Revision: 22672
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=22672
Author:   aligorith
Date:     2009-08-21 12:47:27 +0200 (Fri, 21 Aug 2009)

Log Message:
-----------
Hook Modifier - Bone Targets

Made Hook Modifier be able to use bone targets. However, I haven't been able to 
verify that everything will work perfectly, since just creating a new Hook 
Modifier and assigning targets doesn't set hmd->indexar correctly.

Modified Paths:
--------------
    branches/blender2.5/blender/release/ui/buttons_data_modifier.py
    branches/blender2.5/blender/source/blender/blenkernel/intern/action.c
    branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
    branches/blender2.5/blender/source/blender/editors/object/object_edit.c
    branches/blender2.5/blender/source/blender/editors/object/object_modifier.c
    branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h
    branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c

Modified: branches/blender2.5/blender/release/ui/buttons_data_modifier.py
===================================================================
--- branches/blender2.5/blender/release/ui/buttons_data_modifier.py     
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/release/ui/buttons_data_modifier.py     
2009-08-21 10:47:27 UTC (rev 22672)
@@ -200,7 +200,11 @@
                layout.itemL(text="See Fluid panel.")
                
        def HOOK(self, layout, ob, md):
-               layout.itemR(md, "object")
+               col = layout.column()
+               col.itemR(md, "object")
+               if md.object and md.object.type == "ARMATURE":
+                       layout.item_pointerR(md, "subtarget", md.object.data, 
"bones", text="Bone")
+               
                layout.item_pointerR(md, "vertex_group", ob, "vertex_groups")
 
                split = layout.split()

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/action.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/action.c       
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/action.c       
2009-08-21 10:47:27 UTC (rev 22672)
@@ -410,9 +410,10 @@
 bPoseChannel *get_pose_channel(const bPose *pose, const char *name)
 {
        bPoseChannel *chan;
-
-       if (pose==NULL) return NULL;
        
+       if (ELEM(NULL, pose, name) || (name[0] == 0))
+               return NULL;
+       
        for (chan=pose->chanbase.first; chan; chan=chan->next) {
                if (chan->name[0] == name[0]) {
                        if (!strcmp (chan->name, name))

Modified: 
branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c     
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/modifier.c     
2009-08-21 10:47:27 UTC (rev 22672)
@@ -5598,6 +5598,7 @@
        thmd->indexar = MEM_dupallocN(hmd->indexar);
        memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv));
        strncpy(thmd->name, hmd->name, 32);
+       strncpy(thmd->subtarget, hmd->subtarget, 32);
 }
 
 CustomDataMask hookModifier_requiredDataMask(Object *ob, ModifierData *md)
@@ -5642,9 +5643,11 @@
 
        if (hmd->object) {
                DagNode *curNode = dag_get_node(forest, hmd->object);
-
-               dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA,
-                       "Hook Modifier");
+               
+               if (hmd->subtarget[0])
+                       dag_add_relation(forest, curNode, obNode, 
DAG_RL_OB_DATA|DAG_RL_DATA_DATA, "Hook Modifier");
+               else
+                       dag_add_relation(forest, curNode, obNode, 
DAG_RL_OB_DATA, "Hook Modifier");
        }
 }
 
@@ -5653,12 +5656,22 @@
         float (*vertexCos)[3], int numVerts, int useRenderParams, int 
