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.
This commit is contained in:
Joshua Leung 2009-11-24 05:57:47 +00:00
parent 2597d49664
commit 85301a57bf

@ -602,46 +602,6 @@ static int parent_set_exec(bContext *C, wmOperator *op)
else else
ob->parsubstr[0]= 0; 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) if(partype == PAR_PATH_CONST)
; /* don't do anything here, since this is not technically "parenting" */ ; /* don't do anything here, since this is not technically "parenting" */
else if( ELEM(partype, PAR_CURVE, PAR_LATTICE) || pararm ) 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 */ ob->partype= PARBONE; /* note, dna define, not operator property */
else else
ob->partype= PAROBJECT; /* note, dna define, not operator property */ 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;
} }
} }
} }