BsResourceHandleRTTI.h 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #pragma once
  2. #include "BsCorePrerequisites.h"
  3. #include "BsRTTIType.h"
  4. #include "BsResourceHandle.h"
  5. #include "BsResources.h"
  6. namespace BansheeEngine
  7. {
  8. class BS_CORE_EXPORT ResourceHandleRTTI : public RTTIType<TResourceHandleBase<false>, IReflectable, ResourceHandleRTTI>
  9. {
  10. private:
  11. String& getUUID(TResourceHandleBase<false>* obj)
  12. {
  13. static String Blank = "";
  14. return obj->mData != nullptr ? obj->mData->mUUID : Blank;
  15. }
  16. void setUUID(TResourceHandleBase<false>* obj, String& uuid) { obj->mData->mUUID = uuid; }
  17. public:
  18. ResourceHandleRTTI()
  19. {
  20. addPlainField("mUUID", 0, &ResourceHandleRTTI::getUUID, &ResourceHandleRTTI::setUUID);
  21. }
  22. void onDeserializationEnded(IReflectable* obj) override
  23. {
  24. TResourceHandleBase<false>* resourceHandle = static_cast<TResourceHandleBase<false>*>(obj);
  25. if(resourceHandle->mData && resourceHandle->mData->mUUID != "")
  26. {
  27. HResource loadedResource = gResources()._getResourceHandle(resourceHandle->mData->mUUID);
  28. resourceHandle->releaseRef();
  29. resourceHandle->mData = loadedResource.mData;
  30. resourceHandle->addRef();
  31. }
  32. }
  33. virtual const String& getRTTIName() override
  34. {
  35. static String name = "ResourceHandleBase";
  36. return name;
  37. }
  38. virtual UINT32 getRTTIId() override
  39. {
  40. return TID_ResourceHandle;
  41. }
  42. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  43. {
  44. SPtr<TResourceHandleBase<false>> obj = bs_shared_ptr<TResourceHandleBase<false>>
  45. (new (bs_alloc<TResourceHandleBase<false>>()) TResourceHandleBase<false>());
  46. obj->mData = bs_shared_ptr_new<ResourceHandleData>();
  47. obj->mData->mRefCount++;
  48. return obj;
  49. }
  50. };
  51. class BS_CORE_EXPORT WeakResourceHandleRTTI : public RTTIType<TResourceHandleBase<true>, IReflectable, WeakResourceHandleRTTI>
  52. {
  53. private:
  54. String& getUUID(TResourceHandleBase<true>* obj)
  55. {
  56. static String Blank = "";
  57. return obj->mData != nullptr ? obj->mData->mUUID : Blank;
  58. }
  59. void setUUID(TResourceHandleBase<true>* obj, String& uuid) { obj->mData->mUUID = uuid; }
  60. public:
  61. WeakResourceHandleRTTI()
  62. {
  63. addPlainField("mUUID", 0, &WeakResourceHandleRTTI::getUUID, &WeakResourceHandleRTTI::setUUID);
  64. }
  65. void onDeserializationEnded(IReflectable* obj) override
  66. {
  67. TResourceHandleBase<true>* resourceHandle = static_cast<TResourceHandleBase<true>*>(obj);
  68. if (resourceHandle->mData && resourceHandle->mData->mUUID != "")
  69. {
  70. HResource loadedResource = gResources()._getResourceHandle(resourceHandle->mData->mUUID);
  71. resourceHandle->mData = loadedResource.mData;
  72. }
  73. }
  74. virtual const String& getRTTIName() override
  75. {
  76. static String name = "WeakResourceHandleBase";
  77. return name;
  78. }
  79. virtual UINT32 getRTTIId() override
  80. {
  81. return TID_WeakResourceHandle;
  82. }
  83. virtual std::shared_ptr<IReflectable> newRTTIObject() override
  84. {
  85. SPtr<TResourceHandleBase<true>> obj = bs_shared_ptr<TResourceHandleBase<true>>
  86. (new (bs_alloc<TResourceHandleBase<true>>()) TResourceHandleBase<true>());
  87. obj->mData = bs_shared_ptr_new<ResourceHandleData>();
  88. return obj;
  89. }
  90. };
  91. }