diff --git a/source/ncengine/ecs/NcEcsImpl.cpp b/source/ncengine/ecs/NcEcsImpl.cpp index 4292885b6..2893e5127 100644 --- a/source/ncengine/ecs/NcEcsImpl.cpp +++ b/source/ncengine/ecs/NcEcsImpl.cpp @@ -76,6 +76,7 @@ void EcsModule::UpdateWorldSpaceMatrices() { Transform* transform; std::span children; + size_t childIndex = 0; }; auto stack = std::vector{}; @@ -96,32 +97,38 @@ void EcsModule::UpdateWorldSpaceMatrices() if (hierarchy.children.empty()) continue; - stack.emplace_back(&transform, hierarchy.children); + stack.emplace_back(&transform, hierarchy.children, 0); + while (!stack.empty()) { - if (stack.back().children.empty()) + auto& current = stack.back(); + auto& children = current.children; + + if (current.childIndex >= children.size()) { stack.pop_back(); continue; } - if (!stack.back().children.front().IsStatic()) + auto childEntity = children[current.childIndex]; + current.childIndex++; + + if (childEntity.IsStatic()) { - auto& child = world.Get(stack.back().children.front()); - dirty = dirty || child.IsDirty(); - if (dirty) - child.UpdateWorldMatrix(stack.back().transform->TransformationMatrix()); - - auto& childHierarchy = world.Get(stack.back().children.front()); - if (!childHierarchy.children.empty()) - { - auto currentIndex = stack.size() - 1; // Save index before push - stack.emplace_back(&child, childHierarchy.children); - stack[currentIndex].children = stack[currentIndex].children.subspan(1); // Advance using index - } + continue; } - stack.back().children = stack.back().children.subspan(1); + auto& childTransform = world.Get(childEntity); + dirty = dirty || childTransform.IsDirty(); + + if (dirty) + childTransform.UpdateWorldMatrix(current.transform->TransformationMatrix()); + + auto& childHierarchy = world.Get(childEntity); + if (!childHierarchy.children.empty()) + { + stack.emplace_back(&childTransform, childHierarchy.children, 0); + } } } #else // debug update