forked from bartvdbraak/blender
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:
parent
2597d49664
commit
85301a57bf
@ -598,50 +598,10 @@ static int parent_set_exec(bContext *C, wmOperator *op)
|
|||||||
|
|
||||||
/* handle types */
|
/* handle types */
|
||||||
if (pchan)
|
if (pchan)
|
||||||
strcpy (ob->parsubstr, pchan->name);
|
strcpy(ob->parsubstr, pchan->name);
|
||||||
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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user