BsResourceHandle.cpp 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  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() const
  19. {
  20. return (mData != nullptr && mData->mIsCreated && mData->mPtr != nullptr);
  21. }
  22. void ResourceHandleBase::blockUntilLoaded() const
  23. {
  24. if(mData == nullptr)
  25. return;
  26. if(!mData->mIsCreated)
  27. {
  28. BS_LOCK_MUTEX_NAMED(mResourceCreatedMutex, lock);
  29. while(!mData->mIsCreated)
  30. {
  31. BS_THREAD_WAIT(mResourceCreatedCondition, mResourceCreatedMutex, lock);
  32. }
  33. // Send out ResourceListener events right away, as whatever called this method
  34. // probably also expects the listener events to trigger immediately as well
  35. ResourceListenerManager::instance().notifyListeners(mData->mUUID);
  36. }
  37. }
  38. void ResourceHandleBase::_setHandleData(std::shared_ptr<Resource> ptr, const String& uuid)
  39. {
  40. mData->mPtr = ptr;
  41. if(mData->mPtr)
  42. {
  43. mData->mUUID = uuid;
  44. if(!mData->mIsCreated)
  45. {
  46. BS_LOCK_MUTEX(mResourceCreatedMutex);
  47. {
  48. mData->mIsCreated = true;
  49. }
  50. BS_THREAD_NOTIFY_ALL(mResourceCreatedCondition);
  51. }
  52. }
  53. }
  54. void ResourceHandleBase::_setHandleData(const std::shared_ptr<ResourceHandleData>& data)
  55. {
  56. mData = data;
  57. }
  58. void ResourceHandleBase::throwIfNotLoaded() const
  59. {
  60. if(!isLoaded())
  61. {
  62. BS_EXCEPT(InternalErrorException, "Trying to access a resource that hasn't been loaded yet.");
  63. }
  64. }
  65. RTTITypeBase* ResourceHandleBase::getRTTIStatic()
  66. {
  67. return ResourceHandleRTTI::instance();
  68. }
  69. RTTITypeBase* ResourceHandleBase::getRTTI() const
  70. {
  71. return ResourceHandleBase::getRTTIStatic();
  72. }
  73. }