From b652bada137d539352b5f2dc5ad6585bcc039e91 Mon Sep 17 00:00:00 2001 From: Lynix Date: Sun, 9 Dec 2012 01:44:40 +0100 Subject: [PATCH] Fixed copying a skeleton not copying hierarchy Former-commit-id: 54a556f1c6c336ba2397b60dfaa2b316df11d59b --- src/Nazara/Utility/Skeleton.cpp | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/src/Nazara/Utility/Skeleton.cpp b/src/Nazara/Utility/Skeleton.cpp index fbe457032..8fdc15e28 100644 --- a/src/Nazara/Utility/Skeleton.cpp +++ b/src/Nazara/Utility/Skeleton.cpp @@ -15,17 +15,10 @@ struct NzSkeletonImpl bool jointMapUpdated = false; }; -NzSkeleton::NzSkeleton(const NzSkeleton& skeleton) +NzSkeleton::NzSkeleton(const NzSkeleton& skeleton) : +m_impl(nullptr) { - if (skeleton.m_impl) - { - m_impl = new NzSkeletonImpl; - m_impl->jointMap = skeleton.m_impl->jointMap; - m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated; - m_impl->joints = skeleton.m_impl->joints; - } - else - m_impl = nullptr; + operator=(skeleton); } NzSkeleton::~NzSkeleton() @@ -333,6 +326,26 @@ NzSkeleton& NzSkeleton::operator=(const NzSkeleton& skeleton) m_impl->jointMap = skeleton.m_impl->jointMap; m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated; m_impl->joints = skeleton.m_impl->joints; + + // Code crade mais son optimisation demanderait de stocker jointCount*sizeof(unsigned int) 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 .. + unsigned int jointCount = skeleton.m_impl->joints.size(); + for (unsigned int i = 0; i < jointCount; ++i) + { + const NzNode* parent = skeleton.m_impl->joints[i].GetParent(); + if (parent) + { + for (unsigned int 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; + } + } + } + } } return *this;