- added ModifierData flag, is modifier enabled in editmode
authorDaniel Dunbar <daniel@zuster.org>
Sat, 23 Jul 2005 19:15:08 +0000 (19:15 +0000)
committerDaniel Dunbar <daniel@zuster.org>
Sat, 23 Jul 2005 19:15:08 +0000 (19:15 +0000)
 - added modifier type flag: should modifier be enabled by default for
   active in editmode
 - added subsurf "debug incremental" option instead of G.rt==52 (it becomes
   a slightly useful feature now for debugging how well a modifier works
   with incremental subsurf... maybe important for future python modifier
   developers)
 - shuffled modifier button layout just to keep people guessing
 - switched back to drawing editmesh face centers not through derivedmesh,
   I didn't think this one through, forgot that centers were also used for
   selection. have to think about what to do about this, should be either
   (a) don't draw centers with a cage active (optimal mode) or (b) come up
   with api to draw centers through derivedmesh and also handle selection.
 - changed recalc_editnormals to also follow the len(no)==0.0 use vertex
   co convention

source/blender/blenkernel/BKE_modifier.h
source/blender/blenkernel/intern/DerivedMesh.c
source/blender/blenkernel/intern/modifier.c
source/blender/blenkernel/intern/subsurf_ccg.c
source/blender/include/butspace.h
source/blender/makesdna/DNA_modifier_types.h
source/blender/src/buttons_object.c
source/blender/src/drawobject.c
source/blender/src/editmesh_lib.c

