[Bf-blender-cvs] [7f2f9f0] gooseberry: Exposing customdata mask layer (CD_PAINT_MASK) to Python API

Campbell Barton noreply at git.blender.org
Sat Nov 8 22:27:58 CET 2014


Commit: 7f2f9f0acdc42f54625e1a71592ea9919173879f
Author: Campbell Barton
Date:   Mon Nov 3 23:31:55 2014 +0100
Branches: gooseberry
https://developer.blender.org/rB7f2f9f0acdc42f54625e1a71592ea9919173879f

Exposing customdata mask layer (CD_PAINT_MASK) to Python API

There are several more or less new customdata layers that currently cannot be accessed via Python (or some are exposed via BMesh API but not via Mesh API). This patch aims to expose one of those layers - CD_PAINT_MASK.
It'd be pretty useful for existing and future addons targeting sculpt workflow. Currently to get some access to the mask we employ a hackish approach via hiding/revealing masked vertices, this adds mode switches and doesn't allow to get actual mask values which could be useful if converted into vertex group weights for later use in e.g. modifiers. With this patch we'd be able to access mask data directly.

Reviewers: campbellbarton

Reviewed By: campbellbarton

Subscribers: radcapricorn

Projects: #bf_blender

Differential Revision: https://developer.blender.org/D782

===================================================================

M	source/blender/makesrna/intern/rna_mesh.c
M	source/blender/python/bmesh/bmesh_py_types_customdata.c

===================================================================

diff --git a/source/blender/makesrna/intern/rna_mesh.c b/source/blender/makesrna/intern/rna_mesh.c
index b0b99dc..aaca7d1 100644
--- a/source/blender/makesrna/intern/rna_mesh.c
+++ b/source/blender/makesrna/intern/rna_mesh.c
@@ -1136,6 +1136,37 @@ static int rna_MeshSkinVertexLayer_data_length(PointerRNA *ptr)
 
 /* End skin vertices */
 
+/* Paint mask */
+DEFINE_CUSTOMDATA_LAYER_COLLECTION(vertex_paint_mask, vdata, CD_PAINT_MASK)
+
+static char *rna_MeshPaintMaskLayer_path(PointerRNA *ptr)
+{
+	CustomDataLayer *cdl = ptr->data;
+	char name_esc[sizeof(cdl->name) * 2];
+	BLI_strescape(name_esc, cdl->name, sizeof(name_esc));
+	return BLI_sprintfN("vertex_paint_masks[\"%s\"]", name_esc);
+}
+
+static char *rna_MeshPaintMask_path(PointerRNA *ptr)
+{
+	return rna_VertCustomData_data_path(ptr, "vertex_paint_masks", CD_PAINT_MASK);
+}
+
+static void rna_MeshPaintMaskLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+	Mesh *me = rna_mesh(ptr);
+	CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
+	rna_iterator_array_begin(iter, layer->data, sizeof(MFloatProperty), me->totvert, 0, NULL);
+}
+
+static int rna_MeshPaintMaskLayer_data_length(PointerRNA *ptr)
+{
+	Mesh *me = rna_mesh(ptr);
+	return me->totvert;
+}
+
+/* End paint mask */
+
 static void rna_TexturePoly_image_set(PointerRNA *ptr, PointerRNA value)
 {
 	MTexPoly *tf = (MTexPoly *)ptr->data;
@@ -1690,6 +1721,7 @@ static void UNUSED_FUNCTION(rna_mesh_unused)(void)
 {
 	/* unused functions made by macros */
 	(void)rna_Mesh_skin_vertice_index_range;
+	(void)rna_Mesh_vertex_paint_mask_index_range;
 	(void)rna_Mesh_tessface_uv_texture_active_set;
 	(void)rna_Mesh_tessface_uv_texture_clone_get;
 	(void)rna_Mesh_tessface_uv_texture_clone_index_get;
@@ -3005,6 +3037,36 @@ static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *UNUSED(cprop))
 	RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 }
 
