- switch to using softbody modifier, controls enabling but does not have
authorDaniel Dunbar <daniel@zuster.org>
Thu, 11 Aug 2005 02:23:52 +0000 (02:23 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Thu, 11 Aug 2005 02:23:52 +0000 (02:23 +0000)
   variables, these are still in same place. enable button automatically
   makes/enables modifier.
 - changed hook to hook modifier conversion to happen on direct link,
   required to make sure we don't forget to free any memory for files
   saved with 2.38 that have hooks.
 - update modifier interface to enforce modifiers with the require-original-
   data flag to not move beyond deforming modifiers.
 - enforce only one softbody modifier allowed

NOTE: Once again, no modifier stack for lattice yet means softbody for
lattice does not work atm.

12 files changed:
source/blender/blenkernel/BKE_modifier.h
source/blender/blenkernel/intern/deform.c
source/blender/blenkernel/intern/depsgraph.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/softbody.c
source/blender/blenloader/intern/readfile.c
source/blender/makesdna/DNA_object_force.h
source/blender/python/api2_2x/Object.c
source/blender/src/buttons_editing.c
source/blender/src/buttons_object.c
source/blender/src/editobject.c
source/blender/src/transform_conversions.c

index e2838622494d3b9980fdd9f74cce73b8668f205c..574f7b313b4dd82d762514329c5ed5a7d1236800 100644 (file)
@@ -34,7 +34,6 @@
 #define BKE_MODIFIER_H
 
 struct DerivedMesh;
-struct ModifierData;
 struct DagForest;
 struct DagNode;
 struct Object;
@@ -94,19 +93,19 @@ typedef struct ModifierTypeInfo {
                 * 
                 * This function is optional.
                 */
-       void (*initData)(struct ModifierData *md);
+       void (*initData)(ModifierData *md);
 
                /* Copy instance data for this modifier type. Should copy all user
                 * level settings to the target modifier.
                 */
-       void (*copyData)(struct ModifierData *md, struct ModifierData *target);
+       void (*copyData)(ModifierData *md, ModifierData *target);
 
                /* Free internal modifier data variables, this function should
                 * not free the _md_ variable itself.
                 *
                 * This function is optional.
                 */
-       void (*freeData)(struct ModifierData *md);
+       void (*freeData)(ModifierData *md);
 
                /* Return a boolean value indicating if this modifier is able to be calculated
                 * based on the modifier data. This is *not* regarding the md->flag, that is
@@ -115,20 +114,20 @@ typedef struct ModifierTypeInfo {
                 *
                 * This function is optional (assumes never disabled if not present).
                 */
-       int (*isDisabled)(struct ModifierData *md);
+       int (*isDisabled)(ModifierData *md);
 
                /* Add the appropriate relations to the DEP graph depending on the modifier
                 * data. 
                 *
                 * This function is optional.
                 */
-       void (*updateDepgraph)(struct ModifierData *md, struct DagForest *forest, struct Object *ob, struct DagNode *obNode);
+       void (*updateDepgraph)(ModifierData *md, struct DagForest *forest, struct Object *ob, struct DagNode *obNode);
 
                /* Should return true if the modifier needs to be recalculated on time changes.
                 *
                 * This function is optional (assumes false if not present).
                 */
-       int (*dependsOnTime)(struct ModifierData *md);
+       int (*dependsOnTime)(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
@@ -136,17 +135,17 @@ typedef struct ModifierTypeInfo {
                 *
                 * This function is optional.
                 */
-       void (*foreachObjectLink)(struct ModifierData *md, struct Object *ob, void (*walk)(void *userData, Object *ob, Object **obpoin), void *userData);
+       void (*foreachObjectLink)(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,
                 * and otherwise the _ob_ argument.
                 */
-       void (*deformVerts)(struct ModifierData *md, struct Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts);
+       void (*deformVerts)(ModifierData *md, struct Object *ob, void *derivedData, float (*vertexCos)[3], int numVerts);
 
                /* Like deformVerts but called during editmode (for supporting modifiers) */
-       void (*deformVertsEM)(struct ModifierData *md, struct Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts);
+       void (*deformVertsEM)(ModifierData *md, struct Object *ob, void *editData, void *derivedData, float (*vertexCos)[3], int numVerts);
 
                /* For non-deform types: apply the modifier and return a new derived
                 * data object (type is dependent on object type). If the _derivedData_
@@ -170,7 +169,7 @@ typedef struct ModifierTypeInfo {
                 * The modifier *MAY NOT* reuse or release the _derivedData_ argument
                 * if non-NULL. The modifier *MAY NOT* share the _vertexCos_ argument.
                 */
-       void *(*applyModifier)(struct ModifierData *md, struct Object *ob, void *derivedData, float (*vertexCos)[3], int useRenderParams, int isFinalCalc);
+       void *(*applyModifier)(ModifierData *md, struct Object *ob, void *derivedData, float (*vertexCos)[3], int useRenderParams, int isFinalCalc);
 
                /* Like applyModifier but called during editmode (for supporting modifiers).
                 * 
@@ -178,7 +177,7 @@ typedef struct ModifierTypeInfo {
                 * from editmode objects. The same qualifications regarding _derivedData_ and _vertexCos_
                 * apply as for applyModifier.
                 */
-       void *(*applyModifierEM)(struct ModifierData *md, struct Object *ob, void *editData, void *derivedData, float (*vertexCos)[3]);
+       void *(*applyModifierEM)(ModifierData *md, struct Object *ob, void *editData, void *derivedData, float (*vertexCos)[3]);
 } ModifierTypeInfo;
 
 ModifierTypeInfo*              modifierType_getInfo    (ModifierType type);
@@ -186,19 +185,21 @@ ModifierTypeInfo*         modifierType_getInfo    (ModifierType type);
        /* Modifier utility calls, do call through type pointer and return
         * default values if pointer is optional.
         */
-struct ModifierData*   modifier_new                    (int type);
-void                                   modifier_free                   (struct ModifierData *md);
-
-void                                   modifier_copyData               (struct ModifierData *md, struct ModifierData *target);
-int                                            modifier_dependsOnTime  (struct ModifierData *md);
-int                                            modifier_supportsMapping(struct ModifierData *md);
-int                                            modifier_couldBeCage    (struct ModifierData *md);
-void                                   modifier_setError               (struct ModifierData *md, char *format, ...);
-
-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);
+ModifierData*  modifier_new                            (int type);
+void                   modifier_free                           (ModifierData *md);
+
+void                   modifier_copyData                       (ModifierData *md, ModifierData *target);
+int                            modifier_dependsOnTime          (ModifierData *md);
+int                            modifier_supportsMapping        (ModifierData *md);
+int                            modifier_couldBeCage            (ModifierData *md);
+void                   modifier_setError                       (ModifierData *md, char *format, ...);
+
+void                   modifiers_foreachObjectLink     (struct Object *ob, void (*walk)(void *userData, struct Object *ob, struct Object **obpoin), void *userData);
+ModifierData*  modifiers_findByType            (struct Object *ob, ModifierType type);
+void                   modifiers_clearErrors           (struct Object *ob);
+int                            modifiers_getCageIndex          (struct Object *ob, int *lastPossibleCageIndex_r);
+
+int                            modifiers_isSoftbodyEnabled     (struct Object *ob);
 
 #endif
 
index a1f04eaa048e18fb685c0c03aaea4c307a89d7b8..e2cb842e16d8934f0e9d2f532717c304a4a858fb 100644 (file)
@@ -163,11 +163,6 @@ void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
 
        do_mesh_key(me);
 
-       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);
-       }
-
        if (ob->parent && me->totvert) {
                if(ob->parent->type==OB_CURVE && ob->partype==PARSKEL) {
                        if (!vertexCos) vertexCos = mesh_getVertexCos(me, NULL);
@@ -183,11 +178,6 @@ void mesh_modifier(Object *ob, float (**vertexCos_r)[3])
                }
        }
 
-       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);
-       }
-
        *vertexCos_r = vertexCos;
 }
 
