BsResourceHandleRTTI.h 3.3 KB

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