CImage.cpp 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. #include "CImage.h"
  2. using namespace WallpaperEngine;
  3. using namespace WallpaperEngine::Render::Objects;
  4. extern irr::f32 g_Time;
  5. CImage::CImage (CScene* scene, Core::Objects::CImage* image) :
  6. Render::CObject (scene, Type, image),
  7. m_image (image)
  8. {
  9. // TODO: INITIALIZE NEEDED EFFECTS AND PROPERLY CALCULATE THESE?
  10. irr::f32 xsize = this->m_image->getSize ().X;
  11. irr::f32 ysize = this->m_image->getSize ().Y;
  12. irr::f32 xscale = this->m_image->getScale ().X;
  13. irr::f32 yscale = this->m_image->getScale ().Y;
  14. if (xsize == 0.0f || ysize == 0.0f)
  15. {
  16. xsize = 1920.0f;
  17. ysize = 1080.0f;
  18. this->getScene ()->getContext ()->getDevice ()->getLogger ()->log (
  19. "Initializing xsise and ysize as default values 1920 and 1080",
  20. this->getImage ()->getName ().c_str ()
  21. );
  22. }
  23. irr::core::vector3df cameraCenter = this->getScene ()->getCamera ()->getCenter ();
  24. // take the orthogonal projection into account
  25. irr::f32 scene_width = this->getScene ()->getScene ()->getOrthogonalProjection ()->getWidth ();
  26. irr::f32 scene_height = this->getScene ()->getScene ()->getOrthogonalProjection ()->getHeight ();
  27. irr::f32 xright = (-scene_width / 2.0f + this->m_image->getOrigin ().X + xsize * xscale / 2.0f) + cameraCenter.X;
  28. irr::f32 xleft = (-scene_width / 2.0f + this->m_image->getOrigin ().X - xsize * xscale / 2.0f) + cameraCenter.X;
  29. irr::f32 ytop = (-scene_height / 2.0f + this->m_image->getOrigin ().Y + ysize * yscale / 2.0f) + cameraCenter.Y;
  30. irr::f32 ybottom = (-scene_height / 2.0f + this->m_image->getOrigin ().Y - ysize * yscale / 2.0f) + cameraCenter.Y;
  31. irr::f32 z = this->m_image->getOrigin ().Z;
  32. // top left
  33. this->m_vertex [0].Pos = irr::core::vector3df (xleft, ytop, z);
  34. // top right
  35. this->m_vertex [1].Pos = irr::core::vector3df (xright, ytop, z);
  36. // bottom right
  37. this->m_vertex [2].Pos = irr::core::vector3df (xright, ybottom, z);
  38. // bottom left
  39. this->m_vertex [3].Pos = irr::core::vector3df (xleft, ybottom, z);
  40. this->m_vertex [0].TCoords = irr::core::vector2df (1.0f, 0.0f);
  41. this->m_vertex [1].TCoords = irr::core::vector2df (0.0f, 0.0f);
  42. this->m_vertex [2].TCoords = irr::core::vector2df (0.0f, 1.0f);
  43. this->m_vertex [3].TCoords = irr::core::vector2df (1.0f, 1.0f);
  44. this->m_vertex [0].Color = irr::video::SColor (255, 255, 255, 255);
  45. this->m_vertex [1].Color = irr::video::SColor (255, 255, 255, 255);
  46. this->m_vertex [2].Color = irr::video::SColor (255, 255, 255, 255);
  47. this->m_vertex [3].Color = irr::video::SColor (255, 255, 255, 255);
  48. this->setAutomaticCulling (irr::scene::EAC_OFF);
  49. this->m_boundingBox = irr::core::aabbox3d<irr::f32>(0, 0, 0, 0, 0, 0);
  50. // load the texture in the main material
  51. irr::io::path texturepath = this->getScene ()->getContext ()->resolveMaterials (
  52. (*(*this->m_image->getMaterial ()->getPasses ().begin ())->getTextures ().begin ())
  53. );
  54. irr::video::ITexture *texture = this->getScene ()->getContext ()->getDevice ()->getVideoDriver ()->getTexture (texturepath);
  55. this->m_material = new Render::Objects::Effects::CMaterial (this->getScene ()->getContext (), this, this->m_image->getMaterial (), texture);
  56. auto effectsCur = this->m_image->getEffects ().begin ();
  57. auto effectsEnd = this->m_image->getEffects ().end ();
  58. texture = this->m_material->getOutputTexture ();
  59. for (; effectsCur != effectsEnd; effectsCur ++)
  60. {
  61. CEffect* effect = new CEffect (this, *effectsCur, this->getScene ()->getContext (), texture);
  62. this->m_effects.push_back (effect);
  63. texture = effect->getOutputTexture ();
  64. }
  65. this->generateMaterial (texture);
  66. }
  67. void CImage::render()
  68. {
  69. uint16_t indices [] =
  70. {
  71. 3, 2, 1, 0
  72. };
  73. irr::video::IVideoDriver* driver = SceneManager->getVideoDriver ();
  74. // first render the base material
  75. this->m_material->render ();
  76. // now render all the effects, they should already be linked to each other
  77. auto effectCur = this->m_effects.begin ();
  78. auto effectEnd = this->m_effects.end ();
  79. for (; effectCur != effectEnd; effectCur ++)
  80. {
  81. (*effectCur)->render ();
  82. }
  83. // set render target to the screen
  84. driver->setRenderTarget (irr::video::ERT_FRAME_BUFFER, false, false);
  85. // set the material to use
  86. driver->setMaterial (this->m_irrlichtMaterial);
  87. // draw it
  88. driver->drawVertexPrimitiveList (
  89. this->m_vertex, 4, indices, 1,
  90. irr::video::EVT_STANDARD, irr::scene::EPT_QUADS, irr::video::EIT_16BIT
  91. );
  92. }
  93. void CImage::generateMaterial (irr::video::ITexture* resultTexture)
  94. {
  95. this->m_irrlichtMaterial.setTexture (0, resultTexture);
  96. this->m_irrlichtMaterial.MaterialType = irr::video::EMT_TRANSPARENT_ALPHA_CHANNEL;
  97. this->m_irrlichtMaterial.setFlag (irr::video::EMF_LIGHTING, false);
  98. this->m_irrlichtMaterial.setFlag (irr::video::EMF_BLEND_OPERATION, true);
  99. this->m_irrlichtMaterial.Wireframe = false;
  100. this->m_irrlichtMaterial.Lighting = false;
  101. }
  102. const irr::core::aabbox3d<irr::f32>& CImage::getBoundingBox() const
  103. {
  104. return this->m_boundingBox;
  105. }
  106. const Core::Objects::CImage* CImage::getImage () const
  107. {
  108. return this->m_image;
  109. }
  110. const std::vector<CEffect*>& CImage::getEffects () const
  111. {
  112. return this->m_effects;
  113. }
  114. const irr::video::S3DVertex* CImage::getVertex () const
  115. {
  116. return this->m_vertex;
  117. }
  118. const std::string CImage::Type = "image";