Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGaia Clary <gaia.clary@machinimatrix.org>2013-07-30 15:10:04 +0400
committerGaia Clary <gaia.clary@machinimatrix.org>2013-07-30 15:10:04 +0400
commit5c69338fe61d24924dfb3d9a5c9f960b62cc6e7e (patch)
tree0864f7421d5cc7a0b49456651f583246a19ea529 /source/blender/collada/ArmatureImporter.cpp
parent76e989d7b1303c877e8469513eae4ed746a8efe5 (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.cpp17
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);