BsGameObjectHandleRTTI.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsGameObjectHandle.h"
  5. #include "BsGameObjectManager.h"
  6. namespace BansheeEngine
  7. {
  8. class BS_CORE_EXPORT GameObjectHandleRTTI : public RTTIType<GameObjectHandleBase, IReflectable, GameObjectHandleRTTI>
  9. {
  10. private:
  11. UINT64& getInstanceId(GameObjectHandleBase* obj)
  12. {
  13. static UINT64 invalidId = 0;
  14. if (obj->mData->mPtr != nullptr)
  15. return obj->mData->mPtr->mInstanceId;
  16. return invalidId;
  17. }
  18. void setInstanceId(GameObjectHandleBase* obj, UINT64& value) { obj->mRTTIData = value; }
  19. public:
  20. GameObjectHandleRTTI()
  21. {
  22. addPlainField("mInstanceID", 0, &GameObjectHandleRTTI::getInstanceId, &GameObjectHandleRTTI::setInstanceId);
  23. }
  24. void onDeserializationEnded(IReflectable* obj) override
  25. {
  26. GameObjectHandleBase* gameObjectHandle = static_cast<GameObjectHandleBase*>(obj);
  27. UINT64 originalInstanceId = any_cast<UINT64>(gameObjectHandle->mRTTIData);
  28. GameObjectManager::instance().registerUnresolvedHandle(originalInstanceId, *gameObjectHandle);
  29. gameObjectHandle->mRTTIData = nullptr;
  30. }
  31. virtual const String& getRTTIName() override
  32. {
  33. static String name = "GameObjectHandleBase";
  34. return name;
  35. }
  36. virtual UINT32 getRTTIId() override
  37. {
  38. return TID_GameObjectHandleBase;
  39. }
  40. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  41. {
  42. std::shared_ptr<GameObjectHandleBase> obj = bs_shared_ptr<GameObjectHandleBase>(new (bs_alloc<GameObjectHandleBase>()) GameObjectHandleBase());
  43. return obj;
  44. }
  45. };
  46. }