BsResourceHandle.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  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::_setHandleData(std::shared_ptr<Resource> ptr, const String& uuid)
  53. {
  54. mData->mPtr = ptr;
  55. if(mData->mPtr)
  56. {
  57. mData->mUUID = uuid;
  58. if(!mData->mIsCreated)
  59. {
  60. BS_LOCK_MUTEX(mResourceCreatedMutex);
  61. {
  62. mData->mIsCreated = true;
  63. }
  64. BS_THREAD_NOTIFY_ALL(mResourceCreatedCondition);
  65. }
  66. }
  67. }
  68. void ResourceHandleBase::_setHandleData(const std::shared_ptr<ResourceHandleData>& data)
  69. {
  70. mData = data;
  71. }
  72. void ResourceHandleBase::throwIfNotLoaded() const
  73. {
  74. #if BS_DEBUG_MODE
  75. if (!isLoaded())
  76. {
  77. BS_EXCEPT(InternalErrorException, "Trying to access a resource that hasn't been loaded yet.");
  78. }
  79. #endif
  80. }
  81. RTTITypeBase* ResourceHandleBase::getRTTIStatic()
  82. {
  83. return ResourceHandleRTTI::instance();
  84. }
  85. RTTITypeBase* ResourceHandleBase::getRTTI() const
  86. {
  87. return ResourceHandleBase::getRTTIStatic();
  88. }
  89. }