PolyCGShaderModule.cpp 20 KB

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