@@ -229,31 +219,10 @@ int curve_modifier(Object *ob, char mode)
 
 int lattice_modifier(Object *ob, char mode)
 {
-       static BPoint *bpoint;
-       Lattice *lt= ob->data;
-       int done= 0;
-       
+       Lattice *lt = ob->data;
+
        do_latt_key(lt);
        
-       /* conditions if it's needed */
-       if(ob->parent && ob->partype==PARSKEL); 
-       else if((ob->softflag & OB_SB_ENABLE));
-       else return 0;
-       
-       if(mode=='s') { // "start"
-               /* copy  */
-               bpoint= MEM_dupallocN(lt->def);
-               
-               if((ob->softflag & OB_SB_ENABLE)) {
-                       sbObjectStep(ob, (float)G.scene->r.cfra, NULL);
-               }
-       }
-       else { // end
-               MEM_freeN(lt->def);
-               lt->def= bpoint;
-               bpoint= NULL;
-       }
-       
-       return done;
+       return 0;
 }
 
index 323c6793c7d1fa4292dda9f9822971a623dacd84..bf0bab5403f10941ccd84a25bbcc51dd58fc5075 100644 (file)
@@ -1426,7 +1426,7 @@ void DAG_scene_update_flags(Scene *sce, unsigned int lay)
                
                if(ob->action) ob->recalc |= OB_RECALC_DATA;
                else if(ob->nlastrips.first) ob->recalc |= OB_RECALC_DATA;
