[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [29579] branches/soc-2010-nicolasbishop: * Added mesh rna for paint masks

Nicholas Bishop nicholasbishop at gmail.com
Sun Jun 20 19:42:25 CEST 2010


Revision: 29579
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=29579
Author:   nicholasbishop
Date:     2010-06-20 19:42:24 +0200 (Sun, 20 Jun 2010)

Log 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.

Modified Paths:
--------------
    branches/soc-2010-nicolasbishop/release/scripts/ui/space_view3d_toolbar.py
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c
    branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c
    branches/soc-2010-nicolasbishop/source/blender/makesrna/intern/rna_mesh.c

Modified: branches/soc-2010-nicolasbishop/release/scripts/ui/space_view3d_toolbar.py
===================================================================
--- branches/soc-2010-nicolasbishop/release/scripts/ui/space_view3d_toolbar.py	2010-06-20 15:38:49 UTC (rev 29578)
+++ branches/soc-2010-nicolasbishop/release/scripts/ui/space_view3d_toolbar.py	2010-06-20 17:42:24 UTC (rev 29579)
@@ -498,8 +498,19 @@
         layout = self.layout
 
         settings = self.paint_settings(context)
+        mesh = context.object.data
 
+        row = layout.row()
+
+        col = row.column()
+        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="")
+
         row = layout.row(align=True)
+        row.active = mesh.active_paint_mask_index != -1
         row.operator("paint.mask_set", text="Clear").mode = 'CLEAR'
         row.operator("paint.mask_set", text="Fill").mode = 'FILL'
         row.operator("paint.mask_set", text="Invert").mode = 'INVERT'

Modified: branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h	2010-06-20 15:38:49 UTC (rev 29578)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_intern.h	2010-06-20 17:42:24 UTC (rev 29579)
@@ -123,6 +123,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-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c	2010-06-20 15:38:49 UTC (rev 29578)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_mask.c	2010-06-20 17:42:24 UTC (rev 29579)
@@ -1,3 +1,8 @@
+#include <stdint.h>
+#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 +24,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 :
@@ -114,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-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c	2010-06-20 15:38:49 UTC (rev 29578)
+++ branches/soc-2010-nicolasbishop/source/blender/editors/sculpt_paint/paint_ops.c	2010-06-20 17:42:24 UTC (rev 29579)
@@ -141,6 +141,8 @@
 	WM_operatortype_append(PAINT_OT_face_select_all);
 
 	/* 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-2010-nicolasbishop/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- branches/soc-2010-nicolasbishop/source/blender/makesrna/intern/rna_mesh.c	2010-06-20 15:38:49 UTC (rev 29578)
+++ branches/soc-2010-nicolasbishop/source/blender/makesrna/intern/rna_mesh.c	2010-06-20 17:42:24 UTC (rev 29579)
@@ -288,18 +288,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)
@@ -361,7 +364,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)
@@ -685,7 +688,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)
@@ -782,6 +785,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;
@@ -810,7 +896,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 *iter, void *data)
@@ -841,7 +927,7 @@
 
 static int rna_Mesh_int_layers_length(PointerRNA *ptr)
 {
-	return rna_CustomDataLayer_length(ptr, CD_PROP_INT);
+	return rna_face_CustomDataLayer_count(ptr, CD_PROP_INT);
 }
 
 static int rna_string_layer_check(CollectionPropertyIterator *iter, void *data)
@@ -872,7 +958,7 @@
 
 static int rna_Mesh_string_layers_length(PointerRNA *ptr)
 {
-	return rna_CustomDataLayer_length(ptr, CD_PROP_STR);
+	return rna_face_CustomDataLayer_count(ptr, CD_PROP_STR);
 }
 
 static void rna_TextureFace_image_set(PointerRNA *ptr, PointerRNA value)
@@ -1516,6 +1602,29 @@
 	RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 }
 
+static void rna_def_paintmask(BlenderRNA *brna)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna= RNA_def_struct(brna, "MeshPaintMaskLayer", NULL);
+	RNA_def_struct_sdna(srna, "CustomDataLayer");
+	RNA_def_struct_ui_text(srna, "Mesh Paint Mask Layer", "");

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list