diff options
author | Gaia Clary <gaia.clary@machinimatrix.org> | 2013-07-30 15:10:04 +0400 |
---|---|---|
committer | Gaia Clary <gaia.clary@machinimatrix.org> | 2013-07-30 15:10:04 +0400 |
commit | 5c69338fe61d24924dfb3d9a5c9f960b62cc6e7e (patch) | |
tree | 0864f7421d5cc7a0b49456651f583246a19ea529 /source/blender/collada/ArmatureImporter.cpp | |
parent | 76e989d7b1303c877e8469513eae4ed746a8efe5 (diff) |
apply world matrix only to armature, Bones and children get it implicit via parenting
Diffstat (limited to 'source/blender/collada/ArmatureImporter.cpp')
-rw-r--r-- | source/blender/collada/ArmatureImporter.cpp | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/source/blender/collada/ArmatureImporter.cpp b/source/blender/collada/ArmatureImporter.cpp index 71dd7f280d0..5d47ce155c8 100644 --- a/source/blender/collada/ArmatureImporter.cpp +++ b/source/blender/collada/ArmatureImporter.cpp @@ -86,17 +86,15 @@ JointData *ArmatureImporter::get_joint_data(COLLADAFW::Node *node); 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 @@ void ArmatureImporter::create_bone(SkinInfo *skin, COLLADAFW::Node *node, EditBo 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); |