#pragma once #include "BsCorePrerequisites.h" #include "BsRTTIType.h" #include "BsResourceHandle.h" #include "BsResources.h" namespace BansheeEngine { class BS_CORE_EXPORT ResourceHandleRTTI : public RTTIType, IReflectable, ResourceHandleRTTI> { private: String& getUUID(TResourceHandleBase* obj) { static String Blank = ""; return obj->mData != nullptr ? obj->mData->mUUID : Blank; } void setUUID(TResourceHandleBase* obj, String& uuid) { obj->mData->mUUID = uuid; } public: ResourceHandleRTTI() { addPlainField("mUUID", 0, &ResourceHandleRTTI::getUUID, &ResourceHandleRTTI::setUUID); } void onDeserializationEnded(IReflectable* obj) override { TResourceHandleBase* resourceHandle = static_cast*>(obj); if(resourceHandle->mData && resourceHandle->mData->mUUID != "") { HResource loadedResource = gResources()._getResourceHandle(resourceHandle->mData->mUUID); resourceHandle->releaseRef(); resourceHandle->mData = loadedResource.mData; resourceHandle->addRef(); } } virtual const String& getRTTIName() override { static String name = "ResourceHandleBase"; return name; } virtual UINT32 getRTTIId() override { return TID_ResourceHandle; } virtual std::shared_ptr newRTTIObject() override { SPtr> obj = bs_shared_ptr> (new (bs_alloc>()) TResourceHandleBase()); obj->mData = bs_shared_ptr_new(); obj->mData->mRefCount++; return obj; } }; class BS_CORE_EXPORT WeakResourceHandleRTTI : public RTTIType, IReflectable, WeakResourceHandleRTTI> { private: String& getUUID(TResourceHandleBase* obj) { static String Blank = ""; return obj->mData != nullptr ? obj->mData->mUUID : Blank; } void setUUID(TResourceHandleBase* obj, String& uuid) { obj->mData->mUUID = uuid; } public: WeakResourceHandleRTTI() { addPlainField("mUUID", 0, &WeakResourceHandleRTTI::getUUID, &WeakResourceHandleRTTI::setUUID); } void onDeserializationEnded(IReflectable* obj) override { TResourceHandleBase* resourceHandle = static_cast*>(obj); if (resourceHandle->mData && resourceHandle->mData->mUUID != "") { HResource loadedResource = gResources()._getResourceHandle(resourceHandle->mData->mUUID); resourceHandle->mData = loadedResource.mData; } } virtual const String& getRTTIName() override { static String name = "WeakResourceHandleBase"; return name; } virtual UINT32 getRTTIId() override { return TID_WeakResourceHandle; } virtual std::shared_ptr newRTTIObject() override { SPtr> obj = bs_shared_ptr> (new (bs_alloc>()) TResourceHandleBase()); obj->mData = bs_shared_ptr_new(); return obj; } }; }