TestUserShader.h 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. #pragma once
  2. #include "test.h"
  3. #include "core/UberShaderProgram.h"
  4. #include "core/gl/VideoDriverGLES20.h"
  5. #include "core/gl/oxgl.h"
  6. #include "STDMaterial.h"
  7. DECLARE_SMART(ShaderSprite, spShaderSprite);
  8. class ShaderSprite: public Sprite
  9. {
  10. public:
  11. ShaderSprite(): _program(0), _val(0.5f, 0.5f, 0.5f, 0)
  12. {
  13. }
  14. void setShaderProgram(UberShaderProgram* p)
  15. {
  16. _program = p;
  17. }
  18. const Vector4& getVal() const
  19. {
  20. return _val;
  21. }
  22. void setVal(const Vector4& v)
  23. {
  24. _val = v;
  25. }
  26. typedef Property<Vector4, const Vector4&, ShaderSprite, &ShaderSprite::getVal, &ShaderSprite::setVal> TweenVal;
  27. private:
  28. Vector4 _val;
  29. UberShaderProgram* _program;
  30. void setUniforms(IVideoDriver* driver, ShaderProgram* prog)
  31. {
  32. driver->setUniform("userValue", &_val, 1);
  33. }
  34. void doRender(const RenderState& rs)
  35. {
  36. /* _program->setShaderUniformsCallback(CLOSURE(this, &ShaderSprite::setUniforms));
  37. STDRenderer* renderer = safeCast<STDRenderer*>(rs.renderer);
  38. renderer->setUberShaderProgram(_program);
  39. Sprite::doRender(rs);
  40. renderer->setUberShaderProgram(&Renderer::uberShader);
  41. _program->setShaderUniformsCallback(UberShaderProgram::ShaderUniformsCallback());*/
  42. }
  43. };
  44. class TweenShader: public Tween, public Material
  45. {
  46. public:
  47. UberShaderProgram* _program;
  48. Vector4 _val;
  49. TweenShader(UberShaderProgram* prog) : _program(prog), _val(0, 0, 0, 0) {}
  50. ~TweenShader()
  51. {
  52. if (_client)
  53. _client->setMaterial(0);
  54. }
  55. void _start(Actor& actor) override
  56. {
  57. actor.setName("zzz");
  58. actor.setMaterial(this);
  59. }
  60. void _update(Actor& actor, const UpdateState& us)
  61. {
  62. _val = lerp(Vector4(1, 1, 1, 0), Vector4(0, 0, 0, 0), _percent);
  63. }
  64. void _done(Actor& actor, const UpdateState& us)
  65. {
  66. actor.setMaterial(0);
  67. }
  68. void setUniforms(IVideoDriver* driver, ShaderProgram* prog)
  69. {
  70. driver->setUniform("userValue", &_val, 1);
  71. }
  72. void apply(Material* prev) override
  73. {
  74. STDRenderer* renderer = STDMaterial::instance->getRenderer();
  75. _program->setShaderUniformsCallback(CLOSURE(this, &TweenShader::setUniforms));
  76. //STDRenderer* renderer = safeCast<STDRenderer*>(r);
  77. renderer->setUberShaderProgram(_program);
  78. }
  79. void doRender(Sprite* s, const RenderState& rs) override
  80. {
  81. STDMaterial::instance->doRender(s, rs);
  82. }
  83. void finish() override
  84. {
  85. STDRenderer* renderer = STDMaterial::instance->getRenderer();
  86. renderer->drawBatch();
  87. }
  88. };
  89. class TestUserShader: public Test
  90. {
  91. public:
  92. UberShaderProgram* _shaderMono;
  93. UberShaderProgram* _shaderAddColor;
  94. UberShaderProgram* _shaderInvert;
  95. spSprite _sprite;
  96. TestUserShader(): _shaderMono(0), _shaderAddColor(0)
  97. {
  98. _shaderMono = new UberShaderProgram();
  99. _shaderMono->init(STDRenderer::uberShaderBody,
  100. "#define MODIFY_BASE_PRE\n"
  101. "uniform lowp vec4 userValue;"
  102. "lowp vec4 modify_base_pre(lowp vec4 base)\n"
  103. "{\n"
  104. "lowp float c = (base.r + base.g + base.b) / 3.0;\n"
  105. "return mix(vec4(c, c, c, base.a), base, userValue.r);\n"
  106. "}\n");
  107. _shaderAddColor = new UberShaderProgram();
  108. _shaderAddColor->init(STDRenderer::uberShaderBody,
  109. "#define MODIFY_BASE_PRE\n"
  110. "uniform lowp vec4 userValue;"
  111. "lowp vec4 modify_base_pre(lowp vec4 base)\n"
  112. "{\n"
  113. "return base + userValue * base.a;\n"
  114. "}\n");
  115. _shaderInvert = new UberShaderProgram();
  116. _shaderInvert->init(STDRenderer::uberShaderBody,
  117. "#define MODIFY_BASE_PRE\n"
  118. "uniform lowp vec4 userValue;"
  119. "lowp vec4 modify_base_pre(lowp vec4 base)\n"
  120. "{\n"
  121. "\n"
  122. "lowp vec4 inverted = vec4(1.0, 1.0, 1.0, 1.0) - base;\n"
  123. "lowp vec4 res = mix(inverted * base.a, base, userValue.r);\n"
  124. "return vec4(res.rgb, base.a);\n"
  125. "}\n");
  126. _sprite = new Sprite;
  127. _sprite->setResAnim(resources.getResAnim("bg"));
  128. _sprite->attachTo(content);
  129. //_sprite->addTween2(new TweenShader(_shaderInvert), TweenOptions(2000).twoSides(true).loops(-1));
  130. toggle t[] =
  131. {
  132. toggle("->shader:add color", 0, _shaderAddColor),
  133. toggle("->shader:mono", 0, _shaderMono),
  134. toggle("->shader:invert", 0, _shaderInvert)
  135. };
  136. addToggle("shader", t, 3);
  137. }
  138. ~TestUserShader()
  139. {
  140. delete _shaderInvert;
  141. delete _shaderMono;
  142. delete _shaderAddColor;
  143. }
  144. void toggleClicked(string id, const toggle* data)
  145. {
  146. if (id == "shader")
  147. {
  148. UberShaderProgram* shader = (UberShaderProgram*)data->data;
  149. _sprite->addTween2(new TweenShader(shader), TweenOptions(3000).twoSides(true));
  150. }
  151. }
  152. };