CmResourceRefRTTI.h 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. #pragma once
  2. #include "CmPrerequisites.h"
  3. #include "CmRTTIType.h"
  4. #include "CmResourceRef.h"
  5. #include "CmResources.h"
  6. namespace CamelotEngine
  7. {
  8. class CM_EXPORT ResourceRefDataRTTI : public RTTIType<ResourceRefData, IReflectable, ResourceRefDataRTTI>
  9. {
  10. private:
  11. String& getUUID(ResourceRefData* obj) { return obj->mUUID; }
  12. void setUUID(ResourceRefData* obj, String& uuid)
  13. {
  14. obj->mUUID = uuid;
  15. }
  16. public:
  17. ResourceRefDataRTTI()
  18. {
  19. addPlainField("mUUID", 0, &ResourceRefDataRTTI::getUUID, &ResourceRefDataRTTI::setUUID);
  20. }
  21. virtual const String& getRTTIName()
  22. {
  23. static String name = "ResourceRefData";
  24. return name;
  25. }
  26. virtual UINT32 getRTTIId()
  27. {
  28. return TID_ResourceRefData;
  29. }
  30. virtual std::shared_ptr<IReflectable> newRTTIObject()
  31. {
  32. return std::shared_ptr<ResourceRefData>(new ResourceRefData());
  33. }
  34. };
  35. class CM_EXPORT ResourceRefRTTI : public RTTIType<ResourceRefBase, IReflectable, ResourceRefRTTI>
  36. {
  37. private:
  38. std::shared_ptr<ResourceRefData> getResData(ResourceRefBase* obj) { return obj->mData; }
  39. void setResData(ResourceRefBase* obj, std::shared_ptr<ResourceRefData> val) { obj->mData = val; }
  40. public:
  41. ResourceRefRTTI()
  42. {
  43. addReflectablePtrField("mData", 0, &ResourceRefRTTI::getResData, &ResourceRefRTTI::setResData);
  44. }
  45. void onDeserializationEnded(IReflectable* obj)
  46. {
  47. ResourceRefBase* resourceRef = static_cast<ResourceRefBase*>(obj);
  48. if(resourceRef->mData && resourceRef->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. BaseResourceRef loadedResource = gResources().loadFromUUID(resourceRef->mData->mUUID);
  53. if(loadedResource)
  54. resourceRef->resolve(loadedResource.getInternalPtr());
  55. }
  56. }
  57. virtual const String& getRTTIName()
  58. {
  59. static String name = "ResourceRefBase";
  60. return name;
  61. }
  62. virtual UINT32 getRTTIId()
  63. {
  64. return TID_ResourceRef;
  65. }
  66. virtual std::shared_ptr<IReflectable> newRTTIObject()
  67. {
  68. return std::shared_ptr<ResourceRefBase>(new ResourceRefBase());
  69. }
  70. };
  71. }