- added eModifierTypeFlag_RequiresOriginalData for modifiers that
authorDaniel Dunbar <daniel@zuster.org>
Wed, 10 Aug 2005 22:05:52 +0000 (22:05 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Wed, 10 Aug 2005 22:05:52 +0000 (22:05 +0000)
   can only follow deform (for example, they store mesh vertex
   indices)
 - added ModifierType.foreachObjectLink for iterating over Object
   links inside modifier data (used for file load, relinking, etc)
 - switched various modifiers_ functions to take object argument
   instead of ListBase
 - added user editable name field to modifiers
 - bug fix, duplicate and make single user didn't relink object
   pointers in modifier data
 - added modifiers to outliner, needs icon
 - added armature, hook, and softbody modifiers (softbody doesn't
   do anything atm). added conversion of old hooks to modifiers.

NOTE-THE-FIRST: User name field is not initialized on loading 2.38 files
so if you have saved stuff with a cvs blender you will see blank names.

NOTE-THE-SECOND: Since modifiers aren't evaluated yet for non-Mesh
objects, hooks for lattices and curves are broken. Don't updated if
you actually, say, *use* Blender.

NOTE-THE-THIRD: Old hooks used a quirky weighting system during
deformation which can't be extended to modifiers. On the upside,
I doubt anyone relied on the old quirky system and the new system
makes much more sense. (Although the way falloff works is still
quite stupid I think).

21 files changed:
source/blender/blenkernel/BKE_deform.h
source/blender/blenkernel/BKE_modifier.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/deform.c
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/object.c
source/blender/blenkernel/intern/softbody.c
source/blender/blenloader/intern/readfile.c
source/blender/blenloader/intern/writefile.c
source/blender/include/BIF_outliner.h
source/blender/include/butspace.h
source/blender/makesdna/DNA_modifier_types.h
source/blender/src/buttons_editing.c
source/blender/src/buttons_object.c
source/blender/src/drawobject.c
source/blender/src/editarmature.c
source/blender/src/editmesh_loop.c
source/blender/src/editmesh_tools.c
source/blender/src/editobject.c
source/blender/src/outliner.c

index d3baa8e7bf3ed7752ccfc5f71e49608a7fcecfa3..a06940e883cd39eac9f656fc6318e55e8d7a4068 100644 (file)
@@ -47,8 +47,6 @@ struct bDeformGroup* copy_defgroup (struct bDeformGroup *ingroup);
 struct bDeformGroup *get_named_vertexgroup (Object *ob, char *name);
 int  get_defgroup_num (struct Object *ob, struct bDeformGroup   *dg);
 
-void hook_object_deform(struct Object *ob, int index, float *vec);
-
 int curve_modifier(struct Object *ob, char mode);
 void mesh_modifier(struct Object *ob, float (**vertexCos_r)[3]);
 int lattice_modifier(struct Object *ob, char mode);
index 19fc11424ce4e03ab8dd03cd9f1a00e25960e188..e2838622494d3b9980fdd9f74cce73b8668f205c 100644 (file)
@@ -38,7 +38,6 @@ struct ModifierData;
 struct DagForest;
 struct DagNode;
 struct Object;
-struct ListBase;
 
 typedef enum {
                /* Should not be used, only for None modifier type */
@@ -60,14 +59,19 @@ typedef enum {
        eModifierTypeFlag_AcceptsCVs = (1<<1),
        eModifierTypeFlag_SupportsMapping = (1<<2),
        eModifierTypeFlag_SupportsEditmode = (1<<3),
-
+       
                /* For modifiers that support editmode this determines if the
                 * modifier should be enabled by default in editmode. This should
                 * only be used by modifiers that are relatively speedy and
                 * also generally used in editmode, otherwise let the user enable
-                * it.
+                * it by hand.
                 */
        eModifierTypeFlag_EnableInEditmode = (1<<4),
+
+               /* For modifiers that require original data and so cannot
+                * be placed after any non-deformative modifier.
+                */
+       eModifierTypeFlag_RequiresOriginalData = (1<<5),
 } ModifierTypeFlag;
 
 typedef struct ModifierTypeInfo {
@@ -126,6 +130,14 @@ typedef struct ModifierTypeInfo {
                 */
        int (*dependsOnTime)(struct ModifierData *md);
 
+               /* Should call the given _walk_ function on with a pointer to each Object pointer
+                * that the modifier data stores. This is used for linking on file load and for
+                * unlinking objects or forwarding object references.
+                *
+                * This function is optional.
+                */
+       void (*foreachObjectLink)(struct ModifierData *md, struct Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData);
+
                /* Only for deform types, should apply the deformation
                 * to the given vertex array. If the deformer requires information from
                 * the object it can obtain it from the _derivedData_ argument if non-NULL,
@@ -183,9 +195,10 @@ int                                                modifier_supportsMapping(struct ModifierData *md);
 int                                            modifier_couldBeCage    (struct ModifierData *md);
 void                                   modifier_setError               (struct ModifierData *md, char *format, ...);
 
-struct ModifierData*   modifiers_findByType    (struct ListBase *lb, ModifierType type);
-void                                   modifiers_clearErrors   (struct ListBase *lb);
-int                                            modifiers_getCageIndex  (struct ListBase *lb, int *lastPossibleCageIndex_r);
+void                                   modifiers_foreachObjectLink     (struct Object *ob, void (*walk)(void *userData, struct Object *ob, struct Object **obpoin), void *userData);
+struct ModifierData*   modifiers_findByType            (struct Object *ob, ModifierType type);
+void                                   modifiers_clearErrors           (struct Object *ob);
+int                                            modifiers_getCageIndex          (struct Object *ob, int *lastPossibleCageIndex_r);
 
 #endif
 
index 4c5fe962c723b712ad97dda2a200bd573fd17ecd..574ff1fd31a67a89ccc34dbf20a0faeb602fe14f 100644 (file)
@@ -1393,7 +1393,7 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
        DerivedMesh *dm;
        int numVerts = me->totvert;
 
-       modifiers_clearErrors(&ob->modifiers);
+       modifiers_clearErrors(ob);
 
        if (deform_r) *deform_r = NULL;
        *final_r = NULL;
@@ -1434,6 +1434,10 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
 
                if (!(md->mode&(1<<useRenderParams))) continue;
                if (mti->type==eModifierTypeType_OnlyDeform && !useDeform) continue;
+               if ((mti->flags&eModifierTypeFlag_RequiresOriginalData) && dm) {
+                       modifier_setError(md, "Internal error, modifier requires original data (bad stack position).");
+                       continue;
+               }
                if (mti->isDisabled && mti->isDisabled(md)) continue;
 
                        /* How to apply modifier depends on (a) what we already have as
@@ -1521,9 +1525,9 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
        ModifierData *md;
        float (*deformedVerts)[3] = NULL;
        DerivedMesh *dm;
-       int i, numVerts, cageIndex = modifiers_getCageIndex(&ob->modifiers, NULL);
+       int i, numVerts, cageIndex = modifiers_getCageIndex(ob, NULL);
 
-       modifiers_clearErrors(&ob->modifiers);
+       modifiers_clearErrors(ob);
 
        if (cage_r && cageIndex==-1) {
                *cage_r = getEditMeshDerivedMesh(em, NULL);
@@ -1535,6 +1539,10 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
 
                if (!(md->mode&eModifierMode_Realtime)) continue;
                if (!(md->mode&eModifierMode_Editmode)) continue;
+               if ((mti->flags&eModifierTypeFlag_RequiresOriginalData) && dm) {
+                       modifier_setError(md, "Internal error, modifier requires original data (bad stack position).");
+                       continue;
+               }
                if (mti->isDisabled && mti->isDisabled(md)) continue;
                if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue;
 
index 8e33303d137e266b9b8faf34a0f5d52d7c448303..a1f04eaa048e18fb685c0c03aaea4c307a89d7b8 100644 (file)
@@ -156,98 +156,13 @@ int  get_defgroup_num (Object *ob, bDeformGroup   *dg)
 
 /* *************** HOOK ****************** */
 
-/* vec==NULL: init
-   vec is supposed to be local coord, deform happens in local space
-*/
-
-void hook_object_deform(Object *ob, int index, float *vec)
-{
-       float totforce;
-       ObHook *hook;
-       float vect[3], vectot[3];
-       
-       if(ob->hooks.first==NULL) return;
-       
-       /* reinitialize if... */
-       if(vec==NULL) {
-               totforce= 0.0;
-               for(hook= ob->hooks.first; hook; hook= hook->next) {
-                       if(hook->parent) {
-                               hook->curindex= 0;
-                               Mat4Invert(ob->imat, ob->obmat);
-                               /* apparently this call goes from right to left... */
-                               Mat4MulSerie(hook->mat, ob->imat, hook->parent->obmat, hook->parentinv, NULL, 
-                                                       NULL, NULL, NULL, NULL);
-                       }
-               }
-               return;
-       }
-
-       totforce= 0.0;
-       vectot[0]= vectot[1]= vectot[2]= 0.0;
-       
-       for(hook= ob->hooks.first; hook; hook= hook->next) {
-               if(hook->parent) {
-                       
-                       /* is 'index' in hook array? */
-                       while(hook->curindex < hook->totindex-1) {
-                               if( hook->indexar[hook->curindex] < index ) hook->curindex++;
-                               else break;
-                       }
-                       
-                       if( hook->indexar[hook->curindex]==index ) {
-                               float fac= hook->force, len;
-                               
-                               VecMat4MulVecfl(vect, hook->mat, vec);
-
-                               if(hook->falloff!=0.0) {
-                                       /* hook->cent is in local coords */
-                                       len= VecLenf(vec, hook->cent);
-                                       if(len > hook->falloff) fac= 0.0;
-                                       else if(len>0.0) fac*= sqrt(1.0 - len/hook->falloff);
-                               }
-                               if(fac!=0.0) {
-                                       totforce+= fac;
-                                       vectot[0]+= fac*vect[0];
-                                       vectot[1]+= fac*vect[1];
-                                       vectot[2]+= fac*vect[2];
-                               }
-                       }
-               }
-       }
-
-       /* if totforce < 1.0, we take old position also into account */
-       if(totforce<1.0) {
-               vectot[0]+= (1.0-totforce)*vec[0];
-               vectot[1]+= (1.0-totforce)*vec[1];
-               vectot[2]+= (1.0-totforce)*vec[2];
-       }
-       else VecMulf(vectot, 1.0/totforce);
-       
-       VECCOPY(vec, vectot);
-}
-
-
 void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
 {
        Mesh *me= ob->data;
        float (*vertexCos)[3] = NULL;
-       int a;
 
        do_mesh_key(me);
 
-       /* hooks */
-       if(ob->hooks.first) {
-               if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
-               
-               /* NULL signals initialize */
-               hook_object_deform(ob, 0, NULL);
-               
-               for(a=0; a<me->totvert; a++) {
-                       hook_object_deform(ob, a, vertexCos[a]);
-               }
-       }
-               
        if((ob->softflag & OB_SB_ENABLE) && !(ob->softflag & OB_SB_POSTDEF)) {
                if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
                sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
@@ -281,15 +196,12 @@ int curve_modifier(Object *ob, char mode)
        static ListBase nurb={NULL, NULL};
        Curve *cu= ob->data;
        Nurb *nu, *newnu;
-       BezTriple *bezt;
-       BPoint *bp;
-       int a, index, done= 0;
+       int done= 0;
        
        do_curve_key(cu);
        
        /* conditions if it's needed */
-       if(ob->hooks.first);
-       else if(ob->parent && ob->partype==PARSKEL); 
+       if(ob->parent && ob->partype==PARSKEL); 
        else if(ob->parent && ob->parent->type==OB_LATTICE);
        else return 0;
        
@@ -302,39 +214,6 @@ int curve_modifier(Object *ob, char mode)
                        BLI_addtail(&nurb, newnu);
                        nu= nu->next;
                }
-               
-               /* hooks */
-               if(ob->hooks.first) {
-                       done= 1;
-                       
-                       /* NULL signals initialize */
-                       hook_object_deform(ob, 0, NULL);
-                       index= 0;
-                       
-                       nu= cu->nurb.first;
-                       while(nu) {
-                               if((nu->type & 7)==CU_BEZIER) {
-                                       bezt= nu->bezt;
-                                       a= nu->pntsu;
-                                       while(a--) {
-                                               hook_object_deform(ob, index++, bezt->vec[0]);
-                                               hook_object_deform(ob, index++, bezt->vec[1]);
-                                               hook_object_deform(ob, index++, bezt->vec[2]);
-                                               bezt++;
-                                       }
-                               }
-                               else {
-                                       bp= nu->bp;
-                                       a= nu->pntsu*nu->pntsv;
-                                       while(a--) {
-                                               hook_object_deform(ob, index++, bp->vec);
-                                               bp++;
-                                       }
-                               }
-                                       
-                               nu= nu->next;
-                       }
-               }
        }
        else if(mode=='e') {
                /* paste */
@@ -352,14 +231,12 @@ int lattice_modifier(Object *ob, char mode)
 {
        static BPoint *bpoint;
        Lattice *lt= ob->data;
-       BPoint *bp;
-       int a, index, done= 0;
+       int done= 0;
        
        do_latt_key(lt);
        
        /* conditions if it's needed */
-       if(ob->hooks.first);
-       else if(ob->parent && ob->partype==PARSKEL); 
+       if(ob->parent && ob->partype==PARSKEL); 
        else if((ob->softflag & OB_SB_ENABLE));
        else return 0;
        
@@ -367,25 +244,9 @@ int lattice_modifier(Object *ob, char mode)
                /* copy  */
                bpoint= MEM_dupallocN(lt->def);
                
-               /* hooks */
-               if(ob->hooks.first) {
-                       done= 1;
-                       
-                       /* NULL signals initialize */
-                       hook_object_deform(ob, 0, NULL);
-                       index= 0;
-                       bp= lt->def;
-                       a= lt->pntsu*lt->pntsv*lt->pntsw;
-                       while(a--) {
-                               hook_object_deform(ob, index++, bp->vec);
-                               bp++;
-                       }
-               }
-               
                if((ob->softflag & OB_SB_ENABLE)) {
                        sbObjectStep(ob, (float)G.scene->r.cfra, NULL);
                }
-               
        }
        else { // end
                MEM_freeN(lt->def);
index c3428d865fe5b2e989b0894bca45f63f26cdaaf1..323c6793c7d1fa4292dda9f9822971a623dacd84 100644 (file)
@@ -352,16 +352,6 @@ struct DagForest *build_dag(struct Scene *sce, short mask)
                                }
                        }
                }
-               if (ob->hooks.first) {
-                       ObHook *hook;
-                       
-                       for(hook= ob->hooks.first; hook; hook= hook->next) {
-                               if(hook->parent) {
-                                       node3 = dag_get_node(dag,hook->parent);
-                                       dag_add_relation(dag,node3,node,DAG_RL_OB_DATA);
-                               }
-                       }
-               }
                if (ob->modifiers.first) {
                        ModifierData *md;
 
index 6f9e2f861b2599bb501533c260067950b0f67cd4..d6c4a6838aebe27881d7123952939a6a42af5b57 100644 (file)
@@ -4,6 +4,7 @@
 
 #include "BLI_blenlib.h"
 #include "BLI_rand.h"
+#include "BLI_arithb.h"
 
 #include "MEM_guardedalloc.h"
 
@@ -56,6 +57,13 @@ static int curveModifier_isDisabled(ModifierData *md)
        return !cmd->object;
 }
 
+static void curveModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+       CurveModifierData *cmd = (CurveModifierData*) md;
+
+       walk(userData, ob, &cmd->object);
+}
+
 static void curveModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 {
        CurveModifierData *cmd = (CurveModifierData*) md;
@@ -98,6 +106,13 @@ static int latticeModifier_isDisabled(ModifierData *md)
        return !lmd->object;
 }
 
+static void latticeModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+       LatticeModifierData *lmd = (LatticeModifierData*) md;
+
+       walk(userData, ob, &lmd->object);
+}
+
 static void latticeModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
 {
        LatticeModifierData *lmd = (LatticeModifierData*) md;
@@ -1007,6 +1022,158 @@ static void waveModifier_deformVertsEM(ModifierData *md, Object *ob, void *editD
        waveModifier_deformVerts(md, ob, NULL, vertexCos, numVerts);
 }
 
+/* Armature */
+
+static void armatureModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+       ArmatureModifierData *tamd = (ArmatureModifierData*) target;
+
+       tamd->object = amd->object;
+}
+
+static int armatureModifier_isDisabled(ModifierData *md)
+{
+       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+
+       return !amd->object;
+}
+
+static void armatureModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+
+       walk(userData, ob, &amd->object);
+}
+
+static void armatureModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+{
+       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+
+       if (amd->object) {
+               DagNode *curNode = dag_get_node(forest, amd->object);
+
+               dag_add_relation(forest, curNode, obNode, DAG_RL_DATA_DATA|DAG_RL_OB_DATA);
+       }
+}
+
+static void armatureModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+
+       armature_deform_verts(amd->object, ob, vertexCos, numVerts);
+}
+
+static void armatureModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+
+       armature_deform_verts(amd->object, ob, vertexCos, numVerts);
+}
+
+/* Hook */
+
+static void hookModifier_initData(ModifierData *md) 
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+
+       hmd->force= 1.0;
+}
+
+static void hookModifier_copyData(ModifierData *md, ModifierData *target)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+       HookModifierData *thmd = (HookModifierData*) target;
+
+       VECCOPY(thmd->cent, hmd->cent);
+       thmd->falloff = hmd->falloff;
+       thmd->force = hmd->force;
+       thmd->object = hmd->object;
+       thmd->totindex = hmd->totindex;
+       thmd->indexar = MEM_dupallocN(hmd->indexar);
+       memcpy(thmd->parentinv, hmd->parentinv, sizeof(hmd->parentinv));
+}
+
+static void hookModifier_freeData(ModifierData *md)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+
+       if (hmd->indexar) MEM_freeN(hmd->indexar);
+}
+
+static int hookModifier_isDisabled(ModifierData *md)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+
+       return !hmd->object;
+}
+
+static void hookModifier_foreachObjectLink(ModifierData *md, Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+
+       walk(userData, ob, &hmd->object);
+}
+
+static void hookModifier_updateDepgraph(ModifierData *md, DagForest *forest, Object *ob, DagNode *obNode)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+
+       if (hmd->object) {
+               DagNode *curNode = dag_get_node(forest, hmd->object);
+
+               dag_add_relation(forest, curNode, obNode, DAG_RL_OB_DATA);
+       }
+}
+
+static void hookModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+       float vec[3], mat[4][4];
+       int i;
+
+       Mat4Invert(ob->imat, ob->obmat);
+       Mat4MulSerie(mat, ob->imat, hmd->object->obmat, hmd->parentinv, NULL, NULL, NULL, NULL, NULL);
+
+       for (i=0; i<hmd->totindex; i++) {
+               float *co = vertexCos[hmd->indexar[i]];
+               float fac = hmd->force;
+
+               if(hmd->falloff!=0.0) {
+                       float len= VecLenf(co, hmd->cent);
+                       if(len > hmd->falloff) fac = 0.0;
+                       else if(len>0.0) fac *= sqrt(1.0 - len/hmd->falloff);
+               }
+
+               if(fac!=0.0) {
+                       VecMat4MulVecfl(vec, mat, co);
+                       VecLerpf(co, co, vec, fac);
+               }
+       }
+}
+
+static void hookModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       HookModifierData *hmd = (HookModifierData*) md;
+
+       hookModifier_deformVerts(md, ob, derivedData, vertexCos, numVerts);
+}
+
+/* Softbody */
+
+static void softbodyModifier_deformVerts(ModifierData *md, Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
+
+//     sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
+}
+
+static void softbodyModifier_deformVertsEM(ModifierData *md, Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts)
+{
+       SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
+
+//     sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
+}
 
 /***/
 
