From 4a55d40aecde5e0e25130db1b71be1c295d6f574 Mon Sep 17 00:00:00 2001 From: SirLynix Date: Wed, 24 Aug 2022 13:23:28 +0200 Subject: [PATCH] =?UTF-8?q?Skeleton:=20Improve=20skeleton=20copy=20perform?= =?UTF-8?q?ance=20(O(n=C2=B2)=20=3D>=20O(n))?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/Nazara/Utility/Skeleton.cpp | 16 +++++----------- 1 file changed, 5 insertions(+), 11 deletions(-) diff --git a/src/Nazara/Utility/Skeleton.cpp b/src/Nazara/Utility/Skeleton.cpp index 0414e5433..3034cbd66 100644 --- a/src/Nazara/Utility/Skeleton.cpp +++ b/src/Nazara/Utility/Skeleton.cpp @@ -216,23 +216,17 @@ namespace Nz m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated; m_impl->joints = skeleton.m_impl->joints; - // Code crade mais son optimisation demanderait de stocker jointCount*sizeof(std::size_t) en plus - // Ce qui, pour juste une copie qui ne se fera que rarement, ne vaut pas le coup - // L'éternel trade-off mémoire/calculs .. + // Restore parent hierarchy + const Joint* firstJoint = skeleton.m_impl->joints.data(); + std::size_t jointCount = skeleton.m_impl->joints.size(); for (std::size_t i = 0; i < jointCount; ++i) { const Node* parent = skeleton.m_impl->joints[i].GetParent(); if (parent) { - for (std::size_t j = 0; j < i; ++j) // Le parent se trouve forcément avant nous - { - if (parent == &skeleton.m_impl->joints[j]) // A-t-on trouvé le parent ? - { - m_impl->joints[i].SetParent(m_impl->joints[j]); // Oui, tout ça pour ça - break; - } - } + std::size_t parentIndex = SafeCast(firstJoint - parent); + m_impl->joints[i].SetParent(m_impl->joints[parentIndex]); } } }