clone and stencil layer access added, renamed mask to stencil layer internally
authorCampbell Barton <ideasman42@gmail.com>
Tue, 22 Dec 2009 10:48:13 +0000 (10:48 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 22 Dec 2009 10:48:13 +0000 (10:48 +0000)
release/scripts/ui/space_view3d_toolbar.py
source/blender/blenkernel/BKE_customdata.h
source/blender/blenkernel/intern/customdata.c
source/blender/editors/mesh/mesh_data.c
source/blender/editors/sculpt_paint/paint_image.c
source/blender/editors/space_image/image_buttons.c
source/blender/makesdna/DNA_scene_types.h
source/blender/makesrna/intern/rna_mesh.c
source/blender/makesrna/intern/rna_sculpt_paint.c

index 2c959e640eaaad47cc3ebb20de6d2d6c4f9d7ecf..ca8978eecf8cbc5319d8e0b2772780240f860935 100644 (file)
@@ -826,24 +826,51 @@ class VIEW3D_PT_tools_projectpaint(View3DPanel):
         col.active = (ipaint.use_normal_falloff and use_projection)
         col.prop(ipaint, "normal_angle", text="")
 
-        split = layout.split(percentage=0.7)
-
-        col = split.column(align=False)
-        col.active = (use_projection)
-        col.prop(ipaint, "use_stencil_layer")
+        col = layout.column(align=False)
+        row = col.row()
+        row.active = (use_projection)
+        row.prop(ipaint, "use_stencil_layer", text="Stencil")
 
-        col = split.column(align=False)
-        col.active = (use_projection and ipaint.use_stencil_layer)
-        col.prop(ipaint, "invert_stencil", text="Inv")
+        row2 = row.row(align=False)
+        row2.active = (use_projection and ipaint.use_stencil_layer)
+        row2.menu("VIEW3D_MT_tools_projectpaint_stencil", text=context.active_object.data.uv_texture_stencil.name)
+        row2.prop(ipaint, "invert_stencil", text="", icon='IMAGE_ALPHA')
 
         col = layout.column()
         sub = col.column()
-        sub.active = (settings.tool == 'CLONE')
-        sub.prop(ipaint, "use_clone_layer")
+        row = sub.row()
+        row.active = (settings.tool == 'CLONE')
+        
+        row.prop(ipaint, "use_clone_layer", text="Clone")
+        row.menu("VIEW3D_MT_tools_projectpaint_clone", text=context.active_object.data.uv_texture_clone.name)
 
         sub = col.column()
         sub.prop(ipaint, "seam_bleed")
 
+    class VIEW3D_MT_tools_projectpaint_clone(bpy.types.Menu):
+        bl_label = "Clone Layer"
+
+        def draw(self, context):
+            layout = self.layout
+            for i, tex in enumerate(context.active_object.data.uv_textures):
+                prop = layout.operator("wm.context_set_int", text=tex.name)
+                prop.path = "active_object.data.uv_texture_clone_index"
+                prop.value = i
+
+
+    class VIEW3D_MT_tools_projectpaint_stencil(bpy.types.Menu):
+        bl_label = "Mask Layer"
+
+        def draw(self, context):
+            layout = self.layout
+            for i, tex in enumerate(context.active_object.data.uv_textures):
+                prop = layout.operator("wm.context_set_int", text=tex.name)
+                prop.path = "active_object.data.uv_texture_stencil_index"
+                prop.value = i
+
+    bpy.types.register(VIEW3D_MT_tools_projectpaint_clone)
+    bpy.types.register(VIEW3D_MT_tools_projectpaint_stencil)
+
 
 class VIEW3D_PT_tools_particlemode(View3DPanel):
     '''default tools for particle mode'''
index 5f13e702343c43077ae51ba5f7ca997d18920c52..65c02d1abb9dd467a9676253ea4055d743b9a4c1 100644 (file)
@@ -198,11 +198,11 @@ int CustomData_get_named_layer_index(const struct CustomData *data, int type, ch
 int CustomData_get_active_layer_index(const struct CustomData *data, int type);
 int CustomData_get_render_layer_index(const struct CustomData *data, int type);
 int CustomData_get_clone_layer_index(const struct CustomData *data, int type);
-int CustomData_get_mask_layer_index(const struct CustomData *data, int type);
+int CustomData_get_stencil_layer_index(const struct CustomData *data, int type);
 int CustomData_get_active_layer(const struct CustomData *data, int type);
 int CustomData_get_render_layer(const struct CustomData *data, int type);
 int CustomData_get_clone_layer(const struct CustomData *data, int type);
-int CustomData_get_mask_layer(const struct CustomData *data, int type);
+int CustomData_get_stencil_layer(const struct CustomData *data, int type);
 
 /* copies the data from source to the data element at index in the first
  * layer of type
@@ -231,13 +231,13 @@ void *CustomData_set_layer_n(const struct CustomData *data, int type, int n, voi
 void CustomData_set_layer_active(struct CustomData *data, int type, int n);
 void CustomData_set_layer_render(struct CustomData *data, int type, int n);
 void CustomData_set_layer_clone(struct CustomData *data, int type, int n);
-void CustomData_set_layer_mask(struct CustomData *data, int type, int n);
+void CustomData_set_layer_stencil(struct CustomData *data, int type, int n);
 
 /* same as above but works with an index from CustomData_get_layer_index */
 void CustomData_set_layer_active_index(struct CustomData *data, int type, int n);
 void CustomData_set_layer_render_index(struct CustomData *data, int type, int n);
 void CustomData_set_layer_clone_index(struct CustomData *data, int type, int n);
-void CustomData_set_layer_mask_index(struct CustomData *data, int type, int n);
+void CustomData_set_layer_stencil_index(struct CustomData *data, int type, int n);
 
 /* adds flag to the layer flags */
 void CustomData_set_layer_flag(struct CustomData *data, int type, int flag);
index d9e85d5d4128d57980b0ca7bd8d3f37748a1fb4a..78e673b9e79b4cd9a48972c1ee1d8287cb73ee93 100644 (file)
@@ -1006,7 +1006,7 @@ int CustomData_get_clone_layer_index(const CustomData *data, int type)
        return -1;
 }
 
-int CustomData_get_mask_layer_index(const CustomData *data, int type)
+int CustomData_get_stencil_layer_index(const CustomData *data, int type)
 {
        int i;
 
@@ -1050,7 +1050,7 @@ int CustomData_get_clone_layer(const CustomData *data, int type)
        return -1;
 }
 
-int CustomData_get_mask_layer(const CustomData *data, int type)
+int CustomData_get_stencil_layer(const CustomData *data, int type)
 {
        int i;
 
@@ -1088,7 +1088,7 @@ void CustomData_set_layer_clone(CustomData *data, int type, int n)
                        data->layers[i].active_clone = n;
 }
 
-void CustomData_set_layer_mask(CustomData *data, int type, int n)
+void CustomData_set_layer_stencil(CustomData *data, int type, int n)
 {
        int i;
 
@@ -1125,7 +1125,7 @@ void CustomData_set_layer_clone_index(CustomData *data, int type, int n)
                        data->layers[i].active_clone = n-i;
 }
 
-void CustomData_set_layer_mask_index(CustomData *data, int type, int n)
+void CustomData_set_layer_stencil_index(CustomData *data, int type, int n)
 {
        int i;
 
index 0285faf7949651c83fec18eb6831c93468d07434..1cdc059f57ef882de4ad6b67255cd8868c1d35b6 100644 (file)
@@ -72,10 +72,10 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
 {
        Mesh *me = ob->data;
        CustomData *data= (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
-       void *actlayerdata, *rndlayerdata, *clonelayerdata, *masklayerdata, *layerdata=layer->data;
+       void *actlayerdata, *rndlayerdata, *clonelayerdata, *stencillayerdata, *layerdata=layer->data;
        int type= layer->type;
        int index= CustomData_get_layer_index(data, type);
-       int i, actindex, rndindex, cloneindex, maskindex;
+       int i, actindex, rndindex, cloneindex, stencilindex;
        
        /* ok, deleting a non-active layer needs to preserve the active layer indices.
          to do this, we store a pointer to the .data member of both layer and the active layer,
@@ -87,7 +87,7 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
        actlayerdata = data->layers[CustomData_get_active_layer_index(data, type)].data;
        rndlayerdata = data->layers[CustomData_get_render_layer_index(data, type)].data;
        clonelayerdata = data->layers[CustomData_get_clone_layer_index(data, type)].data;
-       masklayerdata = data->layers[CustomData_get_mask_layer_index(data, type)].data;
+       stencillayerdata = data->layers[CustomData_get_stencil_layer_index(data, type)].data;
        CustomData_set_layer_active(data, type, layer - &data->layers[index]);
 
        if(me->edit_mesh) {
@@ -144,18 +144,18 @@ static void delete_customdata_layer(bContext *C, Object *ob, CustomDataLayer *la
                CustomData_set_layer_clone(data, type, cloneindex);
        }
        
-       if (masklayerdata != layerdata) {
+       if (stencillayerdata != layerdata) {
                /* find index */
-               maskindex = CustomData_get_layer_index(data, type);
-               for (i=maskindex; i<data->totlayer; i++) {
-                       if (data->layers[i].data == masklayerdata) {
-                               maskindex = i - maskindex;
+               stencilindex = CustomData_get_layer_index(data, type);
+               for (i=stencilindex; i<data->totlayer; i++) {
+                       if (data->layers[i].data == stencillayerdata) {
+                               stencilindex = i - stencilindex;
                                break;
                        }
                }
                
                /* set index */
-               CustomData_set_layer_mask(data, type, maskindex);
+               CustomData_set_layer_stencil(data, type, stencilindex);
        }
 }
 
index 1f0d158ece97c59362978ad5c66754f509eb7a82..058dab4ba15351b75bacae7105801e95c2ddef84 100644 (file)
@@ -228,7 +228,7 @@ typedef struct ProjPaintState {
        MFace              *dm_mface;
        MTFace             *dm_mtface;
        MTFace             *dm_mtface_clone;    /* other UV layer, use for cloning between layers */
-       MTFace             *dm_mtface_mask;
+       MTFace             *dm_mtface_stencil;
        
        /* projection painting only */
        MemArena *arena_mt[BLENDER_MAX_THREADS];/* for multithreading, the first item is sometimes used for non threaded cases too */
@@ -257,8 +257,8 @@ typedef struct ProjPaintState {
        
        /* options for projection painting */
        int do_layer_clone;
-       int do_layer_mask;
-       int do_layer_mask_inv;
+       int do_layer_stencil;
+       int do_layer_stencil_inv;
        
        short do_occlude;                       /* Use raytraced occlusion? - ortherwise will paint right through to the back*/
        short do_backfacecull;  /* ignore faces with normals pointing away, skips a lot of raycasts if your normals are correctly flipped */
@@ -1265,10 +1265,10 @@ float project_paint_uvpixel_mask(
        float mask;
        
        /* Image Mask */
-       if (ps->do_layer_mask) {
+       if (ps->do_layer_stencil) {
                /* another UV layers image is masking this one's */
                ImBuf *ibuf_other;
-               const MTFace *tf_other = ps->dm_mtface_mask + face_index;
+               const MTFace *tf_other = ps->dm_mtface_stencil + face_index;
                
                if (tf_other->tpage && (ibuf_other = BKE_image_get_ibuf(tf_other->tpage, NULL))) {
                        /* BKE_image_get_ibuf - TODO - this may be slow */
@@ -1284,7 +1284,7 @@ float project_paint_uvpixel_mask(
                                mask = ((rgba_ub[0]+rgba_ub[1]+rgba_ub[2])/(256*3.0f)) * (rgba_ub[3]/256.0f);
                        }
                        
-                       if (!ps->do_layer_mask_inv) /* matching the gimps layer mask black/white rules, white==full opacity */
+                       if (!ps->do_layer_stencil_inv) /* matching the gimps layer mask black/white rules, white==full opacity */
                                mask = (1.0f - mask);
 
                        if (mask == 0.0f) {
@@ -2863,15 +2863,15 @@ static void project_paint_begin(ProjPaintState *ps)
                }
        }
        
-       if (ps->do_layer_mask) {
-               //int layer_num = CustomData_get_mask_layer(&ps->dm->faceData, CD_MTFACE);
-               int layer_num = CustomData_get_mask_layer(&((Mesh *)ps->ob->data)->fdata, CD_MTFACE);
+       if (ps->do_layer_stencil) {
+               //int layer_num = CustomData_get_stencil_layer(&ps->dm->faceData, CD_MTFACE);
+               int layer_num = CustomData_get_stencil_layer(&((Mesh *)ps->ob->data)->fdata, CD_MTFACE);
                if (layer_num != -1)
-                       ps->dm_mtface_mask = CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num);
+                       ps->dm_mtface_stencil = CustomData_get_layer_n(&ps->dm->faceData, CD_MTFACE, layer_num);
                
-               if (ps->dm_mtface_mask==NULL || ps->dm_mtface_mask==ps->dm_mtface) {
-                       ps->do_layer_mask = 0;
-                       ps->dm_mtface_mask = NULL;
+               if (ps->dm_mtface_stencil==NULL || ps->dm_mtface_stencil==ps->dm_mtface) {
+                       ps->do_layer_stencil = 0;
+                       ps->dm_mtface_stencil = NULL;
                }
        }
        
@@ -4438,8 +4438,8 @@ static int texture_paint_init(bContext *C, wmOperator *op)
                if (pop->ps.tool == PAINT_TOOL_CLONE)
                        pop->ps.do_layer_clone = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_CLONE);
                
-               pop->ps.do_layer_mask = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_MASK) ? 1 : 0;
-               pop->ps.do_layer_mask_inv = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_MASK_INV) ? 1 : 0;
+               pop->ps.do_layer_stencil = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL) ? 1 : 0;
+               pop->ps.do_layer_stencil_inv = (settings->imapaint.flag & IMAGEPAINT_PROJECT_LAYER_STENCIL_INV) ? 1 : 0;
                
                
 #ifndef PROJ_DEBUG_NOSEAMBLEED
index bb989b35cd5304cc3d3bcff8bb499072bec3d93b..4811eb411ec416bfc5b67a35bbf723e1a50e982d 100644 (file)
@@ -363,133 +363,6 @@ static void image_editcursor_buts(const bContext *C, View2D *v2d, uiBlock *block
        }
 }
 
-#if 0
-static void image_panel_view_properties(const bContext *C, Panel *pa)
-{
-}
-#endif
-
-void brush_buttons(const bContext *C, uiBlock *block, short fromsima,
-                                  int evt_nop, int evt_change,
-                                  int evt_browse, int evt_local,
-                                  int evt_del, int evt_keepdata,
-                                  int evt_texbrowse, int evt_texdel)
-{
-//     SpaceImage *sima= CTX_wm_space_image(C);
-       ToolSettings *settings= CTX_data_tool_settings(C);
-       Brush *brush= paint_brush(&settings->imapaint.paint);
-       ID *id;
-       int yco, xco, butw, but_idx;
-//     short *menupoin = &(sima->menunr); // XXX : &(G.buts->menunr);
-       short do_project = settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE ? 0:1;
-       
-       yco= 160;
-       
-       butw = fromsima ? 80 : 106;
-       
-       uiBlockBeginAlign(block);
-       but_idx = 0;
-       uiDefButS(block, ROW, evt_change, "Draw",               butw*(but_idx++),yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_DRAW, 0, 0, "Draw brush");
-       if (fromsima || do_project==0)
-               uiDefButS(block, ROW, evt_change, "Soften",     butw*(but_idx++),       yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SOFTEN, 0, 0, "Soften brush");
-       uiDefButS(block, ROW, evt_change, "Smear",              butw*(but_idx++),       yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_SMEAR, 0, 0, "Smear brush");
-       if (fromsima || do_project)
-               uiDefButS(block, ROW, evt_change, "Clone",      butw*(but_idx++),       yco,butw,19, &settings->imapaint.tool, 7.0, PAINT_TOOL_CLONE, 0, 0, "Clone brush, use RMB to drag source image");
-       
-       uiBlockEndAlign(block);
-       yco -= 30;
-       
-       id= (ID*)brush;
-       xco= 200; // std_libbuttons(block, 0, yco, 0, NULL, evt_browse, ID_BR, 0, id, NULL, menupoin, 0, evt_local, evt_del, 0, evt_keepdata);
-       
-       if(brush && !brush->id.lib) {
-               
-               butw= 320-(xco+10);
-               
-               uiDefButS(block, MENU, evt_nop, "Mix %x0|Add %x1|Subtract %x2|Multiply %x3|Lighten %x4|Darken %x5|Erase Alpha %x6|Add Alpha %x7", xco+10,yco,butw,19, &brush->blend, 0, 0, 0, 0, "Blending method for applying brushes");
-               
-               uiBlockBeginAlign(block);
-               uiDefButBitS(block, TOG|BIT, BRUSH_AIRBRUSH, evt_change, "Airbrush",    xco+10,yco-25,butw/2,19, &brush->flag, 0, 0, 0, 0, "Keep applying paint effect while holding mouse (spray)");
-               uiDefButF(block, NUM, evt_nop, "", xco+10 + butw/2,yco-25,butw/2,19, &brush->rate, 0.01, 1.0, 0, 0, "Number of paints per second for Airbrush");
-               uiBlockEndAlign(block);
-               
-               if (fromsima) {
-                       uiDefButBitS(block, TOG|BIT, BRUSH_TORUS, evt_change, "Wrap",   xco+10,yco-45,butw,19, &brush->flag, 0, 0, 0, 0, "Enables torus wrapping");
-                       yco -= 25;
-               }
-               else {
-                       yco -= 25;
-                       uiBlockBeginAlign(block);
-                       uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_DISABLE, B_REDR, "Project Paint",      xco+10,yco-25,butw,19, &settings->imapaint.flag, 0, 0, 0, 0, "Use projection painting for improved consistency in the brush strokes");
-                       
-                       if ((settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)==0) {
-                               /* Projection Painting */
-                               
-                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_XRAY, B_NOP, "Occlude",        xco+10,yco-45,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Only paint onto the faces directly under the brush (slower)");
-                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_BACKFACE, B_NOP, "Cull",       xco+10+butw/2,yco-45,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Ignore faces pointing away from the view (faster)");
-                               
-                               uiDefButBitS(block, TOGN|BIT, IMAGEPAINT_PROJECT_FLAT, B_NOP, "Normal", xco+10,yco-65,butw/2,19, &settings->imapaint.flag, 0, 0, 0, 0, "Paint most on faces pointing towards the view");
-                               uiDefButS(block, NUM, B_NOP, "", xco+10 +(butw/2),yco-65,butw/2,19, &settings->imapaint.normal_angle, 10.0, 90.0, 0, 0, "Paint most on faces pointing towards the view acording to this angle");
-                               
-                               uiDefButS(block, NUM, B_NOP, "Bleed: ", xco+10,yco-85,butw,19, &settings->imapaint.seam_bleed, 0.0, 8.0, 0, 0, "Extend paint beyond the faces UVs to reduce seams (in pixels, slower)");
-                               uiBlockEndAlign(block);
-                               
-                               uiBlockBeginAlign(block);
-                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_MASK, B_NOP, "Stencil Layer",     xco+10,yco-110,butw-30,19, &settings->imapaint.flag, 0, 0, 0, 0, "Set the mask layer from the UV layer buttons");
-                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_MASK_INV, B_NOP, "Inv",   xco+10 + butw-30,yco-110,30,19, &settings->imapaint.flag, 0, 0, 0, 0, "Invert the mask");
-                               uiBlockEndAlign(block);
-                               
-                       }
-                       uiBlockEndAlign(block);
-               }
-               
-               uiBlockBeginAlign(block);
-               uiDefButF(block, COL, B_VPCOLSLI, "",                                   0,yco,200,19, brush->rgb, 0, 0, 0, 0, "");
-               uiDefButF(block, NUMSLI, evt_nop, "Opacity ",           0,yco-20,180,19, &brush->alpha, 0.0, 1.0, 0, 0, "The amount of pressure on the brush");
-               uiDefIconButBitS(block, TOG|BIT, BRUSH_ALPHA_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE,   180,yco-20,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiDefButI(block, NUMSLI, evt_nop, "Size ",              0,yco-40,180,19, &brush->size, 1, 200, 0, 0, "The size of the brush");
-               uiDefIconButBitS(block, TOG|BIT, BRUSH_SIZE_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE,    180,yco-40,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-//             uiDefButF(block, NUMSLI, evt_nop, "Falloff ",           0,yco-60,180,19, &brush->innerradius, 0.0, 1.0, 0, 0, "The fall off radius of the brush");
-//             uiDefIconButBitS(block, TOG|BIT, BRUSH_RAD_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE,     180,yco-60,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiDefButF(block, NUMSLI, evt_nop, "Spacing ",0,yco-80,180,19, &brush->spacing, 1.0, 100.0, 0, 0, "Repeating paint on %% of brush diameter");
-               uiDefIconButBitS(block, TOG|BIT, BRUSH_SPACING_PRESSURE, evt_nop, ICON_STYLUS_PRESSURE, 180,yco-80,20,19, &brush->flag, 0, 0, 0, 0, "Enables pressure sensitivity for tablets");
-               uiBlockEndAlign(block);
-               
-               yco -= 110;
-               
-               if(fromsima && settings->imapaint.tool == PAINT_TOOL_CLONE) {
-                       id= (ID*)brush->clone.image;
-                       xco= 200; // std_libbuttons(block, 0, yco, 0, NULL, B_SIMACLONEBROWSE, ID_IM, 0, id, 0, menupoin, 0, 0, B_SIMACLONEDELETE, 0, 0);
-                       if(id) {
-                               butw= 320-(xco+5);
-                               uiDefButF(block, NUMSLI, evt_change, "B ",xco+5,yco,butw,19, &brush->clone.alpha , 0.0, 1.0, 0, 0, "Opacity of clone image display");
-                       }
-               }
-               else {
-                       if (
-                               (fromsima==0) && /* 3D View */
-                               (settings->imapaint.flag & IMAGEPAINT_PROJECT_DISABLE)==0 && /* Projection Painting */
-                               (settings->imapaint.tool == PAINT_TOOL_CLONE)
-                               ) {
-                               butw = 130;
-                               uiDefButBitS(block, TOG|BIT, IMAGEPAINT_PROJECT_LAYER_CLONE, B_REDR, "Clone Layer",     0,yco,butw,20, &settings->imapaint.flag, 0, 0, 0, 0, "Use another UV layer as clone source, otherwise use 3D the cursor as the source");
-                       }
-                       else {
-                               MTex *mtex= brush->mtex[brush->texact];
-                               
-                               id= (mtex)? (ID*)mtex->tex: NULL;
-                               xco= 200; // std_libbuttons(block, 0, yco, 0, NULL, evt_texbrowse, ID_TE, 0, id, NULL, menupoin, 0, 0, evt_texdel, 0, 0);
-                               /*uiDefButBitS(block, TOG|BIT, BRUSH_FIXED_TEX, evt_change, "Fixed",    xco+5,yco,butw,19, &brush->flag, 0, 0, 0, 0, "Keep texture origin in fixed position");*/
-                       }
-               }
-       }
-       
-#if 0
-       uiDefButBitS(block, TOG|BIT, IMAGEPAINT_DRAW_TOOL_DRAWING, B_SIMABRUSHCHANGE, "TD", 0,1,50,19, &settings->imapaint.flag.flag, 0, 0, 0, 0, "Enables brush shape while drawing");
-       uiDefButBitS(block, TOG|BIT, IMAGEPAINT_DRAW_TOOL, B_SIMABRUSHCHANGE, "TP", 50,1,50,19, &settings->imapaint.flag.flag, 0, 0, 0, 0, "Enables brush shape while not drawing");
-#endif
-}
-
 static int image_panel_poll(const bContext *C, PanelType *pt)
 {
        SpaceImage *sima= CTX_wm_space_image(C);
index 0ed8aba056a9b4a39d418cfd3800d89483e70d2b..536d9ba2bc3094f5af170339767212533b924399 100644 (file)
@@ -1092,8 +1092,8 @@ typedef enum SculptFlags {
 #define IMAGEPAINT_PROJECT_BACKFACE            32
 #define IMAGEPAINT_PROJECT_FLAT                        64
 #define IMAGEPAINT_PROJECT_LAYER_CLONE 128
-#define IMAGEPAINT_PROJECT_LAYER_MASK  256
-#define IMAGEPAINT_PROJECT_LAYER_MASK_INV      512
+#define IMAGEPAINT_PROJECT_LAYER_STENCIL       256
+#define IMAGEPAINT_PROJECT_LAYER_STENCIL_INV   512
 
 /* toolsettings->uvcalc_flag */
 #define UVCALC_FILLHOLES                       1
index 3163f38af3db94c7bac3de53bd6152c155d40102..c298d83850b0a24ad2494b9c97163a6dc5767457 100644 (file)
@@ -330,7 +330,7 @@ static PointerRNA rna_Mesh_active_uv_texture_get(PointerRNA *ptr)
        return rna_pointer_inherit_refine(ptr, &RNA_MeshTextureFaceLayer, cdl);
 }
 
-static PointerRNA rna_Mesh_clone_uv_texture_get(PointerRNA *ptr)
+static PointerRNA rna_Mesh_uv_texture_clone_get(PointerRNA *ptr)
 {
        Mesh *me= (Mesh*)ptr->data;
        CustomData *fdata= rna_mesh_fdata(me);
@@ -340,6 +340,16 @@ static PointerRNA rna_Mesh_clone_uv_texture_get(PointerRNA *ptr)
        return rna_pointer_inherit_refine(ptr, &RNA_MeshTextureFaceLayer, cdl);
 }
 
+static PointerRNA rna_Mesh_uv_texture_stencil_get(PointerRNA *ptr)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *fdata= rna_mesh_fdata(me);
+       int index= CustomData_get_stencil_layer_index(fdata, CD_MTFACE);
+       CustomDataLayer *cdl= (index == -1)? NULL: &fdata->layers[index];
+
+       return rna_pointer_inherit_refine(ptr, &RNA_MeshTextureFaceLayer, cdl);
+}
+
 static void rna_Mesh_active_uv_texture_set(PointerRNA *ptr, PointerRNA value)
 {
        Mesh *me= (Mesh*)ptr->data;
@@ -356,7 +366,7 @@ static void rna_Mesh_active_uv_texture_set(PointerRNA *ptr, PointerRNA value)
        }
 }
 
-static void rna_Mesh_clone_uv_texture_set(PointerRNA *ptr, PointerRNA value)
+static void rna_Mesh_uv_texture_clone_set(PointerRNA *ptr, PointerRNA value)
 {
        Mesh *me= (Mesh*)ptr->data;
        CustomData *fdata= rna_mesh_fdata(me);
@@ -366,7 +376,21 @@ static void rna_Mesh_clone_uv_texture_set(PointerRNA *ptr, PointerRNA value)
        for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
                if(value.data == cdl) {
                        CustomData_set_layer_clone_index(fdata, CD_MTFACE, a);
-                       mesh_update_customdata_pointers(me);
+                       return;
+               }
+       }
+}
+
+static void rna_Mesh_uv_texture_stencil_set(PointerRNA *ptr, PointerRNA value)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *fdata= rna_mesh_fdata(me);
+       CustomDataLayer *cdl;
+       int a;
+
+       for(cdl=fdata->layers, a=0; a<fdata->totlayer; cdl++, a++) {
+               if(value.data == cdl) {
+                       CustomData_set_layer_stencil_index(fdata, CD_MTFACE, a);
                        return;
                }
        }
@@ -379,13 +403,20 @@ static int rna_Mesh_active_uv_texture_index_get(PointerRNA *ptr)
        return CustomData_get_active_layer(fdata, CD_MTFACE);
 }
 
-static int rna_Mesh_clone_uv_texture_index_get(PointerRNA *ptr)
+static int rna_Mesh_uv_texture_clone_index_get(PointerRNA *ptr)
 {
        Mesh *me= (Mesh*)ptr->data;
        CustomData *fdata= rna_mesh_fdata(me);
        return CustomData_get_clone_layer(fdata, CD_MTFACE);
 }
 
+static int rna_Mesh_uv_texture_stencil_index_get(PointerRNA *ptr)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *fdata= rna_mesh_fdata(me);
+       return CustomData_get_stencil_layer(fdata, CD_MTFACE);
+}
+
 static void rna_Mesh_active_uv_texture_index_set(PointerRNA *ptr, int value)
 {
        Mesh *me= (Mesh*)ptr->data;
@@ -395,13 +426,20 @@ static void rna_Mesh_active_uv_texture_index_set(PointerRNA *ptr, int value)
        mesh_update_customdata_pointers(me);
 }
 
