Revision: 37170
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=37170
Author:   jwilkins
Date:     2011-06-04 06:41:58 +0000 (Sat, 04 Jun 2011)
Log Message:
-----------
Revision: 29579
Author: nicholasbishop
Date: 12:42:24 PM, Sunday, June 20, 2010
Message:
* Added mesh rna for paint masks
* Added operators to add/remove paint mask layers
* Added UI to select paint mask layer and add/remove

Note that this commit doesn't include the code for actually using multiple 
layers in sculpt mode.

** jwilkins:
** sculpt_mask.c included stdint.h, which does not come with MSVC 2008, but it 
seems it isn't needed to compile

Modified Paths:
--------------
    
branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_intern.h
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_mask.c
    branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_ops.c
    branches/soc-2011-onion/source/blender/makesrna/intern/rna_mesh.c

Property Changed:
----------------
    branches/soc-2011-onion/


Property changes on: branches/soc-2011-onion
___________________________________________________________________
Modified: svn:mergeinfo
   - /branches/soc-2010-jwilkins:28499-37009
/branches/soc-2010-nicolasbishop:28448-29483,29503,29514,29536,29572-29574
/trunk/blender:36833-37054
   + /branches/soc-2010-jwilkins:28499-37009
/branches/soc-2010-nicolasbishop:28448-29483,29503,29514,29536,29572-29574,29579
/trunk/blender:36833-37054

Modified: 
branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py
===================================================================
--- 
branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py   
    2011-06-04 06:25:24 UTC (rev 37169)
+++ 
branches/soc-2011-onion/release/scripts/startup/bl_ui/space_view3d_toolbar.py   
    2011-06-04 06:41:58 UTC (rev 37170)
@@ -715,9 +715,20 @@
         layout = self.layout
 
         settings = self.paint_settings(context)
+        mesh = context.object.data
 
+        row = layout.row()
+
+        col = row.column()
+        col.label("Mask:")
+        col.template_list(mesh, "paint_mask_layers", mesh, 
"active_paint_mask_index", rows=2)
+
+        col = row.column(align=True)
+        col.operator("paint.mask_layer_add", icon='ZOOMIN', text="")
+        col.operator("paint.mask_layer_remove", icon='ZOOMOUT', text="")
+
         col = layout.column()
-        col.label("Masking:")
+        col.active = mesh.active_paint_mask_index != -1
         col.operator("paint.mask_set", text="Clear").mode = 'CLEAR'
         col.operator("paint.mask_set", text="Fill").mode = 'FILL'
         col.operator("paint.mask_set", text="Invert").mode = 'INVERT'
@@ -726,7 +737,7 @@
         if context.sculpt_object:
             layout.separator()
             col = layout.column()