-               else if(ob->softflag & OB_SB_ENABLE) ob->recalc |= OB_RECALC_DATA;
+               else if(modifiers_isSoftbodyEnabled(ob)) ob->recalc |= OB_RECALC_DATA;
                else if(object_modifiers_use_time(ob)) ob->recalc |= OB_RECALC_DATA;
                else {
                        Mesh *me;
index 5e6be926caaf57c3650ad86552379c12753319af..f306986a8efda052965c5f7bf0f3261ca22af3d6 100644 (file)
@@ -12,6 +12,7 @@
 #include "DNA_meshdata_types.h"
 #include "DNA_modifier_types.h"
 #include "DNA_object_types.h"
+#include "DNA_object_force.h"
 #include "DNA_effect_types.h"
 #include "DNA_scene_types.h"
 #include "BLI_editVert.h"
@@ -26,6 +27,7 @@
 #include "BKE_subsurf.h"
 #include "BKE_object.h"
 #include "BKE_mesh.h"
+#include "BKE_softbody.h"
 #include "depsgraph_private.h"
 
 #include "LOD_DependKludge.h"
@@ -1138,10 +1140,10 @@ static void hookModifier_deformVerts(ModifierData *md, Object *ob, void *derived
        for (i=0; i<hmd->totindex; i++) {
                int index = hmd->indexar[i];
 
-                       /* These should always be true and I don't generally like 
+                       /* This should always be true and I don't generally like 
                         * "paranoid" style code like this, but old files can have
                         * indices that are out of range because old blender did
-                        * not correct them on exit editmode.
+                        * not correct them on exit editmode. - zr
                         */
                if (index<numVerts) {
                        float *co = vertexCos[index];
@@ -1174,14 +1176,7 @@ static void softbodyModifier_deformVerts(ModifierData *md, Object *ob, void *der
 {
        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);
+       sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
 }
 
 /***/
@@ -1299,9 +1294,8 @@ ModifierTypeInfo *modifierType_getInfo(ModifierType type)
 
                mti = INIT_TYPE(Softbody);
                mti->type = eModifierTypeType_OnlyDeform;
-               mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_SupportsEditmode;
+               mti->flags = eModifierTypeFlag_AcceptsCVs | eModifierTypeFlag_RequiresOriginalData;
                mti->deformVerts = softbodyModifier_deformVerts;
-               mti->deformVertsEM = softbodyModifier_deformVertsEM;
 
                typeArrInit = 0;
 #undef INIT_TYPE
@@ -1460,3 +1454,17 @@ int modifiers_getCageIndex(Object *ob, int *lastPossibleCageIndex_r)
 
        return cageIndex;
 }
+
+
+int modifiers_isSoftbodyEnabled(Object *ob)
+{
+       ModifierData *md = modifiers_findByType(ob, eModifierType_Softbody);
+
+               /* Softbody not allowed in this situation, enforce! */
+       if (md && ob->pd && ob->pd->deflect) {
+               md->mode &= ~(eModifierMode_Realtime|eModifierMode_Render|eModifierMode_Editmode);
+               md = NULL;
+       }
+
+       return (md && md->mode&(eModifierMode_Realtime|eModifierMode_Render));
+}
index b4da0f1097c66298930ee0182f89af481357f145..5e23e00bb19fa8d2a4cff7c41fad3141d2e323b5 100644 (file)
@@ -929,7 +929,7 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff)
 {
        BPoint *bp, *bpu;
        int u, v, w, dv, dw, uxt, vxt, wxt, bpc, bpuc;
-int debugspringcounter = 0;
+       int debugspringcounter = 0;
        bp= lt->def;
        bpc =0;
        
index a166b070d67f8901bf20417bba9fb1155642c937..cfecaa5e9f6f6790814625f6a0bd2a407ab59816 100644 (file)
@@ -2318,7 +2318,6 @@ static void direct_link_object(FileData *fd, Object *ob)
        bSensor *sens;
        bController *cont;
        bActuator *act;
-       ObHook *hook;
        int a;
        
        ob->disp.first=ob->disp.last= NULL;
@@ -2439,8 +2438,13 @@ static void direct_link_object(FileData *fd, Object *ob)
                act= act->next;
        }
 
+       direct_link_modifiers(fd, &ob->modifiers);
+
        link_list(fd, &ob->hooks);
-       for(hook= ob->hooks.first; hook; hook= hook->next) {
+       while (ob->hooks.first) {
+               ObHook *hook = ob->hooks.first;
+               HookModifierData *hmd = (HookModifierData*) modifier_new(eModifierType_Hook);
+
                hook->indexar= newdataadr(fd, hook->indexar);
                if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
                        int a;
@@ -2448,9 +2452,24 @@ static void direct_link_object(FileData *fd, Object *ob)
                                SWITCH_INT(hook->indexar[a]);
                        }
                }
-       }
 
-       direct_link_modifiers(fd, &ob->modifiers);
+                       /* Do conversion here because if we have loaded
+                        * a hook we need to make sure it gets converted
+                        * and free'd, regardless of version.
+                        */
+               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_addhead(&ob->modifiers, hmd);
+               BLI_remlink(&ob->hooks, hook);
+
+               MEM_freeN(hook);
+       }
        
        ob->bb= NULL;
        ob->derivedDeform= NULL;
