svn merge -r 12607:12653 https://svn.blender.org/svnroot/bf-blender/trunk/blender...
[blender.git] / source / blender / src / buttons_editing.c
index 082353f11742a7e00d8a37667b1d309fca95b8b1..70d1c0920662f521324acc1b5483d6898d30ae81 100644 (file)
@@ -88,6 +88,7 @@
 #include "BKE_main.h"
 #include "BKE_modifier.h"
 #include "BKE_packedFile.h"
+#include "BKE_pointcache.h"
 #include "BKE_scene.h"
 
 #include "BLI_blenlib.h"
@@ -951,6 +952,8 @@ static uiBlock *modifiers_add_menu(void *ob_v)
 
                /* Only allow adding through appropriate other interfaces */
                if(ELEM(i, eModifierType_Softbody, eModifierType_Hook)) continue;
+               
+               if(ELEM(i, eModifierType_Cloth, eModifierType_Collision)) continue;
 
                if((mti->flags&eModifierTypeFlag_AcceptsCVs) ||
                   (ob->type==OB_MESH && (mti->flags&eModifierTypeFlag_AcceptsMesh))) {
@@ -1396,6 +1399,14 @@ static void modifiers_convertToReal(void *ob_v, void *md_v)
        BIF_undo_push("Modifier convert to real");
 }
 
