[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [58742] trunk/blender/source/blender/ collada: apply world matrix only to armature, Bones and children get it implicit via parenting

Gaia Clary gaia.clary at machinimatrix.org
Tue Jul 30 13:10:04 CEST 2013


Revision: 58742
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=58742
Author:   gaiaclary
Date:     2013-07-30 11:10:04 +0000 (Tue, 30 Jul 2013)
Log Message:
-----------
apply world matrix only to armature, Bones and children get it implicit via parenting

Modified Paths:
--------------
    trunk/blender/source/blender/collada/ArmatureImporter.cpp
    trunk/blender/source/blender/collada/SkinInfo.cpp

Modified: trunk/blender/source/blender/collada/ArmatureImporter.cpp
===================================================================
--- trunk/blender/source/blender/collada/ArmatureImporter.cpp	2013-07-30 10:58:36 UTC (rev 58741)
+++ trunk/blender/source/blender/collada/ArmatureImporter.cpp	2013-07-30 11:10:04 UTC (rev 58742)
@@ -86,17 +86,15 @@
 void ArmatureImporter::create_bone(SkinInfo *skin, COLLADAFW::Node *node, EditBone *parent, int totchild,
                                    float parent_mat[4][4], bArmature *arm)
 {
+	float mat[4][4];
+	float joint_inv_bind_mat[4][4];
+
 	//Checking if bone is already made.
 	std::vector<COLLADAFW::Node *>::iterator it;
 	it = std::find(finished_joints.begin(), finished_joints.end(), node);
 	if (it != finished_joints.end()) return;
 
-	float joint_inv_bind_mat[4][4];
-
 	// JointData* jd = get_joint_data(node);
-
-	float mat[4][4];
-	float obmat[4][4];
 	
 	// TODO rename from Node "name" attrs later
 	EditBone *bone = ED_armature_edit_bone_add(arm, (char *)bc_get_joint_name(node));
@@ -105,9 +103,18 @@
 	if (skin && skin->get_joint_inv_bind_matrix(joint_inv_bind_mat, node)) {
 		// get original world-space matrix
 		invert_m4_m4(mat, joint_inv_bind_mat);
+
+		// And make local to armature
+		Object *ob_arm = skin->BKE_armature_from_object();
+		if (ob_arm) {
+			float invmat[4][4];
+			invert_m4_m4(invmat, ob_arm->obmat);
+			mul_m4_m4m4(mat, invmat, mat);
+		}
 	}
 	// create a bone even if there's no joint data for it (i.e. it has no influence)
 	else {
+		float obmat[4][4];
 		// bone-space
 		get_node_mat(obmat, node, NULL, NULL);
 

Modified: trunk/blender/source/blender/collada/SkinInfo.cpp
===================================================================
--- trunk/blender/source/blender/collada/SkinInfo.cpp	2013-07-30 10:58:36 UTC (rev 58741)
+++ trunk/blender/source/blender/collada/SkinInfo.cpp	2013-07-30 11:10:04 UTC (rev 58742)
@@ -226,8 +226,6 @@
 	ArmatureModifierData *amd = (ArmatureModifierData *)md;
 	amd->object = ob_arm;
 
-	copy_m4_m4(ob->obmat, bind_shape_matrix);
-	BKE_object_apply_mat4(ob, ob->obmat, 0, 0);
 #if 1
 	bc_set_parent(ob, ob_arm, C);
 #else
@@ -243,6 +241,8 @@
 	DAG_relations_tag_update(bmain);
 	WM_event_add_notifier(C, NC_OBJECT | ND_TRANSFORM, NULL);
 #endif
+	copy_m4_m4(ob->obmat, bind_shape_matrix);
+	BKE_object_apply_mat4(ob, ob->obmat, 0, 0);
 
 	amd->deformflag = ARM_DEF_VGROUP;
 




More information about the Bf-blender-cvs mailing list