@@ -4782,22 +4801,18 @@ 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);
+                       if (ob->softflag&OB_SB_ENABLE) {
+                               if (ob->softflag&OB_SB_POSTDEF) {
+                                       ModifierData *md = ob->modifiers.first;
+
+                                       while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
+                                               md = md->next;
+                                       }
+
+                                       BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(eModifierType_Softbody));
+                               } else {
+                                       BLI_addhead(&ob->modifiers, modifier_new(eModifierType_Softbody));
+                               }
                        }
 
                        // btw. armature_rebuild_pose is further only called on leave editmode
index 77ceb52788fa58f449609255817b91a398ad6213..334d4b44aa6533b10511bc43d47b46a2eb1e18d6 100644 (file)
@@ -1,6 +1,6 @@
 /**
  *
- * $Id:  
+ * $Id$
  *
  * ***** BEGIN GPL/BL DUAL LICENSE BLOCK *****
  *
index f79faac690ca60021606070a7c77d9ab5727cdd8..9cec69b2d1cfcb8462bc5345004a200e563f355a 100644 (file)
@@ -259,10 +259,6 @@ static PyObject *Object_getSBInnerSpringFriction( BPy_Object * self );
 static PyObject *Object_setSBInnerSpringFriction( BPy_Object * self, PyObject * args );
 static PyObject *Object_getSBDefaultGoal( BPy_Object * self );
 static PyObject *Object_setSBDefaultGoal( BPy_Object * self, PyObject * args );
-static PyObject *Object_getSBEnable( BPy_Object * self );
-static PyObject *Object_setSBEnable( BPy_Object * self, PyObject * args );
-static PyObject *Object_getSBPostDef( BPy_Object * self );
-static PyObject *Object_setSBPostDef( BPy_Object * self, PyObject * args );
 static PyObject *Object_getSBUseGoal( BPy_Object * self );
 static PyObject *Object_setSBUseGoal( BPy_Object * self, PyObject * args );
 static PyObject *Object_getSBUseEdges( BPy_Object * self );
@@ -422,14 +418,6 @@ automatic when the script finishes."},
         "Returns SB DefaultGoal"},
        {"setSBDefaultGoal", ( PyCFunction ) Object_setSBDefaultGoal, METH_VARARGS,
         "Sets SB DefaultGoal"},                 
-       {"getSBEnable", ( PyCFunction ) Object_getSBEnable, METH_NOARGS,
-        "Returns SB Enable"},
-       {"setSBEnable", ( PyCFunction ) Object_setSBEnable, METH_VARARGS,
-        "Sets SB Enable"},              
-       {"getSBPostDef", ( PyCFunction ) Object_getSBPostDef, METH_NOARGS,
-        "Returns SB PostDef"},
-       {"setSBPostDef", ( PyCFunction ) Object_setSBPostDef, METH_VARARGS,
-        "Sets SB PostDef"}, 
        {"getSBUseGoal", ( PyCFunction ) Object_getSBUseGoal, METH_NOARGS,
         "Returns SB UseGoal"},
        {"setSBUseGoal", ( PyCFunction ) Object_setSBUseGoal, METH_VARARGS,
@@ -3924,97 +3912,6 @@ PyObject *Object_setSBDefaultGoal( BPy_Object * self, PyObject * args )
        return EXPP_incr_ret( Py_None );
 }
 
-PyObject *Object_getSBEnable( BPy_Object * self )
-{
-    /*short flag =  self->object->softflag;*/
-    PyObject *attr = NULL;
-    
-    if(!self->object->soft){
-       if(!setupSB(self->object))
-          return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "softbody could not be accessed (null pointer)" ) );    
-    }    
-    
-    
-    if(self->object->softflag & OB_SB_ENABLE){
-           attr = PyInt_FromLong(1);
-    }
-    else{  attr = PyInt_FromLong(0);  }
-        
-       if( attr )
-               return attr;
-
-       return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "couldn't get Object->softflag attribute" ) );
-}
-
-PyObject *Object_setSBEnable( BPy_Object * self, PyObject * args )
-{
-    short value;
-    
-    if(!self->object->soft){
-       if(!setupSB(self->object))
-          return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "softbody could not be accessed (null pointer)" ) );    
-    }       
-    
-       if( !PyArg_ParseTuple( args, "h", &value ) )
-               return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
-                       "expected integer argument" ) );
-               
-    if(value > 0){ 
-        self->object->softflag |= OB_SB_ENABLE; 
-    }
-    else{     
-        self->object->softflag &= ~OB_SB_ENABLE; 
-    } 
-
-       return EXPP_incr_ret( Py_None );
-}
-
-PyObject *Object_getSBPostDef( BPy_Object * self )
-{
-    /*short flag =  self->object->softflag;*/
-    PyObject *attr = NULL;
-
-    if(!self->object->soft){
-       if(!setupSB(self->object))
-          return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "softbody could not be accessed (null pointer)" ) );    
-    }   
-    
-    if(self->object->softflag & OB_SB_POSTDEF){
-           attr = PyInt_FromLong(1);
-    }
-    else{  attr = PyInt_FromLong(0);  }
-        
-       if( attr )
-               return attr;
-
-       return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "couldn't get Object->softflag attribute" ) );
-}
-
-PyObject *Object_setSBPostDef( BPy_Object * self, PyObject * args )
-{
-    short value;
-    
-    if(!self->object->soft){
-       if(!setupSB(self->object))
-          return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
-                                       "softbody could not be accessed (null pointer)" ) );    
-    }       
-    
-    
-       if( !PyArg_ParseTuple( args, "h", &value ) )
-               return ( EXPP_ReturnPyObjError( PyExc_AttributeError,
-                       "expected integer argument" ) );
-                       
-    if(value){ self->object->softflag |= OB_SB_POSTDEF; }
-    else{ self->object->softflag &= ~OB_SB_POSTDEF; } 
-
-       return EXPP_incr_ret( Py_None );
-}
 PyObject *Object_getSBUseGoal( BPy_Object * self )
 {
     /*short flag =  self->object->softflag;*/
index 354f204087fd6a8b9650f5405f148c4f74caa8db..63303defd446b2dbf98416a400f595e24492fdb4 100644 (file)
@@ -526,8 +526,19 @@ void do_modifier_panels(unsigned short event)
 static void modifiers_add(void *ob_v, int type)
 {
        Object *ob = ob_v;
+       ModifierTypeInfo *mti = modifierType_getInfo(type);
+       
+       if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
+               ModifierData *md = ob->modifiers.first;
+
+               while (md && modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
+                       md = md->next;
+               }
 
-       BLI_addtail(&ob->modifiers, modifier_new(type));
+               BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
+       } else {
+               BLI_addtail(&ob->modifiers, modifier_new(type));
+       }
 }
 
 static uiBlock *modifiers_add_menu(void *ob_v)
