PolyGLSLShaderModule.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522
  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, 1};
  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. glPushMatrix();
  269. glLoadIdentity();
  270. glEnable(GL_TEXTURE_2D);
  271. GLSLShader *glslShader = (GLSLShader*)material->getShader(shaderIndex);
  272. GLSLShaderBinding *cgBinding = (GLSLShaderBinding*)material->getShaderBinding(shaderIndex);
  273. for(int i=0; i < glslShader->vp->params.size(); i++) {
  274. GLSLProgramParam param = glslShader->vp->params[i];
  275. updateGLSLParam(renderer, param, material->getShaderBinding(shaderIndex), localOptions);
  276. }
  277. for(int i=0; i < glslShader->fp->params.size(); i++) {
  278. GLSLProgramParam param = glslShader->fp->params[i];
  279. updateGLSLParam(renderer, param, material->getShaderBinding(shaderIndex), localOptions);
  280. }
  281. glUseProgram(glslShader->shader_id);
  282. // glActiveTexture(GL_TEXTURE0);
  283. for(int i=0; i < cgBinding->textures.size(); i++) {
  284. int texture_location = glGetUniformLocation(glslShader->shader_id, cgBinding->textures[i].name.c_str());
  285. glUniform1i(texture_location, 0);
  286. glBindTexture(GL_TEXTURE_2D, ((OpenGLTexture*)cgBinding->textures[i].texture)->getTextureID());
  287. }
  288. /*
  289. // Logger::log("applying %s (%s %s)\n", material->getShader()->getName().c_str(), cgShader->vp->getResourceName().c_str(), cgShader->fp->getResourceName().c_str());
  290. for(int i=0; i < cgBinding->cubemaps.size(); i++) {
  291. cgGLSetTextureParameter(cgBinding->cubemaps[i].vpParam, ((OpenGLCubemap*)cgBinding->cubemaps[i].cubemap)->getTextureID());
  292. cgGLEnableTextureParameter(cgBinding->cubemaps[i].vpParam);
  293. }
  294. cgBinding = (GLSLShaderBinding*)localOptions;
  295. for(int i=0; i < cgBinding->textures.size(); i++) {
  296. cgGLSetTextureParameter(cgBinding->textures[i].vpParam, ((OpenGLTexture*)cgBinding->textures[i].texture)->getTextureID());
  297. cgGLEnableTextureParameter(cgBinding->textures[i].vpParam);
  298. }
  299. vector<Texture*> shadowMapTextures = renderer->getShadowMapTextures();
  300. char texName[32];
  301. for(int i=0; i< 4; i++) {
  302. if(i < shadowMapTextures.size()) {
  303. switch(i) {
  304. case 0:
  305. strcpy(texName, "shadowMap0");
  306. break;
  307. case 1:
  308. strcpy(texName, "shadowMap1");
  309. break;
  310. case 2:
  311. strcpy(texName, "shadowMap2");
  312. break;
  313. case 3:
  314. strcpy(texName, "shadowMap3");
  315. break;
  316. }
  317. cgGLSetTextureParameter(cgGetNamedParameter(cgShader->fp->program, texName), ((OpenGLTexture*)shadowMapTextures[i])->getTextureID());
  318. cgGLEnableTextureParameter(cgGetNamedParameter(cgShader->fp->program, texName));
  319. }
  320. }
  321. */
  322. glPopMatrix();
  323. }
  324. void GLSLShaderModule::addParamToProgram(GLSLProgram *program,TiXmlNode *node) {
  325. bool isAuto = false;
  326. int autoID = 0;
  327. int paramType = GLSLProgramParam::PARAM_UNKNOWN;
  328. void *defaultData = NULL;
  329. if(strcmp(node->ToElement()->Attribute("type"), "auto") == 0) {
  330. isAuto = true;
  331. String pid = node->ToElement()->Attribute("id");
  332. if(pid == "TAU_MODELVIEWPROJ_MATRIX")
  333. autoID = GLSLProgramParam::TAU_MODELVIEWPROJ_MATRIX;
  334. else if(pid == "TAU_AREA_LIGHT_POSITION_0")
  335. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_0;
  336. else if(pid == "TAU_AREA_LIGHT_POSITION_1")
  337. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_1;
  338. else if(pid == "TAU_AREA_LIGHT_POSITION_2")
  339. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_2;
  340. else if(pid == "TAU_AREA_LIGHT_POSITION_3")
  341. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_3;
  342. else if(pid == "TAU_AREA_LIGHT_POSITION_4")
  343. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_4;
  344. else if(pid == "TAU_AREA_LIGHT_POSITION_5")
  345. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_5;
  346. else if(pid == "TAU_AREA_LIGHT_POSITION_6")
  347. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_6;
  348. else if(pid == "TAU_AREA_LIGHT_POSITION_7")
  349. autoID = GLSLProgramParam::TAU_AREA_LIGHT_POSITION_7;
  350. else if(pid == "TAU_SPOT_LIGHT_POSITION_0")
  351. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_0;
  352. else if(pid == "TAU_SPOT_LIGHT_POSITION_1")
  353. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_1;
  354. else if(pid == "TAU_SPOT_LIGHT_POSITION_2")
  355. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_2;
  356. else if(pid == "TAU_SPOT_LIGHT_POSITION_3")
  357. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_POSITION_3;
  358. else if(pid == "TAU_AREA_LIGHT_COLOR_0")
  359. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_0;
  360. else if(pid == "TAU_AREA_LIGHT_COLOR_1")
  361. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_1;
  362. else if(pid == "TAU_AREA_LIGHT_COLOR_2")
  363. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_2;
  364. else if(pid == "TAU_AREA_LIGHT_COLOR_3")
  365. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_3;
  366. else if(pid == "TAU_AREA_LIGHT_COLOR_4")
  367. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_4;
  368. else if(pid == "TAU_AREA_LIGHT_COLOR_5")
  369. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_5;
  370. else if(pid == "TAU_AREA_LIGHT_COLOR_6")
  371. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_6;
  372. else if(pid == "TAU_AREA_LIGHT_COLOR_7")
  373. autoID = GLSLProgramParam::TAU_AREA_LIGHT_COLOR_7;
  374. else if(pid == "TAU_SPOT_LIGHT_COLOR_0")
  375. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_0;
  376. else if(pid == "TAU_SPOT_LIGHT_COLOR_1")
  377. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_1;
  378. else if(pid == "TAU_SPOT_LIGHT_COLOR_2")
  379. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_2;
  380. else if(pid == "TAU_SPOT_LIGHT_COLOR_3")
  381. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_COLOR_3;
  382. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_0")
  383. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_0;
  384. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_1")
  385. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_1;
  386. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_2")
  387. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_2;
  388. else if(pid == "TAU_SPOT_LIGHT_DIRECTION_3")
  389. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_DIRECTION_3;
  390. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_0")
  391. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_0;
  392. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_1")
  393. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_1;
  394. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_2")
  395. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_2;
  396. else if(pid == "TAU_SPOT_LIGHT_TEXTUREMATRIX_3")
  397. autoID = GLSLProgramParam::TAU_SPOT_LIGHT_TEXTUREMATRIX_3;
  398. else if(pid == "TAU_MODELVIEW_MATRIX")
  399. autoID = GLSLProgramParam::TAU_MODELVIEW_MATRIX;
  400. else if(pid == "TAU_MODELVIEW_INVERSE_MATRIX")
  401. autoID = GLSLProgramParam::TAU_MODELVIEW_INVERSE_MATRIX;
  402. else if(pid == "TAU_EXPOSURE_LEVEL")
  403. autoID = GLSLProgramParam::TAU_EXPOSURE_LEVEL;
  404. else if(pid == "TAU_CLEARCOLOR")
  405. autoID = GLSLProgramParam::TAU_CLEARCOLOR;
  406. else if(pid == "TAU_AMBIENTCOLOR")
  407. autoID = GLSLProgramParam::TAU_AMBIENTCOLOR;
  408. else
  409. isAuto = false;
  410. } else {
  411. defaultData = GLSLProgramParam::createParamData(&paramType, node->ToElement()->Attribute("type"), node->ToElement()->Attribute("default"));
  412. }
  413. program->addParam(node->ToElement()->Attribute("name"), isAuto, autoID, paramType, defaultData);
  414. }
  415. void GLSLShaderModule::reloadPrograms() {
  416. for(int i=0; i < programs.size(); i++) {
  417. GLSLProgram *program = programs[i];
  418. recreateGLSLProgram(program, program->getResourcePath(), program->type);
  419. }
  420. }
  421. void GLSLShaderModule::recreateGLSLProgram(GLSLProgram *prog, String fileName, int type) {
  422. OSFILE *file = OSBasics::open(fileName, "r");
  423. OSBasics::seek(file, 0, SEEK_END);
  424. long progsize = OSBasics::tell(file);
  425. OSBasics::seek(file, 0, SEEK_SET);
  426. char *buffer = (char*)malloc(progsize+1);
  427. memset(buffer, 0, progsize+1);
  428. OSBasics::read(buffer, progsize, 1, file);
  429. if(type == GLSLProgram::TYPE_VERT) {
  430. prog->program = glCreateShader(GL_VERTEX_SHADER);
  431. } else {
  432. prog->program = glCreateShader(GL_FRAGMENT_SHADER);
  433. }
  434. glShaderSource(prog->program, 1, (const GLchar**)&buffer, 0);
  435. glCompileShader(prog->program);
  436. free(buffer);
  437. }
  438. GLSLProgram *GLSLShaderModule::createGLSLProgram(String fileName, int type) {
  439. GLSLProgram *prog = new GLSLProgram(type);
  440. recreateGLSLProgram(prog, fileName, type);
  441. programs.push_back(prog);
  442. return prog;
  443. }
  444. Resource* GLSLShaderModule::createProgramFromFile(String extension, String fullPath) {
  445. if(extension == "vert") {
  446. Logger::log("Adding GLSL vertex program %s\n", fullPath.c_str());
  447. return createGLSLProgram(fullPath, GLSLProgram::TYPE_VERT);
  448. }
  449. if(extension == "frag") {
  450. Logger::log("Adding GLSL fragment program %s\n", fullPath.c_str());
  451. return createGLSLProgram(fullPath, GLSLProgram::TYPE_FRAG);
  452. }
  453. return NULL;
  454. }