From 83408ad8b3de4376d45fa46110b2137cf17c1050 Mon Sep 17 00:00:00 2001 From: Jaremie Romer Date: Sun, 14 Dec 2025 11:01:06 -0600 Subject: [PATCH] Fixed bug I introduced when fixing hierarchy UB --- source/ncengine/ecs/NcEcsImpl.cpp | 39 ++++++++++++++++++------------- 1 file changed, 23 insertions(+), 16 deletions(-) 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