@@ -1044,6 +1211,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
                mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
                mti->copyData = curveModifier_copyData;
                mti->isDisabled = curveModifier_isDisabled;
+               mti->foreachObjectLink = curveModifier_foreachObjectLink;
                mti->updateDepgraph = curveModifier_updateDepgraph;
                mti->deformVerts = curveModifier_deformVerts;
                mti->deformVertsEM = curveModifier_deformVertsEM;
@@ -1053,6 +1221,7 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
                mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
                mti->copyData = latticeModifier_copyData;
                mti->isDisabled = latticeModifier_isDisabled;
+               mti->foreachObjectLink = latticeModifier_foreachObjectLink;
                mti->updateDepgraph = latticeModifier_updateDepgraph;
                mti->deformVerts = latticeModifier_deformVerts;
                mti->deformVertsEM = latticeModifier_deformVertsEM;
@@ -1097,6 +1266,34 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
                mti->deformVerts = waveModifier_deformVerts;
                mti->deformVertsEM = waveModifier_deformVertsEM;
 
+               mti = INIT_TYPE(Armature);
+               mti->type = eModifierTypeType_OnlyDeform;
+               mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
+               mti->copyData = armatureModifier_copyData;
+               mti->isDisabled = armatureModifier_isDisabled;
+               mti->foreachObjectLink = armatureModifier_foreachObjectLink;
+               mti->updateDepgraph = armatureModifier_updateDepgraph;
+               mti->deformVerts = armatureModifier_deformVerts;
+               mti->deformVertsEM = armatureModifier_deformVertsEM;
+
+               mti = INIT_TYPE(Hook);
+               mti->type = eModifierTypeType_OnlyDeform;
+               mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_RequiresOriginalData;
+               mti->initData = hookModifier_initData;
+               mti->copyData = hookModifier_copyData;
+               mti->freeData = hookModifier_freeData;
+               mti->isDisabled = hookModifier_isDisabled;
+               mti->foreachObjectLink = hookModifier_foreachObjectLink;
+               mti->updateDepgraph = hookModifier_updateDepgraph;
+               mti->deformVerts = hookModifier_deformVerts;
+               mti->deformVertsEM = hookModifier_deformVertsEM;
+
+               mti = INIT_TYPE(Softbody);
+               mti->type = eModifierTypeType_OnlyDeform;
+               mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
+               mti->deformVerts = softbodyModifier_deformVerts;
+               mti->deformVertsEM = softbodyModifier_deformVertsEM;
+
                typeArrInit = 0;
 #undef INIT_TYPE
        }
