BsSceneObjectRTTI.h 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsSceneObject.h"
  5. #include "BsGameObjectHandle.h"
  6. #include "BsGameObjectManager.h"
  7. namespace BansheeEngine
  8. {
  9. class BS_CORE_EXPORT SceneObjectRTTI : public RTTIType<SceneObject, GameObject, SceneObjectRTTI>
  10. {
  11. private:
  12. struct DeserializationData
  13. {
  14. DeserializationData(bool isDeserializationParent)
  15. :isDeserializationParent(isDeserializationParent)
  16. { }
  17. bool isDeserializationParent;
  18. };
  19. // NOTE - These can only be set sequentially, specific array index is ignored
  20. std::shared_ptr<SceneObject> getChild(SceneObject* obj, UINT32 idx) { return obj->mChildren[idx].getInternalPtr(); }
  21. void setChild(SceneObject* obj, UINT32 idx, std::shared_ptr<SceneObject> param) { param->setParent(obj->mThisHandle); } // NOTE: Can only be used for sequentially adding elements
  22. UINT32 getNumChildren(SceneObject* obj) { return (UINT32)obj->mChildren.size(); }
  23. void setNumChildren(SceneObject* obj, UINT32 size) { /* DO NOTHING */ }
  24. // NOTE - These can only be set sequentially, specific array index is ignored
  25. std::shared_ptr<Component> getComponent(SceneObject* obj, UINT32 idx) { return obj->mComponents[idx].getInternalPtr(); }
  26. void setComponent(SceneObject* obj, UINT32 idx, std::shared_ptr<Component> param) { obj->addComponentInternal(param); }
  27. UINT32 getNumComponents(SceneObject* obj) { return (UINT32)obj->mComponents.size(); }
  28. void setNumComponents(SceneObject* obj, UINT32 size) { /* DO NOTHING */ }
  29. public:
  30. SceneObjectRTTI()
  31. {
  32. addReflectablePtrArrayField("mChildren", 0, &SceneObjectRTTI::getChild,
  33. &SceneObjectRTTI::getNumChildren, &SceneObjectRTTI::setChild, &SceneObjectRTTI::setNumChildren);
  34. addReflectablePtrArrayField("mComponents", 1, &SceneObjectRTTI::getComponent,
  35. &SceneObjectRTTI::getNumComponents, &SceneObjectRTTI::setComponent, &SceneObjectRTTI::setNumComponents);
  36. }
  37. virtual void onDeserializationStarted(IReflectable* obj)
  38. {
  39. SceneObject* so = static_cast<SceneObject*>(obj);
  40. if (!GameObjectManager::instance().isGameObjectDeserializationActive())
  41. {
  42. GameObjectManager::instance().startDeserialization();
  43. so->mRTTIData = DeserializationData(true);
  44. }
  45. else
  46. so->mRTTIData = DeserializationData(false);
  47. }
  48. virtual void onDeserializationEnded(IReflectable* obj)
  49. {
  50. SceneObject* so = static_cast<SceneObject*>(obj);
  51. DeserializationData deserializationData = any_cast<DeserializationData>(so->mRTTIData);
  52. if (deserializationData.isDeserializationParent)
  53. GameObjectManager::instance().endDeserialization();
  54. so->mRTTIData = nullptr;
  55. }
  56. virtual const String& getRTTIName()
  57. {
  58. static String name = "SceneObject";
  59. return name;
  60. }
  61. virtual UINT32 getRTTIId()
  62. {
  63. return TID_SceneObject;
  64. }
  65. virtual std::shared_ptr<IReflectable> newRTTIObject()
  66. {
  67. HSceneObject newObject = SceneObject::create("");
  68. return newObject.getInternalPtr();
  69. }
  70. };
  71. }