CObject.cpp 5.3 KB

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