BsSceneObjectRTTI.h 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsSceneObject.h"
  5. #include "BsGameObjectHandle.h"
  6. #include "BsGameObjectManager.h"
  7. #include "BsComponent.h"
  8. #include "BsPrefabDiff.h"
  9. namespace BansheeEngine
  10. {
  11. class BS_CORE_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, GameObject, SceneObjectRTTI>
  12. {
  13. private:
  14. struct DeserializationData
  15. {
  16. DeserializationData(bool isDeserializationParent)
  17. :isDeserializationParent(isDeserializationParent)
  18. { }
  19. bool isDeserializationParent;
  20. };
  21. Vector3& getPosition(SceneObject* obj) { return obj->mPosition; }
  22. void setPosition(SceneObject* obj, Vector3& value) { obj->mPosition = value; }
  23. Quaternion& getRotation(SceneObject* obj) { return obj->mRotation; }
  24. void setRotation(SceneObject* obj, Quaternion& value) { obj->mRotation = value; }
  25. Vector3& getScale(SceneObject* obj) { return obj->mScale; }
  26. void setScale(SceneObject* obj, Vector3& value) { obj->mScale = value; }
  27. bool& getActive(SceneObject* obj) { return obj->mActiveSelf; }
  28. void setActive(SceneObject* obj, bool& value) { obj->mActiveSelf = value; }
  29. // NOTE - These can only be set sequentially, specific array index is ignored
  30. std::shared_ptr<SceneObject> getChild(SceneObject* obj, UINT32 idx) { return obj->mChildren[idx].getInternalPtr(); }
  31. void setChild(SceneObject* obj, UINT32 idx, std::shared_ptr<SceneObject> param) { param->setParent(obj->mThisHandle); } // NOTE: Can only be used for sequentially adding elements
  32. UINT32 getNumChildren(SceneObject* obj) { return (UINT32)obj->mChildren.size(); }
  33. void setNumChildren(SceneObject* obj, UINT32 size) { /* DO NOTHING */ }
  34. // NOTE - These can only be set sequentially, specific array index is ignored
  35. std::shared_ptr<Component> getComponent(SceneObject* obj, UINT32 idx) { return obj->mComponents[idx].getInternalPtr(); }
  36. void setComponent(SceneObject* obj, UINT32 idx, std::shared_ptr<Component> param) { obj->addComponentInternal(param); }
  37. UINT32 getNumComponents(SceneObject* obj) { return (UINT32)obj->mComponents.size(); }
  38. void setNumComponents(SceneObject* obj, UINT32 size) { /* DO NOTHING */ }
  39. String& getPrefabLink(SceneObject* obj) { return obj->mPrefabLinkUUID; }
  40. void setPrefabLink(SceneObject* obj, String& value) { obj->mPrefabLinkUUID = value; }
  41. PrefabDiffPtr getPrefabDiff(SceneObject* obj) { return obj->mPrefabDiff; }
  42. void setPrefabDiff(SceneObject* obj, PrefabDiffPtr value) { obj->mPrefabDiff = value; }
  43. UINT32& getFlags(SceneObject* obj) { return obj->mFlags; }
  44. void setFlags(SceneObject* obj, UINT32& value) { obj->mFlags = value; }
  45. UINT32& getPrefabHash(SceneObject* obj) { return obj->mPrefabHash; }
  46. void setPrefabHash(SceneObject* obj, UINT32& value) { obj->mPrefabHash = value; }
  47. public:
  48. SceneObjectRTTI()
  49. {
  50. addReflectablePtrArrayField("mChildren", 0, &SceneObjectRTTI::getChild,
  51. &SceneObjectRTTI::getNumChildren, &SceneObjectRTTI::setChild, &SceneObjectRTTI::setNumChildren);
  52. addReflectablePtrArrayField("mComponents", 1, &SceneObjectRTTI::getComponent,
  53. &SceneObjectRTTI::getNumComponents, &SceneObjectRTTI::setComponent, &SceneObjectRTTI::setNumComponents);
  54. addPlainField("mPrefabLink", 2, &SceneObjectRTTI::getPrefabLink, &SceneObjectRTTI::setPrefabLink);
  55. addPlainField("mFlags", 3, &SceneObjectRTTI::getFlags, &SceneObjectRTTI::setFlags);
  56. addReflectablePtrField("mPrefabDiff", 4, &SceneObjectRTTI::getPrefabDiff, &SceneObjectRTTI::setPrefabDiff);
  57. addPlainField("mPrefabHash", 5, &SceneObjectRTTI::getPrefabHash, &SceneObjectRTTI::setPrefabHash);
  58. addPlainField("mPosition", 6, &SceneObjectRTTI::getPosition, &SceneObjectRTTI::setPosition);
  59. addPlainField("mRotation", 7, &SceneObjectRTTI::getRotation, &SceneObjectRTTI::setRotation);
  60. addPlainField("mScale", 8, &SceneObjectRTTI::getScale, &SceneObjectRTTI::setScale);
  61. addPlainField("mActiveSelf", 9, &SceneObjectRTTI::getActive, &SceneObjectRTTI::setActive);
  62. }
  63. virtual void onDeserializationStarted(IReflectable* obj) override
  64. {
  65. SceneObject* so = static_cast<SceneObject*>(obj);
  66. if (!GameObjectManager::instance().isGameObjectDeserializationActive())
  67. {
  68. GameObjectManager::instance().startDeserialization();
  69. so->mRTTIData = DeserializationData(true);
  70. }
  71. else
  72. so->mRTTIData = DeserializationData(false);
  73. }
  74. virtual void onDeserializationEnded(IReflectable* obj) override
  75. {
  76. SceneObject* so = static_cast<SceneObject*>(obj);
  77. DeserializationData deserializationData = any_cast<DeserializationData>(so->mRTTIData);
  78. if (deserializationData.isDeserializationParent)
  79. {
  80. GameObjectManager::instance().endDeserialization();
  81. if ((so->mFlags & SOF_DontInstantiate) == 0)
  82. so->instantiate();
  83. }
  84. so->mRTTIData = nullptr;
  85. }
  86. virtual const String& getRTTIName() override
  87. {
  88. static String name = "SceneObject";
  89. return name;
  90. }
  91. virtual UINT32 getRTTIId() override
  92. {
  93. return TID_SceneObject;
  94. }
  95. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  96. {
  97. HSceneObject newObject = SceneObject::create("", SOF_DontInstantiate);
  98. return newObject.getInternalPtr();
  99. }
  100. };
  101. }