TestColorFont.h 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. #pragma once
  2. #include "test.h"
  3. class ColoredShaderMat : public STDMaterialX
  4. {
  5. public:
  6. MATX(ColoredShaderMat);
  7. Vector4 uniformBlack = Vector4(0.0f, 0.0f, 0.0f, 1.0f);
  8. void rehash(size_t& hash) const override
  9. {
  10. STDMaterialX::rehash(hash);
  11. hash_combine(hash, uniformBlack.x, uniformBlack.y, uniformBlack.z, uniformBlack.w);
  12. }
  13. static bool cmp(const ColoredShaderMat& a, const ColoredShaderMat& b)
  14. {
  15. if (!STDMaterialX::cmp(a, b))
  16. return false;
  17. return a.uniformBlack == b.uniformBlack;
  18. }
  19. void xapply() override
  20. {
  21. STDMaterialX::xapply();
  22. IVideoDriver::instance->setUniform("_black", uniformBlack);
  23. }
  24. };
  25. class ShaderTextField : public TextField
  26. {
  27. public:
  28. static UberShaderProgram* shader;
  29. static void init()
  30. {
  31. shader = new UberShaderProgram();
  32. shader->init(STDRenderer::uberShaderBody,
  33. R"(
  34. #define MODIFY_BASE
  35. #define DONT_MULT_BY_RESULT_COLOR)",
  36. R"(
  37. uniform lowp vec4 _black;
  38. uniform lowp vec4 _white;
  39. lowp vec4 modify_base(lowp vec4 base)
  40. {
  41. lowp vec4 black = vec4(_black.rgb, result_color.a);
  42. lowp vec4 white = result_color;
  43. return mix(white, black, base.r) * base.a;
  44. }
  45. )");
  46. }
  47. static void free()
  48. {
  49. delete shader;
  50. }
  51. ColoredShaderMat mat;
  52. ShaderTextField() : _outer(Color::White)
  53. {
  54. mat._uberShader = shader;
  55. mat.uniformBlack = _outer.toVector();
  56. _mat = mc().cache(mat);
  57. }
  58. const Color& getOuterColor() const
  59. {
  60. return _outer;
  61. }
  62. void setOuterColor(const Color& v)
  63. {
  64. _outer = v;
  65. mat.uniformBlack = _outer.toVector();
  66. setMat(mc().cache(mat));
  67. }
  68. typedef Property<Color, const Color&, ShaderTextField, &ShaderTextField::getOuterColor, &ShaderTextField::setOuterColor> TweenOuterColor;
  69. private:
  70. Color _outer;
  71. };
  72. DECLARE_SMART(ShaderTextField, spShaderTextField);
  73. UberShaderProgram* ShaderTextField::shader = 0;
  74. class TestColorFont : public Test
  75. {
  76. public:
  77. spTextField _txt;
  78. TestColorFont()
  79. {
  80. ShaderTextField::init();
  81. spShaderTextField txt = new ShaderTextField;
  82. //spTextField txt = new TextField;
  83. txt->attachTo(content);
  84. _txt = txt;
  85. TextStyle st;
  86. st.font = resources.getResFont("num_fnt_shdr");
  87. st.vAlign = TextStyle::VALIGN_MIDDLE;
  88. st.hAlign = TextStyle::HALIGN_MIDDLE;
  89. //st.color = Color::CornflowerBlue;
  90. st.multiline = true;
  91. txt->setStyle(st);
  92. txt->setColor(Color::CornflowerBlue);
  93. txt->setText("1234567890");
  94. txt->setPosition(getStage()->getSize() / 2);
  95. txt->setOuterColor(Color::White);
  96. txt->setKerning(5);
  97. txt->addTween(ShaderTextField::TweenOuterColor(Color::Black), 4000, -1, true, 2000);
  98. txt->addTween(ShaderTextField::TweenColor(Color::Magenta), 5000, -1, true);
  99. }
  100. ~TestColorFont()
  101. {
  102. ShaderTextField::free();
  103. }
  104. void toggleClicked(string id, const toggle* data)
  105. {
  106. }
  107. };