BsScriptResourceManager.cpp 15 KB

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