-            col.label("Hiding:")
+            col.label("Hide:")
             col.operator("sculpt.area_hide", text="Show Hidden 
Areas").show_all = True
             col.operator("sculpt.area_hide", text="Select Area to Show")
             col.operator("sculpt.area_hide", text="Select Area to 
Hide").hide_inside = True

Modified: 
branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
--- branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_intern.h  
2011-06-04 06:25:24 UTC (rev 37169)
+++ branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_intern.h  
2011-06-04 06:41:58 UTC (rev 37170)
@@ -143,6 +143,9 @@
 void undo_paint_push_end(int type);
 
 /* paint_mask.c */
+void PAINT_OT_mask_layer_add(struct wmOperatorType *ot);
+void PAINT_OT_mask_layer_remove(struct wmOperatorType *ot);
+
 /* For now this is just temporary stuff to test masking */
 typedef enum {
        MASKING_CLEAR,

Modified: 
branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_mask.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_mask.c    
2011-06-04 06:25:24 UTC (rev 37169)
+++ branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_mask.c    
2011-06-04 06:41:58 UTC (rev 37170)
@@ -1,3 +1,7 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
 #include "DNA_mesh_types.h"
 #include "DNA_meshdata_types.h"
 #include "DNA_object_types.h"
@@ -19,12 +23,9 @@
 
 #include "BLI_pbvh.h"
 
+#include "ED_mesh.h"
 #include "paint_intern.h"
 
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-
 static void set_mask_value(MaskSetMode mode, float *m)
 {
        *m = (mode == MASKING_CLEAR ? 1 :
@@ -115,3 +116,67 @@
        /* properties */
        RNA_def_enum(ot->srna, "mode", mask_items, MASKING_CLEAR, "Mode", "");
 }
+
+static int mask_layer_poll(bContext *C)
+{
+       return mask_poll(C) && ED_mesh_layers_poll(C);
+}
+
+static int mask_layer_add_exec(bContext *C, wmOperator *op)
+{
+       Object *ob= CTX_data_active_object(C);
+       Mesh *me= ob->data;
+       int top;
+
+       top= CustomData_number_of_layers(&me->vdata, CD_PAINTMASK);
+       CustomData_add_layer(&me->vdata, CD_PAINTMASK, CD_DEFAULT, NULL, 
me->totvert);
+       CustomData_set_layer_active(&me->vdata, CD_PAINTMASK, top);
+
+       return OPERATOR_FINISHED;
+}
+
+void PAINT_OT_mask_layer_add(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Add Mask Layer";
+       ot->description= "Add a paint mask layer";
+       ot->idname= "PAINT_OT_mask_layer_add";
+       
+       /* api callbacks */
+       ot->poll= mask_layer_poll;
+       ot->exec= mask_layer_add_exec;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}
+
+static int mask_layer_remove_exec(bContext *C, wmOperator *op)
+{
+       Object *ob= CTX_data_active_object(C);
+       Mesh *me= ob->data;
+       int active;
+
+       active = CustomData_get_active_layer_index(&me->vdata, CD_PAINTMASK);
+       
+       if(active >= 0)
+               CustomData_free_layer_active(&me->vdata, CD_PAINTMASK, 
me->totvert);
+       else
+               return OPERATOR_CANCELLED;
+
+       return OPERATOR_FINISHED;
+}
+
+void PAINT_OT_mask_layer_remove(wmOperatorType *ot)
+{
+       /* identifiers */
+       ot->name= "Remove Mask Layer";
+       ot->description= "Remove the active paint mask layer";
+       ot->idname= "PAINT_OT_mask_layer_remove";
+       
+       /* api callbacks */
+       ot->poll= mask_layer_poll;
+       ot->exec= mask_layer_remove_exec;
+
+       /* flags */
+       ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
+}

Modified: 
branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_ops.c
===================================================================
--- branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_ops.c     
2011-06-04 06:25:24 UTC (rev 37169)
+++ branches/soc-2011-onion/source/blender/editors/sculpt_paint/paint_ops.c     
2011-06-04 06:41:58 UTC (rev 37170)
@@ -387,6 +387,8 @@
        WM_operatortype_append(PAINT_OT_face_select_reveal);
 
        /* mask */
+       WM_operatortype_append(PAINT_OT_mask_layer_add);
+       WM_operatortype_append(PAINT_OT_mask_layer_remove);
        WM_operatortype_append(PAINT_OT_mask_set);
 }
 

Modified: branches/soc-2011-onion/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- branches/soc-2011-onion/source/blender/makesrna/intern/rna_mesh.c   
2011-06-04 06:25:24 UTC (rev 37169)
+++ branches/soc-2011-onion/source/blender/makesrna/intern/rna_mesh.c   
2011-06-04 06:41:58 UTC (rev 37170)
@@ -309,18 +309,21 @@
        return (me->edit_mesh)? &me->edit_mesh->fdata: &me->fdata;
 }
 
-static int rna_CustomDataLayer_length(PointerRNA *ptr, int type)
+static CustomData *rna_mesh_vdata(Mesh *me)
 {
-       Mesh *me= (Mesh*)ptr->id.data;
-       CustomData *fdata= rna_mesh_fdata(me);
-       CustomDataLayer *layer;
-       int i, length= 0;
+       return (me->edit_mesh)? &me->edit_mesh->vdata: &me->vdata;
+}
 
-       for(layer=fdata->layers, i=0; i<fdata->totlayer; layer++, i++)
-               if(layer->type == type)
-                       length++;
+static int rna_face_CustomDataLayer_count(PointerRNA *ptr, int type)
+{
+       CustomData *fdata= rna_mesh_fdata(ptr->id.data);
+       return CustomData_number_of_layers(fdata, type);
+}
 
-       return length;
+static int rna_vert_CustomDataLayer_count(PointerRNA *ptr, int type)
+{
+       CustomData *vdata= rna_mesh_vdata(ptr->id.data);
+       return CustomData_number_of_layers(vdata, type);
 }
 
 static int rna_CustomDataLayer_active_get(PointerRNA *ptr, int type, int 
render)
@@ -382,7 +385,7 @@
 
 static int rna_Mesh_uv_textures_length(PointerRNA *ptr)
 {
-       return rna_CustomDataLayer_length(ptr, CD_MTFACE);
+       return rna_face_CustomDataLayer_count(ptr, CD_MTFACE);
 }
 
 static PointerRNA rna_Mesh_active_uv_texture_get(PointerRNA *ptr)
@@ -705,7 +708,7 @@
 
 static int rna_Mesh_vertex_colors_length(PointerRNA *ptr)
 {
-       return rna_CustomDataLayer_length(ptr, CD_MCOL);
+       return rna_face_CustomDataLayer_count(ptr, CD_MCOL);
 }
 
 static PointerRNA rna_Mesh_active_vertex_color_get(PointerRNA *ptr)
@@ -802,6 +805,89 @@
        CustomData_set_layer_unique_name(fdata, cdl - fdata->layers);
 }
 
+/* Paint mask layer */
+
+static int rna_MeshPaintMaskLayer_data_get_length(PointerRNA *ptr, int 
length[RNA_MAX_ARRAY_DIMENSION])
+{
+       Mesh *me= (Mesh*)ptr->id.data;
+
+       length[0] = me->totvert;
+
+       return length[0];
+}
+
+static void rna_MeshPaintMaskLayer_data_get(PointerRNA *ptr, float *values)
+{
+       Mesh *me= (Mesh*)ptr->id.data;
+       CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
+
+       memcpy(values, layer->data, me->totvert * sizeof(float));
+}
+
+static void rna_MeshPaintMaskLayer_data_set(PointerRNA *ptr, const float 
*values)
+{
+       Mesh *me= (Mesh*)ptr->id.data;
+       CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
+
+       memcpy(layer->data, values, me->totvert * sizeof(float));
+}
+
+static char *rna_MeshPaintMask_path(PointerRNA *ptr)
+{
+       CustomDataLayer *layer= (CustomDataLayer*)ptr->data;
+
+       return BLI_sprintfN("paintmask[%d]", (float*)ptr->data - 
(float*)layer->data);
+}
+
+static int rna_mask_layer_check(CollectionPropertyIterator *iter, void *data)
+{
+       CustomDataLayer *layer= (CustomDataLayer*)data;
+       return (layer->type != CD_PAINTMASK);
+}
+
+
+static void rna_Mesh_mask_layers_begin(CollectionPropertyIterator *iter, 
PointerRNA *ptr)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *vdata= rna_mesh_vdata(me);
+       rna_iterator_array_begin(iter, (void*)vdata->layers,
+                                sizeof(CustomDataLayer),
+                                vdata->totlayer, 0,
+                                rna_mask_layer_check);
+}
+
+static int rna_Mesh_mask_layers_length(PointerRNA *ptr)
+{
+       return rna_vert_CustomDataLayer_count(ptr, CD_PAINTMASK);
+}
+
+static int rna_Mesh_active_paint_mask_index_get(PointerRNA *ptr)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *vdata= rna_mesh_vdata(me);
+       return CustomData_get_active_layer(vdata, CD_PAINTMASK);
+}
+
+static void rna_Mesh_active_paint_mask_index_set(PointerRNA *ptr, int value)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *vdata= rna_mesh_vdata(me);
+
+       CustomData_set_layer_active(vdata, CD_PAINTMASK, value);
+}
+
+static void rna_Mesh_active_paint_mask_index_range(PointerRNA *ptr, int *min, 
int *max)
+{
+       Mesh *me= (Mesh*)ptr->data;
+       CustomData *vdata= rna_mesh_vdata(me);
+
+       *min= 0;
+       *max= CustomData_number_of_layers(vdata, CD_PAINTMASK)-1;
+       *max= MAX2(0, *max);
+}
+
+/* Custom property layers */
+
 static void rna_MeshFloatPropertyLayer_data_begin(CollectionPropertyIterator 
*iter, PointerRNA *ptr)
 {
        Mesh *me= (Mesh*)ptr->id.data;
@@ -830,7 +916,7 @@
 
 static int rna_Mesh_float_layers_length(PointerRNA *ptr)
 {
-       return rna_CustomDataLayer_length(ptr, CD_PROP_FLT);
+       return rna_face_CustomDataLayer_count(ptr, CD_PROP_FLT);
 }
 
 static int rna_int_layer_check(CollectionPropertyIterator *UNUSED(iter), void 
*data)
@@ -861,7 +947,7 @@
 
 static int rna_Mesh_int_layers_length(PointerRNA *ptr)
 {

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to