2
0

BsResourceHandle.cpp 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. #include "BsCorePrerequisites.h"
  2. #include "BsResourceHandle.h"
  3. #include "BsResource.h"
  4. #include "BsResourceHandleRTTI.h"
  5. #include "BsResources.h"
  6. #include "BsResourceListenerManager.h"
  7. namespace BansheeEngine
  8. {
  9. BS_STATIC_THREAD_SYNCHRONISER_CLASS_INSTANCE(mResourceCreatedCondition, ResourceHandleBase)
  10. BS_STATIC_MUTEX_CLASS_INSTANCE(mResourceCreatedMutex, ResourceHandleBase)
  11. ResourceHandleBase::ResourceHandleBase()
  12. {
  13. mData = nullptr;
  14. }
  15. ResourceHandleBase::~ResourceHandleBase()
  16. {
  17. }
  18. bool ResourceHandleBase::isLoaded(bool checkDependencies) const
  19. {
  20. bool isLoaded = (mData != nullptr && mData->mIsCreated && mData->mPtr != nullptr);
  21. if (checkDependencies && isLoaded)
  22. isLoaded = mData->mPtr->areDependenciesLoaded();
  23. return isLoaded;
  24. }
  25. void ResourceHandleBase::blockUntilLoaded(bool waitForDependencies) const
  26. {
  27. if(mData == nullptr)
  28. return;
  29. if (!mData->mIsCreated)
  30. {
  31. BS_LOCK_MUTEX_NAMED(mResourceCreatedMutex, lock);
  32. while (!mData->mIsCreated)
  33. {
  34. BS_THREAD_WAIT(mResourceCreatedCondition, mResourceCreatedMutex, lock);
  35. }
  36. // Send out ResourceListener events right away, as whatever called this method
  37. // probably also expects the listener events to trigger immediately as well
  38. ResourceListenerManager::instance().notifyListeners(mData->mUUID);
  39. }
  40. if (waitForDependencies)
  41. {
  42. bs_frame_mark();
  43. {
  44. FrameVector<HResource> dependencies;
  45. mData->mPtr->getResourceDependencies(dependencies);
  46. for (auto& dependency : dependencies)
  47. dependency.blockUntilLoaded(waitForDependencies);
  48. }
  49. bs_frame_clear();
  50. }
  51. }
  52. void ResourceHandleBase::release()
  53. {
  54. gResources().release(*this);
  55. }
  56. void ResourceHandleBase::destroy()
  57. {
  58. gResources().destroy(*this);
  59. }
  60. void ResourceHandleBase::setHandleData(const SPtr<Resource>& ptr, const String& uuid)
  61. {
  62. mData->mPtr = ptr;
  63. if(mData->mPtr)
  64. {
  65. mData->mUUID = uuid;
  66. if(!mData->mIsCreated)
  67. {
  68. BS_LOCK_MUTEX(mResourceCreatedMutex);
  69. {
  70. mData->mIsCreated = true;
  71. }
  72. BS_THREAD_NOTIFY_ALL(mResourceCreatedCondition);
  73. }
  74. }
  75. }
  76. void ResourceHandleBase::addInternalRef()
  77. {
  78. mData->mRefCount++;
  79. }
  80. void ResourceHandleBase::removeInternalRef()
  81. {
  82. mData->mRefCount--;
  83. }
  84. void ResourceHandleBase::throwIfNotLoaded() const
  85. {
  86. #if BS_DEBUG_MODE
  87. if (!isLoaded(false))
  88. {
  89. BS_EXCEPT(InternalErrorException, "Trying to access a resource that hasn't been loaded yet.");
  90. }
  91. #endif
  92. }
  93. template class TResourceHandleBase<true>;
  94. template class TResourceHandleBase<false>;
  95. RTTITypeBase* TResourceHandleBase<true>::getRTTIStatic()
  96. {
  97. return WeakResourceHandleRTTI::instance();
  98. }
  99. RTTITypeBase* TResourceHandleBase<true>::getRTTI() const
  100. {
  101. return getRTTIStatic();
  102. }
  103. RTTITypeBase* TResourceHandleBase<false>::getRTTIStatic()
  104. {
  105. return ResourceHandleRTTI::instance();
  106. }
  107. RTTITypeBase* TResourceHandleBase<false>::getRTTI() const
  108. {
  109. return getRTTIStatic();
  110. }
  111. }