BsResourceHandle.cpp 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  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. Vector<HResource> dependencies;
  43. mData->mPtr->getResourceDependencies(dependencies);
  44. for (auto& dependency : dependencies)
  45. dependency.blockUntilLoaded(waitForDependencies);
  46. }
  47. }
  48. void ResourceHandleBase::_setHandleData(std::shared_ptr<Resource> ptr, const String& uuid)
  49. {
  50. mData->mPtr = ptr;
  51. if(mData->mPtr)
  52. {
  53. mData->mUUID = uuid;
  54. if(!mData->mIsCreated)
  55. {
  56. BS_LOCK_MUTEX(mResourceCreatedMutex);
  57. {
  58. mData->mIsCreated = true;
  59. }
  60. BS_THREAD_NOTIFY_ALL(mResourceCreatedCondition);
  61. }
  62. }
  63. }
  64. void ResourceHandleBase::_setHandleData(const std::shared_ptr<ResourceHandleData>& data)
  65. {
  66. mData = data;
  67. }
  68. void ResourceHandleBase::throwIfNotLoaded() const
  69. {
  70. if(!isLoaded())
  71. {
  72. BS_EXCEPT(InternalErrorException, "Trying to access a resource that hasn't been loaded yet.");
  73. }
  74. }
  75. RTTITypeBase* ResourceHandleBase::getRTTIStatic()
  76. {
  77. return ResourceHandleRTTI::instance();
  78. }
  79. RTTITypeBase* ResourceHandleBase::getRTTI() const
  80. {
  81. return ResourceHandleBase::getRTTIStatic();
  82. }
  83. }