BsGameObjectHandleRTTI.h 1.6 KB

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