BsScriptResourceManager.cpp 14 KB

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