@@ -1108,11 +1305,15 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
        }
 }
 
+/***/
+
 ModifierData *modifier_new(int type)
 {
        ModifierTypeInfo *mti = modifierType_getInfo(type);
        ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
 
+       strcpy(md->name, mti->name);
+
        md->type = type;
        md->mode = eModifierMode_Realtime|eModifierMode_Render|eModifierMode_Expanded;
 
@@ -1150,9 +1351,9 @@ int modifier_supportsMapping(ModifierData *md)
                                        (mti->flags&eModifierTypeFlag_SupportsMapping))) );
 }
 
-ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type)
+ModifierData *modifiers_findByType(Object *ob, ModifierType type)
 {
-       ModifierData *md = lb->first;
+       ModifierData *md = ob->modifiers.first;
 
        for (; md; md=md->next)
                if (md->type==type)
@@ -1161,18 +1362,32 @@ ModifierData *modifiers_findByType(struct ListBase *lb, ModifierType type)
        return md;
 }
 
-void modifiers_clearErrors(struct ListBase *lb)
+void modifiers_clearErrors(Object *ob)
 {
-       ModifierData *md = lb->first;
+       ModifierData *md = ob->modifiers.first;
+       int qRedraw = 0;
 
        for (; md; md=md->next) {
                if (md->error) {
                        MEM_freeN(md->error);
                        md->error = NULL;
 
-                       allqueue(REDRAWBUTSEDIT, 0);
+                       qRedraw = 1;
                }
        }
+
+       if (qRedraw) allqueue(REDRAWBUTSEDIT, 0);
+}
+
+void modifiers_foreachObjectLink(Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData)
+{
+       ModifierData *md = ob->modifiers.first;
+
+       for (; md; md=md->next) {
+               ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+               if (mti->foreachObjectLink) mti->foreachObjectLink(md, ob, walk, userData);
+       }
 }
 
 void modifier_copyData(ModifierData *md, ModifierData *target)
@@ -1212,9 +1427,9 @@ void modifier_setError(ModifierData *md, char *format, ...)
        allqueue(REDRAWBUTSEDIT, 0);
 }
 
-int modifiers_getCageIndex(ListBase *lb, int *lastPossibleCageIndex_r)
+int modifiers_getCageIndex(Object *ob, int *lastPossibleCageIndex_r)
 {
-       ModifierData *md = lb->first;
+       ModifierData *md = ob->modifiers.first;
        int i, cageIndex = -1;
 
                /* Find the last modifier acting on the cage. */
index c8feb7f89ceb4db4ead97e898a8cb6224adbd84e..ab0ee151209dc723cc6b68616c8b6aa9f43b3c84 100644 (file)
@@ -149,29 +149,6 @@ void update_base_layer(Object *ob)
        }
 }
 
-static void free_hooks(ListBase *lb)
-{
-       while(lb->first) {
-               ObHook *hook= lb->first;
-               if(hook->indexar) MEM_freeN(hook->indexar);
-               BLI_remlink(lb, hook);
-               MEM_freeN(hook);
-       }
-}
-
-static void copy_hooks(ListBase *new, ListBase *old)
-{
-       ObHook *hook, *hookn;
-       new->first= new->last= NULL;
-       
-       for(hook= old->first; hook; hook= hook->next) {
-               hookn= MEM_dupallocN(hook);
-               hookn->indexar= MEM_dupallocN(hookn->indexar);
-               BLI_addtail(new, hookn);
-       }
-
-}
-
 void object_free_modifiers(Object *ob)
 {
        while (ob->modifiers.first) {
@@ -233,8 +210,6 @@ void free_object(Object *ob)
        free_constraint_channels(&ob->constraintChannels);
        free_nlastrips(&ob->nlastrips);
        
-       free_hooks(&ob->hooks);
-       
        freedisplist(&ob->disp);
        
        BPY_free_scriptlink(&ob->scriptlink);
@@ -243,6 +218,15 @@ void free_object(Object *ob)
        if(ob->soft) sbFree(ob->soft);
 }
 
+static void unlink_object__unlinkModifierLinks(void *userData, Object *ob, Object **obpoin)
+{
+       Object *unlinkOb = userData;
+
+       if (*obpoin==unlinkOb) {
+               *obpoin = NULL;
+               ob->recalc |= OB_RECALC;
+       }
+}
 void unlink_object(Object *ob)
 {
        Object *obt;
@@ -252,10 +236,8 @@ void unlink_object(Object *ob)
        Scene *sce;
        Curve *cu;
        Tex *tex;
-       ObHook *hook;
        Group *group;
        bConstraint *con;
-       ModifierData *md;
        int a;
        char *str;
        
@@ -277,30 +259,7 @@ void unlink_object(Object *ob)
                                obt->recalc |= OB_RECALC_OB;
                        }
                        
-                       for(hook=obt->hooks.first; hook; hook= hook->next) {
-                               if(hook->parent==ob) {
-                                       hook->parent= NULL;
-                                       obt->recalc |= OB_RECALC;
-                               }
-                       }
-
-                       for (md=obt->modifiers.first; md; md=md->next) {
-                               if (md->type==eModifierType_Curve) {
-                                       CurveModifierData *cmd = (CurveModifierData*) md;
-
-                                       if (cmd->object==ob) {
-                                               cmd->object = NULL;
-                                               obt->recalc |= OB_RECALC;
-                                       }
-                               } else if (md->type==eModifierType_Lattice) {
-                                       LatticeModifierData *lmd = (LatticeModifierData*) md;
-
-                                       if (lmd->object==ob) {
-                                               lmd->object = NULL;
-                                               obt->recalc |= OB_RECALC;
-                                       }
-                               }
-                       }
+                       modifiers_foreachObjectLink(obt, unlink_object__unlinkModifierLinks, ob);
                        
                        if ELEM(obt->type, OB_CURVE, OB_FONT) {
                                cu= obt->data;
@@ -860,8 +819,6 @@ Object *copy_object(Object *ob)
        copy_nlastrips(&obn->nlastrips, &ob->nlastrips);
        copy_constraints (&obn->constraints, &ob->constraints);
 
-       copy_hooks( &obn->hooks, &ob->hooks);
-       
        actcon = clone_constraint_channels (&obn->constraintChannels, &ob->constraintChannels, ob->activecon);
        /* If the active constraint channel was in this list, update it */
        if (actcon)
index d010d16c786c9128187c78026368be23155340ea..b4da0f1097c66298930ee0182f89af481357f145 100644 (file)
@@ -745,7 +745,6 @@ static int object_has_edges(Object *ob)
 /* helper  call */
 static void set_body_point(Object *ob, BodyPoint *bp, float *vec)
 {
-       
        VECCOPY(bp->pos, vec);
        Mat4MulVecfl(ob->obmat, bp->pos);  // yep, sofbody is global coords
        VECCOPY(bp->origS, bp->pos);
index cb6ed51a714ef9a2239a40e6591001d22e907189..a166b070d67f8901bf20417bba9fb1155642c937 100644 (file)
@@ -2119,22 +2119,15 @@ static void direct_link_mesh(FileData *fd, Mesh *mesh)
 
 /* ************ READ OBJECT ***************** */
 
-static void lib_link_modifiers(FileData *fd, Object *ob)
+static void lib_link_modifiers__linkModifiers(void *userData, Object *ob, Object **obpoin)
 {
-       ModifierData *md;
+       FileData *fd = userData;
 
-       for (md=ob->modifiers.first; md; md=md->next) {
-               if (md->type==eModifierType_Lattice) {
-                       LatticeModifierData *lmd = (LatticeModifierData*) md;
-                               
-                       lmd->object = newlibadr(fd, ob->id.lib, lmd->object);
-               } 
-               else if (md->type==eModifierType_Curve) {
-                       CurveModifierData *cmd = (CurveModifierData*) md;
-                               
-                       cmd->object = newlibadr(fd, ob->id.lib, cmd->object);
-               }
-       }
+       *obpoin = newlibadr(fd, ob->id.lib, *obpoin);
+}
+static void lib_link_modifiers(FileData *fd, Object *ob)
+{
+       modifiers_foreachObjectLink(ob, lib_link_modifiers__linkModifiers, fd);
 }
 
 static void lib_link_object(FileData *fd, Main *main)
@@ -2143,7 +2136,6 @@ static void lib_link_object(FileData *fd, Main *main)
        bSensor *sens;
        bController *cont;
        bActuator *act;
-       ObHook *hook;
        void *poin;
        int warn=0, a;
 
@@ -2265,11 +2257,6 @@ static void lib_link_object(FileData *fd, Main *main)
                        }
 
                        lib_link_scriptlink(fd, &ob->id, &ob->scriptlink);
-                       
-                       for(hook= ob->hooks.first; hook; hook= hook->next) {
-                               hook->parent= newlibadr(fd, ob->id.lib, hook->parent);
-                       }
-
                        lib_link_modifiers(fd, ob);
                }
                ob= ob->id.next;
@@ -2310,6 +2297,16 @@ static void direct_link_modifiers(FileData *fd, ListBase *lb)
                        SubsurfModifierData *smd = (SubsurfModifierData*) md;
 
                        smd->emCache = smd->mCache = 0;
+               } else if (md->type==eModifierType_Hook) {
+                       HookModifierData *hmd = (HookModifierData*) md;
+
+                       hmd->indexar= newdataadr(fd, hmd->indexar);
+                       if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
+                               int a;
+                               for(a=0; a<hmd->totindex; a++) {
+                                       SWITCH_INT(hmd->indexar[a]);
+                               }
+                       }
                }
        }
 }
