CImage.cpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. #include "CImage.h"
  2. #include "WallpaperEngine/Render/Shaders/Compiler.h"
  3. #include "WallpaperEngine/Render/Shaders/Parameters/CShaderParameter.h"
  4. #include "WallpaperEngine/Render/Shaders/Parameters/CShaderParameterFloat.h"
  5. #include "WallpaperEngine/Render/Shaders/Parameters/CShaderParameterInteger.h"
  6. #include "WallpaperEngine/Render/Shaders/Parameters/CShaderParameterVector2.h"
  7. #include "WallpaperEngine/Render/Shaders/Parameters/CShaderParameterVector3.h"
  8. #include "WallpaperEngine/Render/Shaders/Parameters/CShaderParameterVector4.h"
  9. using namespace WallpaperEngine;
  10. using namespace WallpaperEngine::Render::Objects;
  11. using namespace WallpaperEngine::Render::Shaders::Parameters;
  12. extern irr::f32 g_Time;
  13. CImage::CImage (CScene* scene, Core::Objects::CImage* image) :
  14. Render::CObject (scene, Type, image),
  15. m_image (image)
  16. {
  17. // TODO: INITIALIZE NEEDED EFFECTS AND PROPERLY CALCULATE THESE?
  18. irr::f32 xright = this->m_image->getOrigin ()->X;
  19. irr::f32 xleft = -this->m_image->getOrigin ()->X;
  20. irr::f32 ztop = this->m_image->getOrigin ()->Y;
  21. irr::f32 zbottom = -this->m_image->getOrigin ()->Y;
  22. irr::f32 z = this->getScene ()->getCamera ()->getEye ()->Z;
  23. // top left
  24. this->m_vertex [0].Pos = irr::core::vector3df (xleft, ztop, z);
  25. // top right
  26. this->m_vertex [1].Pos = irr::core::vector3df (xright, ztop, z);
  27. // bottom right
  28. this->m_vertex [2].Pos = irr::core::vector3df (xright, zbottom, z);
  29. // bottom left
  30. this->m_vertex [3].Pos = irr::core::vector3df (xleft, zbottom, z);
  31. this->m_vertex [0].TCoords = irr::core::vector2df (1.0f, 0.0f);
  32. this->m_vertex [1].TCoords = irr::core::vector2df (0.0f, 0.0f);
  33. this->m_vertex [2].TCoords = irr::core::vector2df (0.0f, 1.0f);
  34. this->m_vertex [3].TCoords = irr::core::vector2df (1.0f, 1.0f);
  35. this->m_vertex [0].Color = irr::video::SColor (255, 255, 255, 255);
  36. this->m_vertex [1].Color = irr::video::SColor (255, 255, 255, 255);
  37. this->m_vertex [2].Color = irr::video::SColor (255, 255, 255, 255);
  38. this->m_vertex [3].Color = irr::video::SColor (255, 255, 255, 255);
  39. this->generateMaterial ();
  40. this->setAutomaticCulling (irr::scene::EAC_OFF);
  41. this->m_boundingBox = irr::core::aabbox3d<irr::f32>(0, 0, 0, 0, 0, 0);
  42. }
  43. void CImage::render()
  44. {
  45. uint16_t indices [] =
  46. {
  47. 0, 1, 2, 3
  48. };
  49. irr::video::IVideoDriver* driver = SceneManager->getVideoDriver ();
  50. driver->setMaterial (this->m_material);
  51. driver->drawVertexPrimitiveList (
  52. this->m_vertex, 4, indices, 1,
  53. irr::video::EVT_STANDARD, irr::scene::EPT_QUADS, irr::video::EIT_16BIT
  54. );
  55. }
  56. void CImage::generateMaterial ()
  57. {
  58. if (this->m_image->getMaterial ()->getPasses ()->empty () == true)
  59. return;
  60. // TODO: SUPPORT OBJECT EFFECTS AND MULTIPLE MATERIAL PASSES
  61. Core::Objects::Images::Materials::CPassess* pass = *this->m_image->getMaterial ()->getPasses ()->begin ();
  62. std::string shader = pass->getShader ();
  63. std::vector<std::string>* textures = pass->getTextures ();
  64. std::vector<std::string>::const_iterator cur = textures->begin ();
  65. std::vector<std::string>::const_iterator end = textures->end ();
  66. for (int textureNumber = 0; cur != end; cur ++, textureNumber ++)
  67. {
  68. // TODO: LOOK THIS UP PROPERLY
  69. irr::io::path texturepath = std::string ("materials/" + (*cur) + ".tex").c_str ();
  70. irr::video::ITexture* texture = this->getScene ()->getContext ()->getDevice ()->getVideoDriver ()->getTexture (texturepath);
  71. this->m_material.setTexture (textureNumber, texture);
  72. }
  73. // TODO: MOVE SHADER INITIALIZATION ELSEWHERE
  74. irr::io::path vertpath = std::string ("shaders/" + shader + ".vert").c_str ();
  75. irr::io::path fragpath = std::string ("shaders/" + shader + ".frag").c_str ();
  76. this->m_vertexShader = new Render::Shaders::Compiler (vertpath, Render::Shaders::Compiler::Type::Type_Vertex, pass->getCombos (), false);
  77. this->m_pixelShader = new Render::Shaders::Compiler (fragpath, Render::Shaders::Compiler::Type::Type_Pixel, pass->getCombos (), false);
  78. this->m_material.MaterialType = (irr::video::E_MATERIAL_TYPE)
  79. this->getScene ()->getContext ()->getDevice ()->getVideoDriver ()->getGPUProgrammingServices ()->addHighLevelShaderMaterial (
  80. this->m_vertexShader->precompile ().c_str (), "main", irr::video::EVST_VS_2_0,
  81. this->m_pixelShader->precompile ().c_str (), "main", irr::video::EPST_PS_2_0,
  82. this, irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL, 0, irr::video::EGSL_DEFAULT
  83. );
  84. // this->m_material.MaterialType = irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL;
  85. this->m_material.setFlag (irr::video::EMF_LIGHTING, false);
  86. this->m_material.setFlag (irr::video::EMF_BLEND_OPERATION, true);
  87. }
  88. const irr::core::aabbox3d<irr::f32>& CImage::getBoundingBox() const
  89. {
  90. return this->m_boundingBox;
  91. }
  92. void CImage::OnRegisterSceneNode ()
  93. {
  94. if (this->m_image->isVisible () == true)
  95. SceneManager->registerNodeForRendering (this);
  96. ISceneNode::OnRegisterSceneNode ();
  97. }
  98. void CImage::OnSetConstants (irr::video::IMaterialRendererServices *services, int32_t userData)
  99. {
  100. irr::f32 g_Texture0 = 0;
  101. irr::f32 g_Texture1 = 1;
  102. irr::f32 g_Texture2 = 2;
  103. irr::f32 g_Texture3 = 3;
  104. irr::f32 g_Texture4 = 4;
  105. irr::f32 g_Texture5 = 5;
  106. irr::f32 g_Texture6 = 6;
  107. irr::f32 g_Texture7 = 7;
  108. irr::f32 g_Texture0Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  109. irr::f32 g_Texture1Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  110. irr::f32 g_Texture2Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  111. irr::f32 g_Texture3Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  112. irr::f32 g_Texture4Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  113. irr::f32 g_Texture5Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  114. irr::f32 g_Texture6Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  115. irr::f32 g_Texture7Rotation [4] = { this->m_image->getAngles ()->X, this->m_image->getAngles ()->Y, this->m_image->getAngles ()->Z, this->m_image->getAngles ()->Z};
  116. irr::f32 g_Texture0Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  117. irr::f32 g_Texture1Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  118. irr::f32 g_Texture2Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  119. irr::f32 g_Texture3Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  120. irr::f32 g_Texture4Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  121. irr::f32 g_Texture5Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  122. irr::f32 g_Texture6Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  123. irr::f32 g_Texture7Resolution [4] = { this->m_image->getSize ()->X, this->m_image->getSize ()->Y, this->m_image->getSize ()->X, this->m_image->getSize ()->Y};
  124. irr::video::IVideoDriver* driver = services->getVideoDriver ();
  125. irr::core::matrix4 worldViewProj;worldViewProj.makeIdentity();
  126. worldViewProj = driver->getTransform(irr::video::ETS_PROJECTION);
  127. worldViewProj *= driver->getTransform(irr::video::ETS_VIEW);
  128. worldViewProj *= driver->getTransform(irr::video::ETS_WORLD);
  129. std::vector<Render::Shaders::Parameters::CShaderParameter*>::const_iterator cur = this->m_vertexShader->getParameters ().begin ();
  130. std::vector<Render::Shaders::Parameters::CShaderParameter*>::const_iterator end = this->m_vertexShader->getParameters ().end ();
  131. for (; cur != end; cur ++)
  132. {
  133. if ((*cur)->Is <CShaderParameterInteger> () == true)
  134. {
  135. services->setVertexShaderConstant (
  136. (*cur)->getName ().c_str (),
  137. (irr::s32*) (*cur)->getValue (),
  138. (*cur)->getSize ()
  139. );
  140. }
  141. else if (
  142. (*cur)->Is <CShaderParameterFloat> () == true ||
  143. (*cur)->Is <CShaderParameterVector2> () == true ||
  144. (*cur)->Is <CShaderParameterVector3> () == true ||
  145. (*cur)->Is <CShaderParameterVector4> () == true)
  146. {
  147. services->setVertexShaderConstant (
  148. (*cur)->getName ().c_str (),
  149. (irr::f32*) (*cur)->getValue (),
  150. (*cur)->getSize ()
  151. );
  152. }
  153. }
  154. cur = this->m_pixelShader->getParameters ().begin ();
  155. end = this->m_pixelShader->getParameters ().end ();
  156. for (; cur != end; cur ++)
  157. {
  158. if ((*cur)->Is <CShaderParameterInteger> () == true)
  159. {
  160. services->setPixelShaderConstant (
  161. (*cur)->getName ().c_str (),
  162. (irr::s32*) (*cur)->getValue (),
  163. (*cur)->getSize ()
  164. );
  165. }
  166. else if (
  167. (*cur)->Is <CShaderParameterFloat> () == true ||
  168. (*cur)->Is <CShaderParameterVector2> () == true ||
  169. (*cur)->Is <CShaderParameterVector3> () == true ||
  170. (*cur)->Is <CShaderParameterVector4> () == true)
  171. {
  172. services->setPixelShaderConstant (
  173. (*cur)->getName ().c_str (),
  174. (irr::f32*) (*cur)->getValue (),
  175. (*cur)->getSize ()
  176. );
  177. }
  178. }
  179. services->setVertexShaderConstant ("g_Time", &g_Time, 1);
  180. services->setPixelShaderConstant ("g_Time", &g_Time, 1);
  181. services->setVertexShaderConstant ("g_ModelViewProjectionMatrix", worldViewProj.pointer(), 16);
  182. services->setVertexShaderConstant ("g_Texture0Resolution", g_Texture0Resolution, 4);
  183. services->setVertexShaderConstant ("g_Texture1Resolution", g_Texture1Resolution, 4);
  184. services->setVertexShaderConstant ("g_Texture2Resolution", g_Texture2Resolution, 4);
  185. services->setVertexShaderConstant ("g_Texture3Resolution", g_Texture3Resolution, 4);
  186. services->setVertexShaderConstant ("g_Texture4Resolution", g_Texture4Resolution, 4);
  187. services->setVertexShaderConstant ("g_Texture5Resolution", g_Texture5Resolution, 4);
  188. services->setVertexShaderConstant ("g_Texture6Resolution", g_Texture6Resolution, 4);
  189. services->setVertexShaderConstant ("g_Texture7Resolution", g_Texture7Resolution, 4);
  190. services->setVertexShaderConstant ("g_Texture0Rotation", g_Texture0Rotation, 4);
  191. services->setVertexShaderConstant ("g_Texture1Rotation", g_Texture1Rotation, 4);
  192. services->setVertexShaderConstant ("g_Texture2Rotation", g_Texture2Rotation, 4);
  193. services->setVertexShaderConstant ("g_Texture3Rotation", g_Texture3Rotation, 4);
  194. services->setVertexShaderConstant ("g_Texture4Rotation", g_Texture4Rotation, 4);
  195. services->setVertexShaderConstant ("g_Texture5Rotation", g_Texture5Rotation, 4);
  196. services->setVertexShaderConstant ("g_Texture6Rotation", g_Texture6Rotation, 4);
  197. services->setVertexShaderConstant ("g_Texture7Rotation", g_Texture7Rotation, 4);
  198. services->setPixelShaderConstant ("g_Texture0", &g_Texture0, 1);
  199. services->setPixelShaderConstant ("g_Texture1", &g_Texture1, 1);
  200. services->setPixelShaderConstant ("g_Texture2", &g_Texture2, 1);
  201. services->setPixelShaderConstant ("g_Texture3", &g_Texture3, 1);
  202. services->setPixelShaderConstant ("g_Texture4", &g_Texture4, 1);
  203. services->setPixelShaderConstant ("g_Texture5", &g_Texture5, 1);
  204. services->setPixelShaderConstant ("g_Texture6", &g_Texture6, 1);
  205. services->setPixelShaderConstant ("g_Texture7", &g_Texture7, 1);
  206. }
  207. const std::string CImage::Type = "image";