CmResourceHandleRTTI.h 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmResourceHandle.h"
  5. #include "CmResources.h"
  6. namespace CamelotEngine
  7. {
  8. class CM_EXPORT ResourceHandleDataRTTI : public RTTIType<ResourceHandleData, IReflectable, ResourceHandleDataRTTI>
  9. {
  10. private:
  11. String& getUUID(ResourceHandleData* obj) { return obj->mUUID; }
  12. void setUUID(ResourceHandleData* obj, String& uuid)
  13. {
  14. obj->mUUID = uuid;
  15. }
  16. public:
  17. ResourceHandleDataRTTI()
  18. {
  19. addPlainField("mUUID", 0, &ResourceHandleDataRTTI::getUUID, &ResourceHandleDataRTTI::setUUID);
  20. }
  21. virtual const String& getRTTIName()
  22. {
  23. static String name = "ResourceHandleData";
  24. return name;
  25. }
  26. virtual UINT32 getRTTIId()
  27. {
  28. return TID_ResourceHandleData;
  29. }
  30. virtual std::shared_ptr<IReflectable> newRTTIObject()
  31. {
  32. return std::shared_ptr<ResourceHandleData>(new ResourceHandleData());
  33. }
  34. };
  35. class CM_EXPORT ResourceHandleRTTI : public RTTIType<ResourceHandleBase, IReflectable, ResourceHandleRTTI>
  36. {
  37. private:
  38. std::shared_ptr<ResourceHandleData> getResData(ResourceHandleBase* obj) { return obj->mData; }
  39. void setResData(ResourceHandleBase* obj, std::shared_ptr<ResourceHandleData> val) { obj->mData = val; }
  40. public:
  41. ResourceHandleRTTI()
  42. {
  43. addReflectablePtrField("mData", 0, &ResourceHandleRTTI::getResData, &ResourceHandleRTTI::setResData);
  44. }
  45. void onDeserializationEnded(IReflectable* obj)
  46. {
  47. ResourceHandleBase* resourceHandle = static_cast<ResourceHandleBase*>(obj);
  48. if(resourceHandle->mData && resourceHandle->mData->mUUID != "")
  49. {
  50. // NOTE: This will cause Resources::load to be called recursively with resources that contain other
  51. // resources. This might cause problems. Keep this note here as a warning until I prove otherwise.
  52. BaseResourceHandle loadedResource = gResources().loadFromUUID(resourceHandle->mData->mUUID);
  53. if(loadedResource)
  54. resourceHandle->resolve(loadedResource.getInternalPtr());
  55. }
  56. }
  57. virtual const String& getRTTIName()
  58. {
  59. static String name = "ResourceHandleBase";
  60. return name;
  61. }
  62. virtual UINT32 getRTTIId()
  63. {
  64. return TID_ResourceHandle;
  65. }
  66. virtual std::shared_ptr<IReflectable> newRTTIObject()
  67. {
  68. return std::shared_ptr<ResourceHandleBase>(new ResourceHandleBase());
  69. }
  70. };
  71. }