CObject.cpp 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. #include "CObject.h"
  2. #include <utility>
  3. #include "WallpaperEngine/Core/UserSettings/CUserSettingBoolean.h"
  4. #include "WallpaperEngine/Core/Objects/CImage.h"
  5. #include "WallpaperEngine/Core/Objects/CSound.h"
  6. #include "WallpaperEngine/Core/Objects/CParticle.h"
  7. #include "WallpaperEngine/Core/CScene.h"
  8. #include "WallpaperEngine/Core/CProject.h"
  9. #include "WallpaperEngine/Assets/CContainer.h"
  10. using namespace WallpaperEngine::Core;
  11. using namespace WallpaperEngine::Assets;
  12. using namespace WallpaperEngine::Core::UserSettings;
  13. CObject::CObject (
  14. CScene* scene,
  15. CUserSettingBoolean* visible,
  16. uint32_t id,
  17. std::string name,
  18. std::string type,
  19. const glm::vec3& origin,
  20. const glm::vec3& scale,
  21. const glm::vec3& angles) :
  22. m_scene (scene),
  23. m_visible (visible),
  24. m_id (id),
  25. m_name (std::move(name)),
  26. m_type (std::move(type)),
  27. m_origin (origin),
  28. m_scale (scale),
  29. m_angles (angles)
  30. {
  31. }
  32. CObject* CObject::fromJSON (json data, CScene* scene, const CContainer* container)
  33. {
  34. std::string json = data.dump ();
  35. auto id_it = jsonFindRequired (data, "id", "Objects must have id");
  36. auto visible = jsonFindUserConfig <CUserSettingBoolean, bool> (data, "visible", true);
  37. auto origin_val = jsonFindDefault <std::string> (data, "origin", "0.0 0.0 0.0");
  38. auto scale_val = jsonFindDefault <std::string> (data, "scale", "0.0 0.0 0.0");
  39. auto angles_val = jsonFindDefault <std::string> (data, "angles", "0.0 0.0 0.0");
  40. auto name_it = jsonFindRequired (data, "name", "Objects must have name");
  41. auto effects_it = data.find ("effects");
  42. auto dependencies_it = data.find ("dependencies");
  43. auto image_it = data.find ("image");
  44. auto sound_it = data.find ("sound");
  45. auto particle_it = data.find ("particle");
  46. auto text_it = data.find ("text");
  47. auto light_it = data.find ("light");
  48. CObject* object = nullptr;
  49. if (image_it != data.end () && (*image_it).is_null () == false)
  50. {
  51. object = Objects::CImage::fromJSON (
  52. scene,
  53. data,
  54. container,
  55. visible,
  56. *id_it,
  57. *name_it,
  58. WallpaperEngine::Core::aToVector3 (origin_val),
  59. WallpaperEngine::Core::aToVector3 (scale_val),
  60. WallpaperEngine::Core::aToVector3 (angles_val)
  61. );
  62. }
  63. else if (sound_it != data.end () && (*sound_it).is_null () == false)
  64. {
  65. object = Objects::CSound::fromJSON (
  66. scene,
  67. data,
  68. visible,
  69. *id_it,
  70. *name_it,
  71. WallpaperEngine::Core::aToVector3 (origin_val),
  72. WallpaperEngine::Core::aToVector3 (scale_val),
  73. WallpaperEngine::Core::aToVector3 (angles_val)
  74. );
  75. }
  76. else if (particle_it != data.end () && (*particle_it).is_null () == false)
  77. {
  78. /// TODO: XXXHACK -- TO REMOVE WHEN PARTICLE SUPPORT IS PROPERLY IMPLEMENTED
  79. try
  80. {
  81. object = Objects::CParticle::fromFile (
  82. scene,
  83. (*particle_it).get <std::string> (),
  84. container,
  85. visible,
  86. *id_it,
  87. *name_it,
  88. WallpaperEngine::Core::aToVector3 (origin_val),
  89. WallpaperEngine::Core::aToVector3 (scale_val)
  90. );
  91. }
  92. catch (std::runtime_error ex)
  93. {
  94. return nullptr;
  95. }
  96. }
  97. else if (text_it != data.end () && (*text_it).is_null () == false)
  98. {
  99. /// TODO: XXXHACK -- TO REMOVE WHEN TEXT SUPPORT IS IMPLEMENTED
  100. return nullptr;
  101. }
  102. else if (light_it != data.end () && (*light_it).is_null () == false)
  103. {
  104. /// TODO: XXXHACK -- TO REMOVE WHEN LIGHT SUPPORT IS IMPLEMENTED
  105. return nullptr;
  106. }
  107. else
  108. {
  109. throw std::runtime_error (std::string ("Unkonwn object type detected ").append (*name_it));
  110. }
  111. if (effects_it != data.end () && (*effects_it).is_array () == true)
  112. {
  113. auto cur = (*effects_it).begin ();
  114. auto end = (*effects_it).end ();
  115. for (; cur != end; cur ++)
  116. {
  117. auto effectVisible_it = data.find ("visible");
  118. CUserSettingBoolean* effectVisible;
  119. if (effectVisible_it == data.end ())
  120. effectVisible = CUserSettingBoolean::fromScalar (true);
  121. else
  122. effectVisible = CUserSettingBoolean::fromJSON (*effectVisible_it);
  123. object->insertEffect (
  124. Objects::CEffect::fromJSON (*cur, effectVisible, object, container)
  125. );
  126. }
  127. }
  128. if (dependencies_it != data.end () && (*dependencies_it).is_array () == true)
  129. {
  130. auto cur = (*dependencies_it).begin ();
  131. auto end = (*dependencies_it).end ();
  132. for (; cur != end; cur ++)
  133. {
  134. object->insertDependency (*cur);
  135. }
  136. }
  137. return object;
  138. }
  139. const glm::vec3& CObject::getOrigin () const
  140. {
  141. return this->m_origin;
  142. }
  143. const glm::vec3& CObject::getScale () const
  144. {
  145. return this->m_scale;
  146. }
  147. const glm::vec3& CObject::getAngles () const
  148. {
  149. return this->m_angles;
  150. }
  151. const std::string& CObject::getName () const
  152. {
  153. return this->m_name;
  154. }
  155. const std::vector<Objects::CEffect*>& CObject::getEffects () const
  156. {
  157. return this->m_effects;
  158. }
  159. const std::vector<uint32_t>& CObject::getDependencies () const
  160. {
  161. return this->m_dependencies;
  162. }
  163. const bool CObject::isVisible () const
  164. {
  165. // TODO: cache this
  166. return this->m_visible->processValue (this->getScene ()->getProject ()->getProperties ());
  167. }
  168. CScene* CObject::getScene () const
  169. {
  170. return this->m_scene;
  171. }
  172. const int CObject::getId () const
  173. {
  174. return this->m_id;
  175. }
  176. void CObject::insertEffect (Objects::CEffect* effect)
  177. {
  178. this->m_effects.push_back (effect);
  179. }
  180. void CObject::insertDependency (uint32_t dependency)
  181. {
  182. this->m_dependencies.push_back (dependency);
  183. }