PolyGLSLShaderModule.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518
  1. /*
  2. * PolyGLSLShader.cpp
  3. * Poly
  4. *
  5. * Created by Ivan Safrin on 9/20/08.
  6. * Copyright 2008 __MyCompanyName__. All rights reserved.
  7. *
  8. */
  9. #include "PolyGLSLShaderModule.h"
  10. using namespace Polycode;
  11. GLSLShaderModule::GLSLShaderModule() : PolycodeShaderModule() {
  12. }
  13. GLSLShaderModule::~GLSLShaderModule() {
  14. }
  15. bool GLSLShaderModule::acceptsExtension(String extension) {
  16. if(extension == "vert" || extension == "frag") {
  17. return true;
  18. } else {
  19. return false;
  20. }
  21. }
  22. String GLSLShaderModule::getShaderType() {
  23. return "glsl";
  24. }
  25. Shader *GLSLShaderModule::createShader(TiXmlNode *node) {
  26. TiXmlNode* pChild, *pChild2, *pChild3;
  27. GLSLProgram *vp = NULL;
  28. GLSLProgram *fp = NULL;
  29. GLSLShader *retShader = NULL;
  30. for (pChild = node->FirstChild(); pChild != 0; pChild = pChild->NextSibling()) {
  31. if(strcmp(pChild->Value(), "vp") == 0) {
  32. vp = (GLSLProgram*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_PROGRAM, pChild->ToElement()->Attribute("source"));
  33. if(vp) {
  34. for (pChild2 = pChild->FirstChild(); pChild2 != 0; pChild2 = pChild2->NextSibling()) {
  35. if(strcmp(pChild2->Value(), "params") == 0) {
  36. for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
  37. if(strcmp(pChild3->Value(), "param") == 0) {
  38. addParamToProgram(vp,pChild3);
  39. }
  40. }
  41. }
  42. }
  43. }
  44. }
  45. if(strcmp(pChild->Value(), "fp") == 0) {
  46. fp = (GLSLProgram*)CoreServices::getInstance()->getResourceManager()->getResource(Resource::RESOURCE_PROGRAM, pChild->ToElement()->Attribute("source"));
  47. if(fp) {
  48. for (pChild2 = pChild->FirstChild(); pChild2 != 0; pChild2 = pChild2->NextSibling()) {
  49. if(strcmp(pChild2->Value(), "params") == 0) {
  50. for (pChild3 = pChild2->FirstChild(); pChild3 != 0; pChild3 = pChild3->NextSibling()) {
  51. if(strcmp(pChild3->Value(), "param") == 0) {
  52. addParamToProgram(fp,pChild3);
  53. }
  54. }
  55. }
  56. }
  57. }
  58. }
  59. }
  60. if(vp != NULL && fp != NULL) {
  61. GLSLShader *cgShader = new GLSLShader(vp,fp);
  62. cgShader->setName(node->ToElement()->Attribute("name"));
  63. retShader = cgShader;
  64. shaders.push_back((Shader*)cgShader);
  65. }
  66. return retShader;
  67. }
  68. void GLSLShaderModule::clearShader() {
  69. glUseProgram(0);
  70. }
  71. void GLSLShaderModule::setGLSLAreaLightPositionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
  72. if(renderer->getNumAreaLights() > lightIndex) {
  73. vector<LightInfo> areaLights = renderer->getAreaLights();
  74. Vector3 lPos(areaLights[lightIndex].position.x,areaLights[lightIndex].position.y,areaLights[lightIndex].position.z);
  75. GLfloat LightPosition[] = {lPos.x, lPos.y, lPos.z, 0};
  76. glLightfv (GL_LIGHT0+lightIndex, GL_POSITION, LightPosition); //change the
  77. } else {
  78. }
  79. }
  80. void GLSLShaderModule::setGLSLSpotLightPositionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
  81. if(renderer->getNumSpotLights() > lightIndex) {
  82. vector<LightInfo> spotLights = renderer->getSpotLights();
  83. Vector3 lPos(spotLights[lightIndex].position.x,spotLights[lightIndex].position.y,spotLights[lightIndex].position.z);
  84. lPos = renderer->getCameraMatrix().inverse() * lPos;
  85. // cgGLSetParameter4f(param.cgParam, lPos.x,lPos.y,lPos.z, spotLights[lightIndex].distance);
  86. } else {
  87. // cgGLSetParameter4f(param.cgParam, 0,0,0,0);
  88. }
  89. }
  90. void GLSLShaderModule::setGLSLSpotLightDirectionParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
  91. if(renderer->getNumSpotLights() > lightIndex) {
  92. vector<LightInfo> spotLights = renderer->getSpotLights();
  93. Vector3 lPos(spotLights[lightIndex].dir.x,spotLights[lightIndex].dir.y,spotLights[lightIndex].dir.z);
  94. lPos = renderer->getCameraMatrix().inverse().rotateVector(lPos);
  95. // cgGLSetParameter3f(param.cgParam, lPos.x,lPos.y,lPos.z);
  96. } else {
  97. // cgGLSetParameter3f(param.cgParam, 0.0f,0.0f,0.0f);
  98. }
  99. }
  100. void GLSLShaderModule::setGLSLAreaLightColorParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
  101. if(renderer->getNumAreaLights() > lightIndex) {
  102. vector<LightInfo> areaLights = renderer->getAreaLights();
  103. GLfloat DiffuseLight[] = {areaLights[lightIndex].color.x, areaLights[lightIndex].color.y, areaLights[lightIndex].color.z};
  104. glLightfv (GL_LIGHT0+lightIndex, GL_DIFFUSE, DiffuseLight);
  105. // cgGLSetParameter4f(param.cgParam, areaLights[lightIndex].color.x,areaLights[lightIndex].color.y,areaLights[lightIndex].color.z, areaLights[lightIndex].intensity);
  106. } else {
  107. // cgGLSetParameter4f(param.cgParam, 0,0,0,0);
  108. }
  109. }
  110. void GLSLShaderModule::setGLSLSpotLightColorParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
  111. if(renderer->getNumSpotLights() > lightIndex) {
  112. vector<LightInfo> spotLights = renderer->getSpotLights();
  113. // cgGLSetParameter4f(param.cgParam, spotLights[lightIndex].color.x,spotLights[lightIndex].color.y,spotLights[lightIndex].color.z, spotLights[lightIndex].intensity);
  114. } else {
  115. // cgGLSetParameter4f(param.cgParam, 0,0,0,0);
  116. }
  117. }
  118. void GLSLShaderModule::setGLSLSpotLightTextureMatrixParameter(Renderer *renderer, GLSLProgramParam &param, int lightIndex) {
  119. if(renderer->getNumLights() > lightIndex) {
  120. vector<LightInfo> spotLights = renderer->getSpotLights();
  121. glMatrixMode(GL_MODELVIEW);
  122. glPushMatrix();
  123. glLoadMatrixd(spotLights[lightIndex].textureMatrix.ml);
  124. // cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_MATRIX,GLSL_GL_MATRIX_IDENTITY);
  125. glPopMatrix();
  126. }
  127. }
  128. void GLSLShaderModule::updateGLSLParam(Renderer *renderer, GLSLProgramParam &param, ShaderBinding *materialOptions, ShaderBinding *localOptions) {
  129. if(param.isAuto) {
  130. switch(param.autoID) {
  131. case GLSLProgramParam::TAU_MODELVIEWPROJ_MATRIX:
  132. // cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_PROJECTION_MATRIX,GLSL_GL_MATRIX_IDENTITY);
  133. break;
  134. case GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_0:
  135. setGLSLSpotLightTextureMatrixParameter(renderer, param, 0);
  136. break;
  137. case GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_1:
  138. setGLSLSpotLightTextureMatrixParameter(renderer, param, 1);
  139. break;
  140. case GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_2:
  141. setGLSLSpotLightTextureMatrixParameter(renderer, param, 2);
  142. break;
  143. case GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_3:
  144. setGLSLSpotLightTextureMatrixParameter(renderer, param, 3);
  145. break;
  146. case GLSLProgramParam::TAU_AMBIENTCOLOR:
  147. // cgGLSetParameter3f(param.cgParam, renderer->ambientColor.r,renderer->ambientColor.g,renderer->ambientColor.b);
  148. break;
  149. case GLSLProgramParam::TAU_CLEARCOLOR:
  150. // cgGLSetParameter3f(param.cgParam, renderer->clearColor.r,renderer->clearColor.g,renderer->clearColor.b);
  151. break;
  152. case GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_0:
  153. setGLSLSpotLightDirectionParameter(renderer, param, 0);
  154. break;
  155. case GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_1:
  156. setGLSLSpotLightDirectionParameter(renderer, param, 1);
  157. break;
  158. case GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_2:
  159. setGLSLSpotLightDirectionParameter(renderer, param, 2);
  160. break;
  161. case GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_3:
  162. setGLSLSpotLightDirectionParameter(renderer, param, 3);
  163. break;
  164. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_0:
  165. setGLSLAreaLightPositionParameter(renderer, param, 0);
  166. break;
  167. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_1:
  168. setGLSLAreaLightPositionParameter(renderer, param, 1);
  169. break;
  170. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_2:
  171. setGLSLAreaLightPositionParameter(renderer, param, 2);
  172. break;
  173. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_3:
  174. setGLSLAreaLightPositionParameter(renderer, param, 3);
  175. break;
  176. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_4:
  177. setGLSLAreaLightPositionParameter(renderer, param, 4);
  178. break;
  179. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_5:
  180. setGLSLAreaLightPositionParameter(renderer, param, 5);
  181. break;
  182. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_6:
  183. setGLSLAreaLightPositionParameter(renderer, param, 6);
  184. break;
  185. case GLSLProgramParam::TAU_AREA_LIGHT_POSITION_7:
  186. setGLSLAreaLightPositionParameter(renderer, param, 7);
  187. break;
  188. case GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_0:
  189. setGLSLSpotLightPositionParameter(renderer, param, 0);
  190. break;
  191. case GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_1:
  192. setGLSLSpotLightPositionParameter(renderer, param, 1);
  193. break;
  194. case GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_2:
  195. setGLSLSpotLightPositionParameter(renderer, param, 2);
  196. break;
  197. case GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_3:
  198. setGLSLSpotLightPositionParameter(renderer, param, 3);
  199. break;
  200. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_0:
  201. setGLSLAreaLightColorParameter(renderer, param, 0);
  202. break;
  203. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_1:
  204. setGLSLAreaLightColorParameter(renderer, param, 1);
  205. break;
  206. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_2:
  207. setGLSLAreaLightColorParameter(renderer, param, 2);
  208. break;
  209. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_3:
  210. setGLSLAreaLightColorParameter(renderer, param, 3);
  211. break;
  212. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_4:
  213. setGLSLAreaLightColorParameter(renderer, param, 4);
  214. break;
  215. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_5:
  216. setGLSLAreaLightColorParameter(renderer, param, 5);
  217. break;
  218. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_6:
  219. setGLSLAreaLightColorParameter(renderer, param, 6);
  220. break;
  221. case GLSLProgramParam::TAU_AREA_LIGHT_COLOR_7:
  222. setGLSLAreaLightColorParameter(renderer, param, 7);
  223. break;
  224. case GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_0:
  225. setGLSLSpotLightColorParameter(renderer, param, 0);
  226. break;
  227. case GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_1:
  228. setGLSLSpotLightColorParameter(renderer, param, 1);
  229. break;
  230. case GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_2:
  231. setGLSLSpotLightColorParameter(renderer, param, 2);
  232. break;
  233. case GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_3:
  234. setGLSLSpotLightColorParameter(renderer, param, 3);
  235. break;
  236. case GLSLProgramParam::TAU_MODELVIEW_MATRIX:
  237. // cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_MATRIX,GLSL_GL_MATRIX_IDENTITY); }
  238. break;
  239. case GLSLProgramParam::TAU_MODELVIEW_INVERSE_MATRIX:
  240. // cgGLSetStateMatrixParameter(param.cgParam, GLSL_GL_MODELVIEW_MATRIX,GLSL_GL_MATRIX_INVERSE_TRANSPOSE);
  241. break;
  242. case GLSLProgramParam::TAU_EXPOSURE_LEVEL:
  243. // cgGLSetParameter1f(param.cgParam, renderer->exposureLevel);
  244. break;
  245. }
  246. } else {
  247. void *paramData = param.defaultData;
  248. LocalShaderParam *localParam = materialOptions->getLocalParamByName(param.name);
  249. if(localParam)
  250. paramData = localParam->data;
  251. localParam = localOptions->getLocalParamByName(param.name);
  252. if(localParam)
  253. paramData = localParam->data;
  254. float *fval;
  255. switch(param.paramType) {
  256. case GLSLProgramParam::PARAM_FLOAT:
  257. fval = (float*)paramData;
  258. // cgGLSetParameter1f(param.cgParam, *fval);
  259. break;
  260. case GLSLProgramParam::PARAM_FLOAT3:
  261. Vector3 *fval3 = (Vector3*)paramData;
  262. // cgGLSetParameter3f(param.cgParam, fval3->x,fval3->y,fval3->z);
  263. break;
  264. }
  265. }
  266. }
  267. bool GLSLShaderModule::applyShaderMaterial(Renderer *renderer, Material *material, ShaderBinding *localOptions, unsigned int shaderIndex) {
  268. glEnable(GL_TEXTURE_2D);
  269. GLSLShader *glslShader = (GLSLShader*)material->getShader(shaderIndex);
  270. GLSLShaderBinding *cgBinding = (GLSLShaderBinding*)material->getShaderBinding(shaderIndex);
  271. for(int i=0; i < glslShader->vp->params.size(); i++) {
  272. GLSLProgramParam param = glslShader->vp->params[i];
  273. updateGLSLParam(renderer, param, material->getShaderBinding(shaderIndex), localOptions);
  274. }
  275. for(int i=0; i < glslShader->fp->params.size(); i++) {
  276. GLSLProgramParam param = glslShader->fp->params[i];
  277. updateGLSLParam(renderer, param, material->getShaderBinding(shaderIndex), localOptions);
  278. }
  279. glUseProgram(glslShader->shader_id);
  280. // glActiveTexture(GL_TEXTURE0);
  281. for(int i=0; i < cgBinding->textures.size(); i++) {
  282. int texture_location = glGetUniformLocation(glslShader->shader_id, cgBinding->textures[i].name.c_str());
  283. glUniform1i(texture_location, 0);
  284. glBindTexture(GL_TEXTURE_2D, ((OpenGLTexture*)cgBinding->textures[i].texture)->getTextureID());
  285. }
  286. /*
  287. // Logger::log("applying %s (%s %s)\n", material->getShader()->getName().c_str(), cgShader->vp->getResourceName().c_str(), cgShader->fp->getResourceName().c_str());
  288. for(int i=0; i < cgBinding->cubemaps.size(); i++) {
  289. cgGLSetTextureParameter(cgBinding->cubemaps[i].vpParam, ((OpenGLCubemap*)cgBinding->cubemaps[i].cubemap)->getTextureID());
  290. cgGLEnableTextureParameter(cgBinding->cubemaps[i].vpParam);
  291. }
  292. cgBinding = (GLSLShaderBinding*)localOptions;
  293. for(int i=0; i < cgBinding->textures.size(); i++) {
  294. cgGLSetTextureParameter(cgBinding->textures[i].vpParam, ((OpenGLTexture*)cgBinding->textures[i].texture)->getTextureID());
  295. cgGLEnableTextureParameter(cgBinding->textures[i].vpParam);
  296. }
  297. vector<Texture*> shadowMapTextures = renderer->getShadowMapTextures();
  298. char texName[32];
  299. for(int i=0; i< 4; i++) {
  300. if(i < shadowMapTextures.size()) {
  301. switch(i) {
  302. case 0:
  303. strcpy(texName, "shadowMap0");
  304. break;
  305. case 1:
  306. strcpy(texName, "shadowMap1");
  307. break;
  308. case 2:
  309. strcpy(texName, "shadowMap2");
  310. break;
  311. case 3:
  312. strcpy(texName, "shadowMap3");
  313. break;
  314. }
  315. cgGLSetTextureParameter(cgGetNamedParameter(cgShader->fp->program, texName), ((OpenGLTexture*)shadowMapTextures[i])->getTextureID());
  316. cgGLEnableTextureParameter(cgGetNamedParameter(cgShader->fp->program, texName));
  317. }
  318. }
  319. */
  320. }
  321. void GLSLShaderModule::addParamToProgram(GLSLProgram *program,TiXmlNode *node) {
  322. bool isAuto = false;
  323. int autoID = 0;
  324. int paramType = GLSLProgramParam::PARAM_UNKNOWN;
  325. void *defaultData = NULL;
  326. if(strcmp(node->ToElement()->Attribute("type"), "auto") == 0) {
  327. isAuto = true;
  328. String pid = node->ToElement()->Attribute("id");
  329. if(pid == "TAU_MODELVIEWPROJ_MATRIX")
  330. autoID = GLSLProgramParam::TAU_MODELVIEWPROJ_MATRIX;
  331. else if(pid == "TAU_AREA_LIGHT_POSITION_0")
  332. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_0;
  333. else if(pid == "TAU_AREA_LIGHT_POSITION_1")
  334. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_1;
  335. else if(pid == "TAU_AREA_LIGHT_POSITION_2")
  336. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_2;
  337. else if(pid == "TAU_AREA_LIGHT_POSITION_3")
  338. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_3;
  339. else if(pid == "TAU_AREA_LIGHT_POSITION_4")
  340. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_4;
  341. else if(pid == "TAU_AREA_LIGHT_POSITION_5")
  342. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_5;
  343. else if(pid == "TAU_AREA_LIGHT_POSITION_6")
  344. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_6;
  345. else if(pid == "TAU_AREA_LIGHT_POSITION_7")
  346. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_7;
  347. else if(pid == "TAU_SPOT_LIGHT_POSITION_0")
  348. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_0;
  349. else if(pid == "TAU_SPOT_LIGHT_POSITION_1")
  350. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_1;
  351. else if(pid == "TAU_SPOT_LIGHT_POSITION_2")
  352. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_2;
  353. else if(pid == "TAU_SPOT_LIGHT_POSITION_3")
  354. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_3;
  355. else if(pid == "TAU_AREA_LIGHT_COLOR_0")
  356. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_0;
  357. else if(pid == "TAU_AREA_LIGHT_COLOR_1")
  358. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_1;
  359. else if(pid == "TAU_AREA_LIGHT_COLOR_2")
  360. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_2;
  361. else if(pid == "TAU_AREA_LIGHT_COLOR_3")
  362. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_3;
  363. else if(pid == "TAU_AREA_LIGHT_COLOR_4")
  364. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_4;
  365. else if(pid == "TAU_AREA_LIGHT_COLOR_5")
  366. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_5;
  367. else if(pid == "TAU_AREA_LIGHT_COLOR_6")
  368. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_6;
  369. else if(pid == "TAU_AREA_LIGHT_COLOR_7")
  370. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_7;
  371. else if(pid == "TAU_SPOT_LIGHT_COLOR_0")
  372. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_0;
  373. else if(pid == "TAU_SPOT_LIGHT_COLOR_1")
  374. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_1;
  375. else if(pid == "TAU_SPOT_LIGHT_COLOR_2")
  376. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_2;
  377. else if(pid == "TAU_SPOT_LIGHT_COLOR_3")
  378. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_3;
  379. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_0")
  380. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_0;
  381. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_1")
  382. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_1;
  383. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_2")
  384. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_2;
  385. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_3")
  386. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_3;
  387. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_0")
  388. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_0;
  389. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_1")
  390. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_1;
  391. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_2")
  392. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_2;
  393. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_3")
  394. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_3;
  395. else if(pid == "TAU_MODELVIEW_MATRIX")
  396. autoID = GLSLProgramParam::TAU_MODELVIEW_MATRIX;
  397. else if(pid == "TAU_MODELVIEW_INVERSE_MATRIX")
  398. autoID = GLSLProgramParam::TAU_MODELVIEW_INVERSE_MATRIX;
  399. else if(pid == "TAU_EXPOSURE_LEVEL")
  400. autoID = GLSLProgramParam::TAU_EXPOSURE_LEVEL;
  401. else if(pid == "TAU_CLEARCOLOR")
  402. autoID = GLSLProgramParam::TAU_CLEARCOLOR;
  403. else if(pid == "TAU_AMBIENTCOLOR")
  404. autoID = GLSLProgramParam::TAU_AMBIENTCOLOR;
  405. else
  406. isAuto = false;
  407. } else {
  408. defaultData = GLSLProgramParam::createParamData(&paramType, node->ToElement()->Attribute("type"), node->ToElement()->Attribute("default"));
  409. }
  410. program->addParam(node->ToElement()->Attribute("name"), isAuto, autoID, paramType, defaultData);
  411. }
  412. void GLSLShaderModule::reloadPrograms() {
  413. for(int i=0; i < programs.size(); i++) {
  414. GLSLProgram *program = programs[i];
  415. recreateGLSLProgram(program, program->getResourcePath(), program->type);
  416. }
  417. }
  418. void GLSLShaderModule::recreateGLSLProgram(GLSLProgram *prog, String fileName, int type) {
  419. OSFILE *file = OSBasics::open(fileName, "r");
  420. OSBasics::seek(file, 0, SEEK_END);
  421. long progsize = OSBasics::tell(file);
  422. OSBasics::seek(file, 0, SEEK_SET);
  423. char *buffer = (char*)malloc(progsize+1);
  424. memset(buffer, 0, progsize+1);
  425. OSBasics::read(buffer, progsize, 1, file);
  426. if(type == GLSLProgram::TYPE_VERT) {
  427. prog->program = glCreateShader(GL_VERTEX_SHADER);
  428. } else {
  429. prog->program = glCreateShader(GL_FRAGMENT_SHADER);
  430. }
  431. glShaderSource(prog->program, 1, (const GLchar**)&buffer, 0);
  432. glCompileShader(prog->program);
  433. free(buffer);
  434. }
  435. GLSLProgram *GLSLShaderModule::createGLSLProgram(String fileName, int type) {
  436. GLSLProgram *prog = new GLSLProgram(type);
  437. recreateGLSLProgram(prog, fileName, type);
  438. programs.push_back(prog);
  439. return prog;
  440. }
  441. Resource* GLSLShaderModule::createProgramFromFile(String extension, String fullPath) {
  442. if(extension == "vert") {
  443. Logger::log("Adding GLSL vertex program %s\n", fullPath.c_str());
  444. return createGLSLProgram(fullPath, GLSLProgram::TYPE_VERT);
  445. }
  446. if(extension == "frag") {
  447. Logger::log("Adding GLSL fragment program %s\n", fullPath.c_str());
  448. return createGLSLProgram(fullPath, GLSLProgram::TYPE_FRAG);
  449. }
  450. return NULL;
  451. }