@@ -542,6 +553,9 @@ static uiBlock *modifiers_add_menu(void *ob_v)
        for (i=eModifierType_None+1; i<NUM_MODIFIER_TYPES; i++) {
                ModifierTypeInfo *mti = modifierType_getInfo(i);
 
+               if (i==eModifierType_Softbody && modifiers_findByType(ob, eModifierType_Softbody))
+                       continue;
+                       
                if (    (mti->flags&eModifierTypeFlag_AcceptsCVs) || 
                                (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
                        uiDefBut(block, BUTM, B_MODIFIER_RECALC, mti->name,             0, yco-=20, 160, 19, NULL, 0, 0, 1, i, "");
@@ -581,6 +595,17 @@ static void modifiers_moveUp(void *ob_v, void *md_v)
        ModifierData *md = md_v;
 
        if (md->prev) {
+               ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+               if (mti->type!=eModifierTypeType_OnlyDeform) {
+                       ModifierTypeInfo *nmti = modifierType_getInfo(md->prev->type);
+
+                       if (nmti->flags&eModifierTypeFlag_RequiresOriginalData) {
+                               error("Cannot move above a modifier requiring original data.");
+                               return;
+                       }
+               }
+
                BLI_remlink(&ob->modifiers, md);
                BLI_insertlink(&ob->modifiers, md->prev->prev, md);
        }
@@ -782,10 +807,14 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
        BIF_ThemeColor(color);
        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)");
+
+               /* Softbody not allowed in this situation, enforce! */
+       if (md->type!=eModifierType_Softbody || !(ob->pd && ob->pd->deflect)) {
+               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);
 
@@ -856,7 +885,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                } else if (md->type==eModifierType_Hook) {
                        height = 86;
                } else if (md->type==eModifierType_Softbody) {
-                       height = 46;
+                       height = 26;
                }
 
                BIF_ThemeColor(color);
@@ -866,8 +895,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                uiBlockBeginAlign(block);
                but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Apply",  lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Apply the current modifier and remove from the stack");
                uiButSetFunc(but, modifiers_applyModifier, ob, md);
