effect.cpp 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547
  1. #include <WallpaperEngine/fs/utils.h>
  2. #include "shaders/compiler.h"
  3. #include "effect.h"
  4. #include "WallpaperEngine/Irrlicht/Irrlicht.h"
  5. #include "WallpaperEngine/Core/Core.h"
  6. extern irr::f32 g_Time;
  7. namespace WallpaperEngine
  8. {
  9. effect::effect (json json_data, WallpaperEngine::object* parent)
  10. {
  11. this->m_parent = parent;
  12. json::const_iterator file = json_data.find ("file");
  13. json::const_iterator pass = json_data.find ("passes");
  14. if (file != json_data.end () && (*file).is_string () == true)
  15. {
  16. this->m_file = (*file).get <std::string> ().c_str ();
  17. }
  18. // passes list is optional
  19. if (pass == json_data.end () || (*pass).is_array () == false)
  20. return;
  21. json::const_iterator curpass = (*pass).begin ();
  22. json::const_iterator endpass = (*pass).end ();
  23. if (curpass == endpass)
  24. return;
  25. json::const_iterator textures = (*curpass).find ("textures");
  26. json::const_iterator combos = (*curpass).find ("combos");
  27. if (textures == (*curpass).end () || (*textures).is_array () == false)
  28. return;
  29. if (combos != (*curpass).end ())
  30. this->parseCombos (*combos);
  31. json::const_iterator curtex = (*textures).begin ();
  32. json::const_iterator endtex = (*textures).end ();
  33. for (; curtex != endtex; curtex ++)
  34. {
  35. if ((*curtex).is_null () == true)
  36. {
  37. this->m_textures.push_back (nullptr);
  38. }
  39. else if ((*curtex).is_string () == true)
  40. {
  41. irr::io::path texturepath = ("materials/" + (*curtex).get <std::string> () + ".tex").c_str ();
  42. this->m_textures.push_back (new WallpaperEngine::texture (texturepath));
  43. }
  44. }
  45. this->m_content = WallpaperEngine::FileSystem::loadFullFile (this->m_file);
  46. this->m_json = json::parse (this->m_content);
  47. json::const_iterator passes = this->m_json.find ("passes");
  48. if (passes == this->m_json.end () || (*passes).is_array () == false)
  49. return;
  50. json::const_iterator curpassmaterial = (*passes).begin ();
  51. json::const_iterator endpassmaterial = (*passes).end ();
  52. for (; curpassmaterial != endpassmaterial; curpassmaterial ++)
  53. {
  54. json::const_iterator material_it = (*curpassmaterial).find ("material");
  55. if (material_it == (*curpassmaterial).end () || (*material_it).is_string () == false)
  56. continue;
  57. irr::io::path material = (*material_it).get <std::string> ().c_str ();
  58. std::string content = WallpaperEngine::FileSystem::loadFullFile (material);
  59. json material_json = json::parse (content);
  60. json::const_iterator shader_passes = material_json.find ("passes");
  61. if (shader_passes == material_json.end () || (*shader_passes).is_array () == false)
  62. continue;
  63. json::const_iterator shaderpasscur = (*shader_passes).begin ();
  64. json::const_iterator shader = (*shaderpasscur).find ("shader");
  65. if (shader == (*shaderpasscur).end () || (*shader).is_string () == false)
  66. continue;
  67. irr::io::path shaderpath = ("shaders/" + (*shader).get <std::string> ()).c_str ();
  68. irr::io::path fragpath = shaderpath + ".frag";
  69. irr::io::path vertpath = shaderpath + ".vert";
  70. this->m_fragShader = new WallpaperEngine::shaders::compiler (fragpath, WallpaperEngine::shaders::compiler::Type::Type_Pixel, &this->m_combos, false);
  71. this->m_vertShader = new WallpaperEngine::shaders::compiler (vertpath, WallpaperEngine::shaders::compiler::Type::Type_Vertex, &this->m_combos, false);
  72. this->m_materialType = WallpaperEngine::Irrlicht::driver->getGPUProgrammingServices ()
  73. ->addHighLevelShaderMaterial (
  74. this->m_vertShader->precompile ().c_str (), "main", irr::video::EVST_VS_2_0,
  75. this->m_fragShader->precompile ().c_str (), "main", irr::video::EPST_PS_2_0,
  76. this, irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL, 0, irr::video::EGSL_DEFAULT
  77. );
  78. }
  79. json::const_iterator constantvalues = (*curpass).find ("constantshadervalues");
  80. if (constantvalues != (*curpass).end () && (*constantvalues).is_object () == true)
  81. this->parseConstantValues ((*constantvalues));
  82. // last step is creating the actual variables for the shaders
  83. std::vector <shaders::compiler::ShaderParameter*>::const_iterator cur;
  84. std::vector <shaders::compiler::ShaderParameter*>::const_iterator end;
  85. cur = this->m_fragShader->getParameters ().begin ();
  86. end = this->m_fragShader->getParameters ().end ();
  87. // first do fragment shaders
  88. for (; cur != end; cur ++)
  89. {
  90. WallpaperEngine::shaders::compiler::ShaderParameter* param = (*cur);
  91. ShaderParameter* parameter = new ShaderParameter;
  92. void* defaultValue = param->defaultValue;
  93. std::map<std::string,void*>::const_iterator constant = this->m_constants.find (param->identifierName);
  94. if (constant != this->m_constants.end ())
  95. defaultValue = (*constant).second;
  96. parameter->value = nullptr;
  97. if (param->type == "vec4")
  98. {
  99. irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
  100. irr::f32* val = new irr::f32 [4];
  101. val [0] = vec->X;
  102. val [1] = vec->Y;
  103. val [2] = vec->Z;
  104. val [3] = 0.0f;
  105. parameter->value = val;
  106. parameter->type = ParameterType::TYPE_VEC4;
  107. }
  108. else if (param->type == "vec3")
  109. {
  110. irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
  111. irr::f32* val = new irr::f32 [3];
  112. val [0] = vec->X;
  113. val [1] = vec->Y;
  114. val [2] = vec->Z;
  115. parameter->value = val;
  116. parameter->type = ParameterType::TYPE_VEC3;
  117. }
  118. else if (param->type == "vec2")
  119. {
  120. irr::core::vector2df* vec = (irr::core::vector2df*) defaultValue;
  121. irr::f32* val = new irr::f32 [2];
  122. val [0] = vec->X;
  123. val [1] = vec->Y;
  124. parameter->value = val;
  125. parameter->type = ParameterType::TYPE_VEC2;
  126. }
  127. else if (param->type == "float")
  128. {
  129. irr::f32* org = (irr::f32*) defaultValue;
  130. irr::f32* val = new irr::f32;
  131. *val = *org;
  132. parameter->value = val;
  133. parameter->type = ParameterType::TYPE_FLOAT;
  134. }
  135. else if (param->type == "int")
  136. {
  137. irr::s32* org = (irr::s32*) defaultValue;
  138. irr::s32* val = new irr::s32;
  139. *val = *org;
  140. parameter->value = val;
  141. parameter->type = ParameterType::TYPE_INT;
  142. }
  143. else if (param->type == "sampler2D")
  144. {
  145. // sampler2D are textures from wallpaper engine
  146. // so these can be ignored as they are later on defined
  147. continue;
  148. }
  149. this->m_pixelVariables.insert (std::pair <std::string, ShaderParameter*> (param->variableName, parameter));
  150. }
  151. cur = this->m_vertShader->getParameters ().begin ();
  152. end = this->m_vertShader->getParameters ().end ();
  153. // second do vertex shaders
  154. for (;cur != end; cur ++)
  155. {
  156. WallpaperEngine::shaders::compiler::ShaderParameter* param = (*cur);
  157. if (param == nullptr)
  158. continue;
  159. void* defaultValue = param->defaultValue;
  160. std::map<std::string,void*>::const_iterator constant = this->m_constants.find (param->identifierName);
  161. if (constant != this->m_constants.end ())
  162. defaultValue = (*constant).second;
  163. ShaderParameter* parameter = new ShaderParameter;
  164. parameter->value = nullptr;
  165. if (param->type == "vec4")
  166. {
  167. irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
  168. irr::f32* val = new irr::f32 [4];
  169. val [0] = vec->X;
  170. val [1] = vec->Y;
  171. val [2] = vec->Z;
  172. val [3] = 0.0f;
  173. parameter->value = val;
  174. parameter->type = ParameterType::TYPE_VEC4;
  175. }
  176. else if (param->type == "vec3")
  177. {
  178. irr::core::vector3df* vec = (irr::core::vector3df*) defaultValue;
  179. irr::f32* val = new irr::f32 [3];
  180. val [0] = vec->X;
  181. val [1] = vec->Y;
  182. val [2] = vec->Z;
  183. parameter->value = val;
  184. parameter->type = ParameterType::TYPE_VEC3;
  185. }
  186. else if (param->type == "vec2")
  187. {
  188. irr::core::vector2df* vec = (irr::core::vector2df*) defaultValue;
  189. irr::f32* val = new irr::f32 [2];
  190. val [0] = vec->X;
  191. val [1] = vec->Y;
  192. parameter->value = val;
  193. parameter->type = ParameterType::TYPE_VEC2;
  194. }
  195. else if (param->type == "float")
  196. {
  197. irr::f32* org = (irr::f32*) defaultValue;
  198. irr::f32* val = new irr::f32;
  199. *val = *org;
  200. parameter->value = val;
  201. parameter->type = ParameterType::TYPE_FLOAT;
  202. }
  203. else if (param->type == "int")
  204. {
  205. irr::s32* org = (irr::s32*) defaultValue;
  206. irr::s32* val = new irr::s32;
  207. *val = *org;
  208. parameter->value = val;
  209. parameter->type = ParameterType::TYPE_INT;
  210. }
  211. else if (param->type == "sampler2D")
  212. {
  213. // sampler2D are textures from wallpaper engine
  214. // so these can be ignored as they are later on defined
  215. continue;
  216. }
  217. this->m_vertexVariables.insert (std::pair <std::string, ShaderParameter*> (param->variableName, parameter));
  218. }
  219. }
  220. void effect::parseConstantValues (json data)
  221. {
  222. /*
  223. "ui_editor_properties_animation_speed" : 0.10000000149011612,
  224. "ui_editor_properties_ripple_scale" : 2.5,
  225. "ui_editor_properties_ripple_strength" : 0.070000000298023224
  226. */
  227. json::const_iterator cur = data.begin ();
  228. json::const_iterator end = data.end ();
  229. for (; cur != end; cur ++)
  230. {
  231. std::string name = cur.key ();
  232. void* value = nullptr;
  233. if ((*cur).is_number_float () == true)
  234. {
  235. value = new irr::f32;
  236. *(irr::f32*) value = (*cur).get <irr::f32> ();
  237. }
  238. else if ((*cur).is_number_integer () == true)
  239. {
  240. value = new irr::s32;
  241. *(irr::s32*) value = (*cur).get <irr::s32> ();
  242. }
  243. else if ((*cur).is_string () == true)
  244. {
  245. value = new irr::core::vector3df;
  246. *(irr::core::vector3df*) value = Core::ato3vf ((*cur).get <std::string> ().c_str ());
  247. }
  248. this->m_constants.insert (std::pair <std::string, void*> (name, value));
  249. }
  250. }
  251. void effect::parseCombos (json data)
  252. {
  253. json::const_iterator cur = data.begin ();
  254. json::const_iterator end = data.end ();
  255. for (; cur != end; cur ++)
  256. {
  257. std::string name = cur.key ();
  258. if ((*cur).is_number_integer () == true)
  259. {
  260. this->m_combos.insert (std::pair <std::string, int> (name, (*cur).get <int> ()));
  261. }
  262. else
  263. {
  264. WallpaperEngine::Irrlicht::device->getLogger ()->log ("Unknown type for combo value", name.c_str (), irr::ELL_ERROR);
  265. }
  266. }
  267. }
  268. std::vector<WallpaperEngine::texture*>& effect::getTextureList ()
  269. {
  270. return this->m_textures;
  271. }
  272. irr::s32 effect::getMaterialType ()
  273. {
  274. return this->m_materialType;
  275. }
  276. void effect::OnSetConstants (irr::video::IMaterialRendererServices* services, int32_t userData)
  277. {
  278. irr::f32 g_Texture0 = 0;
  279. irr::f32 g_Texture1 = 1;
  280. irr::f32 g_Texture2 = 2;
  281. irr::f32 g_Texture3 = 3;
  282. irr::f32 g_Texture4 = 4;
  283. irr::f32 g_Texture5 = 5;
  284. irr::f32 g_Texture6 = 6;
  285. irr::f32 g_Texture7 = 7;
  286. irr::f32 g_Texture0Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  287. irr::f32 g_Texture1Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  288. irr::f32 g_Texture2Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  289. irr::f32 g_Texture3Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  290. irr::f32 g_Texture4Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  291. irr::f32 g_Texture5Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  292. irr::f32 g_Texture6Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  293. irr::f32 g_Texture7Rotation [4] = { this->m_parent->getAngles ().X, this->m_parent->getAngles ().Y, this->m_parent->getAngles ().Z, this->m_parent->getAngles ().Z};
  294. irr::f32 g_Texture0Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  295. irr::f32 g_Texture1Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  296. irr::f32 g_Texture2Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  297. irr::f32 g_Texture3Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  298. irr::f32 g_Texture4Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  299. irr::f32 g_Texture5Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  300. irr::f32 g_Texture6Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  301. irr::f32 g_Texture7Resolution [4] = { this->m_parent->getSize ().X, this->m_parent->getSize ().Y, this->m_parent->getSize ().X, this->m_parent->getSize ().Y};
  302. irr::video::IVideoDriver* driver = services->getVideoDriver ();
  303. irr::core::matrix4 worldViewProj;
  304. worldViewProj = driver->getTransform(irr::video::ETS_PROJECTION);
  305. worldViewProj *= driver->getTransform(irr::video::ETS_VIEW);
  306. worldViewProj *= driver->getTransform(irr::video::ETS_WORLD);
  307. /*
  308. THESE ARE THE VARIABLES AVAILABLE ON SHADERS
  309. uniform float g_Alpha;
  310. uniform vec3 g_Color;
  311. // Application time, starts with 0
  312. uniform float g_Time;
  313. // Maps 24 hrs to [0, 1]
  314. uniform float g_Daytime;
  315. uniform vec2 g_TexelSize;
  316. uniform vec2 g_TexelSizeHalf;
  317. uniform mat4 g_ModelMatrix;
  318. uniform mat4 g_ViewProjectionMatrix;
  319. uniform mat4 g_ModelViewProjectionMatrix;
  320. uniform mat4 g_ModelViewProjectionMatrixInverse;
  321. uniform vec3 g_EyePosition;
  322. uniform vec3 g_ViewUp;
  323. uniform vec3 g_ViewRight;
  324. // Samplers that map to the textures[] array in the material
  325. uniform sampler2D g_Texture0;
  326. uniform sampler2D g_Texture1;
  327. uniform sampler2D g_Texture2;
  328. uniform sampler2D g_Texture3;
  329. uniform sampler2D g_Texture4;
  330. uniform sampler2D g_Texture5;
  331. uniform sampler2D g_Texture6;
  332. uniform sampler2D g_Texture7;
  333. // For sprite sheets (GIFs)
  334. uniform vec4 g_Texture0Rotation;
  335. uniform vec4 g_Texture1Rotation;
  336. uniform vec4 g_Texture2Rotation;
  337. uniform vec4 g_Texture3Rotation;
  338. uniform vec4 g_Texture4Rotation;
  339. uniform vec4 g_Texture5Rotation;
  340. uniform vec4 g_Texture6Rotation;
  341. uniform vec4 g_Texture7Rotation;
  342. uniform vec2 g_Texture0Translation;
  343. uniform vec2 g_Texture1Translation;
  344. uniform vec2 g_Texture2Translation;
  345. uniform vec2 g_Texture3Translation;
  346. uniform vec2 g_Texture4Translation;
  347. uniform vec2 g_Texture5Translation;
  348. uniform vec2 g_Texture6Translation;
  349. uniform vec2 g_Texture7Translation;
  350. uniform vec4 g_LightsColorRadius[4]; // color in XYZ, radius in W
  351. uniform vec3 g_LightsPosition[4];
  352. uniform vec3 g_LightAmbientColor;
  353. uniform vec3 g_LightSkylightColor;
  354. // lower frequencies at lower indices
  355. uniform float g_AudioSpectrum16Left[16];
  356. uniform float g_AudioSpectrum16Right[16];
  357. uniform float g_AudioSpectrum32Left[32];
  358. uniform float g_AudioSpectrum32Right[32];
  359. uniform float g_AudioSpectrum64Left[64];
  360. uniform float g_AudioSpectrum64Right[64];
  361. // Normalized in UV space [0, 1]
  362. uniform vec2 g_PointerPosition;
  363. */
  364. services->setVertexShaderConstant ("g_Time", &g_Time, 1);
  365. services->setPixelShaderConstant ("g_Time", &g_Time, 1);
  366. std::map<std::string, ShaderParameter*>::const_iterator vertcur = this->m_vertexVariables.begin ();
  367. std::map<std::string, ShaderParameter*>::const_iterator vertend = this->m_vertexVariables.end ();
  368. for (; vertcur != vertend; vertcur ++)
  369. {
  370. switch ((*vertcur).second->type)
  371. {
  372. case ParameterType::TYPE_FLOAT:
  373. services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 1);
  374. break;
  375. case ParameterType::TYPE_VEC2:
  376. services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 2);
  377. break;
  378. case ParameterType::TYPE_VEC3:
  379. services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 3);
  380. break;
  381. case ParameterType::TYPE_VEC4:
  382. services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::f32*) (*vertcur).second->value, 4);
  383. break;
  384. case ParameterType::TYPE_INT:
  385. services->setVertexShaderConstant ((*vertcur).first.c_str (), (irr::s32*) (*vertcur).second->value, 1);
  386. break;
  387. }
  388. }
  389. std::map<std::string, ShaderParameter*>::const_iterator pixelcur = this->m_pixelVariables.begin ();
  390. std::map<std::string, ShaderParameter*>::const_iterator pixelend = this->m_pixelVariables.end ();
  391. for (; pixelcur != pixelend; pixelcur ++)
  392. {
  393. switch ((*pixelcur).second->type)
  394. {
  395. case ParameterType::TYPE_FLOAT:
  396. services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 1);
  397. break;
  398. case ParameterType::TYPE_VEC2:
  399. services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 2);
  400. break;
  401. case ParameterType::TYPE_VEC3:
  402. services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 3);
  403. break;
  404. case ParameterType::TYPE_VEC4:
  405. services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::f32*) (*pixelcur).second->value, 4);
  406. break;
  407. case ParameterType::TYPE_INT:
  408. services->setPixelShaderConstant ((*pixelcur).first.c_str (), (irr::s32*) (*pixelcur).second->value, 1);
  409. break;
  410. }
  411. }
  412. services->setVertexShaderConstant ("g_ModelViewProjectionMatrix", worldViewProj.pointer(), 16);
  413. services->setVertexShaderConstant ("g_Texture0Resolution", g_Texture0Resolution, 4);
  414. services->setVertexShaderConstant ("g_Texture1Resolution", g_Texture1Resolution, 4);
  415. services->setVertexShaderConstant ("g_Texture2Resolution", g_Texture2Resolution, 4);
  416. services->setVertexShaderConstant ("g_Texture3Resolution", g_Texture3Resolution, 4);
  417. services->setVertexShaderConstant ("g_Texture4Resolution", g_Texture4Resolution, 4);
  418. services->setVertexShaderConstant ("g_Texture5Resolution", g_Texture5Resolution, 4);
  419. services->setVertexShaderConstant ("g_Texture6Resolution", g_Texture6Resolution, 4);
  420. services->setVertexShaderConstant ("g_Texture7Resolution", g_Texture7Resolution, 4);
  421. services->setVertexShaderConstant ("g_Texture0Rotation", g_Texture0Rotation, 4);
  422. services->setVertexShaderConstant ("g_Texture1Rotation", g_Texture1Rotation, 4);
  423. services->setVertexShaderConstant ("g_Texture2Rotation", g_Texture2Rotation, 4);
  424. services->setVertexShaderConstant ("g_Texture3Rotation", g_Texture3Rotation, 4);
  425. services->setVertexShaderConstant ("g_Texture4Rotation", g_Texture4Rotation, 4);
  426. services->setVertexShaderConstant ("g_Texture5Rotation", g_Texture5Rotation, 4);
  427. services->setVertexShaderConstant ("g_Texture6Rotation", g_Texture6Rotation, 4);
  428. services->setVertexShaderConstant ("g_Texture7Rotation", g_Texture7Rotation, 4);
  429. services->setPixelShaderConstant ("g_Texture0", &g_Texture0, 1);
  430. services->setPixelShaderConstant ("g_Texture1", &g_Texture1, 1);
  431. services->setPixelShaderConstant ("g_Texture2", &g_Texture2, 1);
  432. services->setPixelShaderConstant ("g_Texture3", &g_Texture3, 1);
  433. services->setPixelShaderConstant ("g_Texture4", &g_Texture4, 1);
  434. services->setPixelShaderConstant ("g_Texture5", &g_Texture5, 1);
  435. services->setPixelShaderConstant ("g_Texture6", &g_Texture6, 1);
  436. services->setPixelShaderConstant ("g_Texture7", &g_Texture7, 1);
  437. }
  438. };