BsScriptRenderable.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  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 "BsRenderable.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. namespace BansheeEngine
  18. {
  19. ScriptRenderable::ScriptRenderable(MonoObject* managedInstance, const HSceneObject& parentSO)
  20. :ScriptObject(managedInstance), mRenderable(nullptr)
  21. {
  22. mRenderable = Renderable::create();
  23. gSceneManager()._registerRenderable(mRenderable, parentSO);
  24. }
  25. ScriptRenderable::~ScriptRenderable()
  26. { }
  27. void ScriptRenderable::initRuntimeData()
  28. {
  29. metaData.scriptClass->addInternalCall("Internal_Create", &ScriptRenderable::internal_Create);
  30. metaData.scriptClass->addInternalCall("Internal_SetAnimation", &ScriptRenderable::internal_SetAnimation);
  31. metaData.scriptClass->addInternalCall("Internal_UpdateTransform", &ScriptRenderable::internal_UpdateTransform);
  32. metaData.scriptClass->addInternalCall("Internal_SetMesh", &ScriptRenderable::internal_SetMesh);
  33. metaData.scriptClass->addInternalCall("Internal_GetBounds", &ScriptRenderable::internal_GetBounds);
  34. metaData.scriptClass->addInternalCall("Internal_GetLayers", &ScriptRenderable::internal_GetLayers);
  35. metaData.scriptClass->addInternalCall("Internal_SetLayers", &ScriptRenderable::internal_SetLayers);
  36. metaData.scriptClass->addInternalCall("Internal_SetMaterial", &ScriptRenderable::internal_SetMaterial);
  37. metaData.scriptClass->addInternalCall("Internal_SetMaterials", &ScriptRenderable::internal_SetMaterials);
  38. metaData.scriptClass->addInternalCall("Internal_SetOverrideBounds", &ScriptRenderable::internal_SetOverrideBounds);
  39. metaData.scriptClass->addInternalCall("Internal_SetUseOverrideBounds", &ScriptRenderable::internal_SetUseOverrideBounds);
  40. metaData.scriptClass->addInternalCall("Internal_OnDestroy", &ScriptRenderable::internal_OnDestroy);
  41. }
  42. void ScriptRenderable::updateTransform(const HSceneObject& parent, bool force)
  43. {
  44. mRenderable->_updateTransform(parent, force);
  45. if (parent->getActive() != mRenderable->getIsActive())
  46. mRenderable->setIsActive(parent->getActive());
  47. }
  48. void ScriptRenderable::internal_Create(MonoObject* instance, ScriptSceneObject* parentSO)
  49. {
  50. HSceneObject so;
  51. if (parentSO != nullptr)
  52. so = parentSO->getNativeHandle();
  53. new (bs_alloc<ScriptRenderable>()) ScriptRenderable(instance, so);
  54. }
  55. void ScriptRenderable::internal_SetAnimation(ScriptRenderable* thisPtr, ScriptAnimation* animation)
  56. {
  57. SPtr<Animation> anim;
  58. if (animation != nullptr)
  59. anim = animation->getInternal();
  60. thisPtr->getInternal()->setAnimation(anim);
  61. }
  62. void ScriptRenderable::internal_UpdateTransform(ScriptRenderable* thisPtr, ScriptSceneObject* parent, bool force)
  63. {
  64. HSceneObject parentSO = parent->getNativeSceneObject();
  65. thisPtr->updateTransform(parentSO, force);
  66. }
  67. void ScriptRenderable::internal_SetMesh(ScriptRenderable* thisPtr, ScriptMesh* mesh)
  68. {
  69. HMesh nativeMesh;
  70. if (mesh != nullptr)
  71. nativeMesh = mesh->getHandle();
  72. thisPtr->getInternal()->setMesh(nativeMesh);
  73. }
  74. void ScriptRenderable::internal_GetBounds(ScriptRenderable* thisPtr, ScriptSceneObject* parent, AABox* box, Sphere* sphere)
  75. {
  76. HSceneObject parentSO = parent->getNativeSceneObject();
  77. thisPtr->updateTransform(parentSO, false);
  78. Bounds bounds = thisPtr->getInternal()->getBounds();
  79. *box = bounds.getBox();
  80. *sphere = bounds.getSphere();
  81. }
  82. UINT64 ScriptRenderable::internal_GetLayers(ScriptRenderable* thisPtr)
  83. {
  84. return thisPtr->getInternal()->getLayer();
  85. }
  86. void ScriptRenderable::internal_SetLayers(ScriptRenderable* thisPtr, UINT64 layers)
  87. {
  88. thisPtr->getInternal()->setLayer(layers);
  89. }
  90. void ScriptRenderable::internal_SetMaterials(ScriptRenderable* thisPtr, MonoArray* materials)
  91. {
  92. if (materials != nullptr)
  93. {
  94. ScriptArray scriptMaterials(materials);
  95. Vector<HMaterial> nativeMaterials(scriptMaterials.size());
  96. for (UINT32 i = 0; i < scriptMaterials.size(); i++)
  97. {
  98. MonoObject* monoMaterial = scriptMaterials.get<MonoObject*>(i);
  99. ScriptMaterial* scriptMaterial = ScriptMaterial::toNative(monoMaterial);
  100. if (scriptMaterial != nullptr)
  101. nativeMaterials[i] = scriptMaterial->getHandle();
  102. }
  103. thisPtr->getInternal()->setMaterials(nativeMaterials);
  104. }
  105. else
  106. {
  107. thisPtr->getInternal()->setMaterials({});
  108. }
  109. }
  110. void ScriptRenderable::internal_SetMaterial(ScriptRenderable* thisPtr, ScriptMaterial* material, int index)
  111. {
  112. HMaterial nativeMaterial;
  113. if (material != nullptr)
  114. nativeMaterial = material->getHandle();
  115. thisPtr->getInternal()->setMaterial(index, nativeMaterial);
  116. }
  117. void ScriptRenderable::internal_SetOverrideBounds(ScriptRenderable* thisPtr, AABox* box)
  118. {
  119. thisPtr->getInternal()->setOverrideBounds(*box);
  120. }
  121. void ScriptRenderable::internal_SetUseOverrideBounds(ScriptRenderable* thisPtr, bool enable)
  122. {
  123. thisPtr->getInternal()->setUseOverrideBounds(enable);
  124. }
  125. void ScriptRenderable::internal_OnDestroy(ScriptRenderable* thisPtr)
  126. {
  127. thisPtr->destroy();
  128. }
  129. void ScriptRenderable::destroy()
  130. {
  131. if (mRenderable->isDestroyed())
  132. return;
  133. gSceneManager()._unregisterRenderable(mRenderable);
  134. mRenderable->destroy();
  135. }
  136. void ScriptRenderable::_onManagedInstanceDeleted()
  137. {
  138. destroy();
  139. ScriptObject::_onManagedInstanceDeleted();
  140. }
  141. }