UberShaderProgram.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. #include "UberShaderProgram.h"
  2. #include "vertex.h"
  3. #include "gl/VideoDriverGLES20.h"
  4. #include "gl/ShaderProgramGL.h"
  5. #include "NativeTexture.h"
  6. namespace oxygine
  7. {
  8. UberShaderProgramBase::UberShaderProgramBase()
  9. {
  10. }
  11. void UberShaderProgramBase::init(const std::vector<unsigned char>& baseShader, const char* prepend, const char* append)
  12. {
  13. _data = baseShader;
  14. _data.insert(_data.begin(), prepend, prepend + strlen(prepend));
  15. _data.insert(_data.end(), append, append + strlen(append));
  16. _data.push_back(0);
  17. reg(CLOSURE(this, &UberShaderProgramBase::_restore), 0);
  18. }
  19. UberShaderProgramBase::~UberShaderProgramBase()
  20. {
  21. releaseShaders();
  22. }
  23. void UberShaderProgramBase::_restore(Restorable*, void*)
  24. {
  25. }
  26. void UberShaderProgramBase::release()
  27. {
  28. releaseShaders();
  29. unreg();
  30. }
  31. UberShaderProgramBase::shader* UberShaderProgram::getShaderProgram(int flags)
  32. {
  33. shader& s = _shaders[flags];
  34. if (!s.program)
  35. {
  36. bvertex_format bformat = vertexPCT2::FORMAT;
  37. s.flags = flags;
  38. const char* data = (const char*)&_data.front();
  39. char prepend[255];
  40. char append[255];
  41. append[0] = 0;
  42. prepend[0] = 0;
  43. if (flags & ALPHA_PREMULTIPLY)
  44. strcat(prepend, "#define ALPHA_PREMULTIPLY\n");
  45. if (flags & SEPARATE_ALPHA)
  46. strcat(prepend, "#define SEPARATE_ALPHA\n");
  47. if (flags & MASK_R_CHANNEL)
  48. strcat(prepend, "#define MASK_R_CHANNEL\n");
  49. if (flags & MASK)
  50. {
  51. strcat(prepend, "#define MASK\n");
  52. }
  53. char* end = prepend + strlen(prepend);
  54. strcat(prepend, "#define program_main_ps main\n");
  55. strcat(prepend, "#define PS\n");
  56. int fs = ShaderProgramGL::createShader(GL_FRAGMENT_SHADER, data, prepend, append);
  57. *end = 0;
  58. strcat(prepend, "#define program_main_vs main\n");
  59. strcat(prepend, "#define VS\n");
  60. int vs = ShaderProgramGL::createShader(GL_VERTEX_SHADER, data, prepend, append);
  61. ShaderProgramGL* pgl = new ShaderProgramGL;
  62. VideoDriverGLES20* driver = ((VideoDriverGLES20*)IVideoDriver::instance);
  63. const VertexDeclarationGL* decl = driver->getVertexDeclaration(bformat);
  64. pgl->init(ShaderProgramGL::createProgram(vs, fs, decl));
  65. CHECKGL();
  66. driver->setShaderProgram(pgl);
  67. CHECKGL();
  68. driver->setUniformInt("base_texture", UberShaderProgram::SAMPLER_BASE);
  69. driver->setUniformInt("alpha_texture", UberShaderProgram::SAMPLER_ALPHA);
  70. driver->setUniformInt("mask_texture", UberShaderProgram::SAMPLER_MASK);
  71. s.program = pgl;
  72. CHECKGL();
  73. }
  74. return &s;
  75. }
  76. UberShaderProgram::UberShaderProgram()
  77. {
  78. }
  79. UberShaderProgram::~UberShaderProgram()
  80. {
  81. releaseShaders();
  82. }
  83. void UberShaderProgram::releaseShaders()
  84. {
  85. for (int i = 0; i < SIZE; ++i)
  86. {
  87. shader& s = _shaders[i];
  88. delete s.program;
  89. s.program = 0;
  90. }
  91. }
  92. void UberShaderProgram::apply(spNativeTexture base, spNativeTexture alpha)
  93. {
  94. //STDRenderer
  95. IVideoDriver* driver = IVideoDriver::instance;
  96. driver->setTexture(UberShaderProgram::SAMPLER_BASE, base);
  97. if (alpha)
  98. driver->setTexture(UberShaderProgram::SAMPLER_ALPHA, alpha);
  99. }
  100. }