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);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to