2
0

BsScriptResourceManager.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382
  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 "BsScriptShader.h"
  12. #include "BsScriptMaterial.h"
  13. #include "BsScriptMesh.h"
  14. #include "BsScriptFont.h"
  15. #include "BsScriptManagedResource.h"
  16. #include "BsScriptAssemblyManager.h"
  17. namespace BansheeEngine
  18. {
  19. ScriptResourceManager::ScriptResourceManager()
  20. {
  21. }
  22. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(const HTexture& resourceHandle)
  23. {
  24. MonoClass* textureClass = ScriptAssemblyManager::instance().getTexture2DClass();
  25. MonoObject* monoInstance = textureClass->createInstance();
  26. return createScriptTexture2D(monoInstance, resourceHandle);
  27. }
  28. ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(const HTexture& resourceHandle)
  29. {
  30. MonoClass* textureClass = ScriptAssemblyManager::instance().getTexture3DClass();
  31. MonoObject* monoInstance = textureClass->createInstance();
  32. return createScriptTexture3D(monoInstance, resourceHandle);
  33. }
  34. ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(const HTexture& resourceHandle)
  35. {
  36. MonoClass* textureClass = ScriptAssemblyManager::instance().getTextureCubeClass();
  37. MonoObject* monoInstance = textureClass->createInstance();
  38. return createScriptTextureCube(monoInstance, resourceHandle);
  39. }
  40. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(MonoObject* instance, const HTexture& resourceHandle)
  41. {
  42. const String& uuid = resourceHandle.getUUID();
  43. #if BS_DEBUG_MODE
  44. throwExceptionIfInvalidOrDuplicate(uuid);
  45. #endif
  46. ScriptTexture2D* scriptResource = new (bs_alloc<ScriptTexture2D>()) ScriptTexture2D(instance, resourceHandle);
  47. mScriptResources[uuid] = scriptResource;
  48. return scriptResource;
  49. }
  50. ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(MonoObject* instance, const HTexture& resourceHandle)
  51. {
  52. const String& uuid = resourceHandle.getUUID();
  53. #if BS_DEBUG_MODE
  54. throwExceptionIfInvalidOrDuplicate(uuid);
  55. #endif
  56. ScriptTexture3D* scriptResource = new (bs_alloc<ScriptTexture3D>()) ScriptTexture3D(instance, resourceHandle);
  57. mScriptResources[uuid] = scriptResource;
  58. return scriptResource;
  59. }
  60. ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(MonoObject* instance, const HTexture& resourceHandle)
  61. {
  62. const String& uuid = resourceHandle.getUUID();
  63. #if BS_DEBUG_MODE
  64. throwExceptionIfInvalidOrDuplicate(uuid);
  65. #endif
  66. ScriptTextureCube* scriptResource = new (bs_alloc<ScriptTextureCube>()) ScriptTextureCube(instance, resourceHandle);
  67. mScriptResources[uuid] = scriptResource;
  68. return scriptResource;
  69. }
  70. ScriptShader* ScriptResourceManager::createScriptShader(const HShader& resourceHandle)
  71. {
  72. MonoClass* shaderClass = ScriptAssemblyManager::instance().getShaderClass();
  73. MonoObject* monoInstance = shaderClass->createInstance();
  74. return createScriptShader(monoInstance, resourceHandle);
  75. }
  76. ScriptShader* ScriptResourceManager::createScriptShader(MonoObject* instance, const HShader& resourceHandle)
  77. {
  78. const String& uuid = resourceHandle.getUUID();
  79. #if BS_DEBUG_MODE
  80. throwExceptionIfInvalidOrDuplicate(uuid);
  81. #endif
  82. ScriptShader* scriptResource = new (bs_alloc<ScriptShader>()) ScriptShader(instance, resourceHandle);
  83. mScriptResources[uuid] = scriptResource;
  84. return scriptResource;
  85. }
  86. ScriptMaterial* ScriptResourceManager::createScriptMaterial(const HMaterial& resourceHandle)
  87. {
  88. MonoClass* materialClass = ScriptAssemblyManager::instance().getMaterialClass();
  89. MonoObject* monoInstance = materialClass->createInstance();
  90. return createScriptMaterial(monoInstance, resourceHandle);
  91. }
  92. ScriptMaterial* ScriptResourceManager::createScriptMaterial(MonoObject* instance, const HMaterial& resourceHandle)
  93. {
  94. const String& uuid = resourceHandle.getUUID();
  95. #if BS_DEBUG_MODE
  96. throwExceptionIfInvalidOrDuplicate(uuid);
  97. #endif
  98. ScriptMaterial* scriptResource = new (bs_alloc<ScriptMaterial>()) ScriptMaterial(instance, resourceHandle);
  99. mScriptResources[uuid] = scriptResource;
  100. return scriptResource;
  101. }
  102. ScriptMesh* ScriptResourceManager::createScriptMesh(const HMesh& resourceHandle)
  103. {
  104. MonoClass* meshClass = ScriptAssemblyManager::instance().getMeshClass();
  105. MonoObject* monoInstance = meshClass->createInstance();
  106. return createScriptMesh(monoInstance, resourceHandle);
  107. }
  108. ScriptMesh* ScriptResourceManager::createScriptMesh(MonoObject* instance, const HMesh& resourceHandle)
  109. {
  110. const String& uuid = resourceHandle.getUUID();
  111. #if BS_DEBUG_MODE
  112. throwExceptionIfInvalidOrDuplicate(uuid);
  113. #endif
  114. ScriptMesh* scriptResource = new (bs_alloc<ScriptMesh>()) ScriptMesh(instance, resourceHandle);
  115. mScriptResources[uuid] = scriptResource;
  116. return scriptResource;
  117. }
  118. ScriptPlainText* ScriptResourceManager::createScriptPlainText(const HPlainText& resourceHandle)
  119. {
  120. MonoClass* plainTextClass = ScriptAssemblyManager::instance().getPlainTextClass();
  121. MonoObject* monoInstance = plainTextClass->createInstance();
  122. return createScriptPlainText(monoInstance, resourceHandle);
  123. }
  124. ScriptPlainText* ScriptResourceManager::createScriptPlainText(MonoObject* instance, const HPlainText& resourceHandle)
  125. {
  126. const String& uuid = resourceHandle.getUUID();
  127. #if BS_DEBUG_MODE
  128. throwExceptionIfInvalidOrDuplicate(uuid);
  129. #endif
  130. ScriptPlainText* scriptResource = new (bs_alloc<ScriptPlainText>()) ScriptPlainText(instance, resourceHandle);
  131. mScriptResources[uuid] = scriptResource;
  132. return scriptResource;
  133. }
  134. ScriptScriptCode* ScriptResourceManager::createScriptScriptCode(const HScriptCode& resourceHandle)
  135. {
  136. MonoClass* scriptCodeClass = ScriptAssemblyManager::instance().getScriptCodeClass();
  137. MonoObject* monoInstance = scriptCodeClass->createInstance();
  138. return createScriptScriptCode(monoInstance, resourceHandle);
  139. }
  140. ScriptScriptCode* ScriptResourceManager::createScriptScriptCode(MonoObject* instance, const HScriptCode& resourceHandle)
  141. {
  142. const String& uuid = resourceHandle.getUUID();
  143. #if BS_DEBUG_MODE
  144. throwExceptionIfInvalidOrDuplicate(uuid);
  145. #endif
  146. ScriptScriptCode* scriptResource = new (bs_alloc<ScriptScriptCode>()) ScriptScriptCode(instance, resourceHandle);
  147. mScriptResources[uuid] = scriptResource;
  148. return scriptResource;
  149. }
  150. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  151. {
  152. MonoClass* spriteTextureClass = ScriptAssemblyManager::instance().getSpriteTextureClass();
  153. MonoObject* monoInstance = spriteTextureClass->createInstance();
  154. return createScriptSpriteTexture(monoInstance, resourceHandle);
  155. }
  156. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(MonoObject* instance, const HSpriteTexture& resourceHandle)
  157. {
  158. const String& uuid = resourceHandle.getUUID();
  159. #if BS_DEBUG_MODE
  160. throwExceptionIfInvalidOrDuplicate(uuid);
  161. #endif
  162. ScriptSpriteTexture* scriptResource = new (bs_alloc<ScriptSpriteTexture>()) ScriptSpriteTexture(instance, resourceHandle);
  163. mScriptResources[uuid] = scriptResource;
  164. return scriptResource;
  165. }
  166. ScriptFont* ScriptResourceManager::createScriptFont(const HFont& resourceHandle)
  167. {
  168. MonoClass* fontClass = ScriptAssemblyManager::instance().getFontClass();
  169. MonoObject* monoInstance = fontClass->createInstance();
  170. return createScriptFont(monoInstance, resourceHandle);
  171. }
  172. ScriptFont* ScriptResourceManager::createScriptFont(MonoObject* instance, const HFont& resourceHandle)
  173. {
  174. const String& uuid = resourceHandle.getUUID();
  175. #if BS_DEBUG_MODE
  176. throwExceptionIfInvalidOrDuplicate(uuid);
  177. #endif
  178. ScriptFont* scriptResource = new (bs_alloc<ScriptFont>()) ScriptFont(instance, resourceHandle);
  179. mScriptResources[uuid] = scriptResource;
  180. return scriptResource;
  181. }
  182. ScriptManagedResource* ScriptResourceManager::createManagedResource(MonoObject* existingInstance, const HManagedResource& resourceHandle)
  183. {
  184. const String& uuid = resourceHandle.getUUID();
  185. throwExceptionIfInvalidOrDuplicate(uuid);
  186. ScriptManagedResource* scriptResource = new (bs_alloc<ScriptManagedResource>()) ScriptManagedResource(existingInstance, resourceHandle);
  187. mScriptResources[uuid] = scriptResource;
  188. return scriptResource;
  189. }
  190. ScriptTexture2D* ScriptResourceManager::getScriptTexture2D(const HTexture& resourceHandle)
  191. {
  192. return static_cast<ScriptTexture2D*>(getScriptResource(resourceHandle.getUUID()));
  193. }
  194. ScriptTexture3D* ScriptResourceManager::getScriptTexture3D(const HTexture& resourceHandle)
  195. {
  196. return static_cast<ScriptTexture3D*>(getScriptResource(resourceHandle.getUUID()));
  197. }
  198. ScriptTextureCube* ScriptResourceManager::getScriptTextureCube(const HTexture& resourceHandle)
  199. {
  200. return static_cast<ScriptTextureCube*>(getScriptResource(resourceHandle.getUUID()));
  201. }
  202. ScriptSpriteTexture* ScriptResourceManager::getScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  203. {
  204. return static_cast<ScriptSpriteTexture*>(getScriptResource(resourceHandle.getUUID()));
  205. }
  206. ScriptShader* ScriptResourceManager::getScriptShader(const HShader& resourceHandle)
  207. {
  208. return static_cast<ScriptShader*>(getScriptResource(resourceHandle.getUUID()));
  209. }
  210. ScriptMaterial* ScriptResourceManager::getScriptMaterial(const HMaterial& resourceHandle)
  211. {
  212. return static_cast<ScriptMaterial*>(getScriptResource(resourceHandle.getUUID()));
  213. }
  214. ScriptMesh* ScriptResourceManager::getScriptMesh(const HMesh& resourceHandle)
  215. {
  216. return static_cast<ScriptMesh*>(getScriptResource(resourceHandle.getUUID()));
  217. }
  218. ScriptPlainText* ScriptResourceManager::getScriptPlainText(const HPlainText& resourceHandle)
  219. {
  220. return static_cast<ScriptPlainText*>(getScriptResource(resourceHandle.getUUID()));
  221. }
  222. ScriptScriptCode* ScriptResourceManager::getScriptScriptCode(const HScriptCode& resourceHandle)
  223. {
  224. return static_cast<ScriptScriptCode*>(getScriptResource(resourceHandle.getUUID()));
  225. }
  226. ScriptManagedResource* ScriptResourceManager::getScriptManagedResource(const HManagedResource& resourceHandle)
  227. {
  228. return static_cast<ScriptManagedResource*>(getScriptResource(resourceHandle.getUUID()));
  229. }
  230. ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
  231. {
  232. if(uuid == "")
  233. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  234. auto findIter = mScriptResources.find(uuid);
  235. if(findIter != mScriptResources.end())
  236. return findIter->second;
  237. return nullptr;
  238. }
  239. ScriptResourceBase* ScriptResourceManager::createScriptResource(const HResource& resource)
  240. {
  241. #if BS_DEBUG_MODE
  242. throwExceptionIfInvalidOrDuplicate(resource.getUUID());
  243. #endif
  244. UINT32 resTypeID = resource->getTypeId();
  245. switch (resTypeID)
  246. {
  247. case TID_Texture:
  248. {
  249. HTexture texture = static_resource_cast<Texture>(resource);
  250. TextureType type = texture->getProperties().getTextureType();
  251. if (type == TEX_TYPE_3D)
  252. return createScriptTexture3D(texture);
  253. else if (type == TEX_TYPE_CUBE_MAP)
  254. return createScriptTextureCube(texture);
  255. else
  256. return createScriptTexture2D(texture);
  257. }
  258. case TID_SpriteTexture:
  259. return createScriptSpriteTexture(static_resource_cast<SpriteTexture>(resource));
  260. case TID_Font:
  261. return createScriptFont(static_resource_cast<Font>(resource));
  262. case TID_PlainText:
  263. return createScriptPlainText(static_resource_cast<PlainText>(resource));
  264. case TID_ScriptCode:
  265. return createScriptScriptCode(static_resource_cast<ScriptCode>(resource));
  266. case TID_Shader:
  267. return createScriptShader(static_resource_cast<Shader>(resource));
  268. case TID_Material:
  269. return createScriptMaterial(static_resource_cast<Material>(resource));
  270. case TID_Mesh:
  271. return createScriptMesh(static_resource_cast<Mesh>(resource));
  272. case TID_ManagedResource:
  273. BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
  274. break;
  275. default:
  276. BS_EXCEPT(NotImplementedException, "Attempting to load a resource type that is not supported. Type ID: " + toString(resTypeID));
  277. break;
  278. }
  279. }
  280. void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
  281. {
  282. HResource resourceHandle = resource->getNativeHandle();
  283. const String& uuid = resourceHandle.getUUID();
  284. if(uuid == "")
  285. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  286. auto findIter = mScriptResources.find(uuid);
  287. if(findIter != mScriptResources.end())
  288. {
  289. (resource)->~ScriptResourceBase();
  290. MemoryAllocator<GenAlloc>::free(resource);
  291. mScriptResources.erase(findIter);
  292. }
  293. }
  294. void ScriptResourceManager::throwExceptionIfInvalidOrDuplicate(const String& uuid) const
  295. {
  296. if(uuid == "")
  297. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  298. auto findIter = mScriptResources.find(uuid);
  299. if(findIter != mScriptResources.end())
  300. {
  301. BS_EXCEPT(InvalidStateException, "Provided resource handle already has a script resource. \
  302. Retrieve the existing instance instead of creating a new one.");
  303. }
  304. }
  305. }