@@ -4785,6 +4782,24 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
                        where_is_armature(arm);
                }
                for(ob= main->object.first; ob; ob= ob->id.next) {
+                       while (ob->hooks.first) {
+                               ObHook *hook = ob->hooks.first;
+                               HookModifierData *hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
+
+                               VECCOPY(hmd->cent, hook->cent);
+                               hmd->falloff = hook->falloff;
+                               hmd->force = hook->force;
+                               hmd->indexar = hook->indexar;
+                               hmd->object = hook->parent;
+                               memcpy(hmd->parentinv, hook->parentinv, sizeof(hmd->parentinv));
+                               hmd->totindex = hook->totindex;
+
+                               BLI_addtail(&ob->modifiers, hmd);
+                               BLI_remlink(&ob->hooks, hook);
+
+                               MEM_freeN(hook);
+                       }
+
                        // btw. armature_rebuild_pose is further only called on leave editmode
                        if(ob->type==OB_ARMATURE) {
                                if(ob->pose) {
index fe6b0c5662990ffec339173455be7b2d94494c09..920d4ed634a1ee55348892d7f6485e8edd987140 100644 (file)
@@ -664,13 +664,18 @@ static void write_modifiers(WriteData *wd, ListBase *modbase)
                ModifierTypeInfo *mti = modifierType_getInfo(md->type);
 
                writestruct(wd, DATA, mti->structName, 1, md);
+
+               if (md->type==eModifierType_Hook) {
+                       HookModifierData *hmd = (HookModifierData*) md;
+
+                       writedata(wd, DATA, sizeof(int)*hmd->totindex, hmd->indexar);
+               }
        }
 }
 
 static void write_objects(WriteData *wd, ListBase *idbase)
 {
        Object *ob;
-       ObHook *hook;
        int a;
        
        ob= idbase->first;
@@ -705,11 +710,6 @@ static void write_objects(WriteData *wd, ListBase *idbase)
                                }
                        }
                        
-                       for(hook= ob->hooks.first; hook; hook= hook->next) {
-                               writestruct(wd, DATA, "ObHook", 1, hook);
-                               writedata(wd, DATA, sizeof(int)*hook->totindex, hook->indexar);
-                       }
-
                        write_modifiers(wd, &ob->modifiers);
                }
                ob= ob->id.next;
index 448a6be58841f31df7060f6e22d755c7347f7814..1a33b3d0810e49575f99de368308b8b8d231e73d 100644 (file)
@@ -60,11 +60,12 @@ typedef struct TreeElement {
 #define TSE_EBONE                      6
 #define TSE_CONSTRAINT_BASE    7
 #define TSE_CONSTRAINT         8
-#define TSE_HOOKS_BASE         9
-#define TSE_HOOK                       10
-#define TSE_SCRIPT_BASE                11
-#define TSE_POSE_BASE          12
-#define TSE_POSE_CHANNEL       13
+#define TSE_MODIFIER_BASE      9
+#define TSE_MODIFIER           10
+#define TSE_MODIFIER_OB                11
+#define TSE_SCRIPT_BASE                12
+#define TSE_POSE_BASE          13
+#define TSE_POSE_CHANNEL       14
 
 /* button events */
 #define OL_NAMEBUTTON          1
index cddf8809c14b961836093bb8a0fb83dcc9686d4b..e849cdbf114db86b8e5773e15dfeb9c5cf4466a6 100644 (file)
@@ -215,10 +215,8 @@ void test_idbutton_cb(void *namev, void *arg2_unused);
 /* *********************** */
 #define B_ANIMBUTS             1500
 
-#define B_RECALCPATH           1401
+#define B_RECALCPATH   1401
 #define B_TRACKBUTS            1402
-#define B_DEL_HOOK             1403
-#define B_CLR_HOOK             1404
 
 #define B_PRINTSPEED   1413
 #define B_PRINTLEN             1414
index ee43dd543cdc93dfb3464d63f4259299d4f986cf..5847e2cd01a08be41714ee20babfe59016697b4e 100644 (file)
@@ -14,6 +14,9 @@ typedef enum ModifierType {
        eModifierType_Mirror,
        eModifierType_Decimate,
        eModifierType_Wave,
+       eModifierType_Armature,
+       eModifierType_Hook,
+       eModifierType_Softbody,
 
        NUM_MODIFIER_TYPES
 } ModifierType;
@@ -23,7 +26,6 @@ typedef enum ModifierType {
         * for render calc.
         */
 typedef enum ModifierMode {
-       eModifierMode_Disabled = 0,
        eModifierMode_Realtime = (1<<0),
        eModifierMode_Render = (1<<1),
        eModifierMode_Editmode = (1<<2),
@@ -35,6 +37,7 @@ typedef struct ModifierData {
        struct ModifierData *next, *prev;
 
        int type, mode;
+       char name[32];
 
        char *error;
 } ModifierData;
@@ -95,4 +98,27 @@ typedef struct WaveModifierData {
        float timeoffs, lifetime;
 } WaveModifierData;
 
+typedef struct ArmatureModifierData {
+       ModifierData modifier;
+
+       struct Object *object;
+} ArmatureModifierData;
+
+typedef struct HookModifierData {
+       ModifierData modifier;
+
+       struct Object *object;
+       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 */
+       
+       int *indexar;
+       int totindex;
+       float force;
+} HookModifierData;
+
+typedef struct SoftbodyModifierData {
+       ModifierData modifier;
+} SoftbodyModifierData;
+
 #endif
index 0f6c2fcf90962c59317102b40fab550df0df4958..354f204087fd6a8b9650f5405f148c4f74caa8db 100644 (file)
@@ -511,11 +511,13 @@ void do_modifier_panels(unsigned short event)
        switch(event) {
        case B_MODIFIER_REDRAW:
                allqueue(REDRAWBUTSEDIT, 0);
+               allqueue(REDRAWOOPS, 0);
                break;
 
        case B_MODIFIER_RECALC:
                allqueue(REDRAWBUTSEDIT, 0);
                allqueue(REDRAWVIEW3D, 0);
+               allqueue(REDRAWOOPS, 0);
                DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
                break;
        }
@@ -590,6 +592,17 @@ static void modifiers_moveDown(void *ob_v, void *md_v)
        ModifierData *md = md_v;
 
        if (md->next) {
+               ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+               if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
+                       ModifierTypeInfo *nmti = modifierType_getInfo(md->next->type);
+
+                       if (nmti->type!=eModifierTypeType_OnlyDeform) {
+                               error("Cannot move beyond a non-deforming modifier.");
+                               return;
+                       }
+               }
+
                BLI_remlink(&ob->modifiers, md);
                BLI_insertlink(&ob->modifiers, md->next, md);
        }
@@ -629,6 +642,23 @@ static void modifier_testCurveObj(char *name, ID **idpp)
        *idpp= 0;
 }
 
+static void modifier_testArmatureObj(char *name, ID **idpp)
+{
+       ID *id;
+
+       for (id= G.main->object.first; id; id= id->next) {
+               if( strcmp(name, id->name+2)==0 ) {
+                       if (((Object *)id)->type != OB_ARMATURE) {
+                               error ("Armature deform object must be an armature");
+                               break;
+                       } 
+                       *idpp= id;
+                       return;
+               }
+       }
+       *idpp= 0;
+}
+
 static void modifiers_applyModifier(void *obv, void *mdv)
 {
        Object *ob = obv;
@@ -718,6 +748,19 @@ static void modifiers_setSubsurfIncremental(void *ob_v, void *md_v)
        }
 }
 
