SceneNode.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. // Copyright (C) 2009-present, Panagiotis Christopoulos Charitos and contributors.
  2. // All rights reserved.
  3. // Code licensed under the BSD License.
  4. // http://www.anki3d.org/LICENSE
  5. #include <AnKi/Scene/SceneNode.h>
  6. #include <AnKi/Scene/SceneGraph.h>
  7. #include <AnKi/Scene/Components/SceneComponent.h>
  8. #include <AnKi/Scene/Components/MoveComponent.h>
  9. #include <AnKi/Scene/Components/BodyComponent.h>
  10. #include <AnKi/Scene/Components/CameraComponent.h>
  11. #include <AnKi/Scene/Components/DecalComponent.h>
  12. #include <AnKi/Scene/Components/FogDensityComponent.h>
  13. #include <AnKi/Scene/Components/GlobalIlluminationProbeComponent.h>
  14. #include <AnKi/Scene/Components/JointComponent.h>
  15. #include <AnKi/Scene/Components/LensFlareComponent.h>
  16. #include <AnKi/Scene/Components/LightComponent.h>
  17. #include <AnKi/Scene/Components/ModelComponent.h>
  18. #include <AnKi/Scene/Components/MoveComponent.h>
  19. #include <AnKi/Scene/Components/ParticleEmitterComponent.h>
  20. #include <AnKi/Scene/Components/PlayerControllerComponent.h>
  21. #include <AnKi/Scene/Components/ReflectionProbeComponent.h>
  22. #include <AnKi/Scene/Components/ScriptComponent.h>
  23. #include <AnKi/Scene/Components/SkinComponent.h>
  24. #include <AnKi/Scene/Components/SkyboxComponent.h>
  25. #include <AnKi/Scene/Components/TriggerComponent.h>
  26. #include <AnKi/Scene/Components/UiComponent.h>
  27. namespace anki {
  28. // Specialize newComponent(). Do that first
  29. #define ANKI_DEFINE_SCENE_COMPONENT(name, weight) \
  30. template<> \
  31. name##Component* SceneNode::newComponent<name##Component>() \
  32. { \
  33. auto it = SceneGraph::getSingleton().getComponentArrays().get##name##s().emplace(this); \
  34. it->setArrayIndex(it.getArrayIndex()); \
  35. newComponentInternal(&(*it)); \
  36. return &(*it); \
  37. }
  38. #include <AnKi/Scene/Components/SceneComponentClasses.def.h>
  39. SceneNode::SceneNode(CString name)
  40. : m_uuid(SceneGraph::getSingleton().getNewUuid())
  41. {
  42. if(name)
  43. {
  44. m_name = name;
  45. }
  46. // Add the implicit MoveComponent
  47. newComponent<MoveComponent>();
  48. }
  49. SceneNode::~SceneNode()
  50. {
  51. for(SceneComponent* comp : m_components)
  52. {
  53. comp->onDestroy(*this);
  54. switch(comp->getType())
  55. {
  56. #define ANKI_DEFINE_SCENE_COMPONENT(name, weight) \
  57. case SceneComponentType::k##name: \
  58. SceneGraph::getSingleton().getComponentArrays().get##name##s().erase(comp->getArrayIndex()); \
  59. break;
  60. #include <AnKi/Scene/Components/SceneComponentClasses.def.h>
  61. default:
  62. ANKI_ASSERT(0);
  63. }
  64. }
  65. }
  66. void SceneNode::setMarkedForDeletion()
  67. {
  68. // Mark for deletion only when it's not already marked because we don't want to increase the counter again
  69. if(!getMarkedForDeletion())
  70. {
  71. m_markedForDeletion = true;
  72. SceneGraph::getSingleton().increaseObjectsMarkedForDeletion();
  73. }
  74. [[maybe_unused]] const Error err = visitChildren([](SceneNode& obj) -> Error {
  75. obj.setMarkedForDeletion();
  76. return Error::kNone;
  77. });
  78. }
  79. void SceneNode::newComponentInternal(SceneComponent* newc)
  80. {
  81. m_componentTypeMask |= 1 << SceneComponentTypeMask(newc->getType());
  82. // Inform all other components that some component was added
  83. for(SceneComponent* other : m_components)
  84. {
  85. other->onOtherComponentRemovedOrAdded(newc, true);
  86. }
  87. // Inform the current component about others
  88. for(SceneComponent* other : m_components)
  89. {
  90. newc->onOtherComponentRemovedOrAdded(other, true);
  91. }
  92. m_components.emplaceBack(newc);
  93. // Sort based on update weight
  94. std::sort(m_components.getBegin(), m_components.getEnd(), [](const SceneComponent* a, const SceneComponent* b) {
  95. const F32 weightA = SceneComponent::getUpdateOrderWeight(a->getType());
  96. const F32 weightB = SceneComponent::getUpdateOrderWeight(b->getType());
  97. if(weightA != weightB)
  98. {
  99. return weightA < weightB;
  100. }
  101. else
  102. {
  103. return a->getType() < b->getType();
  104. }
  105. });
  106. }
  107. Bool SceneNode::updateTransform()
  108. {
  109. const Bool needsUpdate = m_localTransformDirty;
  110. m_localTransformDirty = false;
  111. const Bool updatedLastFrame = m_transformUpdatedThisFrame;
  112. m_transformUpdatedThisFrame = needsUpdate;
  113. if(needsUpdate || updatedLastFrame)
  114. {
  115. m_prevWTrf = m_wtrf;
  116. }
  117. // Update world transform
  118. if(needsUpdate)
  119. {
  120. const SceneNode* parent = getParent();
  121. if(parent == nullptr || m_ignoreParentNodeTransform)
  122. {
  123. m_wtrf = m_ltrf;
  124. }
  125. else
  126. {
  127. m_wtrf = parent->getWorldTransform().combineTransformations(m_ltrf);
  128. }
  129. // Make children dirty as well. Don't walk the whole tree because you will re-walk it later
  130. [[maybe_unused]] const Error err = visitChildrenMaxDepth(1, [](SceneNode& childNode) -> Error {
  131. if(!childNode.m_ignoreParentNodeTransform)
  132. {
  133. childNode.m_localTransformDirty = true;
  134. }
  135. return Error::kNone;
  136. });
  137. }
  138. return needsUpdate;
  139. }
  140. } // end namespace anki