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