+static void modifiers_pointCacheClearModifier(void *ob_v, void *md_v)
+{
+       Object *ob = ob_v;
+       ModifierData *md = md_v;        
+       int stack_index = modifiers_indexInObject(ob_v, md_v);
+       PTCache_id_clear((ID *)ob, CFRA, stack_index);
+}
+
 static void build_uvlayer_menu_vars(CustomData *data, char **menu_string,
                                     int *uvlayer_tmp, char *uvlayer_name)
 {
@@ -1524,7 +1535,7 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
        uiBlockSetCol(block, TH_AUTO);
        
        /* open/close icon */
-       if (!isVirtual) {
+       if (!isVirtual && md->type!=eModifierType_Collision) {
                uiBlockSetEmboss(block, UI_EMBOSSN);
                uiDefIconButBitI(block, ICONTOG, eModifierMode_Expanded, B_MODIFIER_REDRAW, VICON_DISCLOSURE_TRI_RIGHT, x-10, y-2, 20, 20, &md->mode, 0.0, 0.0, 0.0, 0.0, "Collapse/Expand Modifier");
        }
@@ -1541,8 +1552,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                uiBlockBeginAlign(block);
                uiDefBut(block, TEX, B_MODIFIER_REDRAW, "", x+10, y-1, buttonWidth-60, 19, md->name, 0.0, sizeof(md->name)-1, 0.0, 0.0, "Modifier name"); 
 
-                       /* Softbody not allowed in this situation, enforce! */
-               if (md->type!=eModifierType_Softbody || !(ob->pd && ob->pd->deflect)) {
+               /* Softbody not allowed in this situation, enforce! */
+               if ((md->type!=eModifierType_Softbody && md->type!=eModifierType_Collision) || !(ob->pd && ob->pd->deflect)) {
                        uiDefIconButBitI(block, TOG, eModifierMode_Render, B_MODIFIER_RECALC, ICON_SCENE, x+10+buttonWidth-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+10+buttonWidth-40, y-1, 19, 19,&md->mode, 0, 0, 1, 0, "Enable modifier during interactive display");
                        if (mti->flags&eModifierTypeFlag_SupportsEditmode) {
@@ -1581,9 +1592,13 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                uiButSetFunc(but, modifiers_moveDown, ob, md);
                
                uiBlockSetEmboss(block, UI_EMBOSSN);
-
-               but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_X, x+width-70+40, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Delete modifier");
-               uiButSetFunc(but, modifiers_del, ob, md);
+               
+               // deletion over the deflection panel
+               if(md->type!=eModifierType_Collision)
+               {
+                       but = uiDefIconBut(block, BUT, B_MODIFIER_RECALC, VICON_X, x+width-70+40, y, 16, 16, NULL, 0.0, 0.0, 0.0, 0.0, "Delete modifier");
+                       uiButSetFunc(but, modifiers_del, ob, md);
+               }
                uiBlockSetCol(block, TH_AUTO);
        }
 
@@ -1642,6 +1657,10 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                                height += 20;
                } else if (md->type==eModifierType_Softbody) {
                        height = 26;
+               } else if (md->type==eModifierType_Cloth) {
+                       height = 26;
+               } else if (md->type==eModifierType_Collision) {
+                       height = 19;
                } else if (md->type==eModifierType_Boolean) {
                        height = 48;
                } else if (md->type==eModifierType_Array) {
@@ -1649,6 +1668,8 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                } else if (md->type==eModifierType_MeshDeform) {
                        MeshDeformModifierData *mmd= (MeshDeformModifierData*)md;
                        height = (mmd->bindcos)? 73: 93;
+               } else if (md->type==eModifierType_PointCache) {
+                       height = 48;
                } 
                
                                                        /* roundbox 4 free variables: corner-rounding, nop, roundbox type, shade */
@@ -1656,11 +1677,11 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
 
                y -= 18;
 
-               if (!isVirtual) {
+               if (!isVirtual && (md->type!=eModifierType_Collision)) {
                        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);
-                       if (md->type!=eModifierType_Softbody) {
+                       if ((md->type!=eModifierType_Softbody) && (md->type!=eModifierType_Cloth)) {
                                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);
                        }
@@ -2159,6 +2180,18 @@ static void draw_modifier(uiBlock *block, Object *ob, ModifierData *md, int *xco
                                uiDefButBitS(block, TOG, MOD_MDEF_DYNAMIC_BIND, B_MODIFIER_RECALC, "Dynamic", lx+(buttonWidth+1)/2 + 20, (cy-=19), buttonWidth/2 - 20,19, &mmd->flag, 0.0, 31.0, 0, 0, "Invert vertex group influence");
                        }
                        uiBlockEndAlign(block);
+               } else if (md->type==eModifierType_PointCache) {
+               PointCacheModifierData *pcm = (PointCacheModifierData *) md;
+               uiBut *but;     
+               cy -= 20;
+               uiBlockEndAlign(block);
+                       
+               uiDefButS(block, ROW,B_MODIFIER_RECALC,"Write Cache",           lx, cy, 75, 19, &pcm->mode, 12.0, ePointCache_Read, 0, 0, "");
+               uiDefButS(block, ROW,B_MODIFIER_RECALC,"Read Cache",            lx+75, cy, 75,19, &pcm->mode, 12.0, ePointCache_Write, 0, 0, "");
+               cy -= 20;                       
+               but = uiDefBut(block, BUT, B_NOP, "Clear Cache",                        lx, cy, 150,19, 0, 0, 0, 0, 0, "");
+               uiButSetFunc(but, modifiers_pointCacheClearModifier, ob, md);
+                       
                }
 
                uiBlockEndAlign(block);
@@ -3428,6 +3461,9 @@ void do_latticebuts(unsigned short event)
                        if(ob==G.obedit) resizelattice(editLatt, lt->opntsu, lt->opntsv, lt->opntsw, NULL);
                        else resizelattice(ob->data, lt->opntsu, lt->opntsv, lt->opntsw, NULL);
                        ob->softflag |= OB_SB_REDO;
+                       if(modifiers_isClothEnabled(ob)) {
+                               cloth_free_modifier(modifiers_isClothEnabled(ob));
+                       }
                        DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
                        allqueue(REDRAWVIEW3D, 0);
                }
@@ -3436,6 +3472,9 @@ void do_latticebuts(unsigned short event)
                        lt = ob->data;
                        resizelattice(ob->data, lt->opntsu, lt->opntsv, lt->opntsw, ob);
                        ob->softflag |= OB_SB_REDO;
+                       if(modifiers_isClothEnabled(ob)) {
+                               cloth_free_modifier(modifiers_isClothEnabled(ob));
+                       }
                        DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
                        allqueue(REDRAWVIEW3D, 0);
                }