BsScriptResourceManager.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204
  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. template<class RetType, class InType>
  25. void ScriptResourceManager::createScriptResource(const ResourceHandle<InType>& resourceHandle, RetType** out)
  26. {
  27. MonoClass* resourceClass = RetType::getMetaData()->scriptClass;
  28. MonoObject* monoInstance = resourceClass->createInstance();
  29. createScriptResource(monoInstance, resourceHandle, out);
  30. }
  31. template<class RetType, class InType>
  32. void ScriptResourceManager::createScriptResource(MonoObject* instance, const ResourceHandle<InType>& resourceHandle, RetType** out)
  33. {
  34. const String& uuid = resourceHandle.getUUID();
  35. #if BS_DEBUG_MODE
  36. throwExceptionIfInvalidOrDuplicate(uuid);
  37. #endif
  38. RetType* scriptResource = new (bs_alloc<RetType>()) RetType(instance, resourceHandle);
  39. mScriptResources[uuid] = scriptResource;
  40. *out = scriptResource;
  41. }
  42. template<class RetType, class InType>
  43. void ScriptResourceManager::getScriptResource(const ResourceHandle<InType>& resourceHandle, RetType** out, bool create)
  44. {
  45. *out = static_cast<RetType*>(getScriptResource(resourceHandle.getUUID()));
  46. if (*out == nullptr && create)
  47. createScriptResource(resourceHandle, out);
  48. }
  49. template<>
  50. void ScriptResourceManager::createScriptResource(const ResourceHandle<StringTable>& resourceHandle, ScriptStringTable** out)
  51. {
  52. MonoClass* resourceClass = ScriptStringTable::getMetaData()->scriptClass;
  53. bool dummy = true;
  54. void* params = { &dummy };
  55. MonoObject* monoInstance = resourceClass->createInstance(&params, 1);
  56. createScriptResource(monoInstance, resourceHandle, out);
  57. }
  58. template<>
  59. void ScriptResourceManager::createScriptResource(const HResource& resourceHandle, ScriptResourceBase** out)
  60. {
  61. #if BS_DEBUG_MODE
  62. throwExceptionIfInvalidOrDuplicate(resourceHandle.getUUID());
  63. #endif
  64. UINT32 resTypeID = resourceHandle->getTypeId();
  65. switch (resTypeID)
  66. {
  67. case TID_Texture:
  68. {
  69. HTexture texture = static_resource_cast<Texture>(resourceHandle);
  70. TextureType type = texture->getProperties().getTextureType();
  71. if (type == TEX_TYPE_3D)
  72. return createScriptResource(texture, (ScriptTexture3D**)out);
  73. else if (type == TEX_TYPE_CUBE_MAP)
  74. return createScriptResource(texture, (ScriptTextureCube**)out);
  75. else
  76. return createScriptResource(texture, (ScriptTexture2D**)out);
  77. }
  78. case TID_SpriteTexture:
  79. return createScriptResource(static_resource_cast<SpriteTexture>(resourceHandle), (ScriptSpriteTexture**)out);
  80. case TID_Font:
  81. return createScriptResource(static_resource_cast<Font>(resourceHandle), (ScriptFont**)out);
  82. case TID_PlainText:
  83. return createScriptResource(static_resource_cast<PlainText>(resourceHandle), (ScriptPlainText**)out);
  84. case TID_ScriptCode:
  85. return createScriptResource(static_resource_cast<ScriptCode>(resourceHandle), (ScriptScriptCode**)out);
  86. case TID_Shader:
  87. return createScriptResource(static_resource_cast<Shader>(resourceHandle), (ScriptShader**)out);
  88. case TID_Prefab:
  89. return createScriptResource(static_resource_cast<Prefab>(resourceHandle), (ScriptPrefab**)out);
  90. case TID_StringTable:
  91. return createScriptResource(static_resource_cast<StringTable>(resourceHandle), (ScriptStringTable**)out);
  92. case TID_Material:
  93. return createScriptResource(static_resource_cast<Material>(resourceHandle), (ScriptMaterial**)out);
  94. case TID_Mesh:
  95. return createScriptResource(static_resource_cast<Mesh>(resourceHandle), (ScriptMesh**)out);
  96. case TID_ManagedResource:
  97. BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
  98. break;
  99. default:
  100. BS_EXCEPT(NotImplementedException, "Attempting to load a resource type that is not supported. Type ID: " + toString(resTypeID));
  101. break;
  102. }
  103. }
  104. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Texture>&, ScriptTexture2D**);
  105. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Texture>&, ScriptTexture3D**);
  106. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Texture>&, ScriptTextureCube**);
  107. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<SpriteTexture>&, ScriptSpriteTexture**);
  108. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Mesh>&, ScriptMesh**);
  109. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Material>&, ScriptMaterial**);
  110. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Shader>&, ScriptShader**);
  111. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Prefab>&, ScriptPrefab**);
  112. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<Font>&, ScriptFont**);
  113. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<PlainText>&, ScriptPlainText**);
  114. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<ScriptCode>&, ScriptScriptCode**);
  115. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(const ResourceHandle<StringTable>&, ScriptStringTable**);
  116. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Texture>&, ScriptTexture2D**);
  117. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Texture>&, ScriptTexture3D**);
  118. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Texture>&, ScriptTextureCube**);
  119. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<SpriteTexture>&, ScriptSpriteTexture**);
  120. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Mesh>&, ScriptMesh**);
  121. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Material>&, ScriptMaterial**);
  122. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Shader>&, ScriptShader**);
  123. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Prefab>&, ScriptPrefab**);
  124. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<Font>&, ScriptFont**);
  125. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<PlainText>&, ScriptPlainText**);
  126. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<ScriptCode>&, ScriptScriptCode**);
  127. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<StringTable>&, ScriptStringTable**);
  128. template BS_SCR_BE_EXPORT void ScriptResourceManager::createScriptResource(MonoObject*, const ResourceHandle<ManagedResource>&, ScriptManagedResource**);
  129. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Texture>& resourceHandle, ScriptTexture2D** out, bool create);
  130. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Texture>& resourceHandle, ScriptTexture3D** out, bool create);
  131. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Texture>& resourceHandle, ScriptTextureCube** out, bool create);
  132. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<SpriteTexture>& resourceHandle, ScriptSpriteTexture** out, bool create);
  133. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Mesh>& resourceHandle, ScriptMesh** out, bool create);
  134. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Material>& resourceHandle, ScriptMaterial** out, bool create);
  135. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Shader>& resourceHandle, ScriptShader** out, bool create);
  136. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Prefab>& resourceHandle, ScriptPrefab** out, bool create);
  137. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Font>& resourceHandle, ScriptFont** out, bool create);
  138. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<PlainText>& resourceHandle, ScriptPlainText** out, bool create);
  139. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<ScriptCode>& resourceHandle, ScriptScriptCode** out, bool create);
  140. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<StringTable>& resourceHandle, ScriptStringTable** out, bool create);
  141. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<ManagedResource>& resourceHandle, ScriptManagedResource** out, bool create);
  142. template BS_SCR_BE_EXPORT void ScriptResourceManager::getScriptResource(const ResourceHandle<Resource>& resourceHandle, ScriptResourceBase** out, bool create);
  143. ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
  144. {
  145. if(uuid == "")
  146. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  147. auto findIter = mScriptResources.find(uuid);
  148. if(findIter != mScriptResources.end())
  149. return findIter->second;
  150. return nullptr;
  151. }
  152. void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
  153. {
  154. HResource resourceHandle = resource->getNativeHandle();
  155. const String& uuid = resourceHandle.getUUID();
  156. if(uuid == "")
  157. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  158. auto findIter = mScriptResources.find(uuid);
  159. if(findIter != mScriptResources.end())
  160. {
  161. (resource)->~ScriptResourceBase();
  162. MemoryAllocator<GenAlloc>::free(resource);
  163. mScriptResources.erase(findIter);
  164. }
  165. }
  166. void ScriptResourceManager::throwExceptionIfInvalidOrDuplicate(const String& uuid) const
  167. {
  168. if(uuid == "")
  169. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  170. auto findIter = mScriptResources.find(uuid);
  171. if(findIter != mScriptResources.end())
  172. {
  173. BS_EXCEPT(InvalidStateException, "Provided resource handle already has a script resource. \
  174. Retrieve the existing instance instead of creating a new one.");
  175. }
  176. }
  177. }