BsResourceHandle.cpp 2.1 KB

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