BsScriptRenderable.cpp 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2016 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "BsScriptRenderable.h"
  4. #include "BsScriptMeta.h"
  5. #include "BsMonoField.h"
  6. #include "BsMonoClass.h"
  7. #include "BsMonoManager.h"
  8. #include "BsMonoUtil.h"
  9. #include "BsApplication.h"
  10. #include "BsCRenderable.h"
  11. #include "BsScriptSceneObject.h"
  12. #include "BsSceneObject.h"
  13. #include "BsSceneManager.h"
  14. #include "BsScriptMesh.h"
  15. #include "BsScriptAnimation.h"
  16. #include "BsScriptMaterial.h"
  17. #include "BsScriptResourceManager.h"
  18. namespace bs
  19. {
  20. ScriptRenderable::ScriptRenderable(MonoObject* managedInstance, const HSceneObject& parentSO)
  21. :ScriptObject(managedInstance), mRenderable(nullptr)
  22. {
  23. mRenderable = Renderable::create();
  24. gSceneManager()._registerRenderable(mRenderable, parentSO);
  25. }
  26. ScriptRenderable::~ScriptRenderable()
  27. { }
  28. void ScriptRenderable::initRuntimeData()
  29. {
  30. metaData.scriptClass->addInternalCall("Internal_Create", &ScriptRenderable::internal_Create);
  31. metaData.scriptClass->addInternalCall("Internal_SetAnimation", &ScriptRenderable::internal_SetAnimation);
  32. metaData.scriptClass->addInternalCall("Internal_UpdateTransform", &ScriptRenderable::internal_UpdateTransform);
  33. metaData.scriptClass->addInternalCall("Internal_SetMesh", &ScriptRenderable::internal_SetMesh);
  34. metaData.scriptClass->addInternalCall("Internal_GetBounds", &ScriptRenderable::internal_GetBounds);
  35. metaData.scriptClass->addInternalCall("Internal_GetLayers", &ScriptRenderable::internal_GetLayers);
  36. metaData.scriptClass->addInternalCall("Internal_SetLayers", &ScriptRenderable::internal_SetLayers);
  37. metaData.scriptClass->addInternalCall("Internal_SetMaterial", &ScriptRenderable::internal_SetMaterial);
  38. metaData.scriptClass->addInternalCall("Internal_SetMaterials", &ScriptRenderable::internal_SetMaterials);
  39. metaData.scriptClass->addInternalCall("Internal_SetOverrideBounds", &ScriptRenderable::internal_SetOverrideBounds);
  40. metaData.scriptClass->addInternalCall("Internal_SetUseOverrideBounds", &ScriptRenderable::internal_SetUseOverrideBounds);
  41. metaData.scriptClass->addInternalCall("Internal_OnDestroy", &ScriptRenderable::internal_OnDestroy);
  42. }
  43. void ScriptRenderable::updateTransform(const HSceneObject& parent, bool force)
  44. {
  45. mRenderable->_updateTransform(parent, force);
  46. if (parent->getActive() != mRenderable->getIsActive())
  47. mRenderable->setIsActive(parent->getActive());
  48. }
  49. void ScriptRenderable::internal_Create(MonoObject* instance, ScriptSceneObject* parentSO)
  50. {
  51. HSceneObject so;
  52. if (parentSO != nullptr)
  53. so = parentSO->getNativeHandle();
  54. new (bs_alloc<ScriptRenderable>()) ScriptRenderable(instance, so);
  55. }
  56. void ScriptRenderable::internal_SetAnimation(ScriptRenderable* thisPtr, ScriptAnimation* animation)
  57. {
  58. SPtr<Animation> anim;
  59. if (animation != nullptr)
  60. anim = animation->getInternal();
  61. thisPtr->getInternal()->setAnimation(anim);
  62. }
  63. void ScriptRenderable::internal_UpdateTransform(ScriptRenderable* thisPtr, ScriptSceneObject* parent, bool force)
  64. {
  65. HSceneObject parentSO = parent->getNativeSceneObject();
  66. thisPtr->updateTransform(parentSO, force);
  67. }
  68. void ScriptRenderable::internal_SetMesh(ScriptRenderable* thisPtr, ScriptMesh* mesh)
  69. {
  70. HMesh nativeMesh;
  71. if (mesh != nullptr)
  72. nativeMesh = mesh->getHandle();
  73. thisPtr->getInternal()->setMesh(nativeMesh);
  74. }
  75. void ScriptRenderable::internal_GetBounds(ScriptRenderable* thisPtr, ScriptSceneObject* parent, AABox* box, Sphere* sphere)
  76. {
  77. HSceneObject parentSO = parent->getNativeSceneObject();
  78. thisPtr->updateTransform(parentSO, false);
  79. Bounds bounds = thisPtr->getInternal()->getBounds();
  80. *box = bounds.getBox();
  81. *sphere = bounds.getSphere();
  82. }
  83. UINT64 ScriptRenderable::internal_GetLayers(ScriptRenderable* thisPtr)
  84. {
  85. return thisPtr->getInternal()->getLayer();
  86. }
  87. void ScriptRenderable::internal_SetLayers(ScriptRenderable* thisPtr, UINT64 layers)
  88. {
  89. thisPtr->getInternal()->setLayer(layers);
  90. }
  91. void ScriptRenderable::internal_SetMaterials(ScriptRenderable* thisPtr, MonoArray* materials)
  92. {
  93. if (materials != nullptr)
  94. {
  95. ScriptArray scriptMaterials(materials);
  96. Vector<HMaterial> nativeMaterials(scriptMaterials.size());
  97. for (UINT32 i = 0; i < scriptMaterials.size(); i++)
  98. {
  99. MonoObject* monoMaterial = scriptMaterials.get<MonoObject*>(i);
  100. ScriptMaterial* scriptMaterial = ScriptMaterial::toNative(monoMaterial);
  101. if (scriptMaterial != nullptr)
  102. nativeMaterials[i] = scriptMaterial->getHandle();
  103. }
  104. thisPtr->getInternal()->setMaterials(nativeMaterials);
  105. }
  106. else
  107. {
  108. thisPtr->getInternal()->setMaterials({});
  109. }
  110. }
  111. void ScriptRenderable::internal_SetMaterial(ScriptRenderable* thisPtr, ScriptMaterial* material, int index)
  112. {
  113. HMaterial nativeMaterial;
  114. if (material != nullptr)
  115. nativeMaterial = material->getHandle();
  116. thisPtr->getInternal()->setMaterial(index, nativeMaterial);
  117. }
  118. void ScriptRenderable::internal_SetOverrideBounds(ScriptRenderable* thisPtr, AABox* box)
  119. {
  120. thisPtr->getInternal()->setOverrideBounds(*box);
  121. }
  122. void ScriptRenderable::internal_SetUseOverrideBounds(ScriptRenderable* thisPtr, bool enable)
  123. {
  124. thisPtr->getInternal()->setUseOverrideBounds(enable);
  125. }
  126. void ScriptRenderable::internal_OnDestroy(ScriptRenderable* thisPtr)
  127. {
  128. thisPtr->destroy();
  129. }
  130. void ScriptRenderable::destroy()
  131. {
  132. if (mRenderable->isDestroyed())
  133. return;
  134. gSceneManager()._unregisterRenderable(mRenderable);
  135. mRenderable->destroy();
  136. }
  137. void ScriptRenderable::_onManagedInstanceDeleted()
  138. {
  139. destroy();
  140. ScriptObject::_onManagedInstanceDeleted();
  141. }
  142. ScriptRenderable2::ScriptRenderable2(MonoObject* managedInstance, const HComponent& component)
  143. :TScriptComponent <ScriptRenderable2, CRenderable>(managedInstance, component)
  144. { }
  145. ScriptRenderable2::~ScriptRenderable2()
  146. { }
  147. void ScriptRenderable2::initRuntimeData()
  148. {
  149. metaData.scriptClass->addInternalCall("Internal_GetMesh", &ScriptRenderable2::internal_GetMesh);
  150. metaData.scriptClass->addInternalCall("Internal_SetMesh", &ScriptRenderable2::internal_SetMesh);
  151. metaData.scriptClass->addInternalCall("Internal_GetBounds", &ScriptRenderable2::internal_GetBounds);
  152. metaData.scriptClass->addInternalCall("Internal_GetLayers", &ScriptRenderable2::internal_GetLayers);
  153. metaData.scriptClass->addInternalCall("Internal_SetLayers", &ScriptRenderable2::internal_SetLayers);
  154. metaData.scriptClass->addInternalCall("Internal_GetMaterial", &ScriptRenderable2::internal_GetMaterial);
  155. metaData.scriptClass->addInternalCall("Internal_SetMaterial", &ScriptRenderable2::internal_SetMaterial);
  156. metaData.scriptClass->addInternalCall("Internal_GetMaterials", &ScriptRenderable2::internal_GetMaterials);
  157. metaData.scriptClass->addInternalCall("Internal_SetMaterials", &ScriptRenderable2::internal_SetMaterials);
  158. }
  159. MonoObject* ScriptRenderable2::internal_GetMesh(ScriptRenderable2* thisPtr)
  160. {
  161. HMesh mesh = thisPtr->getHandle()->getMesh();
  162. if (!mesh.isLoaded(false))
  163. return nullptr;
  164. ScriptMesh* scriptMesh;
  165. ScriptResourceManager::instance().getScriptResource(mesh, &scriptMesh, true);
  166. return scriptMesh->getManagedInstance();
  167. }
  168. void ScriptRenderable2::internal_SetMesh(ScriptRenderable2* thisPtr, ScriptMesh* mesh)
  169. {
  170. HMesh nativeMesh;
  171. if (mesh != nullptr)
  172. nativeMesh = mesh->getHandle();
  173. HRenderable renderable = thisPtr->getHandle();
  174. renderable->setMesh(nativeMesh);
  175. }
  176. void ScriptRenderable2::internal_GetBounds(ScriptRenderable2* thisPtr, AABox* box, Sphere* sphere)
  177. {
  178. Bounds bounds = thisPtr->getHandle()->getBounds();
  179. *box = bounds.getBox();
  180. *sphere = bounds.getSphere();
  181. }
  182. UINT64 ScriptRenderable2::internal_GetLayers(ScriptRenderable2* thisPtr)
  183. {
  184. return thisPtr->getHandle()->getLayer();
  185. }
  186. void ScriptRenderable2::internal_SetLayers(ScriptRenderable2* thisPtr, UINT64 layers)
  187. {
  188. thisPtr->getHandle()->setLayer(layers);
  189. }
  190. MonoObject* ScriptRenderable2::internal_GetMaterial(ScriptRenderable2* thisPtr, int index)
  191. {
  192. HMaterial material = thisPtr->getHandle()->getMaterial(index);
  193. if (!material.isLoaded())
  194. return nullptr;
  195. ScriptMaterial* scriptMaterial;
  196. ScriptResourceManager::instance().getScriptResource(material, &scriptMaterial, true);
  197. return scriptMaterial->getManagedInstance();
  198. }
  199. void ScriptRenderable2::internal_SetMaterial(ScriptRenderable2* thisPtr, ScriptMaterial* material, int index)
  200. {
  201. HMaterial nativeMaterial;
  202. if (material != nullptr)
  203. nativeMaterial = material->getHandle();
  204. thisPtr->getHandle()->setMaterial(index, nativeMaterial);
  205. }
  206. MonoArray* ScriptRenderable2::internal_GetMaterials(ScriptRenderable2* thisPtr)
  207. {
  208. HRenderable renderable = thisPtr->getHandle();
  209. HMesh mesh = renderable->getMesh();
  210. if (!mesh.isLoaded())
  211. return ScriptArray::create<ScriptMaterial>(0).getInternal();
  212. UINT32 numMaterials = mesh->getProperties().getNumSubMeshes();
  213. ScriptArray output = ScriptArray::create<ScriptMaterial>(numMaterials);
  214. for(UINT32 i = 0; i < numMaterials; i++)
  215. {
  216. HMaterial material = renderable->getMaterial(i);
  217. if (!material.isLoaded())
  218. output.set(i, nullptr);
  219. else
  220. {
  221. ScriptMaterial* scriptMaterial;
  222. ScriptResourceManager::instance().getScriptResource(material, &scriptMaterial, true);
  223. output.set(i, scriptMaterial->getManagedInstance());
  224. }
  225. }
  226. return output.getInternal();
  227. }
  228. void ScriptRenderable2::internal_SetMaterials(ScriptRenderable2* thisPtr, MonoArray* materials)
  229. {
  230. HRenderable renderable = thisPtr->getHandle();
  231. if (materials != nullptr)
  232. {
  233. ScriptArray scriptMaterials(materials);
  234. Vector<HMaterial> nativeMaterials(scriptMaterials.size());
  235. for (UINT32 i = 0; i < scriptMaterials.size(); i++)
  236. {
  237. MonoObject* monoMaterial = scriptMaterials.get<MonoObject*>(i);
  238. ScriptMaterial* scriptMaterial = ScriptMaterial::toNative(monoMaterial);
  239. if (scriptMaterial != nullptr)
  240. renderable->setMaterial(i, scriptMaterial->getHandle());
  241. }
  242. }
  243. else
  244. {
  245. HMesh mesh = renderable->getMesh();
  246. if (!mesh.isLoaded())
  247. return;
  248. UINT32 numMaterials = mesh->getProperties().getNumSubMeshes();
  249. for (UINT32 i = 0; i < numMaterials; i++)
  250. renderable->setMaterial(i, HMaterial());
  251. }
  252. }
  253. }