BsScriptRenderable.cpp 5.1 KB

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