Revision: 15422
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15422
Author:   jaguarandi
Date:     2008-07-04 03:03:50 +0200 (Fri, 04 Jul 2008)

Log Message:
-----------
Added modes Squash and Strech to SimpleDeform (need testing)
CHanged the add modifier menu to show a submenu for selecting the type of 
simpledeform.

Modified Paths:
--------------
    
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c
    branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
    branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c

Modified: 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c
===================================================================
--- 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c   
    2008-07-04 00:30:44 UTC (rev 15421)
+++ 
branches/soc-2008-jaguarandi/source/blender/blenkernel/intern/simple_deform.c   
    2008-07-04 01:03:50 UTC (rev 15422)
@@ -66,6 +66,46 @@
        }
 }
 
+/* TODO strech and squash need review on function */
+static void simpleDeform_strech(const float factor, const float dcut[3], float 
*co)
+{
+       float x = co[0], y = co[1], z = co[2];
+       float scale;
+
+       scale = z*factor;
+       scale = scale*scale;
+
+       co[0] += x+x*scale;
+       co[1] += y+y*scale;
+
+       if(dcut)
+       {
+               co[0] += dcut[0]*scale;
+               co[1] += dcut[0]*scale;
+               co[2] += dcut[2]; 
+       }
+
+}
+
+static void simpleDeform_squash(const float factor, const float dcut[3], float 
*co)
+{
+       float x = co[0], y = co[1], z = co[2];
+       float scale;
+
+       scale = z*factor;
+       scale = -scale*scale;
+
+       co[0] += x+x*scale;
+       co[1] += y+y*scale;
+
+       if(dcut)
+       {
+               co[0] += dcut[0]*scale;
+               co[1] += dcut[0]*scale;
+               co[2] += dcut[2]; 
+       }
+}
+
 static void simpleDeform_tapperX(const float factor, const float *dcut, float 
*co)
 {
        float x = co[0], y = co[1], z = co[2];
@@ -179,6 +219,16 @@
                                axis_limit(2, smd->factor+1, *vertexCos, dcut);
                                simpleDeform_tapperXY(smd->factor[0], dcut, 
*vertexCos);
                                break;
+
+                       case MOD_SIMPLEDEFORM_MODE_STRECH:
+                               axis_limit(2, smd->factor+1, *vertexCos, dcut);
+                               simpleDeform_strech(smd->factor[0], dcut, 
*vertexCos);
+                               break;
+
+                       case MOD_SIMPLEDEFORM_MODE_SQUASH:
+                               axis_limit(2, smd->factor+1, *vertexCos, dcut);
+                               simpleDeform_squash(smd->factor[0], dcut, 
*vertexCos);
+                               break;
                }
 
                if(mod2ob)

Modified: 
branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h   
2008-07-04 00:30:44 UTC (rev 15421)
+++ branches/soc-2008-jaguarandi/source/blender/makesdna/DNA_modifier_types.h   
2008-07-04 01:03:50 UTC (rev 15422)
@@ -533,5 +533,7 @@
 #define MOD_SIMPLEDEFORM_MODE_BEND             2
 #define MOD_SIMPLEDEFORM_MODE_TAPER_X  3
 #define MOD_SIMPLEDEFORM_MODE_TAPER_XY 4
+#define MOD_SIMPLEDEFORM_MODE_STRECH   5
+#define MOD_SIMPLEDEFORM_MODE_SQUASH   6
 
 #endif

Modified: branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c
===================================================================
--- branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c   
2008-07-04 00:30:44 UTC (rev 15421)
+++ branches/soc-2008-jaguarandi/source/blender/src/buttons_editing.c   
2008-07-04 01:03:50 UTC (rev 15422)
@@ -938,25 +938,62 @@
        }
 }
 