isFinalCalc)
 {
        HookModifierData *hmd = (HookModifierData*) md;
-       float vec[3], mat[4][4];
+       bPoseChannel *pchan= get_pose_channel(hmd->object->pose, 
hmd->subtarget);
+       float vec[3], mat[4][4], dmat[4][4], imat[4][4];
        int i;
        DerivedMesh *dm = derivedData;
-
-       Mat4Invert(ob->imat, ob->obmat);
-       Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv,
+       
+       /* get world-space matrix of target, corrected for the space the verts 
are in */
+       if (hmd->subtarget[0] && pchan) {
+               /* bone target if there's a matching pose-channel */
+               Mat4MulMat4(dmat, pchan->pose_mat, hmd->object->obmat);
+       }
+       else {
+               /* just object target */
+               Mat4CpyMat4(dmat, hmd->object->obmat);
+       }
+       Mat4Invert(imat, dmat);
+       Mat4MulSerie(mat, imat, dmat, hmd->parentinv,
                     NULL, NULL, NULL, NULL, NULL);
 
        /* vertex indices? */

Modified: 
branches/blender2.5/blender/source/blender/editors/object/object_edit.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_edit.c     
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/editors/object/object_edit.c     
2009-08-21 10:47:27 UTC (rev 22672)
@@ -979,6 +979,9 @@
        EditVert *eve;
        int index=0, nr=0;
        
+       if (hmd->indexar == NULL)
+               return;
+       
        for(eve= em->verts.first; eve; eve= eve->next, nr++) {
                if(nr==hmd->indexar[index]) {
                        eve->f |= SELECT;
@@ -1361,6 +1364,7 @@
                        hmd->totindex= tot;
                        BLI_strncpy(hmd->name, name, 32);
                        
+                       // TODO: need to take into account bone targets here 
too now...
                        if(mode==1 || mode==2) {
                                /* matrix calculus */
                                /* vert x (obmat x hook->imat) x hook->obmat x 
ob->imat */

Modified: 
branches/blender2.5/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/object/object_modifier.c 
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/editors/object/object_modifier.c 
2009-08-21 10:47:27 UTC (rev 22672)
@@ -31,6 +31,7 @@
 
 #include "MEM_guardedalloc.h"
 
+#include "DNA_action_types.h"
 #include "DNA_curve_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
@@ -42,6 +43,7 @@
 #include "BLI_arithb.h"
 #include "BLI_listbase.h"
 
+#include "BKE_action.h"
 #include "BKE_curve.h"
 #include "BKE_context.h"
 #include "BKE_depsgraph.h"
@@ -853,8 +855,21 @@
        HookModifierData *hmd= ptr.data;
 
        if(hmd->object) {
-               Mat4Invert(hmd->object->imat, hmd->object->obmat);
-               Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, 
NULL, NULL, NULL, NULL, NULL, NULL);
+               bPoseChannel *pchan= get_pose_channel(hmd->object->pose, 
hmd->subtarget);
+               
+               if(hmd->subtarget[0] && pchan) {
+                       float imat[4][4], mat[4][4];
+                       
+                       /* calculate the world-space matrix for the 
pose-channel target first, then carry on as usual */
+                       Mat4MulMat4(mat, pchan->pose_mat, hmd->object->obmat);
+                       
+                       Mat4Invert(imat, mat);
+                       Mat4MulSerie(hmd->parentinv, imat, mat, NULL, NULL, 
NULL, NULL, NULL, NULL);
+               }
+               else {
+                       Mat4Invert(hmd->object->imat, hmd->object->obmat);
+                       Mat4MulSerie(hmd->parentinv, hmd->object->imat, 
ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+               }
        }
 
        DAG_object_flush_update(scene, ob, OB_RECALC_DATA);

Modified: 
branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h    
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/makesdna/DNA_modifier_types.h    
2009-08-21 10:47:27 UTC (rev 22672)
@@ -426,6 +426,8 @@
        ModifierData modifier;
 
        struct Object *object;
+       char subtarget[32];             /* optional name of bone target */
+       
        float parentinv[4][4];  /* matrix making current transform unmodified */
        float cent[3];                  /* visualization of hook */
        float falloff;                  /* if not zero, falloff is distance 
where influence zero */

Modified: 
branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c
===================================================================
--- branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c   
2009-08-21 07:19:06 UTC (rev 22671)
+++ branches/blender2.5/blender/source/blender/makesrna/intern/rna_modifier.c   
2009-08-21 10:47:27 UTC (rev 22672)
@@ -912,6 +912,11 @@
        RNA_def_property_ui_text(prop, "Object", "Parent Object for hook, also 
recalculates and clears offset");
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, 
"rna_Modifier_dependency_update");
+       
+       prop= RNA_def_property(srna, "subtarget", PROP_STRING, PROP_NONE);
+       RNA_def_property_string_sdna(prop, NULL, "subtarget");
+       RNA_def_property_ui_text(prop, "Sub-Target", "Name of Parent Bone for 
hook (if applicable), also recalculates and clears offset");
+       RNA_def_property_update(prop, NC_OBJECT|ND_MODIFIER, 
"rna_Modifier_dependency_update");
 
        prop= RNA_def_property(srna, "vertex_group", PROP_STRING, PROP_NONE);
        RNA_def_property_string_sdna(prop, NULL, "name");


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to