[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