#pragma once #include "BsCorePrerequisites.h" #include "BsRTTIType.h" #include "BsGameObjectHandle.h" #include "BsGameObjectManager.h" namespace BansheeEngine { class BS_CORE_EXPORT GameObjectHandleRTTI : public RTTIType { private: UINT64& getInstanceId(GameObjectHandleBase* obj) { static UINT64 invalidId = 0; if (obj->mData->mPtr != nullptr) return obj->mData->mPtr->mInstanceId; return invalidId; } void setInstanceId(GameObjectHandleBase* obj, UINT64& value) { obj->mRTTIData = value; } public: GameObjectHandleRTTI() { addPlainField("mInstanceID", 0, &GameObjectHandleRTTI::getInstanceId, &GameObjectHandleRTTI::setInstanceId); } void onDeserializationEnded(IReflectable* obj) override { GameObjectHandleBase* gameObjectHandle = static_cast(obj); UINT64 originalInstanceId = any_cast(gameObjectHandle->mRTTIData); GameObjectManager::instance().registerUnresolvedHandle(originalInstanceId, *gameObjectHandle); gameObjectHandle->mRTTIData = nullptr; } virtual const String& getRTTIName() override { static String name = "GameObjectHandleBase"; return name; } virtual UINT32 getRTTIId() override { return TID_GameObjectHandleBase; } virtual std::shared_ptr newRTTIObject() override { std::shared_ptr obj = bs_shared_ptr(new (bs_alloc()) GameObjectHandleBase()); return obj; } }; }