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:
authorJoshua Leung <aligorith@gmail.com>2009-11-24 08:57:47 +0300
committerJoshua Leung <aligorith@gmail.com>2009-11-24 08:57:47 +0300
commit85301a57bf0a9295721894e9dd95eb5c42e13913 (patch)
tree6675d5237e62b2e9220b4e00612262f8faaa1454 /source/blender/editors/object/object_relations.c
parent2597d4966456f8f008af03ee6bae62feb9d6ac3c (diff)
Bugfix for Parenting to Bones:
Reshuffled the code a bit so that the parent-type gets set before the parent inverse matrices are calculated. Thanks to Claas Eicke Kuhnen (cekuhnen) on Blender Artists for catching this.
Diffstat (limited to 'source/blender/editors/object/object_relations.c')
-rw-r--r--source/blender/editors/object/object_relations.c82
1 files changed, 41 insertions, 41 deletions
diff --git a/source/blender/editors/object/object_relations.c b/source/blender/editors/object/object_relations.c
index a6feefa2c5e..95f6f3802af 100644
--- a/source/blender/editors/object/object_relations.c
+++ b/source/blender/editors/object/object_relations.c
@@ -598,50 +598,10 @@ static int parent_set_exec(bContext *C, wmOperator *op)
/* handle types */
if (pchan)
- strcpy (ob->parsubstr, pchan->name);
+ strcpy(ob->parsubstr, pchan->name);
else
ob->parsubstr[0]= 0;
-
- /* constraint */
- if(partype == PAR_PATH_CONST) {
- bConstraint *con;
- bFollowPathConstraint *data;
- float cmat[4][4], vec[3];
-
- con = add_ob_constraint(ob, "AutoPath", CONSTRAINT_TYPE_FOLLOWPATH);
-
- data = con->data;
- data->tar = par;
-
- get_constraint_target_matrix(scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra - give_timeoffset(ob));
- sub_v3_v3v3(vec, ob->obmat[3], cmat[3]);
-
- ob->loc[0] = vec[0];
- ob->loc[1] = vec[1];
- ob->loc[2] = vec[2];
- }
- else if(pararm && ob->type==OB_MESH && par->type == OB_ARMATURE) {
- if(partype == PAR_ARMATURE_NAME)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_NAME);
- else if(partype == PAR_ARMATURE_ENVELOPE)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_ENVELOPE);
- else if(partype == PAR_ARMATURE_AUTO)
- create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_AUTO);
-
- /* get corrected inverse */
- ob->partype= PAROBJECT;
- what_does_parent(scene, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
- }
- else {
- /* calculate inverse parent matrix */
- what_does_parent(scene, ob, &workob);
- invert_m4_m4(ob->parentinv, workob.obmat);
- }
-
- ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
-
if(partype == PAR_PATH_CONST)
; /* don't do anything here, since this is not technically "parenting" */
else if( ELEM(partype, PAR_CURVE, PAR_LATTICE) || pararm )
@@ -683,6 +643,46 @@ static int parent_set_exec(bContext *C, wmOperator *op)
ob->partype= PARBONE; /* note, dna define, not operator property */
else
ob->partype= PAROBJECT; /* note, dna define, not operator property */
+
+ /* constraint */
+ if(partype == PAR_PATH_CONST) {
+ bConstraint *con;
+ bFollowPathConstraint *data;
+ float cmat[4][4], vec[3];
+
+ con = add_ob_constraint(ob, "AutoPath", CONSTRAINT_TYPE_FOLLOWPATH);
+
+ data = con->data;
+ data->tar = par;
+
+ get_constraint_target_matrix(scene, con, 0, CONSTRAINT_OBTYPE_OBJECT, NULL, cmat, scene->r.cfra - give_timeoffset(ob));
+ sub_v3_v3v3(vec, ob->obmat[3], cmat[3]);
+
+ ob->loc[0] = vec[0];
+ ob->loc[1] = vec[1];
+ ob->loc[2] = vec[2];
+ }
+ else if(pararm && ob->type==OB_MESH && par->type == OB_ARMATURE) {
+ if(partype == PAR_ARMATURE_NAME)
+ create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_NAME);
+ else if(partype == PAR_ARMATURE_ENVELOPE)
+ create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_ENVELOPE);
+ else if(partype == PAR_ARMATURE_AUTO)
+ create_vgroups_from_armature(scene, ob, par, ARM_GROUPS_AUTO);
+
+ /* get corrected inverse */
+ ob->partype= PAROBJECT;
+ what_does_parent(scene, ob, &workob);
+
+ invert_m4_m4(ob->parentinv, workob.obmat);
+ }
+ else {
+ /* calculate inverse parent matrix */
+ what_does_parent(scene, ob, &workob);
+ invert_m4_m4(ob->parentinv, workob.obmat);
+ }
+
+ ob->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
}
}
}