TestUserShader2.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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 "core/gl/ShaderProgramGL.h"
  7. class LightningMaterial : public Material
  8. {
  9. public:
  10. const VertexDeclaration* _vdecl;
  11. ShaderProgramGL* _lightShader;
  12. Vector2 _light;
  13. vector<vertexPCT2T2> _vertices;
  14. AnimationFrame _normal;
  15. spNativeTexture _base;
  16. LightningMaterial()
  17. {
  18. _normal = resources.getResAnim("normal")->getFrame(0);
  19. _light = getStage()->getSize() / 2;
  20. IVideoDriver* driver = IVideoDriver::instance;
  21. _vdecl = driver->getVertexDeclaration(vertexPCT2T2::FORMAT);
  22. //load vertex shader
  23. file::buffer vsdata;
  24. file::read("light_vs.glsl", vsdata);
  25. vsdata.push_back(0);///null terminating string
  26. unsigned int vs = ShaderProgramGL::createShader(GL_VERTEX_SHADER, (const char*)&vsdata.front(), "", "");
  27. //load fragment shader
  28. file::buffer fsdata;
  29. file::read("light_fs.glsl", fsdata);
  30. fsdata.push_back(0);///null terminating string
  31. unsigned int ps = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, (const char*)&fsdata.front(), "", "");
  32. //link into 1 shader program
  33. unsigned int pr = ShaderProgramGL::createProgram(vs, ps, static_cast<const VertexDeclarationGL*>(IVideoDriver::instance->getVertexDeclaration(vertexPCT2T2::FORMAT)));
  34. _lightShader = new ShaderProgramGL(pr);
  35. //set shader and apply samplers uniforms
  36. driver->setShaderProgram(_lightShader);
  37. driver->setUniformInt("base_texture", 0);
  38. driver->setUniformInt("normal_texture", 1);
  39. }
  40. void apply(Material* prev) override
  41. {
  42. IVideoDriver* driver = IVideoDriver::instance;
  43. driver->setShaderProgram(_lightShader);
  44. Vector2 light = getStage()->getDescendant("light")->getPosition();
  45. driver->setUniform("light", &light, 1);
  46. driver->setUniform("mat", &STDMaterial::instance->getRenderer()->getViewProjection());
  47. driver->setTexture(1, _normal.getDiffuse().base);
  48. driver->setState(IVideoDriver::STATE_BLEND, 0);
  49. driver->setBlendFunc(IVideoDriver::BT_ONE, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
  50. driver->setBlendFunc(IVideoDriver::BT_SRC_ALPHA, IVideoDriver::BT_ONE_MINUS_SRC_ALPHA);
  51. }
  52. void finish() override
  53. {
  54. drawBatch(IVideoDriver::instance);
  55. }
  56. void drawBatch(IVideoDriver* driver)
  57. {
  58. size_t count = _vertices.size();
  59. if (!count)
  60. return;
  61. size_t indices = (count * 3) / 2;
  62. driver->setTexture(0, _base);
  63. driver->draw(IVideoDriver::PT_TRIANGLES, _vdecl, &_vertices.front(), (unsigned int)count, &STDRenderer::indices16.front(), (unsigned int)indices);
  64. _vertices.clear();
  65. }
  66. void doRender(Sprite* sprite, const RenderState& rs) override
  67. {
  68. Material::setCurrent(this);
  69. vertexPCT2T2 v[4];
  70. const AnimationFrame& frame = sprite->getAnimFrame();
  71. if (frame.getDiffuse().base != _base)
  72. {
  73. drawBatch(IVideoDriver::instance);
  74. _base = frame.getDiffuse().base;
  75. }
  76. fillQuadT2(v, frame.getSrcRect(), _normal.getSrcRect(), sprite->getDestRect(), rs.transform, 0xffFFffFF);
  77. _vertices.insert(_vertices.end(), v, v + 4);
  78. }
  79. };
  80. class TestUserShader2 : public Test
  81. {
  82. public:
  83. Draggable drag;
  84. TestUserShader2()
  85. {
  86. LightningMaterial* mat = new LightningMaterial;
  87. spSprite spr = new Sprite();
  88. spr->setResAnim(resources.getResAnim("tiled2"));
  89. spr->setScale(2);
  90. spr->setAnchor(0.5f, 0.5f);
  91. spr->setPosition(content->getSize() / 2);
  92. spr->attachTo(content);
  93. spr->setMaterial(mat);
  94. spr = new Sprite();
  95. spr->setResAnim(resources.getResAnim("tiled2"));
  96. spr->setScale(2);
  97. spr->setAnchor(0.5f, 0.5f);
  98. spr->setPosition(content->getSize() / 2 + Vector2(300, 50));
  99. spr->attachTo(content);
  100. spr->setMaterial(mat);
  101. spr = new Sprite();
  102. spr->setResAnim(resources.getResAnim("tiled2"));
  103. spr->setScale(2);
  104. spr->setAnchor(0.5f, 0.5f);
  105. spr->setPosition(content->getSize() / 2 + Vector2(-200, 50));
  106. spr->attachTo(content);
  107. spr->setMaterial(mat);
  108. spSprite light = new Sprite;
  109. light->setName("light");
  110. light->setResAnim(resources.getResAnim("light"));
  111. light->setAnchor(0.5f, 0.5f);
  112. drag.init(light.get());
  113. light->setPosition(getSize() / 2);
  114. content->addChild(light);
  115. }
  116. };