+static void modifiers_clearHookOffset(void *ob_v, void *md_v)
+{
+       Object *ob = ob_v;
+       ModifierData *md = md_v;
+       HookModifierData *hmd = (HookModifierData*) md;
+       
+       if (hmd->object) {
+               Mat4Invert(hmd->object->imat, hmd->object->obmat);
+               Mat4MulSerie(hmd->parentinv, hmd->object->imat, ob->obmat, NULL, NULL, NULL, NULL, NULL, NULL);
+               BIF_undo_push("Clear hook");
+       }
+}
+
 static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco, int *yco, int index, int cageIndex, int lastCageIndex)
 {
        ModifierTypeInfo *mti = modifierType_getInfo(md->type);
@@ -737,7 +780,14 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
        uiRoundBox(x+4+10, y-18, x+width+10, y+6, 5.0);
 
        BIF_ThemeColor(color);
-       uiDefBut(block, LABEL, B_NOP, mti->name, x+5, y-1, 100, 19, NULL, 0.0, 0.0, 0.0, 0.0, ""); 
+       uiBlockBeginAlign(block);
+       uiDefBut(block, TEX, B_MODIFIER_REDRAW, "", x+10, y-1, width-120-60-10, 19, md->name, 0.0, sizeof(md->name)-1, 0.0, 0.0, "Modifier name"); 
+       uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+width-120-60, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
+       uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+width-120-60+20, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
+       if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
+               uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+width-120-60+40, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
+       }
+       uiBlockEndAlign(block);
 
        uiBlockSetEmboss(block, UI_EMBOSSR);
 
@@ -756,7 +806,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        icon = ICON_BLANK1;
                }
                uiBlockSetCol(block, color);
-               but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, icon, x+width-120, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
+               but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, icon, x+width-105, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Apply modifier to editing cage during Editmode");
                uiButSetFunc(but, modifiers_setOnCage, ob, md);
                uiBlockSetCol(block, TH_AUTO);
        }
@@ -778,14 +828,6 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
        BIF_ThemeColor(color);
        uiBlockSetEmboss(block, UI_EMBOSS);
 
-       uiBlockBeginAlign(block);
-       uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+width-120-90, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
-       uiDefIconButBitI(block, TOG, eModifierMode_Realtime, B_MODIFIER_RECALC, VICON_VIEW3D, x+width-120-90+20, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
-       if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
-               uiDefIconButBitI(block, TOG, eModifierMode_Editmode, B_MODIFIER_RECALC, VICON_EDIT, x+width-120-90+40, y, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during Editmode (only if enabled for display)");
-       }
-       uiBlockEndAlign(block);
-
        if (!(md->mode&eModifierMode_Expanded)) {
                y -= 18;
        } else {
@@ -798,17 +840,23 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                if (md->type==eModifierType_Subsurf) {
                        height = 86;
                } else if (md->type==eModifierType_Lattice) {
-                       height = 86;
+                       height = 46;
                } else if (md->type==eModifierType_Curve) {
-                       height = 86;
+                       height = 46;
                } else if (md->type==eModifierType_Build) {
                        height = 86;
                } else if (md->type==eModifierType_Mirror) {
-                       height = 86;
+                       height = 46;
                } else if (md->type==eModifierType_Decimate) {
-                       height = 66;
+                       height = 46;
                } else if (md->type==eModifierType_Wave) {
                        height = 200;
+               } else if (md->type==eModifierType_Armature) {
+                       height = 46;
+               } else if (md->type==eModifierType_Hook) {
+                       height = 86;
+               } else if (md->type==eModifierType_Softbody) {
+                       height = 46;
                }
 
                BIF_ThemeColor(color);
@@ -845,10 +893,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MODIFIER_RECALC, "Debug", lx+90, cy,70,19,&smd->flags, 0, 0, 0, 0, "Visualize the subsurf incremental calculation, for debugging effect of other modifiers");
                } else if (md->type==eModifierType_Lattice) {
                        LatticeModifierData *lmd = (LatticeModifierData*) md;
-                       uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:",      lx, (cy-=19), 120,19, &lmd->object, "Lattice object to deform with");
+                       uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob: ",     lx, (cy-=19), 120,19, &lmd->object, "Lattice object to deform with");
                } else if (md->type==eModifierType_Curve) {
                        CurveModifierData *cmd = (CurveModifierData*) md;
-                       uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob:", lx, (cy-=19), 120,19, &cmd->object, "Curve object to deform with");
+                       uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &cmd->object, "Curve object to deform with");
                } else if (md->type==eModifierType_Build) {
                        BuildModifierData *bmd = (BuildModifierData*) md;
                        uiDefButF(block, NUM, B_MODIFIER_RECALC, "Start:", lx, (cy-=19), 160,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect");
@@ -883,6 +931,18 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                        uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Heigth:",  lx,(cy-=19),220,19, &wmd->height, -2.0, 2.0, 0, 0, "Specify the amplitude of the wave");
                        uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Width:",   lx,(cy-=19),220,19, &wmd->width, 0.0, 5.0, 0, 0, "Specify the width of the wave");
                        uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Narrow:",  lx,(cy-=19),220,19, &wmd->narrow, 0.0, 10.0, 0, 0, "Specify how narrow the wave follows");
+               } else if (md->type==eModifierType_Armature) {
+                       ArmatureModifierData *amd = (ArmatureModifierData*) md;
+                       uiDefIDPoinBut(block, modifier_testArmatureObj, B_CHANGEDEP, "Ob: ", lx, (cy-=19), 120,19, &amd->object, "Armature object to deform with");
+               } else if (md->type==eModifierType_Hook) {
+                       HookModifierData *hmd = (HookModifierData*) md;
+                       uiDefButF(block, NUM, B_MODIFIER_RECALC, "Falloff: ",           lx, (cy-=19), 160,19, &hmd->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
+                       uiDefButF(block, NUMSLI, B_MODIFIER_RECALC, "Force: ",  lx, (cy-=19), 160,19, &hmd->force, 0.0, 1.0, 100, 0, "Set relative force of hook");
+                       uiDefIDPoinBut(block, test_obpoin_but, B_CHANGEDEP, "Ob: ",     lx, (cy-=19), 160,19, &hmd->object, "Parent Object for hook, also recalculates and clears offset"); 
+                       but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Clear offset",           lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook");
+                       uiButSetFunc(but, modifiers_clearHookOffset, ob, md);
+               } else if (md->type==eModifierType_Softbody) {
+                       uiDefBut(block, LABEL, 1, "See Softbody panel.",        lx, (cy-=19), 160,19, NULL, 0.0, 0.0, 0, 0, "");
                }
                uiBlockEndAlign(block);
 
@@ -913,9 +973,8 @@ static void editing_panel_modifiers(Object *ob)
        ModifierData *md;
        uiBlock *block;
        char str[64];
-       int xco, yco, i, lastCageIndex, cageIndex = modifiers_getCageIndex(&ob->modifiers, &lastCageIndex);
+       int xco, yco, i, lastCageIndex, cageIndex = modifiers_getCageIndex(ob, &lastCageIndex);
 
-               // XXX ofsx should probably be changed in other panels here
        block= uiNewBlock(&curarea->uiblocks, "editing_panel_modifiers", UI_EMBOSS, UI_HELV, curarea->win);
        if( uiNewPanel(curarea, block, "Modifiers", "Editing", 640, 0, 318, 204)==0) return;
 
index 7e5405f3e3f96842be4aea12afdb5dbcf3b24e50..9ce1ecb099fd250c2106b31f5ad0172d96775819 100644 (file)
@@ -1032,60 +1032,6 @@ static void object_panel_draw(Object *ob)
 
 }
 
