UberShaderProgram.cpp 3.2 KB

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