+static void rna_def_paint_mask(BlenderRNA *brna, PropertyRNA *UNUSED(cprop))
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "MeshPaintMaskLayer", NULL);
+	RNA_def_struct_ui_text(srna, "Mesh Paint Mask Layer", "Per-vertex paint mask data");
+	RNA_def_struct_sdna(srna, "CustomDataLayer");
+	RNA_def_struct_path_func(srna, "rna_MeshPaintMaskLayer_path");
+
+	prop = RNA_def_property(srna, "data", PROP_COLLECTION, PROP_NONE);
+	RNA_def_property_struct_type(prop, "MeshPaintMaskProperty");
+	RNA_def_property_ui_text(prop, "Data", "");
+
+	RNA_def_property_collection_funcs(prop, "rna_MeshPaintMaskLayer_data_begin", "rna_iterator_array_next",
+	                                  "rna_iterator_array_end", "rna_iterator_array_get",
+	                                  "rna_MeshPaintMaskLayer_data_length", NULL, NULL, NULL);
+
+	srna = RNA_def_struct(brna, "MeshPaintMaskProperty", NULL);
+	RNA_def_struct_sdna(srna, "MFloatProperty");
+	RNA_def_struct_ui_text(srna, "Mesh Paint Mask Property",
+	                       "Floating point paint mask value");
+	RNA_def_struct_path_func(srna, "rna_MeshPaintMask_path");
+
+	prop = RNA_def_property(srna, "value", PROP_FLOAT, PROP_NONE);
+	RNA_def_property_float_sdna(prop, NULL, "f");
+	RNA_def_property_ui_text(prop, "Value", "");
+	RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
+}
+
 static void rna_def_mesh(BlenderRNA *brna)
 {
 	StructRNA *srna;
@@ -3185,6 +3247,16 @@ static void rna_def_mesh(BlenderRNA *brna)
 	rna_def_skin_vertices(brna, prop);
 	/* End skin vertices */
 
+	/* Paint mask */
+	prop = RNA_def_property(srna, "vertex_paint_masks", PROP_COLLECTION, PROP_NONE);
+	RNA_def_property_collection_sdna(prop, NULL, "vdata.layers", "vdata.totlayer");
+	RNA_def_property_collection_funcs(prop, "rna_Mesh_vertex_paint_masks_begin", NULL, NULL, NULL,
+	                                  "rna_Mesh_vertex_paint_masks_length", NULL, NULL, NULL);
+	RNA_def_property_struct_type(prop, "MeshPaintMaskLayer");
+	RNA_def_property_ui_text(prop, "Vertex Paint Mask", "Vertex paint mask");
+	rna_def_paint_mask(brna, prop);
+	/* End paint mask */
+
 	prop = RNA_def_property(srna, "use_auto_smooth", PROP_BOOLEAN, PROP_NONE);
 	RNA_def_property_boolean_sdna(prop, NULL, "flag", ME_AUTOSMOOTH);
 	RNA_def_property_ui_text(prop, "Auto Smooth",
diff --git a/source/blender/python/bmesh/bmesh_py_types_customdata.c b/source/blender/python/bmesh/bmesh_py_types_customdata.c
index 6ecb01a..c4a6653 100644
--- a/source/blender/python/bmesh/bmesh_py_types_customdata.c
+++ b/source/blender/python/bmesh/bmesh_py_types_customdata.c
@@ -115,6 +115,9 @@ PyDoc_STRVAR(bpy_bmlayeraccess_collection__color_doc,
 PyDoc_STRVAR(bpy_bmlayeraccess_collection__skin_doc,
 "Accessor for skin layer.\n\ntype: :class:`BMLayerCollection`"
 );
+PyDoc_STRVAR(bpy_bmlayeraccess_collection__paint_mask_doc,
+"Accessor for paint mask layer.\n\ntype: :class:`BMLayerCollection`"
+);
 #ifdef WITH_FREESTYLE
 PyDoc_STRVAR(bpy_bmlayeraccess_collection__freestyle_edge_doc,
 "Accessor for Freestyle edge layer.\n\ntype: :class:`BMLayerCollection`"
@@ -195,6 +198,7 @@ static PyGetSetDef bpy_bmlayeraccess_vert_getseters[] = {
 	{(char *)"shape",        (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__shape_doc, (void *)CD_SHAPEKEY},
 	{(char *)"bevel_weight", (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__bevel_weight_doc, (void *)CD_BWEIGHT},
 	{(char *)"skin",         (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__skin_doc, (void *)CD_MVERT_SKIN},
+	{(char *)"paint_mask",   (getter)bpy_bmlayeraccess_collection_get, (setter)NULL, (char *)bpy_bmlayeraccess_collection__paint_mask_doc, (void *)CD_PAINT_MASK},
 
 	{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
 };
@@ -981,6 +985,7 @@ PyObject *BPy_BMLayerItem_GetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer)
 			ret = BPy_BMDeformVert_CreatePyObject(value);
 			break;
 		}
+		case CD_PAINT_MASK:
 		case CD_PROP_FLT:
 		{
 			ret = PyFloat_FromDouble(*(float *)value);
@@ -1058,6 +1063,7 @@ int BPy_BMLayerItem_SetItem(BPy_BMElem *py_ele, BPy_BMLayerItem *py_layer, PyObj
 			ret = BPy_BMDeformVert_AssignPyObject(value, py_value);
 			break;
 		}
+		case CD_PAINT_MASK:
 		case CD_PROP_FLT:
 		{
 			float tmp_val = PyFloat_AsDouble(py_value);




More information about the Bf-blender-cvs mailing list