TestColorFont.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. #pragma once
  2. #include "test.h"
  3. #include "core/UberShaderProgram.h"
  4. DECLARE_SMART(ShaderTextField, spShaderTextField);
  5. class CustomShader : public Material
  6. {
  7. public:
  8. static CustomShader* get(Actor* a)
  9. {
  10. return safeCast<CustomShader*>(a->getMaterial());
  11. }
  12. CustomShader(UberShaderProgram* shader): _shader(shader) {}
  13. void apply(Actor* a)
  14. {
  15. a->setMaterial(this);
  16. }
  17. void free()
  18. {
  19. }
  20. void setUniforms(IVideoDriver* driver, ShaderProgram* prog)
  21. {
  22. //driver->setUniform("userValue", &_val, 1);
  23. /*Color q(_adata, _adata, _adata, _adata);
  24. Vector4 c;
  25. c = tovec(_outer * q);
  26. driver->setUniform("_black", &c, 1);
  27. c = tovec(getColor() * _style.color * q);
  28. driver->setUniform("_white", &c, 1);*/
  29. }
  30. void doRender(Actor* actor, RenderState& rs)
  31. {
  32. /* _shader->setShaderUniformsCallback(CLOSURE(this, &CustomShader::setUniforms));
  33. STDRenderer* renderer = safeCast<STDRenderer*>(rs.renderer);
  34. renderer->setUberShaderProgram(_shader);
  35. actor->doRender(rs);
  36. renderer->setUberShaderProgram(&Renderer::uberShader);
  37. _shader->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());*/
  38. }
  39. UberShaderProgram* _shader;
  40. };
  41. class ShaderTextField : public TextField
  42. {
  43. public:
  44. static UberShaderProgram* shader;
  45. static void init()
  46. {
  47. shader = new UberShaderProgram();
  48. shader->init(STDRenderer::uberShaderBody,
  49. "#define MODIFY_BASE\n"
  50. "#define DONT_MULT_BY_RESULT_COLOR\n"
  51. "uniform lowp vec4 _black;"
  52. "uniform lowp vec4 _white;"
  53. "lowp vec4 modify_base(lowp vec4 base)\n"
  54. "{\n"
  55. "lowp vec4 black = vec4(_black.rgb, 1.0);" "\n"
  56. "lowp vec4 white = vec4(_white.rgb, 1.0);" "\n"
  57. "return mix(_white, _black, base.r) * base.a;\n"
  58. "}\n");
  59. }
  60. static void free()
  61. {
  62. delete shader;
  63. }
  64. //void set
  65. ShaderTextField() : _outer(Color::White)
  66. {
  67. }
  68. const Color& getOuterColor() const
  69. {
  70. return _outer;
  71. }
  72. void setOuterColor(const Color& v)
  73. {
  74. _outer = v;
  75. }
  76. typedef Property<Color, const Color&, ShaderTextField, &ShaderTextField::getOuterColor, &ShaderTextField::setOuterColor> TweenOuterColor;
  77. private:
  78. Color _outer;
  79. unsigned char _adata;
  80. void setUniforms(IVideoDriver* driver, ShaderProgram* prog)
  81. {
  82. Color q(_adata, _adata, _adata, _adata);
  83. Vector4 c = (_outer * q).toVector();
  84. driver->setUniform("_black", &c, 1);
  85. c = (getColor() * _style.color * q).toVector();
  86. driver->setUniform("_white", &c, 1);
  87. }
  88. void doRender(const RenderState& rs)
  89. {
  90. Material::setCurrent(rs.material);
  91. STDRenderer* renderer = STDRenderer::instance;
  92. _adata = rs.alpha;
  93. shader->setShaderUniformsCallback(CLOSURE(this, &ShaderTextField::setUniforms));
  94. renderer->setUberShaderProgram(shader);
  95. TextField::doRender(rs);
  96. renderer->setUberShaderProgram(&STDRenderer::uberShader);
  97. shader->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());
  98. }
  99. };
  100. UberShaderProgram* ShaderTextField::shader = 0;
  101. class TestColorFont : public Test
  102. {
  103. public:
  104. spTextField _txt;
  105. TestColorFont()
  106. {
  107. ShaderTextField::init();
  108. spShaderTextField txt = new ShaderTextField;
  109. //spTextField txt = new TextField;
  110. txt->attachTo(content);
  111. _txt = txt;
  112. TextStyle st;
  113. st.font = resources.getResFont("num_fnt_shdr");
  114. st.vAlign = TextStyle::VALIGN_MIDDLE;
  115. st.hAlign = TextStyle::HALIGN_MIDDLE;
  116. //st.color = Color::CornflowerBlue;
  117. st.multiline = true;
  118. txt->setStyle(st);
  119. txt->setColor(Color::CornflowerBlue);
  120. txt->setText("1234567890");
  121. txt->setPosition(getStage()->getSize() / 2);
  122. txt->setOuterColor(Color::White);
  123. txt->addTween(ShaderTextField::TweenOuterColor(Color::Black), 4000, -1, true, 2000);
  124. txt->addTween(TextField::TweenColor(Color::Magenta), 5000, -1, true);
  125. }
  126. ~TestColorFont()
  127. {
  128. ShaderTextField::free();
  129. }
  130. void toggleClicked(string id, const toggle* data)
  131. {
  132. }
  133. };