CmResourceHandleRTTI.h 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmResourceHandle.h"
  5. #include "CmResources.h"
  6. namespace CamelotFramework
  7. {
  8. class CM_EXPORT ResourceHandleRTTI : public RTTIType<ResourceHandleBase, IReflectable, ResourceHandleRTTI>
  9. {
  10. private:
  11. String& getUUID(ResourceHandleBase* obj) { return obj->mData->mUUID; }
  12. void setUUID(ResourceHandleBase* obj, String& uuid) { obj->mData->mUUID = uuid; }
  13. public:
  14. ResourceHandleRTTI()
  15. {
  16. addPlainField("mUUID", 0, &ResourceHandleRTTI::getUUID, &ResourceHandleRTTI::setUUID);
  17. }
  18. void onDeserializationEnded(IReflectable* obj)
  19. {
  20. ResourceHandleBase* resourceHandle = static_cast<ResourceHandleBase*>(obj);
  21. if(resourceHandle->mData && resourceHandle->mData->mUUID != "")
  22. {
  23. // NOTE: This will cause Resources::load to be called recursively with resources that contain other
  24. // resources. This might cause problems. Keep this note here as a warning until I prove otherwise.
  25. HResource loadedResource = gResources().loadFromUUID(resourceHandle->mData->mUUID);
  26. if(loadedResource)
  27. resourceHandle->resolve(loadedResource.getInternalPtr());
  28. }
  29. }
  30. virtual const String& getRTTIName()
  31. {
  32. static String name = "ResourceHandleBase";
  33. return name;
  34. }
  35. virtual UINT32 getRTTIId()
  36. {
  37. return TID_ResourceHandle;
  38. }
  39. virtual std::shared_ptr<IReflectable> newRTTIObject()
  40. {
  41. return cm_shared_ptr<ResourceHandleBase, PoolAlloc>(new (cm_alloc<ResourceHandleBase, PoolAlloc>()) ResourceHandleBase());
  42. }
  43. };
  44. }