BsSceneObjectRTTI.h 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. namespace BansheeEngine
  9. {
  10. class BS_CORE_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, GameObject, SceneObjectRTTI>
  11. {
  12. private:
  13. struct DeserializationData
  14. {
  15. DeserializationData(bool isDeserializationParent)
  16. :isDeserializationParent(isDeserializationParent)
  17. { }
  18. bool isDeserializationParent;
  19. };
  20. // NOTE - These can only be set sequentially, specific array index is ignored
  21. std::shared_ptr<SceneObject> getChild(SceneObject* obj, UINT32 idx) { return obj->mChildren[idx].getInternalPtr(); }
  22. void setChild(SceneObject* obj, UINT32 idx, std::shared_ptr<SceneObject> param) { param->setParent(obj->mThisHandle); } // NOTE: Can only be used for sequentially adding elements
  23. UINT32 getNumChildren(SceneObject* obj) { return (UINT32)obj->mChildren.size(); }
  24. void setNumChildren(SceneObject* obj, UINT32 size) { /* DO NOTHING */ }
  25. // NOTE - These can only be set sequentially, specific array index is ignored
  26. std::shared_ptr<Component> getComponent(SceneObject* obj, UINT32 idx) { return obj->mComponents[idx].getInternalPtr(); }
  27. void setComponent(SceneObject* obj, UINT32 idx, std::shared_ptr<Component> param) { obj->addComponentInternal(param); }
  28. UINT32 getNumComponents(SceneObject* obj) { return (UINT32)obj->mComponents.size(); }
  29. void setNumComponents(SceneObject* obj, UINT32 size) { /* DO NOTHING */ }
  30. HPrefab& getPrefabLink(SceneObject* obj) { return obj->mPrefabLink; }
  31. void setPrefabLink(SceneObject* obj, HPrefab& value) { obj->mPrefabLink = value; }
  32. UINT32& getFlags(SceneObject* obj) { return obj->mFlags; }
  33. void setFlags(SceneObject* obj, UINT32& value) { obj->mFlags = value; }
  34. public:
  35. SceneObjectRTTI()
  36. {
  37. addReflectablePtrArrayField("mChildren", 0, &SceneObjectRTTI::getChild,
  38. &SceneObjectRTTI::getNumChildren, &SceneObjectRTTI::setChild, &SceneObjectRTTI::setNumChildren);
  39. addReflectablePtrArrayField("mComponents", 1, &SceneObjectRTTI::getComponent,
  40. &SceneObjectRTTI::getNumComponents, &SceneObjectRTTI::setComponent, &SceneObjectRTTI::setNumComponents);
  41. addReflectableField("mPrefabLink", 2, &SceneObjectRTTI::getPrefabLink, &SceneObjectRTTI::setPrefabLink);
  42. addPlainField("mFlags", 3, &SceneObjectRTTI::getFlags, &SceneObjectRTTI::setFlags);
  43. }
  44. virtual void onDeserializationStarted(IReflectable* obj) override
  45. {
  46. SceneObject* so = static_cast<SceneObject*>(obj);
  47. if (!GameObjectManager::instance().isGameObjectDeserializationActive())
  48. {
  49. GameObjectManager::instance().startDeserialization();
  50. so->mRTTIData = DeserializationData(true);
  51. }
  52. else
  53. so->mRTTIData = DeserializationData(false);
  54. }
  55. virtual void onDeserializationEnded(IReflectable* obj) override
  56. {
  57. SceneObject* so = static_cast<SceneObject*>(obj);
  58. DeserializationData deserializationData = any_cast<DeserializationData>(so->mRTTIData);
  59. if (deserializationData.isDeserializationParent)
  60. {
  61. GameObjectManager::instance().endDeserialization();
  62. if ((so->mFlags & SOF_DontInstantiate) == 0)
  63. so->instantiate();
  64. }
  65. so->mRTTIData = nullptr;
  66. }
  67. virtual const String& getRTTIName() override
  68. {
  69. static String name = "SceneObject";
  70. return name;
  71. }
  72. virtual UINT32 getRTTIId() override
  73. {
  74. return TID_SceneObject;
  75. }
  76. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  77. {
  78. HSceneObject newObject = SceneObject::create("", SOF_DontInstantiate);
  79. return newObject.getInternalPtr();
  80. }
  81. };
  82. }