Hook Modifier Bugfixes:
authorJoshua Leung <aligorith@gmail.com>
Sat, 22 Aug 2009 04:11:17 +0000 (04:11 +0000)
committerJoshua Leung <aligorith@gmail.com>
Sat, 22 Aug 2009 04:11:17 +0000 (04:11 +0000)
Fixed some typos made in previous commit. Hook Modifier should now work correctly again (and also for newly added Hook relationships)

Notes:
* To add a hook, you currently need to perform the following steps
1) add modifier from menu (no operator in EditMode)
2) specify the object (and/or bone to use as the hook target)
3a) in EditMode, select the vertices you wish to be affected by the hook, and press 'Assign'
3b) alternatively, fill in the vertex-group field for the Vertex Group which contains the vertices to be affected
4) press 'Reset' (to make sure hook will behave correctly)
5) optionally, also press 'Recenter' if the hook position isn't right...

* BUG ALERT (Brecht/Ton): it is impossible to clear the vertexgroup/bone fields once you have assigned some value. Doing backspace+enter (or any other variation) will always result in the first item in the search menu being used.

source/blender/blenkernel/intern/modifier.c
source/blender/editors/object/object_edit.c
source/blender/editors/object/object_modifier.c

index 6da2c94fab8eb9f3b5cbfebf67934567f6b18b80..1cb163a4de713130a35afefadf3a6a65b9ce73ec 100644 (file)
@@ -5657,7 +5657,7 @@ static void hookModifier_deformVerts(
 {
        HookModifierData *hmd = (HookModifierData*) md;
        bPoseChannel *pchan= get_pose_channel(hmd->object->pose, hmd->subtarget);
-       float vec[3], mat[4][4], dmat[4][4], imat[4][4];
+       float vec[3], mat[4][4], dmat[4][4];
        int i;
        DerivedMesh *dm = derivedData;
        
@@ -5670,8 +5670,8 @@ static void hookModifier_deformVerts(
                /* just object target */
                Mat4CpyMat4(dmat, hmd->object->obmat);
        }
-       Mat4Invert(imat, dmat);
-       Mat4MulSerie(mat, imat, dmat, hmd->parentinv,
+       Mat4Invert(ob->imat, ob->obmat);
+       Mat4MulSerie(mat, ob->imat, dmat, hmd->parentinv,
                     NULL, NULL, NULL, NULL, NULL);
 
        /* vertex indices? */
@@ -5728,7 +5728,8 @@ static void hookModifier_deformVerts(
                                }
                        }
                }
-       } else {        /* vertex group hook */
+       } 
+       else if(hmd->name[0]) { /* vertex group hook */
                bDeformGroup *curdef;
                Mesh *me = ob->data;
                int index = 0;
index 8ac12a5e3a4b6bdb0b130c02a23547ca357b65df..3d2ddba3757909340c1288ba52880dbe74df632c 100644 (file)
@@ -1384,9 +1384,11 @@ void add_hook(Scene *scene, View3D *v3d, int mode)
                modifier_free(md);
        }
        else if(mode==5) { /* select */
+               // FIXME: this is now OBJECT_OT_hook_select
                object_hook_select(obedit, hmd);
        }
        else if(mode==6) { /* clear offset */
+               // FIXME: this is now OBJECT_OT_hook_reset operator
                where_is_object(scene, ob);     /* ob is hook->parent */
 
                Mat4Invert(ob->imat, ob->obmat);
@@ -1398,25 +1400,6 @@ void add_hook(Scene *scene, View3D *v3d, int mode)
        DAG_scene_sort(scene);
 }
 
-
-/* use this when the loc/size/rot of the parent has changed but the children should stay in the same place
- * apply-size-rot or object center for eg */
-static void ignore_parent_tx(Scene *scene, Object *ob ) 
-{
-       Object workob;
-       Object *ob_child;
-       
-       /* a change was made, adjust the children to compensate */
-       for (ob_child=G.main->object.first; ob_child; ob_child=ob_child->id.next) {
-               if (ob_child->parent == ob) {
-                       ED_object_apply_obmat(ob_child);
-                       what_does_parent(scene, ob_child, &workob);
-                       Mat4Invert(ob_child->parentinv, workob.obmat);
-               }
-       }
-}
-
-
 void add_hook_menu(Scene *scene, View3D *v3d)
 {
        Object *obedit= scene->obedit;  // XXX get from context
@@ -1435,6 +1418,25 @@ void add_hook_menu(Scene *scene, View3D *v3d)
        add_hook(scene, v3d, mode);
 }
 
+
+
+/* use this when the loc/size/rot of the parent has changed but the children should stay in the same place
+ * apply-size-rot or object center for eg */
+static void ignore_parent_tx(Scene *scene, Object *ob ) 
+{
+       Object workob;
+       Object *ob_child;
+       
+       /* a change was made, adjust the children to compensate */
+       for (ob_child=G.main->object.first; ob_child; ob_child=ob_child->id.next) {
+               if (ob_child->parent == ob) {
+                       ED_object_apply_obmat(ob_child);
+                       what_does_parent(scene, ob_child, &workob);
+                       Mat4Invert(ob_child->parentinv, workob.obmat);
+               }
+       }
+}
+
 /* ******************** clear parent operator ******************* */
 
 static EnumPropertyItem prop_clear_parent_types[] = {
index 1b20f90360a2adc92a01a968802f1d532b6784a1..ec46cea8e84a3d18386f33bbdef75b9a32c42b77 100644 (file)
@@ -865,7 +865,7 @@ static int hook_reset_exec(bContext *C, wmOperator *op)
                        Mat4MulMat4(mat, pchan->pose_mat, hmd->object->obmat);
                        
                        Mat4Invert(imat, mat);
-                       Mat4MulSerie(hmd->parentinv, imat, mat, NULL, NULL, NULL, NULL, NULL, NULL);
+                       Mat4MulSerie(hmd->parentinv, imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
                }
                else {
                        Mat4Invert(hmd->object->imat, hmd->object->obmat);