BsScriptRenderable.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  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), mLastUpdateHash(0)
  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_OnDestroy", &ScriptRenderable::internal_OnDestroy);
  39. }
  40. void ScriptRenderable::updateTransform(const HSceneObject& parent)
  41. {
  42. UINT32 curHash = parent->getTransformHash();
  43. if (curHash != mLastUpdateHash)
  44. {
  45. Matrix4 transformNoScale = Matrix4::TRS(parent->getWorldPosition(), parent->getWorldRotation(), Vector3::ONE);
  46. mRenderable->setTransform(parent->getWorldTfrm(), transformNoScale);
  47. mLastUpdateHash = curHash;
  48. }
  49. if (parent->getActive() != mRenderable->getIsActive())
  50. {
  51. mRenderable->setIsActive(parent->getActive());
  52. }
  53. }
  54. void ScriptRenderable::internal_Create(MonoObject* instance, ScriptSceneObject* parentSO)
  55. {
  56. HSceneObject so;
  57. if (parentSO != nullptr)
  58. so = parentSO->getNativeHandle();
  59. new (bs_alloc<ScriptRenderable>()) ScriptRenderable(instance, so);
  60. }
  61. void ScriptRenderable::internal_SetAnimation(ScriptRenderable* thisPtr, ScriptAnimation* animation)
  62. {
  63. SPtr<Animation> anim;
  64. if (animation != nullptr)
  65. anim = animation->getInternal();
  66. thisPtr->getInternal()->setAnimation(anim);
  67. }
  68. void ScriptRenderable::internal_UpdateTransform(ScriptRenderable* thisPtr, ScriptSceneObject* parent)
  69. {
  70. HSceneObject parentSO = parent->getNativeSceneObject();
  71. thisPtr->updateTransform(parentSO);
  72. }
  73. void ScriptRenderable::internal_SetMesh(ScriptRenderable* thisPtr, ScriptMesh* mesh)
  74. {
  75. HMesh nativeMesh;
  76. if (mesh != nullptr)
  77. nativeMesh = mesh->getHandle();
  78. thisPtr->getInternal()->setMesh(nativeMesh);
  79. }
  80. void ScriptRenderable::internal_GetBounds(ScriptRenderable* thisPtr, ScriptSceneObject* parent, AABox* box, Sphere* sphere)
  81. {
  82. HSceneObject parentSO = parent->getNativeSceneObject();
  83. thisPtr->updateTransform(parentSO);
  84. Bounds bounds = thisPtr->getInternal()->getBounds();
  85. *box = bounds.getBox();
  86. *sphere = bounds.getSphere();
  87. }
  88. UINT64 ScriptRenderable::internal_GetLayers(ScriptRenderable* thisPtr)
  89. {
  90. return thisPtr->getInternal()->getLayer();
  91. }
  92. void ScriptRenderable::internal_SetLayers(ScriptRenderable* thisPtr, UINT64 layers)
  93. {
  94. thisPtr->getInternal()->setLayer(layers);
  95. }
  96. void ScriptRenderable::internal_SetMaterials(ScriptRenderable* thisPtr, MonoArray* materials)
  97. {
  98. if (materials != nullptr)
  99. {
  100. ScriptArray scriptMaterials(materials);
  101. Vector<HMaterial> nativeMaterials(scriptMaterials.size());
  102. for (UINT32 i = 0; i < scriptMaterials.size(); i++)
  103. {
  104. MonoObject* monoMaterial = scriptMaterials.get<MonoObject*>(i);
  105. ScriptMaterial* scriptMaterial = ScriptMaterial::toNative(monoMaterial);
  106. if (scriptMaterial != nullptr)
  107. nativeMaterials[i] = scriptMaterial->getHandle();
  108. }
  109. thisPtr->getInternal()->setMaterials(nativeMaterials);
  110. }
  111. else
  112. {
  113. thisPtr->getInternal()->setMaterials({});
  114. }
  115. }
  116. void ScriptRenderable::internal_SetMaterial(ScriptRenderable* thisPtr, ScriptMaterial* material, int index)
  117. {
  118. HMaterial nativeMaterial;
  119. if (material != nullptr)
  120. nativeMaterial = material->getHandle();
  121. thisPtr->getInternal()->setMaterial(index, nativeMaterial);
  122. }
  123. void ScriptRenderable::internal_OnDestroy(ScriptRenderable* thisPtr)
  124. {
  125. thisPtr->destroy();
  126. }
  127. void ScriptRenderable::destroy()
  128. {
  129. if (mRenderable->isDestroyed())
  130. return;
  131. gSceneManager()._unregisterRenderable(mRenderable);
  132. mRenderable->destroy();
  133. }
  134. void ScriptRenderable::_onManagedInstanceDeleted()
  135. {
  136. destroy();
  137. ScriptObject::_onManagedInstanceDeleted();
  138. }
  139. }