forked from 0ad/0ad
44 lines
1009 B
C++
44 lines
1009 B
C++
|
#include "PSProp.h"
|
||
|
#include "ExpProp.h"
|
||
|
#include "ExpUtil.h"
|
||
|
#include "decomp.h"
|
||
|
|
||
|
PMDExpProp::PMDExpProp(INode* node) : m_Node(node)
|
||
|
{
|
||
|
}
|
||
|
|
||
|
bool PMDExpProp::IsProp(Object* obj)
|
||
|
{
|
||
|
return obj->ClassID()==PSPROP_CLASS_ID ? true : false;
|
||
|
}
|
||
|
|
||
|
ExpProp* PMDExpProp::Build()
|
||
|
{
|
||
|
ExpProp* prop=new ExpProp;
|
||
|
prop->m_Name=m_Node->GetName();
|
||
|
prop->m_Parent=m_Node->GetParentNode();
|
||
|
|
||
|
// build local transformation matrix
|
||
|
INode *parent;
|
||
|
Matrix3 parentTM, nodeTM, localTM;
|
||
|
nodeTM = m_Node->GetNodeTM(0);
|
||
|
parent = m_Node->GetParentNode();
|
||
|
parentTM = parent->GetNodeTM(0);
|
||
|
localTM = nodeTM*Inverse(parentTM);
|
||
|
|
||
|
// decompose it to get translation and rotation
|
||
|
AffineParts parts;
|
||
|
decomp_affine(localTM,&parts);
|
||
|
|
||
|
// get translation from affine parts
|
||
|
MAXtoGL(parts.t);
|
||
|
prop->m_Position=CVector3D(parts.t.x,parts.t.y,parts.t.z);
|
||
|
|
||
|
// get rotation from affine parts
|
||
|
prop->m_Rotation.m_V.X=parts.q.x;
|
||
|
prop->m_Rotation.m_V.Y=parts.q.z;
|
||
|
prop->m_Rotation.m_V.Z=parts.q.y;
|
||
|
prop->m_Rotation.m_W=parts.q.w;
|
||
|
|
||
|
return prop;
|
||
|
}
|