-static void rna_Mesh_clone_uv_texture_index_set(PointerRNA *ptr, int value)
+static void rna_Mesh_uv_texture_clone_index_set(PointerRNA *ptr, int value)
 {
        Mesh *me= (Mesh*)ptr->data;
        CustomData *fdata= rna_mesh_fdata(me);
 
        CustomData_set_layer_clone(fdata, CD_MTFACE, value);
-       mesh_update_customdata_pointers(me);
+}
+
+static void rna_Mesh_uv_texture_stencil_index_set(PointerRNA *ptr, int value)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *fdata= rna_mesh_fdata(me);
+
+       CustomData_set_layer_stencil(fdata, CD_MTFACE, value);
 }
 
 static void rna_Mesh_active_uv_texture_index_range(PointerRNA *ptr, int *min, int *max)
@@ -1593,17 +1631,25 @@ static void rna_def_mesh(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Active UV Texture Index", "Active UV texture index.");
        RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 
-       prop= RNA_def_property(srna, "clone_uv_texture", PROP_POINTER, PROP_UNSIGNED);
+       prop= RNA_def_property(srna, "uv_texture_clone", PROP_POINTER, PROP_UNSIGNED);
        RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
-       RNA_def_property_pointer_funcs(prop, "rna_Mesh_clone_uv_texture_get", "rna_Mesh_clone_uv_texture_set", NULL);
+       RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_clone_get", "rna_Mesh_uv_texture_clone_set", NULL);
        RNA_def_property_flag(prop, PROP_EDITABLE);
        RNA_def_property_ui_text(prop, "Clone UV Texture", "UV texture to be used as cloning source.");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 
-       prop= RNA_def_property(srna, "clone_uv_texture_index", PROP_INT, PROP_UNSIGNED);
-       RNA_def_property_int_funcs(prop, "rna_Mesh_clone_uv_texture_index_get", "rna_Mesh_clone_uv_texture_index_set", "rna_Mesh_active_uv_texture_index_range");
+       prop= RNA_def_property(srna, "uv_texture_clone_index", PROP_INT, PROP_UNSIGNED);
+       RNA_def_property_int_funcs(prop, "rna_Mesh_uv_texture_clone_index_get", "rna_Mesh_uv_texture_clone_index_set", "rna_Mesh_active_uv_texture_index_range");
        RNA_def_property_ui_text(prop, "Clone UV Texture Index", "Clone UV texture index.");
-       RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+
+       prop= RNA_def_property(srna, "uv_texture_stencil", PROP_POINTER, PROP_UNSIGNED);
+       RNA_def_property_struct_type(prop, "MeshTextureFaceLayer");
+       RNA_def_property_pointer_funcs(prop, "rna_Mesh_uv_texture_stencil_get", "rna_Mesh_uv_texture_stencil_set", NULL);
+       RNA_def_property_flag(prop, PROP_EDITABLE);
+       RNA_def_property_ui_text(prop, "Mask UV Texture", "UV texture to mask the painted area.");
+
+       prop= RNA_def_property(srna, "uv_texture_stencil_index", PROP_INT, PROP_UNSIGNED);
+       RNA_def_property_int_funcs(prop, "rna_Mesh_uv_texture_stencil_index_get", "rna_Mesh_uv_texture_stencil_index_set", "rna_Mesh_active_uv_texture_index_range");
+       RNA_def_property_ui_text(prop, "Mask UV Texture Index", "Mask UV texture index.");
 
        /* Vertex colors */
 
index c8fb11ced9586644115441a4efbe53b147ba8305..13c3b15549b8e969df9b742c59ad09d61fb9bd63 100644 (file)
@@ -315,11 +315,11 @@ static void rna_def_image_paint(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Normal", "Paint most on faces pointing towards the view");
        
        prop= RNA_def_property(srna, "use_stencil_layer", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_STENCIL);
        RNA_def_property_ui_text(prop, "Stencil Layer", "Set the mask layer from the UV layer buttons");
        
        prop= RNA_def_property(srna, "invert_stencil", PROP_BOOLEAN, PROP_NONE);
-       RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_MASK_INV);
+       RNA_def_property_boolean_sdna(prop, NULL, "flag", IMAGEPAINT_PROJECT_LAYER_STENCIL_INV);
        RNA_def_property_ui_text(prop, "Invert", "Invert the stencil layer");
        
        prop= RNA_def_property(srna, "use_clone_layer", PROP_BOOLEAN, PROP_NONE);