Bugfix for Parenting to Bones:
authorJoshua Leung <aligorith@gmail.com>
Tue, 24 Nov 2009 05:57:47 +0000 (05:57 +0000)
committerJoshua Leung <aligorith@gmail.com>
Tue, 24 Nov 2009 05:57:47 +0000 (05:57 +0000)
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.

source/blender/editors/object/object_relations.c

index a6feefa2c5e12062a8c20e7fa5afc196f7cdfec5..95f6f3802af4eb0d98496406a035cd8ee369826a 100644 (file)
@@ -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;
                        }
                }
        }