index e079b2f2e3096b3552d606bbb782f3dd41ab7232..e407c04159c825bd4b53a83f31fd4d8f0f94deba 100644 (file)
@@ -59,6 +59,14 @@ 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.
+                */
+       eModifierTypeFlag_EnableInEditmode = (1<<4),
 } ModifierTypeFlag;
 
 typedef struct ModifierTypeInfo {
index 89b6f1458a47c4f237e048b9d5d98592b31522fa..ce3573366ba1286ca483ce44df6ba5aae4006351 100644 (file)
@@ -34,6 +34,8 @@
 #include <config.h>
 #endif
 
+#include "PIL_time.h"
+
 #include "MEM_guardedalloc.h"
 
 #include "DNA_effect_types.h"
@@ -1234,6 +1236,7 @@ typedef float vec3f[3];
 
 static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedMesh **deform_r, DerivedMesh **final_r, int useRenderParams, int useDeform)
 {
+//     double startTime = PIL_check_seconds_timer();
        Mesh *me = ob->data;
        ModifierData *md= ob->modifiers.first;
        float (*deformedVerts)[3];
@@ -1351,6 +1354,8 @@ static void mesh_calc_modifiers(Object *ob, float (*inputVertexCos)[3], DerivedM
        if (deformedVerts && deformedVerts!=inputVertexCos) {
                MEM_freeN(deformedVerts);
        }
+
+//     printf("mesh_calc_modifiers(%p, %p, %p, %p, %d) : %6.3fs\n", ob, inputVertexCos, deform_r, final_r, useRenderParams, PIL_check_seconds_timer()-startTime);
 }
 
 static vec3f *editmesh_getVertexCos(EditMesh *em, int *numVerts_r)
@@ -1387,7 +1392,7 @@ static void editmesh_calc_modifiers(DerivedMesh **cage_r, DerivedMesh **final_r)
        for (; md; md=md->next) {
                ModifierTypeInfo *mti = modifierType_get_info(md->type);
 
-               if (!(md->mode&1)) continue;
+               if (!(md->mode&eModifierMode_Editmode)) continue;
                if (mti->isDisabled && mti->isDisabled(md)) continue;
                if (!(mti->flags&eModifierTypeFlag_SupportsEditmode)) continue;
 
index 1730c339651c2bd8d38662aebf7a820b36e03e0a..27289c2fc4c623fc5c8b555459cd8b8eb953c58d 100644 (file)
@@ -754,7 +754,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
 
                mti = INIT_TYPE(Subsurf);
                mti->type = eModifierTypeType_Constructive;
-               mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_SupportsEditmode;
+               mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsMapping | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode;
                mti->initData = subsurfModifier_initData;
                mti->freeData = subsurfModifier_freeData;
                mti->applyModifier = subsurfModifier_applyModifier;
@@ -769,7 +769,7 @@ ModifierTypeInfo *modifierType_get_info(ModifierType type)
 
                mti = INIT_TYPE(Mirror);
                mti->type = eModifierTypeType_Constructive;
-               mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode;
+               mti->flags = eModifierTypeFlag_AcceptsMesh | eModifierTypeFlag_SupportsEditmode | eModifierTypeFlag_EnableInEditmode;
                mti->initData = mirrorModifier_initData;
                mti->applyModifier = mirrorModifier_applyModifier;
                mti->applyModifierEM = mirrorModifier_applyModifierEM;
@@ -791,7 +791,10 @@ ModifierData *modifier_new(int type)
        ModifierData *md = MEM_callocN(mti->structSize, mti->structName);
 
        md->type = type;
-       md->mode = eModifierMode_RealtimeAndRender;
+       md->mode = eModifierMode_Realtime|eModifierMode_Render;
+
+       if (mti->flags&eModifierTypeFlag_EnableInEditmode)
+               md->mode |= eModifierMode_Editmode;
 
        if (mti->initData) mti->initData(md);
 
index adc2d90bb24ddb5d0c8e82f1c053e9226ac7a71e..ca2690a51774866811f1adfc43eff519043dc2c7 100644 (file)
@@ -92,6 +92,7 @@ static CCGSubSurf *_getSubSurf(CCGSubSurf *prevSS, int subdivLevels, int useAgin
        if (prevSS) {
                int oldUseAging;
 
+               useAging = !!useAging;
                ccgSubSurf_getUseAgeCounts(prevSS, &oldUseAging, NULL, NULL, NULL);
 
                if (oldUseAging!=useAging) {
@@ -1291,8 +1292,9 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss, int fromEditmesh, Mesh
 
 DerivedMesh *subsurf_make_derived_from_editmesh(EditMesh *em, SubsurfModifierData *smd, float (*vertCos)[3]) {
        int useSimple = smd->subdivType==ME_SIMPLE_SUBSURF;
-       
-       smd->emCache = _getSubSurf(smd->emCache, smd->levels, G.rt==52, 0, 0, useSimple);
+       int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
+
+       smd->emCache = _getSubSurf(smd->emCache, smd->levels, useAging, 0, 0, useSimple);
        ss_sync_from_editmesh(smd->emCache, em, vertCos, useSimple);
 
        return (DerivedMesh*) getCCGDerivedMesh(smd->emCache, 1, NULL, NULL);
@@ -1316,7 +1318,8 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf
                return derivedmesh_from_displistmesh(ndlm);
        } else {
                int useEdgeCreation = !(dlm?dlm->medge:me->medge);
-               int useIncremental = smd->useIncrementalMesh && !useEdgeCreation;
+               int useIncremental = (smd->flags&eSubsurfModifierFlag_Incremental) && !useEdgeCreation;
+               int useAging = smd->flags&eSubsurfModifierFlag_DebugIncr;
                CCGSubSurf *ss;
                
                        /* It is quite possible there is a much better place to do this. It
@@ -1333,7 +1336,7 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf
                }
 
                if (useIncremental && isFinalCalc) {
-                       smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels, G.rt==52, 0, 0, useSimple);
+                       smd->mCache = ss = _getSubSurf(smd->mCache, smd->levels, useAging, 0, 0, useSimple);
 
                        ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
 
@@ -1344,7 +1347,7 @@ DerivedMesh *subsurf_make_derived_from_mesh(Mesh *me, DispListMesh *dlm, Subsurf
                                smd->mCache = NULL;
                        }
 
-                       ss = _getSubSurf(NULL, smd->levels, G.rt==52, 1, useEdgeCreation, useSimple);
+                       ss = _getSubSurf(NULL, smd->levels, 0, 1, useEdgeCreation, useSimple);
                        ss_sync_from_mesh(ss, me, dlm, vertCos, useSimple);
                        ndlm = ss_to_displistmesh(ss, 0, me, dlm);
 
index 6d626a5d6a885745a8ab3cbd01737311a76261c1..238d2ac712ab52df158798ab88da4a6dc9d4750e 100644 (file)
@@ -603,7 +603,7 @@ enum {
 
 #define B_MDFR_BUTS                    3600
 
-#define B_MDFR_INCREMENTAl     3501
+#define B_MDFR_INCREMENTAL     3501
 
 /* *********************** */
 
index 8efad895e479a5722adbe2cd19381f7be5ec7790..c4c5227fa7382f14d770c68a74c8825e0148e681 100644 (file)
@@ -22,9 +22,9 @@ typedef enum ModifierType {
         */
 typedef enum ModifierMode {
        eModifierMode_Disabled = 0,
-       eModifierMode_OnlyRealtime = 1,
-       eModifierMode_OnlyRender = 2,
-       eModifierMode_RealtimeAndRender = 3,
+       eModifierMode_Realtime = (1<<0),
+       eModifierMode_Render = (1<<1),
+       eModifierMode_Editmode = (1<<2),
 } ModifierMode;
 
 typedef struct ModifierData {
@@ -33,10 +33,14 @@ typedef struct ModifierData {
        int type, mode;
 } ModifierData;
 
+typedef enum {
+       eSubsurfModifierFlag_Incremental = (1<<0),
+       eSubsurfModifierFlag_DebugIncr = (1<<1)
+} SubsurfModifierFlag;
 typedef struct SubsurfModifierData {
        ModifierData modifier;
 
-       short subdivType, levels, renderLevels, useIncrementalMesh;
+       short subdivType, levels, renderLevels, flags;
 
        void *emCache, *mCache;
 } SubsurfModifierData;
index e3f9a57ffc2fed8df92423fcb986daabea1eb7c5..a73d333a79742587b947301a194e889418ba3775 100644 (file)
@@ -1665,9 +1665,11 @@ void do_modifier_panels(unsigned short event)
                md = md->next;
 
        switch(event) {
-       case B_MDFR_INCREMENTAl:
-               if (md && md->type==eModifierType_Subsurf && ((SubsurfModifierData*)md)->useIncrementalMesh) {
-                       if (ob->type==OB_MESH) {
+       case B_MDFR_INCREMENTAL:
+               if (md && md->type==eModifierType_Subsurf) {
+                       SubsurfModifierData *smd = (SubsurfModifierData*) md;
+                       
+                       if ((smd->flags&eSubsurfModifierFlag_Incremental) && ob->type==OB_MESH) {
                                Mesh *me = ob->data;
 
                                if (!me->medge) {
@@ -1805,64 +1807,66 @@ static void object_panel_modifiers(Object *ob)
        uiBut *but;
        
        block= uiNewBlock(&curarea->uiblocks, "modifiers_panel", UI_EMBOSS, UI_HELV, curarea->win);
-       uiNewPanelTabbed("Constraints", "Object");
        if(uiNewPanel(curarea, block, "Modifiers", "Object", 640, 0, 318, 204)==0) return;
 
        uiBlockBeginAlign(block);
-       uiDefBlockBut(block, modifier_add_menu, ob, "Add Modifier", 550,400,124,27, "Append a new modifier");
-       but = uiDefBut(block, BUT, B_MAKEDISP, "Delete", 676,400,62,27, 0, 0, 0, 0, 0, "Delete the current modifier");
+       uiDefBlockBut(block, modifier_add_menu, ob, "Add Modifier", 740,400,110,19, "Append a new modifier");
+       but = uiDefBut(block, BUT, B_MAKEDISP, "Delete", 850,400,70,19, 0, 0, 0, 0, 0, "Delete the current modifier");
        uiButSetFunc(but, modifiers_del, ob, NULL);
-       uiBlockEndAlign(block);
 
        if (ob->modifiers.first) {
                int i, numModifiers = BLI_countlist(&ob->modifiers);
                ModifierData *md;
 
                CLAMP(actModifier, 1, numModifiers);
-               uiDefButI(block, NUM, B_REDR, "Modifier", 760,400,160,27, &actModifier, 1, numModifiers, 0, 0, "Index of current modifier");
+               uiDefButI(block, NUM, B_REDR, "Modifier", 740,380,180,27, &actModifier, 1, numModifiers, 0, 0, "Index of current modifier");
 
                for (i=0, md=ob->modifiers.first; md && i<actModifier-1; i++)
                        md = md->next;
 
                if (md) {
-                       static char *modifier_mode_menu ="Modifier Mode%t|Disabled%x0|Only Realtime%x1|Only Render%x2|Realtime & Render%x3";
                        ModifierTypeInfo *mti = modifierType_get_info(md->type);
                        char str[128];
 
-                       but = uiDefBut(block, BUT, B_MAKEDISP, "Move Up", 760, 380, 80, 19, 0, 0, 0, 0, 0, "Move modifier up in stack");
+                       but = uiDefBut(block, BUT, B_MAKEDISP, "Move Up", 740, 360, 90, 19, 0, 0, 0, 0, 0, "Move modifier up in stack");
                        uiButSetFunc(but, modifiers_moveUp, ob, md);
-                       but = uiDefBut(block, BUT, B_MAKEDISP, "Move Down", 840, 380, 80, 19, 0, 0, 0, 0, 0, "Move modifier down in stack");
+                       but = uiDefBut(block, BUT, B_MAKEDISP, "Move Down", 830, 360, 90, 19, 0, 0, 0, 0, 0, "Move modifier down in stack");
                        uiButSetFunc(but, modifiers_moveDown, ob, md);
+                       uiDefButBitI(block, TOG, eModifierMode_Render, B_NOP, "Render", 740,340,60,19,&md->mode, 0, 0, 1, 0, "");
+                       uiDefButBitI(block, TOG, eModifierMode_Realtime, B_MAKEDISP, "Realtime", 810,340,60,19,&md->mode, 0, 0, 1, 0, "");
+                       if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
+                               uiDefButBitI(block, TOG, eModifierMode_Editmode, B_MAKEDISP, "Editmode", 860,340,60,19,&md->mode, 0, 0, 1, 0, "");
+                       }
 
-                       sprintf(str, "Modifier: %s", mti->name);
-                       uiDefBut(block, LABEL, 1, str,  550, 360, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
-                       but = uiDefButI(block, MENU, B_MAKEDISP, modifier_mode_menu, 550, 340, 160,19, &md->mode, 0, 0, 0, 0, "Modifier calculation mode");
                        uiBlockBeginAlign(block);
+                       sprintf(str, "Modifier: %s", mti->name);
+                       uiDefBut(block, LABEL, 1, str,  550, 400, 150, 20, NULL, 0.0, 0.0, 0, 0, "");
                        if (md->type==eModifierType_Subsurf) {
                                SubsurfModifierData *smd = (SubsurfModifierData*) md;
                                char subsurfmenu[]="Subsurf Type%t|Catmull-Clark%x0|Simple Subdiv.%x1";
-                               uiDefButS(block, NUM, B_MAKEDISP, "Levels:",            550, 320, 150,19, &smd->levels, 1, 6, 0, 0, "Number subdivisions to perform");
-                               uiDefButS(block, NUM, B_MAKEDISP, "Render Levels:",             550, 300, 150,19, &smd->renderLevels, 1, 6, 0, 0, "Number subdivisions to perform when rendering");
-                               uiDefButS(block, MENU, B_MAKEDISP, subsurfmenu,         550,280,150,19, &smd->subdivType, 0, 0, 0, 0, "Selects type of subdivision algorithm.");
-                               uiDefButS(block, TOG, B_MDFR_INCREMENTAl, "Incremental", 550, 260,150,19,&smd->useIncrementalMesh, 0, 0, 1, 0, "Use incremental calculation, even outside of mesh mode");
+                               uiDefButS(block, NUM, B_MAKEDISP, "Levels:",            550, 380, 160,19, &smd->levels, 1, 6, 0, 0, "Number subdivisions to perform");
+                               uiDefButS(block, NUM, B_MAKEDISP, "Render Levels:",             550, 360, 160,19, &smd->renderLevels, 1, 6, 0, 0, "Number subdivisions to perform when rendering");
+                               uiDefButS(block, MENU, B_MAKEDISP, subsurfmenu,         550,340,160,19, &smd->subdivType, 0, 0, 0, 0, "Selects type of subdivision algorithm.");
+                               uiDefButBitS(block, TOG, eSubsurfModifierFlag_Incremental, B_MDFR_INCREMENTAL, "Incremental", 550, 320,160,19,&smd->flags, 0, 0, 0, 0, "Use incremental calculation, even outside of mesh mode");
+                               uiDefButBitS(block, TOG, eSubsurfModifierFlag_DebugIncr, B_MAKEDISP, "Debug Incr.", 550, 300,160,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:",              550, 320, 120,19, &lmd->object, "Lattice object to deform with");
+                               uiDefIDPoinBut(block, modifier_testLatticeObj, B_CHANGEDEP, "Ob:",              550, 380, 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:",                550, 320, 120,19, &cmd->object, "Curve object to deform with");
+                               uiDefIDPoinBut(block, modifier_testCurveObj, B_CHANGEDEP, "Ob:",                550, 380, 120,19, &cmd->object, "Curve object to deform with");
                        } else if (md->type==eModifierType_Build) {
                                BuildModifierData *bmd = (BuildModifierData*) md;
-                               uiDefButF(block, NUM, B_MAKEDISP, "Start:", 550, 320, 150,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect");
-                               uiDefButF(block, NUM, B_MAKEDISP, "Length:", 550, 300, 150,19, &bmd->length, 1.0, 9000.0, 100, 0, "Specify the total time the build effect requires");
-                               uiDefButI(block, TOG, B_MAKEDISP, "Randomize", 550, 280, 150,19, &bmd->randomize, 0, 0, 1, 0, "Randomize the faces or edges during build.");
-                               uiDefButI(block, NUM, B_MAKEDISP, "Seed:", 700, 280, 150,19, &bmd->seed, 1.0, 9000.0, 100, 0, "Specify the seed for random if used.");
+                               uiDefButF(block, NUM, B_MAKEDISP, "Start:", 550, 380, 150,19, &bmd->start, 1.0, 9000.0, 100, 0, "Specify the start frame of the effect");
+                               uiDefButF(block, NUM, B_MAKEDISP, "Length:", 550, 360, 150,19, &bmd->length, 1.0, 9000.0, 100, 0, "Specify the total time the build effect requires");
+                               uiDefButI(block, TOG, B_MAKEDISP, "Randomize", 550, 340, 150,19, &bmd->randomize, 0, 0, 1, 0, "Randomize the faces or edges during build.");
+                               uiDefButI(block, NUM, B_MAKEDISP, "Seed:", 550, 320, 150,19, &bmd->seed, 1.0, 9000.0, 100, 0, "Specify the seed for random if used.");
                        } else if (md->type==eModifierType_Mirror) {
                                MirrorModifierData *mmd = (MirrorModifierData*) md;
-                               uiDefButF(block, NUM, B_MAKEDISP, "Tolerance:", 550, 320, 150,19, &mmd->tolerance, 0.0, 1, 0, 0, "Distance from axis within which to share vertices");
-                               uiDefButI(block, ROW, B_MAKEDISP, "X",  550, 300, 20,19, &mmd->axis, 1, 0, 0, 0, "Specify the axis to mirror about");
-                               uiDefButI(block, ROW, B_MAKEDISP, "Y",  570, 300, 20,19, &mmd->axis, 1, 1, 0, 0, "Specify the axis to mirror about");
-                               uiDefButI(block, ROW, B_MAKEDISP, "Z",  590, 300, 20,19, &mmd->axis, 1, 2, 0, 0, "Specify the axis to mirror about");
+                               uiDefButF(block, NUM, B_MAKEDISP, "Tolerance:", 550, 380, 150,19, &mmd->tolerance, 0.0, 1, 0, 0, "Distance from axis within which to share vertices");
+                               uiDefButI(block, ROW, B_MAKEDISP, "X",  550, 360, 20,19, &mmd->axis, 1, 0, 0, 0, "Specify the axis to mirror about");
+                               uiDefButI(block, ROW, B_MAKEDISP, "Y",  570, 360, 20,19, &mmd->axis, 1, 1, 0, 0, "Specify the axis to mirror about");
+                               uiDefButI(block, ROW, B_MAKEDISP, "Z",  590, 360, 20,19, &mmd->axis, 1, 2, 0, 0, "Specify the axis to mirror about");
                        }
 
                        uiBlockEndAlign(block);
index bb0fb52fa0f031605db265892211b03e97986718..0e8be4cedcb56f29bb2b7496bf7a3ec377e92195 100644 (file)
@@ -1221,8 +1221,16 @@ static int ev_nonhidden__setDrawOptions(void *userData, EditVert *eve)
 static void draw_dm_face_normals(DerivedMesh *dm) {
        dm->drawMappedFaceNormalsEM(dm, G.scene->editbutsize, ef_nonhiddenAndFgon__setDrawOptions, 0);
 }
-static void draw_dm_face_centers(DerivedMesh *dm, int sel) {
-       dm->drawMappedFaceCentersEM(dm, ef_nonhiddenAndFgon__setDrawOptions, (void*) (sel+1));
+static void draw_em_face_centers(EditMesh *em, int sel) {
+       EditFace *efa;
+
+       bglBegin(GL_POINTS);
+       for(efa= em->faces.first; efa; efa= efa->next) {
+               if(efa->h==0 && efa->fgonf!=EM_FGON && (efa->f&SELECT)==sel) {
+                       bglVertex3fv(efa->cent);
+               }
+       }
+       bglEnd();
 }
 
 static void draw_dm_vert_normals(DerivedMesh *dm) {
@@ -1377,7 +1385,7 @@ static void draw_em_fancy_verts(EditMesh *em, DerivedMesh *cageDM)
                        if(G.scene->selectmode & SCE_SELECT_FACE) {
                                glPointSize(fsize);
                                glColor4ubv(fcol);
-                               draw_dm_face_centers(cageDM, sel);
+                               draw_em_face_centers(em, sel);
                        }
                        
                        if (pass==0) {
index 677aa07078880adffd83130825242d03ffc0260a..7776b5075338e9ba70c52b1b8260c485cd123dc1 100644 (file)
@@ -1370,7 +1370,10 @@ void recalc_editnormals(void)
        }
 
        for(eve= em->verts.first; eve; eve=eve->next) {
-               Normalise(eve->no);
+               if (Normalise(eve->no)==0.0) {
+                       VECCOPY(eve->no, eve->co);
+                       Normalise(eve->no);
+               }
        }
 }