BsScriptResourceManager.cpp 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. #include "BsScriptResourceManager.h"
  2. #include "BsMonoManager.h"
  3. #include "BsMonoAssembly.h"
  4. #include "BsMonoClass.h"
  5. #include "BsScriptTexture2D.h"
  6. #include "BsScriptTexture3D.h"
  7. #include "BsScriptTextureCube.h"
  8. #include "BsScriptSpriteTexture.h"
  9. #include "BsScriptPlainText.h"
  10. #include "BsScriptScriptCode.h"
  11. #include "BsScriptFont.h"
  12. #include "BsScriptManagedResource.h"
  13. #include "BsScriptAssemblyManager.h"
  14. namespace BansheeEngine
  15. {
  16. ScriptResourceManager::ScriptResourceManager()
  17. {
  18. }
  19. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(const HTexture& resourceHandle)
  20. {
  21. MonoClass* textureClass = ScriptAssemblyManager::instance().getTextureClass();
  22. MonoObject* monoInstance = textureClass->createInstance();
  23. return createScriptTexture2D(monoInstance, resourceHandle);
  24. }
  25. ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(const HTexture& resourceHandle)
  26. {
  27. MonoClass* textureClass = ScriptAssemblyManager::instance().getTextureClass();
  28. MonoObject* monoInstance = textureClass->createInstance();
  29. return createScriptTexture3D(monoInstance, resourceHandle);
  30. }
  31. ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(const HTexture& resourceHandle)
  32. {
  33. MonoClass* textureClass = ScriptAssemblyManager::instance().getTextureClass();
  34. MonoObject* monoInstance = textureClass->createInstance();
  35. return createScriptTextureCube(monoInstance, resourceHandle);
  36. }
  37. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(MonoObject* instance, const HTexture& resourceHandle)
  38. {
  39. const String& uuid = resourceHandle.getUUID();
  40. #if BS_DEBUG_MODE
  41. throwExceptionIfInvalidOrDuplicate(uuid);
  42. #endif
  43. ScriptTexture2D* scriptResource = new (bs_alloc<ScriptTexture2D>()) ScriptTexture2D(instance, resourceHandle);
  44. mScriptResources[uuid] = scriptResource;
  45. return scriptResource;
  46. }
  47. ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(MonoObject* instance, const HTexture& resourceHandle)
  48. {
  49. const String& uuid = resourceHandle.getUUID();
  50. #if BS_DEBUG_MODE
  51. throwExceptionIfInvalidOrDuplicate(uuid);
  52. #endif
  53. ScriptTexture3D* scriptResource = new (bs_alloc<ScriptTexture3D>()) ScriptTexture3D(instance, resourceHandle);
  54. mScriptResources[uuid] = scriptResource;
  55. return scriptResource;
  56. }
  57. ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(MonoObject* instance, const HTexture& resourceHandle)
  58. {
  59. const String& uuid = resourceHandle.getUUID();
  60. #if BS_DEBUG_MODE
  61. throwExceptionIfInvalidOrDuplicate(uuid);
  62. #endif
  63. ScriptTextureCube* scriptResource = new (bs_alloc<ScriptTextureCube>()) ScriptTextureCube(instance, resourceHandle);
  64. mScriptResources[uuid] = scriptResource;
  65. return scriptResource;
  66. }
  67. ScriptPlainText* ScriptResourceManager::createScriptPlainText(const HPlainText& resourceHandle)
  68. {
  69. MonoClass* plainTextClass = ScriptAssemblyManager::instance().getPlainTextClass();
  70. MonoObject* monoInstance = plainTextClass->createInstance();
  71. return createScriptPlainText(monoInstance, resourceHandle);
  72. }
  73. ScriptPlainText* ScriptResourceManager::createScriptPlainText(MonoObject* instance, const HPlainText& resourceHandle)
  74. {
  75. const String& uuid = resourceHandle.getUUID();
  76. #if BS_DEBUG_MODE
  77. throwExceptionIfInvalidOrDuplicate(uuid);
  78. #endif
  79. ScriptPlainText* scriptResource = new (bs_alloc<ScriptPlainText>()) ScriptPlainText(instance, resourceHandle);
  80. mScriptResources[uuid] = scriptResource;
  81. return scriptResource;
  82. }
  83. ScriptScriptCode* ScriptResourceManager::createScriptScriptCode(const HScriptCode& resourceHandle)
  84. {
  85. MonoClass* scriptCodeClass = ScriptAssemblyManager::instance().getScriptCodeClass();
  86. MonoObject* monoInstance = scriptCodeClass->createInstance();
  87. return createScriptScriptCode(monoInstance, resourceHandle);
  88. }
  89. ScriptScriptCode* ScriptResourceManager::createScriptScriptCode(MonoObject* instance, const HScriptCode& resourceHandle)
  90. {
  91. const String& uuid = resourceHandle.getUUID();
  92. #if BS_DEBUG_MODE
  93. throwExceptionIfInvalidOrDuplicate(uuid);
  94. #endif
  95. ScriptScriptCode* scriptResource = new (bs_alloc<ScriptScriptCode>()) ScriptScriptCode(instance, resourceHandle);
  96. mScriptResources[uuid] = scriptResource;
  97. return scriptResource;
  98. }
  99. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  100. {
  101. MonoClass* spriteTextureClass = ScriptAssemblyManager::instance().getSpriteTextureClass();
  102. MonoObject* monoInstance = spriteTextureClass->createInstance();
  103. return createScriptSpriteTexture(monoInstance, resourceHandle);
  104. }
  105. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(MonoObject* instance, const HSpriteTexture& resourceHandle)
  106. {
  107. const String& uuid = resourceHandle.getUUID();
  108. #if BS_DEBUG_MODE
  109. throwExceptionIfInvalidOrDuplicate(uuid);
  110. #endif
  111. ScriptSpriteTexture* scriptResource = new (bs_alloc<ScriptSpriteTexture>()) ScriptSpriteTexture(instance, resourceHandle);
  112. mScriptResources[uuid] = scriptResource;
  113. return scriptResource;
  114. }
  115. ScriptFont* ScriptResourceManager::createScriptFont(const HFont& resourceHandle)
  116. {
  117. MonoClass* fontClass = ScriptAssemblyManager::instance().getFontClass();
  118. MonoObject* monoInstance = fontClass->createInstance();
  119. return createScriptFont(monoInstance, resourceHandle);
  120. }
  121. ScriptFont* ScriptResourceManager::createScriptFont(MonoObject* instance, const HFont& resourceHandle)
  122. {
  123. const String& uuid = resourceHandle.getUUID();
  124. #if BS_DEBUG_MODE
  125. throwExceptionIfInvalidOrDuplicate(uuid);
  126. #endif
  127. ScriptFont* scriptResource = new (bs_alloc<ScriptFont>()) ScriptFont(instance, resourceHandle);
  128. mScriptResources[uuid] = scriptResource;
  129. return scriptResource;
  130. }
  131. ScriptManagedResource* ScriptResourceManager::createManagedResource(MonoObject* existingInstance, const HManagedResource& resourceHandle)
  132. {
  133. const String& uuid = resourceHandle.getUUID();
  134. throwExceptionIfInvalidOrDuplicate(uuid);
  135. ScriptManagedResource* scriptResource = new (bs_alloc<ScriptManagedResource>()) ScriptManagedResource(existingInstance, resourceHandle);
  136. mScriptResources[uuid] = scriptResource;
  137. return scriptResource;
  138. }
  139. ScriptTexture2D* ScriptResourceManager::getScriptTexture(const HTexture& resourceHandle)
  140. {
  141. return static_cast<ScriptTexture2D*>(getScriptResource(resourceHandle.getUUID()));
  142. }
  143. ScriptSpriteTexture* ScriptResourceManager::getScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  144. {
  145. return static_cast<ScriptSpriteTexture*>(getScriptResource(resourceHandle.getUUID()));
  146. }
  147. ScriptPlainText* ScriptResourceManager::getScriptPlainText(const HPlainText& resourceHandle)
  148. {
  149. return static_cast<ScriptPlainText*>(getScriptResource(resourceHandle.getUUID()));
  150. }
  151. ScriptScriptCode* ScriptResourceManager::getScriptScriptCode(const HScriptCode& resourceHandle)
  152. {
  153. return static_cast<ScriptScriptCode*>(getScriptResource(resourceHandle.getUUID()));
  154. }
  155. ScriptManagedResource* ScriptResourceManager::getScriptManagedResource(const HManagedResource& resourceHandle)
  156. {
  157. return static_cast<ScriptManagedResource*>(getScriptResource(resourceHandle.getUUID()));
  158. }
  159. ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
  160. {
  161. if(uuid == "")
  162. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  163. auto findIter = mScriptResources.find(uuid);
  164. if(findIter != mScriptResources.end())
  165. return findIter->second;
  166. return nullptr;
  167. }
  168. ScriptResourceBase* ScriptResourceManager::createScriptResource(const HResource& resource)
  169. {
  170. #if BS_DEBUG_MODE
  171. throwExceptionIfInvalidOrDuplicate(resource.getUUID());
  172. #endif
  173. UINT32 resTypeID = resource->getTypeId();
  174. switch (resTypeID)
  175. {
  176. case TID_Texture:
  177. return createScriptTexture2D(static_resource_cast<Texture>(resource));
  178. case TID_SpriteTexture:
  179. return createScriptSpriteTexture(static_resource_cast<SpriteTexture>(resource));
  180. case TID_Font:
  181. return createScriptFont(static_resource_cast<Font>(resource));
  182. case TID_ManagedResource:
  183. BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
  184. break;
  185. default:
  186. BS_EXCEPT(NotImplementedException, "Attempting to load a resource type that is not supported. Type ID: " + toString(resTypeID));
  187. break;
  188. }
  189. }
  190. void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
  191. {
  192. HResource resourceHandle = resource->getNativeHandle();
  193. const String& uuid = resourceHandle.getUUID();
  194. if(uuid == "")
  195. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  196. auto findIter = mScriptResources.find(uuid);
  197. if(findIter != mScriptResources.end())
  198. {
  199. (resource)->~ScriptResourceBase();
  200. MemoryAllocator<GenAlloc>::free(resource);
  201. mScriptResources.erase(findIter);
  202. }
  203. }
  204. void ScriptResourceManager::throwExceptionIfInvalidOrDuplicate(const String& uuid) const
  205. {
  206. if(uuid == "")
  207. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  208. auto findIter = mScriptResources.find(uuid);
  209. if(findIter != mScriptResources.end())
  210. {
  211. BS_EXCEPT(InvalidStateException, "Provided resource handle already has a script resource. \
  212. Retrieve the existing instance instead of creating a new one.");
  213. }
  214. }
  215. }