BsResourceHandleRTTI.h 3.2 KB

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