-               but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Copy",   lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Duplicate the current modifier at the same position in the stack");
-               uiButSetFunc(but, modifiers_copyModifier, ob, md);
+               if (md->type!=eModifierType_Softbody) {
+                       but = uiDefBut(block, BUT, B_MODIFIER_RECALC, "Copy",   lx,(cy-=19),60,19, 0, 0, 0, 0, 0, "Duplicate the current modifier at the same position in the stack");
+                       uiButSetFunc(but, modifiers_copyModifier, ob, md);
+               }
                uiBlockEndAlign(block);
 
 //             uiDefButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, "Render", lx,(cy-=19),60,19,&md->mode, 0, 0, 1, 0, "Enable modifier during rendering");
index 9ce1ecb099fd250c2106b31f5ad0172d96775819..5fbd80e60276d8ba2cb0b1c10d73cb3448dbf99d 100644 (file)
@@ -1417,13 +1417,12 @@ static void object_panel_deflectors(Object *ob)
                uiDefButF(block, NUM, REDRAWVIEW3D, "MaxDist: ",        10,40,140,20, &pd->maxdist, 0, 1000.0, 100, 0, "Maximum distance for the field to work");
                uiBlockEndAlign(block);
 
-               if(ob->softflag & OB_SB_ENABLE) {
+               if(modifiers_isSoftbodyEnabled(ob)) {
                        uiDefBut(block, LABEL, 0, "Object is Softbody,",                160,160,150,20, NULL, 0.0, 0, 0, 0, "");
                        uiDefBut(block, LABEL, 0, "no Deflection possible",             160,140,150,20, NULL, 0.0, 0, 0, 0, "");
                        pd->deflect= 0;
                }
                else {
-                       
                        uiDefBut(block, LABEL, 0, "Deflection", 160,180,140,20, NULL, 0.0, 0, 0, 0, "");
                        
                        /* only meshes collide now */
@@ -1452,6 +1451,20 @@ static void object_panel_deflectors(Object *ob)
 
 
 /* Panel for softbodies */
+static void object_softbodies__enable(void *ob_v, void *arg2)
+{
+       Object *ob = ob_v;
+       ModifierData *md = modifiers_findByType(ob, eModifierType_Softbody);
+
+       if (!md) {
+               md = modifier_new(eModifierType_Softbody);
+               BLI_addhead(&ob->modifiers, md);
+       }
+
+       md->mode |= eModifierMode_Render|eModifierMode_Realtime;
+
+       allqueue(REDRAWBUTSEDIT, 0);
+}
 
 static void object_softbodies(Object *ob)
 {
@@ -1462,22 +1475,18 @@ static void object_softbodies(Object *ob)
        if(uiNewPanel(curarea, block, "Softbody", "Object", 640, 0, 318, 204)==0) return;
 
        /* do not allow to combine with force fields */
-       if(ob->pd) {
-               PartDeflect *pd= ob->pd;
-               
-               if(pd->deflect) {
-                       uiDefBut(block, LABEL, 0, "Object has Deflection,",             10,160,300,20, NULL, 0.0, 0, 0, 0, "");
-                       uiDefBut(block, LABEL, 0, "no Softbody possible",               10,140,300,20, NULL, 0.0, 0, 0, 0, "");
-                       ob->softflag &= ~OB_SB_ENABLE;
-                       
-                       return;
+       if(ob->pd && ob->pd->deflect) {
+               uiDefBut(block, LABEL, 0, "Object has Deflection,",             10,160,300,20, NULL, 0.0, 0, 0, 0, "");
+               uiDefBut(block, LABEL, 0, "no Softbody possible",               10,140,300,20, NULL, 0.0, 0, 0, 0, "");
+       } else {
+               if (!modifiers_isSoftbodyEnabled(ob)) {
+                       uiBut *but = uiDefButS(block, BUT, REDRAWBUTSOBJECT, "Enable Soft Body",        10,200,150,20, &ob->softflag, 0, 0, 0, 0, "Sets object to become soft body");
+                       uiButSetFunc(but, object_softbodies__enable, ob, NULL);
+                       uiDefBut(block, LABEL, 0, "",   160, 200,150,20, NULL, 0.0, 0.0, 0, 0, "");     // alignment reason
                }
        }
        
-       uiDefButBitS(block, TOG, OB_SB_ENABLE, REDRAWBUTSOBJECT, "Enable Soft Body",    10,200,150,20, &ob->softflag, 0, 0, 0, 0, "Sets object to become soft body");
-       uiDefBut(block, LABEL, 0, "",   160, 200,150,20, NULL, 0.0, 0.0, 0, 0, "");     // alignment reason
-       
-       if(ob->softflag & OB_SB_ENABLE) {
+       if(modifiers_isSoftbodyEnabled(ob)) {
                SoftBody *sb= ob->soft;
                int defCount;
                char *menustr;
@@ -1522,7 +1531,6 @@ static void object_softbodies(Object *ob)
                        uiDefButF(block, NUM, B_DIFF, "Grav:",                  10,150,150,20, &sb->grav , 0.0, 10.0, 10, 0, "Apply gravitation to point movement");
                        uiDefButF(block, NUM, B_DIFF, "Speed:",                 160,150,150,20, &sb->physics_speed , 0.01, 100.0, 10, 0, "Tweak timing for physics to control frequency and speed");
                        uiDefButF(block, NUM, B_DIFF, "Error Limit:",   10,130,150,20, &sb->rklimit , 0.01, 1.0, 10, 0, "The Runge-Kutta ODE solver error limit, low value gives more precision");
-                       uiDefButBitS(block, TOG, OB_SB_POSTDEF, B_DIFF, "Apply Deform First",   160,130,150,20, &ob->softflag, 0, 0, 0, 0, "Softbody is calculated AFTER Deformation");
                        uiBlockEndAlign(block);
                        
                        /* GOAL STUFF */
index 82851ee82d2baf6554e786306cf5766c7bcb9bf7..687e0f09f66524460e27cabd3e08f40c5e9c6bc4 100644 (file)
@@ -1511,7 +1511,7 @@ void exit_editmode(int freedata)  /* freedata==0 at render, 1= freedata, 2= do un
        if(freedata) G.obedit= NULL;
 
        /* total remake of softbody data */
-       if(ob->softflag & OB_SB_ENABLE) {
+       if(modifiers_isSoftbodyEnabled(ob)) {
                SoftBody *sb= ob->soft;
                
                if(sb->keys) {
@@ -2473,7 +2473,7 @@ 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 (ELEM(i, eModifierType_Hook, eModifierType_Softbody)) continue;
 
                if (    (mti->flags&eModifierTypeFlag_AcceptsCVs) || 
                                (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
@@ -2774,6 +2774,10 @@ void copy_attr(short event)
                                        if(base->object->soft) sbFree(base->object->soft);
                                        
                                        base->object->soft= copy_softbody(ob->soft);
+
+                                       if (!modifiers_findByType(base->object, eModifierType_Softbody)) {
+                                               BLI_addhead(&base->object->modifiers, modifier_new(eModifierType_Softbody));
+                                       }
                                }
                        }
                }
index 3926783c4e38d9d8d14ea5722220b025ecf8c236..93479e45be301177c7f1d15586c086f9371d3525 100755 (executable)
@@ -55,6 +55,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_scene_types.h"
 #include "BKE_ipo.h"
 #include "BKE_lattice.h"
 #include "BKE_mball.h"
+#include "BKE_modifier.h"
 #include "BKE_object.h"
 #include "BKE_softbody.h"
 #include "BKE_utildefines.h"
 
-
 #include "BIF_editaction.h"
 #include "BIF_editview.h"
 #include "BIF_editlattice.h"
@@ -1411,8 +1412,8 @@ void special_aftertrans_update(short cancelled)
                        if(base->flag & BA_DO_IPO) redrawipo= 1;
                        
                        ob= base->object;
-                       /* reset soft body object */
-                       if(ob->softflag & OB_SB_ENABLE) sbObjectReset(ob, NULL);
+
+                       if(modifiers_isSoftbodyEnabled(ob)) sbObjectReset(ob, NULL);
                        
                        /* Set autokey if necessary */
                        if ((G.flags & G_RECORDKEYS) && (!cancelled) && (base->flag & SELECT)){