BsResourceHandle.cpp 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. //__________________________ Banshee Project - A modern game development toolkit _________________________________//
  2. //_____________________________________ www.banshee-project.com __________________________________________________//
  3. //________________________ Copyright (c) 2014 Marko Pintera. All rights reserved. ________________________________//
  4. #include "BsCorePrerequisites.h"
  5. #include "BsResourceHandle.h"
  6. #include "BsResource.h"
  7. #include "BsResourceHandleRTTI.h"
  8. #include "BsResources.h"
  9. namespace BansheeEngine
  10. {
  11. BS_STATIC_THREAD_SYNCHRONISER_CLASS_INSTANCE(mResourceCreatedCondition, ResourceHandleBase)
  12. BS_STATIC_MUTEX_CLASS_INSTANCE(mResourceCreatedMutex, ResourceHandleBase)
  13. ResourceHandleBase::ResourceHandleBase()
  14. {
  15. mData = nullptr;
  16. }
  17. ResourceHandleBase::~ResourceHandleBase()
  18. {
  19. }
  20. bool ResourceHandleBase::isLoaded() const
  21. {
  22. return (mData != nullptr && mData->mIsCreated && mData->mPtr != nullptr);
  23. }
  24. void ResourceHandleBase::synchronize() const
  25. {
  26. if(mData == nullptr)
  27. return;
  28. if(!mData->mIsCreated)
  29. {
  30. BS_LOCK_MUTEX_NAMED(mResourceCreatedMutex, lock);
  31. while(!mData->mIsCreated)
  32. {
  33. BS_THREAD_WAIT(mResourceCreatedCondition, mResourceCreatedMutex, lock);
  34. }
  35. }
  36. mData->mPtr->synchronize();
  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::throwIfNotLoaded() const
  55. {
  56. if(!isLoaded())
  57. {
  58. BS_EXCEPT(InternalErrorException, "Trying to access a resource that hasn't been loaded yet.");
  59. }
  60. }
  61. RTTITypeBase* ResourceHandleBase::getRTTIStatic()
  62. {
  63. return ResourceHandleRTTI::instance();
  64. }
  65. RTTITypeBase* ResourceHandleBase::getRTTI() const
  66. {
  67. return ResourceHandleBase::getRTTIStatic();
  68. }
  69. }