if (!HasKey())
return m_Transform;
- int fn = (lm::clamp)(0, frame, GetKeyframeMax() - 1);
+ int max_kf = GetKeyframeMax();
+ int fn = (lm::clamp)(0, frame, max_kf - 1);
lm::matrix4f mt = lm::matrix4f::get_identity();
{
float vel;
lm::vec3f ax;
- m_Rotate[frame].get_rotate_params(ax, vel);
+ m_Rotate[fn].get_rotate_params(ax, vel);
mt *= lm::matrix4f::get_rotate(ax, vel);
}
if (!m_Scale.empty())
{
- const lm::vec3f& s = m_Scale[frame];
+ const lm::vec3f& s = m_Scale[fn];
mt *= lm::matrix4f::get_scale(s.x, s.y, s.z);
}
if (!m_Translate.empty())
{
- lm::vec3f d = m_Translate[frame];
+ lm::vec3f d = m_Translate[fn];
mt *= lm::matrix4f::get_translate(d);
}
}
+void GeoNodeTree::TraceNodeTree(void)
+{
+ for (BoneNode& n : m_RootNodes)
+ {
+ TraceNodeTreeN(&n);
+ }
+}
+
+void GeoNodeTree::TraceNodeTreeN(BoneNode* bn)
+{
+ static int TraceLayer = 0;
+
+ if (bn == NULL)
+ return;
+
+ std::ostringstream s;
+ for (int i = 0; i < TraceLayer; ++i)
+ {
+ s << "|";
+ }
+
+ s << "+" << bn->m_Name;
+ if (bn->m_Bone != NULL)
+ s << "b" << bn->m_Bone->m_Index;
+ s << "(" << bn->GetKeyframeMax() << ")";
+ s << "[";
+ for (int mid : bn->m_MeshIDs)
+ {
+ s << " " << mid;
+ }
+ s << " ]";
+ s << std::endl;
+ OutputDebugStringA(s.str().c_str());
+
+ for (BoneNode& cn : bn->m_Children)
+ {
+ TraceLayer++;
+ TraceNodeTreeN(&cn);
+ TraceLayer--;
+ }
+}
+
+
}
void AssimpUtil::CreateBoneTree(BoneMap& bone_map, BoneNode* bn)
{
- static bool EnableTrace = false;
- static int TraceLayer = 0;
-
if (bn == NULL)
return;
- if (EnableTrace)
- {
- std::ostringstream s;
- for (int i = 0; i < TraceLayer; ++i)
- {
- s << "|";
- }
-
- s << "+" << bn->m_Name;
- s << "[";
- for (int mid : bn->m_MeshIDs)
- {
- s << " " << mid;
- }
- s << " ]";
- s << std::endl;
- OutputDebugStringA(s.str().c_str());
- }
-
bone_map.Bones[bn->m_Name] = bn;
for (int i = 0; i < bn->m_Children.size(); ++i)
{
- TraceLayer++;
CreateBoneTree(bone_map, &bn->m_Children[i]);
- TraceLayer--;
}
}
m.m_Mesh.m_Verts = m.m_Bones.m_SrcVertPos;
}
+ int a_frame = frame - 1;
+
for (BoneNode& n : m_Nodes.m_RootNodes)
{
ApplyTrans(n, n.m_Transform);
}
- int a_frame = frame - 1;
-
ObjectSkinWeight vw;
vw.Reset(*this, a_frame);