Fixed copying a skeleton not copying hierarchy

Former-commit-id: 54a556f1c6c336ba2397b60dfaa2b316df11d59b
This commit is contained in:
Lynix 2012-12-09 01:44:40 +01:00
parent 883c5fa0da
commit b652bada13
1 changed files with 23 additions and 10 deletions

View File

@ -15,17 +15,10 @@ struct NzSkeletonImpl
bool jointMapUpdated = false; bool jointMapUpdated = false;
}; };
NzSkeleton::NzSkeleton(const NzSkeleton& skeleton) NzSkeleton::NzSkeleton(const NzSkeleton& skeleton) :
m_impl(nullptr)
{ {
if (skeleton.m_impl) operator=(skeleton);
{
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;
} }
NzSkeleton::~NzSkeleton() NzSkeleton::~NzSkeleton()
@ -333,6 +326,26 @@ NzSkeleton& NzSkeleton::operator=(const NzSkeleton& skeleton)
m_impl->jointMap = skeleton.m_impl->jointMap; m_impl->jointMap = skeleton.m_impl->jointMap;
m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated; m_impl->jointMapUpdated = skeleton.m_impl->jointMapUpdated;
m_impl->joints = skeleton.m_impl->joints; 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; return *this;