BsScriptResourceManager.cpp 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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 "BsScriptFont.h"
  10. #include "BsScriptManagedResource.h"
  11. namespace BansheeEngine
  12. {
  13. ScriptResourceManager::ScriptResourceManager()
  14. :mTextureClass(nullptr), mSpriteTextureClass(nullptr)
  15. {
  16. MonoAssembly* assembly = MonoManager::instance().getAssembly(BansheeEngineAssemblyName);
  17. if(assembly == nullptr)
  18. BS_EXCEPT(InternalErrorException, "Cannot find \"" + String(BansheeEngineAssemblyName) + "\" assembly.");
  19. mTextureClass = assembly->getClass("BansheeEngine", "Texture2D");
  20. mSpriteTextureClass = assembly->getClass("BansheeEngine", "SpriteTexture");
  21. mFontClass = assembly->getClass("BansheeEngine", "Font");
  22. if(mTextureClass == nullptr)
  23. BS_EXCEPT(InternalErrorException, "Cannot find managed Texture2D class.");
  24. if(mSpriteTextureClass == nullptr)
  25. BS_EXCEPT(InternalErrorException, "Cannot find managed SpriteTexture class.");
  26. if (mFontClass == nullptr)
  27. BS_EXCEPT(InternalErrorException, "Cannot find managed Font class.");
  28. }
  29. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(const HTexture& resourceHandle)
  30. {
  31. MonoObject* monoInstance = mTextureClass->createInstance();
  32. return createScriptTexture2D(monoInstance, resourceHandle);
  33. }
  34. ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(const HTexture& resourceHandle)
  35. {
  36. MonoObject* monoInstance = mTextureClass->createInstance();
  37. return createScriptTexture3D(monoInstance, resourceHandle);
  38. }
  39. ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(const HTexture& resourceHandle)
  40. {
  41. MonoObject* monoInstance = mTextureClass->createInstance();
  42. return createScriptTextureCube(monoInstance, resourceHandle);
  43. }
  44. ScriptTexture2D* ScriptResourceManager::createScriptTexture2D(MonoObject* instance, const HTexture& resourceHandle)
  45. {
  46. const String& uuid = resourceHandle.getUUID();
  47. #if BS_DEBUG_MODE
  48. throwExceptionIfInvalidOrDuplicate(uuid);
  49. #endif
  50. ScriptTexture2D* scriptResource = new (bs_alloc<ScriptTexture2D>()) ScriptTexture2D(instance, resourceHandle);
  51. mScriptResources[uuid] = scriptResource;
  52. return scriptResource;
  53. }
  54. ScriptTexture3D* ScriptResourceManager::createScriptTexture3D(MonoObject* instance, const HTexture& resourceHandle)
  55. {
  56. const String& uuid = resourceHandle.getUUID();
  57. #if BS_DEBUG_MODE
  58. throwExceptionIfInvalidOrDuplicate(uuid);
  59. #endif
  60. ScriptTexture3D* scriptResource = new (bs_alloc<ScriptTexture3D>()) ScriptTexture3D(instance, resourceHandle);
  61. mScriptResources[uuid] = scriptResource;
  62. return scriptResource;
  63. }
  64. ScriptTextureCube* ScriptResourceManager::createScriptTextureCube(MonoObject* instance, const HTexture& resourceHandle)
  65. {
  66. const String& uuid = resourceHandle.getUUID();
  67. #if BS_DEBUG_MODE
  68. throwExceptionIfInvalidOrDuplicate(uuid);
  69. #endif
  70. ScriptTextureCube* scriptResource = new (bs_alloc<ScriptTextureCube>()) ScriptTextureCube(instance, resourceHandle);
  71. mScriptResources[uuid] = scriptResource;
  72. return scriptResource;
  73. }
  74. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  75. {
  76. MonoObject* monoInstance = mSpriteTextureClass->createInstance();
  77. return createScriptSpriteTexture(monoInstance, resourceHandle);
  78. }
  79. ScriptSpriteTexture* ScriptResourceManager::createScriptSpriteTexture(MonoObject* instance, const HSpriteTexture& resourceHandle)
  80. {
  81. const String& uuid = resourceHandle.getUUID();
  82. #if BS_DEBUG_MODE
  83. throwExceptionIfInvalidOrDuplicate(uuid);
  84. #endif
  85. ScriptSpriteTexture* scriptResource = new (bs_alloc<ScriptSpriteTexture>()) ScriptSpriteTexture(instance, resourceHandle);
  86. mScriptResources[uuid] = scriptResource;
  87. return scriptResource;
  88. }
  89. ScriptFont* ScriptResourceManager::createScriptFont(const HFont& resourceHandle)
  90. {
  91. MonoObject* monoInstance = mFontClass->createInstance();
  92. return createScriptFont(monoInstance, resourceHandle);
  93. }
  94. ScriptFont* ScriptResourceManager::createScriptFont(MonoObject* instance, const HFont& resourceHandle)
  95. {
  96. const String& uuid = resourceHandle.getUUID();
  97. #if BS_DEBUG_MODE
  98. throwExceptionIfInvalidOrDuplicate(uuid);
  99. #endif
  100. ScriptFont* scriptResource = new (bs_alloc<ScriptFont>()) ScriptFont(instance, resourceHandle);
  101. mScriptResources[uuid] = scriptResource;
  102. return scriptResource;
  103. }
  104. ScriptManagedResource* ScriptResourceManager::createManagedResource(MonoObject* existingInstance, const HManagedResource& resourceHandle)
  105. {
  106. const String& uuid = resourceHandle.getUUID();
  107. throwExceptionIfInvalidOrDuplicate(uuid);
  108. ScriptManagedResource* scriptResource = new (bs_alloc<ScriptManagedResource>()) ScriptManagedResource(existingInstance, resourceHandle);
  109. mScriptResources[uuid] = scriptResource;
  110. return scriptResource;
  111. }
  112. ScriptTexture2D* ScriptResourceManager::getScriptTexture(const HTexture& resourceHandle)
  113. {
  114. return static_cast<ScriptTexture2D*>(getScriptResource(resourceHandle.getUUID()));
  115. }
  116. ScriptSpriteTexture* ScriptResourceManager::getScriptSpriteTexture(const HSpriteTexture& resourceHandle)
  117. {
  118. return static_cast<ScriptSpriteTexture*>(getScriptResource(resourceHandle.getUUID()));
  119. }
  120. ScriptManagedResource* ScriptResourceManager::getScriptManagedResource(const HManagedResource& resourceHandle)
  121. {
  122. return static_cast<ScriptManagedResource*>(getScriptResource(resourceHandle.getUUID()));
  123. }
  124. ScriptResourceBase* ScriptResourceManager::getScriptResource(const String& uuid)
  125. {
  126. if(uuid == "")
  127. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  128. auto findIter = mScriptResources.find(uuid);
  129. if(findIter != mScriptResources.end())
  130. return findIter->second;
  131. return nullptr;
  132. }
  133. ScriptResourceBase* ScriptResourceManager::createScriptResource(const HResource& resource)
  134. {
  135. #if BS_DEBUG_MODE
  136. throwExceptionIfInvalidOrDuplicate(resource.getUUID());
  137. #endif
  138. UINT32 resTypeID = resource->getTypeId();
  139. switch (resTypeID)
  140. {
  141. case TID_Texture:
  142. return createScriptTexture2D(static_resource_cast<Texture>(resource));
  143. case TID_SpriteTexture:
  144. return createScriptSpriteTexture(static_resource_cast<SpriteTexture>(resource));
  145. case TID_Font:
  146. return createScriptFont(static_resource_cast<Font>(resource));
  147. case TID_ManagedResource:
  148. BS_EXCEPT(InternalErrorException, "Managed resources must have a managed instance by default, this call is invalid.")
  149. break;
  150. default:
  151. BS_EXCEPT(NotImplementedException, "Attempting to load a resource type that is not supported. Type ID: " + toString(resTypeID));
  152. break;
  153. }
  154. }
  155. void ScriptResourceManager::destroyScriptResource(ScriptResourceBase* resource)
  156. {
  157. HResource resourceHandle = resource->getNativeHandle();
  158. const String& uuid = resourceHandle.getUUID();
  159. if(uuid == "")
  160. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  161. auto findIter = mScriptResources.find(uuid);
  162. if(findIter != mScriptResources.end())
  163. {
  164. (resource)->~ScriptResourceBase();
  165. MemoryAllocator<GenAlloc>::free(resource);
  166. mScriptResources.erase(findIter);
  167. }
  168. }
  169. void ScriptResourceManager::throwExceptionIfInvalidOrDuplicate(const String& uuid) const
  170. {
  171. if(uuid == "")
  172. BS_EXCEPT(InvalidParametersException, "Provided resource handle has an undefined resource UUID.");
  173. auto findIter = mScriptResources.find(uuid);
  174. if(findIter != mScriptResources.end())
  175. {
  176. BS_EXCEPT(InvalidStateException, "Provided resource handle already has a script resource. \
  177. Retrieve the existing instance instead of creating a new one.");
  178. }
  179. }
  180. }