BsScriptResourceManager.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. #include "BsScriptResourceManager.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoAssembly.h"
  4. #include "BsMonoClass.h"
  5. #include "BsScriptTexture2D.h"
  6. #include "BsScriptSpriteTexture.h"
  7. #include "BsScriptFont.h"
  8. #include "BsScriptManagedResource.h"
  9. namespace BansheeEngine
  10. {
  11. ScriptResourceManager::ScriptResourceManager()
  12. :mTextureClass(nullptr), mSpriteTextureClass(nullptr)
  13. {
  14. MonoAssembly* assembly = MonoManager::instance().getAssembly(BansheeEngineAssemblyName);
  15. if(assembly == nullptr)
  16. BS_EXCEPT(InternalErrorException, "Cannot find \"" + String(BansheeEngineAssemblyName) + "\" assembly.");
  17. mTextureClass = assembly->getClass("BansheeEngine", "Texture2D");
  18. mSpriteTextureClass = assembly->getClass("BansheeEngine", "SpriteTexture");
  19. mFontClass = assembly->getClass("BansheeEngine", "Font");
  20. if(mTextureClass == nullptr)
  21. BS_EXCEPT(InternalErrorException, "Cannot find managed Texture2D class.");
  22. if(mSpriteTextureClass == nullptr)
  23. BS_EXCEPT(InternalErrorException, "Cannot find managed SpriteTexture class.");
  24. if (mFontClass == nullptr)
  25. BS_EXCEPT(InternalErrorException, "Cannot find managed Font class.");
  26. }
  27. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(const HTexture& resourceHandle)
  28. {
  29. MonoObject* monoInstance = mTextureClass->createInstance();
  30. return createScriptTexture2D(monoInstance, resourceHandle);
  31. }
  32. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(MonoObject* instance, const HTexture& resourceHandle)
  33. {
  34. const String& uuid = resourceHandle.getUUID();
  35. #if BS_DEBUG_MODE
  36. throwExceptionIfInvalidOrDuplicate(uuid);
  37. #endif
  38. ScriptTexture2D* scriptResource = new (bs_alloc<ScriptTexture2D>()) ScriptTexture2D(instance, resourceHandle);
  39. mScriptResources[uuid] = scriptResource;
  40. return scriptResource;
  41. }
  42. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  43. {
  44. MonoObject* monoInstance = mSpriteTextureClass->createInstance();
  45. return createScriptSpriteTexture(monoInstance, resourceHandle);
  46. }
  47. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(MonoObject* instance, const HSpriteTexture& resourceHandle)
  48. {
  49. const String& uuid = resourceHandle.getUUID();
  50. #if BS_DEBUG_MODE
  51. throwExceptionIfInvalidOrDuplicate(uuid);
  52. #endif
  53. ScriptSpriteTexture* scriptResource = new (bs_alloc<ScriptSpriteTexture>()) ScriptSpriteTexture(instance, resourceHandle);
  54. mScriptResources[uuid] = scriptResource;
  55. return scriptResource;
  56. }
  57. ScriptFont* ScriptResourceManager::createScriptFont(const HFont& resourceHandle)
  58. {
  59. MonoObject* monoInstance = mFontClass->createInstance();
  60. return createScriptFont(monoInstance, resourceHandle);
  61. }
  62. ScriptFont* ScriptResourceManager::createScriptFont(MonoObject* instance, const HFont& resourceHandle)
  63. {
  64. const String& uuid = resourceHandle.getUUID();
  65. #if BS_DEBUG_MODE
  66. throwExceptionIfInvalidOrDuplicate(uuid);
  67. #endif
  68. ScriptFont* scriptResource = new (bs_alloc<ScriptFont>()) ScriptFont(instance, resourceHandle);
  69. mScriptResources[uuid] = scriptResource;
  70. return scriptResource;
  71. }
  72. ScriptManagedResource* ScriptResourceManager::createManagedResource(MonoObject* existingInstance, const HManagedResource& resourceHandle)
  73. {
  74. const String& uuid = resourceHandle.getUUID();
  75. throwExceptionIfInvalidOrDuplicate(uuid);
  76. ScriptManagedResource* scriptResource = new (bs_alloc<ScriptManagedResource>()) ScriptManagedResource(existingInstance, resourceHandle);
  77. mScriptResources[uuid] = scriptResource;
  78. return scriptResource;
  79. }
  80. ScriptTexture2D* ScriptResourceManager::getScriptTexture(const HTexture& resourceHandle)
  81. {
  82. return static_cast<ScriptTexture2D*>(getScriptResource(resourceHandle.getUUID()));
  83. }
  84. ScriptSpriteTexture* ScriptResourceManager::getScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  85. {
  86. return static_cast<ScriptSpriteTexture*>(getScriptResource(resourceHandle.getUUID()));
  87. }
  88. ScriptManagedResource* ScriptResourceManager::getScriptManagedResource(const HManagedResource& resourceHandle)
  89. {
  90. return static_cast<ScriptManagedResource*>(getScriptResource(resourceHandle.getUUID()));
  91. }
  92. ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
  93. {
  94. if(uuid == "")
  95. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  96. auto findIter = mScriptResources.find(uuid);
  97. if(findIter != mScriptResources.end())
  98. return findIter->second;
  99. return nullptr;
  100. }
  101. ScriptResourceBase* ScriptResourceManager::createScriptResource(const HResource& resource)
  102. {
  103. #if BS_DEBUG_MODE
  104. throwExceptionIfInvalidOrDuplicate(resource.getUUID());
  105. #endif
  106. UINT32 resTypeID = resource->getTypeId();
  107. switch (resTypeID)
  108. {
  109. case TID_Texture:
  110. return createScriptTexture2D(static_resource_cast<Texture>(resource));
  111. case TID_SpriteTexture:
  112. return createScriptSpriteTexture(static_resource_cast<SpriteTexture>(resource));
  113. case TID_Font:
  114. return createScriptFont(static_resource_cast<Font>(resource));
  115. case TID_ManagedResource:
  116. BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
  117. break;
  118. default:
  119. BS_EXCEPT(NotImplementedException, "Attempting to load a resource type that is not supported. Type ID: " + toString(resTypeID));
  120. break;
  121. }
  122. }
  123. void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
  124. {
  125. HResource resourceHandle = resource->getNativeHandle();
  126. const String& uuid = resourceHandle.getUUID();
  127. if(uuid == "")
  128. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  129. auto findIter = mScriptResources.find(uuid);
  130. if(findIter != mScriptResources.end())
  131. {
  132. (resource)->~ScriptResourceBase();
  133. MemoryAllocator<GenAlloc>::free(resource);
  134. mScriptResources.erase(findIter);
  135. }
  136. }
  137. void ScriptResourceManager::throwExceptionIfInvalidOrDuplicate(const String& uuid) const
  138. {
  139. if(uuid == "")
  140. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  141. auto findIter = mScriptResources.find(uuid);
  142. if(findIter != mScriptResources.end())
  143. {
  144. BS_EXCEPT(InvalidStateException, "Provided resource handle already has a script resource. \
  145. Retrieve the existing instance instead of creating a new one.");
  146. }
  147. }
  148. }