From 79018e9598f9eedd7191eea32e2bc019a8a345f4 Mon Sep 17 00:00:00 2001 From: Shon Ferguson <shonferg@users.sourceforge.net> Date: Wed, 20 Sep 2006 01:28:04 +0000 Subject: [PATCH] Fixed NiSkinData overall offset transform calculation. "Fixed" NiTriBasedGeom::GetSkinInfluencedVertices function so it fails to import meshes with bad overall offset transforms. --- src/obj/NiSkinData.cpp | 2 +- src/obj/NiTriBasedGeom.cpp | 8 ++++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/obj/NiSkinData.cpp b/src/obj/NiSkinData.cpp index 3d338f4f..8bbdd962 100644 --- a/src/obj/NiSkinData.cpp +++ b/src/obj/NiSkinData.cpp @@ -95,7 +95,7 @@ NiSkinData::NiSkinData( const Ref<NiTriBasedGeom> & owner ) NI_SKIN_DATA_CONSTRU Matrix44 sr_world = skinInst->GetSkeletonRoot()->GetWorldTransform(); //Inverse owner NiTriBasedGeom matrix & multiply with skeleton root matrix - Matrix44 overall_mat = owner_mat.Inverse() * sr_world; + Matrix44 overall_mat = (owner_mat * sr_world.Inverse()).Inverse(); //Store result overall_mat.Decompose( translation, rotation, scale ); diff --git a/src/obj/NiTriBasedGeom.cpp b/src/obj/NiTriBasedGeom.cpp index 87420c2e..77a90a2a 100644 --- a/src/obj/NiTriBasedGeom.cpp +++ b/src/obj/NiTriBasedGeom.cpp @@ -254,13 +254,17 @@ vector<Vector3> NiTriBasedGeom::GetSkinInfluencedVertices() const { vector<Vector3> skin_verts( vertices.size()); //Transform vertices into position based on skin data - Matrix44 root_world = skel_root->GetWorldTransform(); + Matrix44 skel_root_inv = skel_root->GetWorldTransform().Inverse(); Matrix44 geom_world = GetWorldTransform(); + Matrix44 overall_offset = skin_data->GetOverallTransform(); + for ( uint i = 0; i < skin_data->GetBoneCount(); ++i ) { Matrix44 bone_world = bone_nodes[i]->GetWorldTransform(); Matrix44 bone_offset = skin_data->GetBoneTransform(i); vector<SkinWeight> weights = skin_data->GetBoneWeights(i); - Matrix44 vert_trans = bone_offset * bone_world; + //Matrix44 vert_trans = bone_offset * skel_root_inv * bone_world * overall_offset * geom_world; + Matrix44 vert_trans = geom_world * bone_world * skel_root_inv * overall_offset * bone_offset; + for ( uint j = 0; j < weights.size(); ++j ) { uint index = weights[j].index; float weight = weights[j].weight; -- GitLab