-static void object_panel_hooks(Object *ob)
-{
-       uiBlock *block;
-       ObHook *hook;
-       int tothook=0, nr, active;
-       char *cp;
-       
-       block= uiNewBlock(&curarea->uiblocks, "object_panel_hooks", UI_EMBOSS, UI_HELV, curarea->win);
-       uiNewPanelTabbed("Draw", "Object");
-       if(uiNewPanel(curarea, block, "Hooks", "Object", 320, 0, 318, 204)==0) return;
-
-       if(ob->hooks.first==NULL) {
-               uiDefBut(block, LABEL, 0, "Add hooks in Editmode", 10,180,300,19, NULL, 0, 0, 0, 0, "");
-               return;
-       }
-       
-       /* build menu */
-       for(hook= ob->hooks.first; hook; hook= hook->next) tothook++;
-       
-       cp= MEM_callocN(32*tothook+32, "temp string");
-       strcpy(cp, "Active Hook %t|");
-
-       for(hook= ob->hooks.first; hook; hook= hook->next) {
-               strcat(cp, hook->name);
-               strcat(cp, " |");
-       }
-       /* active is stored in first hook */
-       hook= ob->hooks.first;
-       if(hook->active<1 || hook->active > tothook) hook->active= 1;
-       active= hook->active;
-       
-       uiBlockBeginAlign(block);
-       uiDefButS(block, MENU, B_REDR, cp,                                      10,180,150,19, &hook->active, 0, 0, 0, 0, "Set active hook");
-       MEM_freeN(cp);
-
-       for(nr=1, hook= ob->hooks.first; hook; hook= hook->next, nr++) {
-               if(nr==active) break;
-       }
-       if(hook==NULL) printf("error in object_panel_hooks\n");
-       
-       uiDefBut(block, TEX, B_REDR, "Name: ",                          160,180,150,19, hook->name, 0, 31, 0, 0, "Set name of hook");
-
-       uiBlockBeginAlign(block);
-       uiDefButF(block, NUM, B_MAKEDISP, "Falloff: ",          160,140,150,19, &hook->falloff, 0.0, 100.0, 100, 0, "If not zero, the distance from hook where influence ends");
-       uiDefButF(block, NUMSLI, B_MAKEDISP, "Force: ",         160,120,150,19, &hook->force, 0.0, 1.0, 100, 0, "Set relative force of hook");
-       uiBlockEndAlign(block);
-
-       uiDefIDPoinBut(block, test_obpoin_but, B_CLR_HOOK, "Parent:",   10, 120, 150, 19, &hook->parent, "Parent Object for hook, also recalculates and clears offset"); 
-
-       uiBlockBeginAlign(block);
-       uiDefBut(block, BUT, B_DEL_HOOK, "Delete",                              10,80,150,19, NULL, 0.0, 0.0, 0, 0, "Delete hook");
-       uiDefBut(block, BUT, B_CLR_HOOK, "Clear offset",                160,80,150,19, NULL, 0.0, 0.0, 0, 0, "Recalculate and clear offset (transform) of hook");
-}
-
 static void softbody_bake(Object *ob)
 {
        SoftBody *sb= ob->soft;
@@ -1139,7 +1085,6 @@ static void softbody_bake(Object *ob)
 void do_object_panels(unsigned short event)
 {
        Object *ob;
-       ObHook *hook;
        Effect *eff;
        
        ob= OBACT;
@@ -1150,42 +1095,6 @@ void do_object_panels(unsigned short event)
                DAG_object_flush_update(G.scene, ob, OB_RECALC_OB);
                allqueue(REDRAWVIEW3D, 0);
                break;
-       case B_DEL_HOOK:
-               hook= ob->hooks.first;
-               if(hook) {
-                       int active= hook->active, nr;
-                       for(nr=1, hook=ob->hooks.first; hook; hook=hook->next, nr++) {
-                               if(active==nr) break;
-                       }
-                       if(hook) {
-                               BLI_remlink(&ob->hooks, hook);
-                               if(hook->indexar) MEM_freeN(hook->indexar);
-                               MEM_freeN(hook);
-                       }
-                       freedisplist(&ob->disp);
-                       BIF_undo_push("Delete hook");
-                       allqueue(REDRAWVIEW3D, 0);
-                       allqueue(REDRAWBUTSOBJECT, 0);
-               }
-               break;
-       case B_CLR_HOOK:
-               hook= ob->hooks.first;
-               if(hook) {
-                       int active= hook->active, nr;
-                       for(nr=1, hook=ob->hooks.first; hook; hook=hook->next, nr++) {
-                               if(active==nr) break;
-                       }
-                       if(hook && hook->parent) {
-                               Mat4Invert(hook->parent->imat, hook->parent->obmat);
-                               /* apparently this call goes from right to left... */
-                               Mat4MulSerie(hook->parentinv, hook->parent->imat, ob->obmat, NULL, 
-                                                       NULL, NULL, NULL, NULL, NULL);
-                               DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
-                               BIF_undo_push("Clear hook");
-                               allqueue(REDRAWVIEW3D, 0);
-                       }
-               }
-               break;
        case B_RECALCPATH:
                DAG_object_flush_update(G.scene, OBACT, OB_RECALC_DATA);
                allqueue(REDRAWVIEW3D, 0);
@@ -1782,7 +1691,6 @@ void object_panels()
 
                object_panel_anim(ob);
                object_panel_draw(ob);
-               object_panel_hooks(ob);
                object_panel_constraint();
                if(ob->type==OB_MESH) {
                        object_panel_effects(ob);
index 02b90877b6ce3fa932b297d4d2db2688f7e79a2f..9ad5fe1f56670c7c8da496481eb2102cf15e652e 100644 (file)
@@ -58,6 +58,7 @@
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
 #include "DNA_object_force.h"
 #include "DNA_space_types.h"
@@ -3387,27 +3388,30 @@ static void drawWireExtra(Object *ob)
 /* should be called in view space */
 static void draw_hooks(Object *ob)
 {
-       ObHook *hook;
+       ModifierData *md;
        float vec[3];
        
-       for(hook= ob->hooks.first; hook; hook= hook->next) {
-               
-               VecMat4MulVecfl(vec, ob->obmat, hook->cent);
-               if(hook->parent) {
-                       setlinestyle(3);
-                       glBegin(GL_LINES);
-                       glVertex3fv(hook->parent->obmat[3]);
-                       glVertex3fv(vec);
-                       glEnd();
-                       setlinestyle(0);
-               }
+       for (md=ob->modifiers.first; md; md=md->next) {
+               if (md->type==eModifierType_Hook) {
+                       HookModifierData *hmd = (HookModifierData*) md;
 
-               glPointSize(3.0);
-               bglBegin(GL_POINTS);
-               bglVertex3fv(vec);
-               bglEnd();
-               glPointSize(1.0);
+                       VecMat4MulVecfl(vec, ob->obmat, hmd->cent);
 
+                       if(hmd->object) {
+                               setlinestyle(3);
+                               glBegin(GL_LINES);
+                               glVertex3fv(hmd->object->obmat[3]);
+                               glVertex3fv(vec);
+                               glEnd();
+                               setlinestyle(0);
+                       }
+
+                       glPointSize(3.0);
+                       bglBegin(GL_POINTS);
+                       bglVertex3fv(vec);
+                       bglEnd();
+                       glPointSize(1.0);
+               }
        }
 }
 
@@ -3782,7 +3786,7 @@ void draw_object(Base *base)
                ListBase *list;
 
                /* draw hook center and offset line */
-               if(ob->hooks.first && ob!=G.obedit) draw_hooks(ob);
+               if(ob!=G.obedit) draw_hooks(ob);
 
                /* help lines and so */
                if(ob!=G.obedit && ob->parent && (ob->parent->lay & G.vd->lay)) {
index 8beb90d2062b3782658225c07930e23e082230f3..35f3b44091c3557002289e92d37f547d8e26f187 100644 (file)
@@ -1995,7 +1995,7 @@ static void add_verts_to_closest_dgroup(Object *ob, Object *par)
     mesh = (Mesh*)ob->data;
 
        /* Is subsurf on? Lets use the verts on the limit surface then */
-       if (modifiers_findByType(&ob->modifiers, eModifierType_Subsurf)) {
+       if (modifiers_findByType(ob, eModifierType_Subsurf)) {
                subverts = MEM_mallocN(3*mesh->totvert*sizeof(float), "subverts");
                subsurf_calculate_limit_positions(mesh, (void *)subverts);      /* (ton) made void*, dunno how to cast */
        }
index c10f7ac4c0d4092126e5cbb6a086f3541b9d2dbc..813498b104360bfb3bafcafccb40f05eff111b2a 100644 (file)
@@ -695,7 +695,7 @@ short seg_intersect(EditEdge *e, CutCurve *c, int len)
        int  i;
        short isect=0;
        
-       /* Get screen coords of verts (v->xs and v->ys clip if off screen */
+       /* Get screen coords of verts */
        VECCOPY(co, e->v1->co);
        co[3]= 1.0;
        Mat4MulVec4fl(G.obedit->obmat, co);
index 5ed2470c33e69943d6c3a39cb5bbea65ba6695f9..09bb08255bdd1fad42db3bf8b45bf6200751293b 100644 (file)
@@ -1077,8 +1077,6 @@ void fill_mesh(void)
 
        ok= BLI_edgefill(0);
 
-       /* printf("time: %d\n",(clock()-tijd)/1000); */
-
        if(ok) {
                efa= fillfacebase.first;
                while(efa) {
@@ -1087,7 +1085,6 @@ void fill_mesh(void)
                        efa= efa->next;
                }
        }
-       /* else printf("fill error\n"); */
 
        BLI_end_edgefill();
 
@@ -4436,8 +4433,6 @@ int EdgeSlide(short immediate, float imperc)
                tempsv->origvert.no[0] = ev->no[0];
                tempsv->origvert.no[1] = ev->no[1];
                tempsv->origvert.no[2] = ev->no[2];
-               tempsv->origvert.xs = ev->xs;
-               tempsv->origvert.ys = ev->ys;
                // i is total edges that vert is on
                // j is total selected edges that vert is on
                
index 65839cd84e502a112c347735be054108f06ae44c..82851ee82d2baf6554e786306cf5766c7bcb9bf7 100644 (file)
@@ -307,16 +307,16 @@ static int return_editmesh_indexar(int **indexar, float *cent)
        return totvert;
 }
 
-static void select_editmesh_hook(ObHook *hook)
+static void select_editmesh_hook(HookModifierData *hmd)
 {
        EditMesh *em = G.editMesh;
        EditVert *eve;
        int index=0, nr=0;
        
        for(eve= em->verts.first; eve; eve= eve->next, nr++) {
-               if(nr==hook->indexar[index]) {
+               if(nr==hmd->indexar[index]) {
                        eve->f |= SELECT;
-                       if(index < hook->totindex-1) index++;
+                       if(index < hmd->totindex-1) index++;
                }
        }
        EM_select_flush();
@@ -361,7 +361,7 @@ static int return_editlattice_indexar(int **indexar, float *cent)
        return totvert;
 }
 
-static void select_editlattice_hook(ObHook *hook)
+static void select_editlattice_hook(HookModifierData *hmd)
 {
        BPoint *bp;
        int index=0, nr=0, a;
@@ -370,9 +370,9 @@ static void select_editlattice_hook(ObHook *hook)
        a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
        bp= editLatt->def;
        while(a--) {
-               if(hook->indexar[index]==nr) {
+               if(hmd->indexar[index]==nr) {
                        bp->f1 |= SELECT;
-                       if(index < hook->totindex-1) index++;
+                       if(index < hmd->totindex-1) index++;
                }
                nr++;
                bp++;
@@ -455,7 +455,7 @@ static int return_editcurve_indexar(int **indexar, float *cent)
        return totvert;
 }
 
-static void select_editcurve_hook(ObHook *hook)
+static void select_editcurve_hook(HookModifierData *hmd)
 {
        extern ListBase editNurb;
        Nurb *nu;
@@ -468,19 +468,19 @@ static void select_editcurve_hook(ObHook *hook)
                        bezt= nu->bezt;
                        a= nu->pntsu;
                        while(a--) {
-                               if(nr == hook->indexar[index]) {
+                               if(nr == hmd->indexar[index]) {
                                        bezt->f1 |= SELECT;
-                                       if(index<hook->totindex-1) index++;
+                                       if(index<hmd->totindex-1) index++;
                                }
                                nr++;
-                               if(nr == hook->indexar[index]) {
+                               if(nr == hmd->indexar[index]) {
                                        bezt->f2 |= SELECT;
-                                       if(index<hook->totindex-1) index++;
+                                       if(index<hmd->totindex-1) index++;
                                }
                                nr++;
-                               if(nr == hook->indexar[index]) {
+                               if(nr == hmd->indexar[index]) {
                                        bezt->f3 |= SELECT;
-                                       if(index<hook->totindex-1) index++;
+                                       if(index<hmd->totindex-1) index++;
                                }
                                nr++;
 
@@ -491,9 +491,9 @@ static void select_editcurve_hook(ObHook *hook)
                        bp= nu->bp;
                        a= nu->pntsu*nu->pntsv;
                        while(a--) {
-                               if(nr == hook->indexar[index]) {
+                               if(nr == hmd->indexar[index]) {
                                        bp->f1 |= SELECT;
-                                       if(index<hook->totindex-1) index++;
+                                       if(index<hmd->totindex-1) index++;
                                }
                                nr++;
                                bp++;
@@ -504,14 +504,15 @@ static void select_editcurve_hook(ObHook *hook)
 
 void add_hook(void)
 {
+       ModifierData *md = NULL;
+       HookModifierData *hmd = NULL;
        Object *ob=NULL;
-       ObHook *hook=NULL;
        float cent[3];
        int tot=0, *indexar, mode;
 
        if(G.obedit==NULL) return;
        
-       if(G.obedit->hooks.first)
+       if(modifiers_findByType(G.obedit, eModifierType_Hook))
                mode= pupmenu("Hooks %t|Add Hook, To New Empty %x1|Add Hook, To Selected Object %x2|Remove... %x3|Reassign... %x4|Select... %x5|Clear Offset...%x6");
        else
                mode= pupmenu("Hooks %t|Add, New Empty %x1|Add, To Selected Object %x2");
@@ -541,7 +542,10 @@ void add_hook(void)
                char *cp;
                
                // make pupmenu with hooks
-               for(hook= G.obedit->hooks.first; hook; hook= hook->next) maxlen+=32;
+               for(md=G.obedit->modifiers.first; md; md= md->next) {
+                       if (md->type==eModifierType_Hook) 
+                               maxlen+=32;
+               }
                
                if(maxlen==0) {
                        error("Object has no hooks yet");
@@ -554,9 +558,11 @@ void add_hook(void)
                else if(mode==5) strcpy(cp, "Select %t|");
                else if(mode==6) strcpy(cp, "Clear Offset %t|");
                
-               for(hook= G.obedit->hooks.first; hook; hook= hook->next) {
-                       strcat(cp, hook->name);
-                       strcat(cp, " |");
+               for(md=G.obedit->modifiers.first; md; md= md->next) {
+                       if (md->type==eModifierType_Hook) {
+                               strcat(cp, md->name);
+                               strcat(cp, " |");
+                       }
                }
        
                nr= pupmenu(cp);
@@ -565,10 +571,15 @@ void add_hook(void)
                if(nr<1) return;
                
                a= 1;
-               for(hook= G.obedit->hooks.first; hook; hook= hook->next, a++) {
-                       if(a==nr) break;
+               for(md=G.obedit->modifiers.first; md; md=md->next) {
+                       if (md->type==eModifierType_Hook) {
+                               if(a==nr) break;
+                               a++;
+                       }
                }
-               ob= hook->parent;
+
+               hmd = (HookModifierData*) md;
+               ob= hmd->object;
        }
 
        /* do it, new hooks or reassign */
@@ -611,17 +622,16 @@ void add_hook(void)
                                                                        
                        /* new hook */
                        if(mode==1 || mode==2) {
-                               hook= MEM_callocN(sizeof(ObHook), "new hook");
-                               BLI_addtail(&G.obedit->hooks, hook);
-                               strncpy(hook->name, ob->id.name+2, 30);
-                               hook->force= 1.0;
+                               hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
+                               BLI_addtail(&G.obedit->modifiers, &hmd); // XXX, ordering
+                               sprintf("Hook-%s", hmd->modifier.name, ob->id.name+2);
                        }
-                       else MEM_freeN(hook->indexar); // reassign, hook was set
+                       else if (hmd->indexar) MEM_freeN(hmd->indexar); // reassign, hook was set
 
-                       hook->parent= ob;
-                       hook->indexar= indexar;
-                       VECCOPY(hook->cent, cent);
-                       hook->totindex= tot;
+                       hmd->object= ob;
+                       hmd->indexar= indexar;
+                       VECCOPY(hmd->cent, cent);
+                       hmd->totindex= tot;
                        
                        if(mode==1 || mode==2) {
                                /* matrix calculus */
@@ -632,28 +642,27 @@ void add_hook(void)
                
                                Mat4Invert(ob->imat, ob->obmat);
                                /* apparently this call goes from right to left... */
-                               Mat4MulSerie(hook->parentinv, ob->imat, G.obedit->obmat, NULL, 
+                               Mat4MulSerie(hmd->parentinv, ob->imat, G.obedit->obmat, NULL, 
                                                        NULL, NULL, NULL, NULL, NULL);
                        }
                }
        }
        else if(mode==3) { // remove
-               BLI_remlink(&G.obedit->hooks, hook);
-               MEM_freeN(hook->indexar);
-               MEM_freeN(hook);
+               BLI_remlink(&G.obedit->modifiers, md);
+               modifier_free(md);
        }
        else if(mode==5) { // select
-               if(G.obedit->type==OB_MESH) select_editmesh_hook(hook);
-               else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hook);
-               else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hook);
-               else if(G.obedit->type==OB_SURF) select_editcurve_hook(hook);
+               if(G.obedit->type==OB_MESH) select_editmesh_hook(hmd);
+               else if(G.obedit->type==OB_LATTICE) select_editlattice_hook(hmd);
+               else if(G.obedit->type==OB_CURVE) select_editcurve_hook(hmd);
+               else if(G.obedit->type==OB_SURF) select_editcurve_hook(hmd);
        }
        else if(mode==6) { // clear offset
                where_is_object(ob);    // ob is hook->parent
 
                Mat4Invert(ob->imat, ob->obmat);
                /* this call goes from right to left... */
-               Mat4MulSerie(hook->parentinv, ob->imat, G.obedit->obmat, NULL, 
+               Mat4MulSerie(hmd->parentinv, ob->imat, G.obedit->obmat, NULL, 
                                        NULL, NULL, NULL, NULL, NULL);
        }
 
@@ -2318,7 +2327,7 @@ void convertmenu(void)
         */
 void flip_subdivison(Object *ob, int level)
 {
-       ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf);
+       ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf);
 
        if (md) {
                SubsurfModifierData *smd = (SubsurfModifierData*) md;
@@ -2464,6 +2473,8 @@ static void copymenu_modifiers(Object *ob)
        for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
                ModifierTypeInfo *mti = modifierType_getInfo(i);
 
+               if (i==eModifierType_Hook) continue;
+
                if (    (mti->flags&eModifierTypeFlag_AcceptsCVs) || 
                                (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
                        sprintf(str+strlen(str), "|%s%%x%d", mti->name, i);
@@ -2485,15 +2496,17 @@ static void copymenu_modifiers(Object *ob)
                                                object_free_modifiers(base->object);
 
                                                for (md=ob->modifiers.first; md; md=md->next) {
-                                                       ModifierData *nmd = modifier_new(md->type);
-                                                       modifier_copyData(md, nmd);
-                                                       BLI_addtail(&base->object->modifiers, nmd);
+                                                       if (md->type!=eModifierType_Hook) {
+                                                               ModifierData *nmd = modifier_new(md->type);
+                                                               modifier_copyData(md, nmd);
+                                                               BLI_addtail(&base->object->modifiers, nmd);
+                                                       }
                                                }
                                        } else {
-                                               ModifierData *md = modifiers_findByType(&ob->modifiers, event);
+                                               ModifierData *md = modifiers_findByType(ob, event);
 
                                                if (md) {
-                                                       ModifierData *tmd = modifiers_findByType(&base->object->modifiers, event);
+                                                       ModifierData *tmd = modifiers_findByType(base->object, event);
 
                                                        if (!tmd) {
                                                                tmd = modifier_new(event);
@@ -2727,10 +2740,10 @@ void copy_attr(short event)
                                }
                                else if(event==21){
                                        if (base->object->type==OB_MESH) {
-                                               ModifierData *md = modifiers_findByType(&ob->modifiers, eModifierType_Subsurf);
+                                               ModifierData *md = modifiers_findByType(ob, eModifierType_Subsurf);
 
                                                if (md) {
-                                                       ModifierData *tmd = modifiers_findByType(&base->object->modifiers, eModifierType_Subsurf);
+                                                       ModifierData *tmd = modifiers_findByType(base->object, eModifierType_Subsurf);
 
                                                        if (!tmd) {
                                                                tmd = modifier_new(eModifierType_Subsurf);
@@ -3444,6 +3457,10 @@ void rightmouse_transform(void)
 /* ************************************** */
 
 
+static void single_object_users__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
+{
+       ID_NEW(*obpoin);
+}
 void single_object_users(int flag)     
 {
        Base *base;
@@ -3485,17 +3502,10 @@ void single_object_users(int flag)
                                                relink_constraints(&chan->constraints);
                                        }
                                }
-                               if(base->object->hooks.first) {
-                                       ObHook *hook= base->object->hooks.first;
-                                       while(hook) {
-                                               ID_NEW(hook->parent);
-                                               hook= hook->next;
-                                       }
-                               }
+                               modifiers_foreachObjectLink(base->object, single_object_users__forwardModifierLinks, NULL);
                                
                                ID_NEW(ob->parent);
                                ID_NEW(ob->track);
-                               
                        }
                }
                base= base->next;
@@ -4012,7 +4022,10 @@ void make_local(void)
        BIF_undo_push("Make local");
 }
 
-
+static void adduplicate__forwardModifierLinks(void *userData, Object *ob, Object **obpoin)
+{
+       ID_NEW(*obpoin);
+}
 void adduplicate(int noTrans)
 /* dtrans is 3 x 3xfloat dloc, drot en dsize */
 {
@@ -4206,7 +4219,6 @@ void adduplicate(int noTrans)
        base= FIRSTBASE;
        while(base) {
                if TESTBASELIB(base) {
-                       
                        relink_constraints(&base->object->constraints);
                        if (base->object->pose){
                                bPoseChannel *chan;
@@ -4214,13 +4226,7 @@ void adduplicate(int noTrans)
                                        relink_constraints(&chan->constraints);
                                }
                        }
-                       if(base->object->hooks.first) {
-                               ObHook *hook= base->object->hooks.first;
-                               while(hook) {
-                                       ID_NEW(hook->parent);
-                                       hook= hook->next;
-                               }
-                       }
+                       modifiers_foreachObjectLink(base->object, adduplicate__forwardModifierLinks, NULL);
                        ID_NEW(base->object->parent);
                        ID_NEW(base->object->track);
                        
index ceae2838650e6cadc85a9ecd85b6c8b1e7bf38c8..16745342faedd9fc2575ed9ea6f02e0d8c42dac6 100644 (file)
@@ -47,6 +47,7 @@
 #include "DNA_material_types.h"
 #include "DNA_mesh_types.h"
 #include "DNA_meta_types.h"
+#include "DNA_modifier_types.h"
 #include "DNA_nla_types.h"
 #include "DNA_object_types.h"
 #include "DNA_oops_types.h"
@@ -65,6 +66,7 @@
 #include "BKE_library.h"
 #include "BKE_main.h"
 #include "BKE_material.h"
+#include "BKE_modifier.h"
 #include "BKE_screen.h"
 #include "BKE_utildefines.h"
 
@@ -367,7 +369,6 @@ static void outliner_sort(SpaceOops *soops, ListBase *lb)
 static void outliner_add_bone(SpaceOops *soops, ListBase *lb, 
                                                          ID *id, Bone *curBone, TreeElement *parent, int *a);
 
-
 static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *idv, 
                                                                                 TreeElement *parent, short type, short index)
 {
@@ -502,16 +503,25 @@ static TreeElement *outliner_add_element(SpaceOops *soops, ListBase *lb, void *i
                                        }
                                }
                                
-                               if(ob->hooks.first) {
-                                       ObHook *hook;
-                                       TreeElement *ten;
-                                       TreeElement *tenla= outliner_add_element(soops, &te->subtree, ob, te, TSE_HOOKS_BASE, 0);
-                                       int a= 0;
-                                       
-                                       tenla->name= "Hooks";
-                                       for(hook=ob->hooks.first; hook; hook= hook->next, a++) {
-                                               ten= outliner_add_element(soops, &tenla->subtree, hook->parent, tenla, TSE_HOOK, a);
-                                               if(ten) ten->name= hook->name;
+                               if(ob->modifiers.first) {
+                                       ModifierData *md;
+                                       TreeElement *temod = outliner_add_element(soops, &te->subtree, ob, te, TSE_MODIFIER_BASE, 0);
+                                       int index;
+
+                                       for (index=0,md=ob->modifiers.first; md; index++,md=md->next) {
+                                               ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+                                               TreeElement *te = outliner_add_element(soops, &temod->subtree, ob, temod, TSE_MODIFIER, index);
+                                               if(te) te->name= md->name;
+
+                                               if (md->type==eModifierType_Lattice) {
+                                                       outliner_add_element(soops, &te->subtree, ((LatticeModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
+                                               } else if (md->type==eModifierType_Curve) {
+                                                       outliner_add_element(soops, &te->subtree, ((CurveModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
+                                               } else if (md->type==eModifierType_Armature) {
+                                                       outliner_add_element(soops, &te->subtree, ((ArmatureModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
+                                               } else if (md->type==eModifierType_Hook) {
+                                                       outliner_add_element(soops, &te->subtree, ((HookModifierData*) md)->object, te, TSE_MODIFIER_OB, 0);
+                                               }
                                        }
                                }
                                if(ob->defbase.first) {
@@ -1298,6 +1308,14 @@ static int tree_element_active_ebone(TreeElement *te, TreeStoreElem *tselem, int
        return 0;
 }
 
+static int tree_element_active_modifier(TreeElement *te, TreeStoreElem *tselem, int set)
+{
+       if(set) {
+               extern_set_butspace(F9KEY);
+       }
+       
+       return 0;
+}
 
 static int tree_element_active_text(SpaceOops *soops, TreeElement *te, int set)
 {
@@ -1369,7 +1387,9 @@ static int tree_element_type_active(SpaceOops *soops, TreeElement *te, TreeStore
                        return tree_element_active_bone(te, tselem, set);
                case TSE_EBONE:
                        return tree_element_active_ebone(te, tselem, set);
-               case TSE_HOOK: // actually object
+               case TSE_MODIFIER:
+                       return tree_element_active_modifier(te, tselem, set);
+               case TSE_MODIFIER_OB:
                        if(set) tree_element_active_object(soops, te);
                        else if(tselem->id==(ID *)OBACT) return 1;
                        break;
@@ -1417,7 +1437,7 @@ static int do_outliner_mouse_event(SpaceOops *soops, TreeElement *te, short even
                        
                        /* activate a name button? */
                        if(G.qual & LR_CTRLKEY) {
-                               if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_HOOKS_BASE, TSE_SCRIPT_BASE)) 
+                               if(ELEM5(tselem->type, TSE_NLA, TSE_DEFGROUP_BASE, TSE_CONSTRAINT_BASE, TSE_MODIFIER_BASE, TSE_SCRIPT_BASE)) 
                                        error("Cannot edit builtin name");
                                else {
                                        tselem->flag |= TSE_TEXTBUT;
@@ -1903,9 +1923,9 @@ static void tselem_draw_icon(float x, float y, TreeStoreElem *tselem)
                                BIF_draw_icon(x, y, ICON_WPAINT_DEHLT); break;
                        case TSE_CONSTRAINT_BASE:
                                BIF_draw_icon(x, y, ICON_CONSTRAINT); break;
-                       case TSE_HOOKS_BASE:
+                       case TSE_MODIFIER_BASE:
                                BIF_draw_icon(x, y, ICON_HOOK); break;
-                       case TSE_HOOK:
+                       case TSE_MODIFIER_OB:
                                BIF_draw_icon(x, y, ICON_OBJECT); break;
                        case TSE_SCRIPT_BASE:
                                BIF_draw_icon(x, y, ICON_TEXT); break;
@@ -2326,15 +2346,14 @@ static void outliner_buttons(uiBlock *block, SpaceOops *soops, ListBase *lb)
                tselem= TREESTORE(te);
                if(tselem->flag & TSE_TEXTBUT) {
                        
-                       if(tselem->type==TSE_EBONE) {
-                               len= 32;
-                       }
-                       else len= 19;
+                       if(tselem->type==TSE_EBONE) len = sizeof(((EditBone*) 0)->name);
+                       else if (tselem->type==TSE_MODIFIER) len = sizeof(((ModifierData*) 0)->name);
+                       else len= sizeof(((ID*) 0)->name)-2;
                        
                        dx= BIF_GetStringWidth(G.font, te->name, 0);
                        if(dx<50) dx= 50;
                        
-                       bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "",  te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len, 0, 0, "");
+                       bt= uiDefBut(block, TEX, OL_NAMEBUTTON, "",  te->xs+2*OL_X-4, te->ys, dx+10, OL_H-1, te->name, 1.0, (float)len-1, 0, 0, "");
                        uiButSetFunc(bt, namebutton_cb, soops, NULL);
 
                        // signal for button to open