-static void modifiers_add(void *ob_v, int type)
+static void object_add_modifier(Object *ob, ModifierData *md)
 {
-       Object *ob = ob_v;
-       ModifierTypeInfo *mti = modifierType_getInfo(type);
-       
+       ModifierTypeInfo *mti = modifierType_getInfo(md->type);
        if (mti->flags&eModifierTypeFlag_RequiresOriginalData) {
-               ModifierData *md = ob->modifiers.first;
+               ModifierData *iter = ob->modifiers.first;
 
-               while (md && 
modifierType_getInfo(md->type)->type==eModifierTypeType_OnlyDeform) {
-                       md = md->next;
+               while (iter && 
modifierType_getInfo(iter->type)->type==eModifierTypeType_OnlyDeform) {
+                       iter = iter->next;
                }
 
-               BLI_insertlinkbefore(&ob->modifiers, md, modifier_new(type));
+               BLI_insertlinkbefore(&ob->modifiers, iter, md);
        } else {
-               BLI_addtail(&ob->modifiers, modifier_new(type));
+               BLI_addtail(&ob->modifiers, md);
        }
+}
+
+static void modifiers_add(void *ob_v, int type)
+{
+       object_add_modifier((Object*) ob_v, modifier_new(type));
        BIF_undo_push("Add modifier");
 }
 
+static void do_modifiers_select_simpledeform_typemenu(void *ob_v, int event)
+{
+       static const char *default_name[] = { "", "Twist", "Bend", "Taper X", 
"Taper XY", "Strech", "Squash" };
+       SimpleDeformModifierData *smd = 
(SimpleDeformModifierData*)modifier_new(eModifierType_SimpleDeform);
+       smd->mode = event;
+
+       if(smd->mode >= 0 && smd->mode < 
sizeof(default_name)/sizeof(*default_name))
+               strncpy( smd->modifier.name, default_name[ smd->mode ], 
sizeof(smd->modifier.name));
+
+       object_add_modifier((Object*) ob_v, (ModifierData*)smd);
+       BIF_undo_push("Add modifier");
+}
+
+static uiBlock *modifiers_select_simpledeform_typemenu(void *ob_v)
+{
+       uiBlock *block;
+       short yco = 20, menuwidth = 160;
+
+       block= uiNewBlock(&curarea->uiblocks, 
"modifiers_select_simpledeform_typemenu", UI_EMBOSSP, UI_HELV, 
G.curscreen->mainwin);
+       uiBlockSetButmFunc(block, do_modifiers_select_simpledeform_typemenu, 
ob_v);
+
+       uiDefBut(block, BUTM, 1, "Twist",               0, yco-=20, menuwidth, 
19, NULL, 0.0, 0.0, 1, MOD_SIMPLEDEFORM_MODE_TWIST, "");
+       uiDefBut(block, BUTM, 1, "Bend",                0, yco-=20, menuwidth, 
19, NULL, 0.0, 0.0, 1, MOD_SIMPLEDEFORM_MODE_BEND, "");
+       uiDefBut(block, BUTM, 1, "Tapper X",    0, yco-=20, menuwidth, 19, 
NULL, 0.0, 0.0, 1, MOD_SIMPLEDEFORM_MODE_TAPER_X, "");
+       uiDefBut(block, BUTM, 1, "Tapper XY",   0, yco-=20, menuwidth, 19, 
NULL, 0.0, 0.0, 1, MOD_SIMPLEDEFORM_MODE_TAPER_XY, "");
+       uiDefBut(block, BUTM, 1, "Strech",              0, yco-=20, menuwidth, 
19, NULL, 0.0, 0.0, 1, MOD_SIMPLEDEFORM_MODE_STRECH, "");
+       uiDefBut(block, BUTM, 1, "Squash",              0, yco-=20, menuwidth, 
19, NULL, 0.0, 0.0, 1, MOD_SIMPLEDEFORM_MODE_SQUASH, "");
+       
+       uiBlockSetDirection(block, UI_RIGHT);
+       uiTextBoundsBlock(block, 50);
+       return block;
+}
+
+
 typedef struct MenuEntry {
        char *name;
        int ID;
@@ -1000,8 +1037,18 @@
 
 
        for(i = 0; i < numEntries; ++i)
-               uiDefBut(block, BUTM, B_MODIFIER_RECALC, entries[i].name,
-                        0, yco -= 20, 160, 19, NULL, 0, 0, 1, entries[i].ID, 
"");
+       {
+               if(entries[i].ID == eModifierType_SimpleDeform)
+               {
+                       //TODO: this menu has a left space.. which loooks ugly 
:S
+                       uiDefIconTextBlockBut(block, 
modifiers_select_simpledeform_typemenu, ob_v, ICON_RIGHTARROW_THIN, 
entries[i].name, 0, yco-=20, 160, 19, "");
+               }
+               else
+               {
+                       uiDefBut(block, BUTM, B_MODIFIER_RECALC, 
entries[i].name,
+                                0, yco -= 20, 160, 19, NULL, 0, 0, 1, 
entries[i].ID, "");
+               }
+       }
 
        uiTextBoundsBlock(block, 50);
        uiBlockSetDirection(block, UI_DOWN);
@@ -1859,8 +1906,7 @@
                        if (smd->shrinkType == MOD_SHRINKWRAP_NORMAL)
                                height += 19*5;
                } else if (md->type==eModifierType_SimpleDeform) {
-                       SimpleDeformModifierData *smd = 
(SimpleDeformModifierData*) md;
-                       height += 19*5;
+                       height += 19*4;
                }
                                                        /* roundbox 4 free 
variables: corner-rounding, nop, roundbox type, shade */
                uiDefBut(block, ROUNDBOX, 0, "", x-10, y-height-2, width, 
height-2, NULL, 5.0, 0.0, 12, 40, ""); 
@@ -2509,11 +2555,12 @@
                        uiBlockEndAlign(block);
                } else if (md->type==eModifierType_SimpleDeform) {
                        SimpleDeformModifierData *smd = 
(SimpleDeformModifierData*) md;
-                       char simpledeform_typemenu[]="Deform type%t|Twist 
%x1|Bend %x2|Taper %x3|TaperXY %x4";
 
+/*
+                       char simpledeform_typemenu[]="Deform type%t|Twist 
%x1|Bend %x2|Taper %x3|TaperXY %x4|Strech %x5|Squash %x6";
                        uiDefButC(block, MENU, B_MODIFIER_RECALC, 
simpledeform_typemenu, lx,(cy-=19),buttonWidth,19, &smd->mode, 0, 0, 0, 0, 
"Selects type of deform");
+*/
 
-
                        uiDefIDPoinBut(block, test_obpoin_but, ID_OB, 
B_CHANGEDEP, "Ob: ",      lx, (cy-=19), buttonWidth-17,19, &smd->origin, 
"Origin of modifier space coordinates");
 
                        if(smd->origin)


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

Reply via email to