OSDN Git Service

スキニングの不具合修正と動作確認用機能追加
authorqw_fuku <fkhideaki@gmail.com>
Sun, 8 Feb 2015 14:00:25 +0000 (23:00 +0900)
committerqw_fuku <fkhideaki@gmail.com>
Sun, 8 Feb 2015 14:00:25 +0000 (23:00 +0900)
Src/LibQtGeoViewerCore/Bone.cpp
Src/LibQtGeoViewerCore/Bone.h
Src/LibQtGeoViewerCore/Format/AssimpReader.cpp
Src/LibQtGeoViewerCore/Format/AssimpUtil.cpp
Src/LibQtGeoViewerCore/GeomObject.cpp

index 1bb1582..33706da 100644 (file)
@@ -36,7 +36,8 @@ lm::matrix4f BoneNode::GetFrameTransform(int frame) const
        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();
 
@@ -44,19 +45,19 @@ lm::matrix4f BoneNode::GetFrameTransform(int frame) const
        {
                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);
        }
 
@@ -92,4 +93,47 @@ int GeoNodeTree::GetKeyframeMax(void) const
 }
 
 
+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--;
+       }
+}
+
+
 }
index 77d9bcd..543720d 100644 (file)
@@ -91,6 +91,9 @@ public:
 
        int GetKeyframeMax(void) const;
 
+       void TraceNodeTree(void);
+       void TraceNodeTreeN(BoneNode* bn);
+
 public:
        boost::ptr_vector<BoneNode> m_RootNodes;
 };
index de4b604..7f0c196 100644 (file)
@@ -84,6 +84,8 @@ bool AssimpReader::Load(SceneMain& scene, const std::string& filename)
        geom->m_FileFormat = GeomFileFormat::XFile;
        geom->m_FilePath   = filename;
 
+       geom->m_Nodes.TraceNodeTree();
+
        scene.UpdateTransform();
 
        scene.ReportDoneEditGeometry();
index b6e8284..3da2afa 100644 (file)
@@ -149,38 +149,14 @@ void AssimpUtil::CopyMaterials(GeomObject* geom, MeshBuf* mbuf, const aiScene* a
 
 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--;
        }
 }
 
index 04fbb8d..768fee4 100644 (file)
@@ -118,13 +118,13 @@ void GeomObject::SetFrame(int frame)
                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);