[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [60955] trunk/blender/source/blender/ python/bmesh: Expose MVertSkin customdata layer in Python.

Andrew Hale TrumanBlending at gmail.com
Sun Oct 27 13:16:45 CET 2013


Revision: 60955
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=60955
Author:   trumanblending
Date:     2013-10-27 12:16:45 +0000 (Sun, 27 Oct 2013)
Log Message:
-----------
Expose MVertSkin customdata layer in Python. This allows scripts to change parameters which are used by the skin modifier (such as radius)

Modified Paths:
--------------
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.c
    trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.h

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2013-10-27 10:01:35 UTC (rev 60954)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_customdata.c	2013-10-27 12:16:45 UTC (rev 60955)
@@ -113,6 +113,9 @@
 PyDoc_STRVAR(bpy_bmlayeraccess_collection__color_doc,
 "Accessor for vertex color layer.\n\ntype: :class:`BMLayerCollection`"
 );
+PyDoc_STRVAR(bpy_bmlayeraccess_collection__skin_doc,
+"Accessor for skin 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`"
@@ -192,6 +195,7 @@
 
 	{(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},
 
 	{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
 };
@@ -1030,6 +1034,11 @@
 			ret = PyFloat_FromDouble(*(float *)value);
 			break;
 		}
+		case CD_MVERT_SKIN:
+		{
+			ret = BPy_BMVertSkin_CreatePyObject(value);
+			break;
+		}
 		default:
 		{
 			ret = Py_NotImplemented; /* TODO */
@@ -1147,6 +1156,11 @@
 			}
 			break;
 		}
+		case CD_MVERT_SKIN:
+		{
+			ret = BPy_BMVertSkin_AssignPyObject(value, py_value);
+			break;
+		}
 		default:
 		{
 			PyErr_SetString(PyExc_AttributeError, "readonly / unsupported type");

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.c
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.c	2013-10-27 10:01:35 UTC (rev 60954)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.c	2013-10-27 12:16:45 UTC (rev 60955)
@@ -248,6 +248,115 @@
 
 /* --- End Mesh Loop UV --- */
 
+/* Mesh Vert Skin
+ * ************ */
+
+#define BPy_BMVertSkin_Check(v)  (Py_TYPE(v) == &BPy_BMVertSkin_Type)
+
+typedef struct BPy_BMVertSkin {
+	PyObject_VAR_HEAD
+	MVertSkin *data;
+} BPy_BMVertSkin;
+
+PyDoc_STRVAR(bpy_bmvertskin_radius_doc,
+"Vert skin radii (as a 2D Vector).\n\n:type: :class:`mathutils.Vector`"
+);
+static PyObject *bpy_bmvertskin_radius_get(BPy_BMVertSkin *self, void *UNUSED(closure))
+{
+	return Vector_CreatePyObject(self->data->radius, 2, Py_WRAP, NULL);
+}
+
+static int bpy_bmvertskin_radius_set(BPy_BMVertSkin *self, PyObject *value, void *UNUSED(closure))
+{
+	float tvec[2];
+	if (mathutils_array_parse(tvec, 2, 2, value, "BMVertSkin.radius") != -1) {
+		copy_v2_v2(self->data->radius, tvec);
+		return 0;
+	}
+	else {
+		return -1;
+	}
+}
+
+PyDoc_STRVAR(bpy_bmvertskin_flag__use_root_doc,
+"Use as root vertex.\n\n:type: boolean"
+);
+PyDoc_STRVAR(bpy_bmvertskin_flag__use_loose_doc,
+"Use loose vertex.\n\n:type: boolean"
+);
+
+static PyObject *bpy_bmvertskin_flag_get(BPy_BMVertSkin *self, void *flag_p)
+{
+	const int flag = GET_INT_FROM_POINTER(flag_p);
+	return PyBool_FromLong(self->data->flag & flag);
+}
+
+static int bpy_bmvertskin_flag_set(BPy_BMVertSkin *self, PyObject *value, void *flag_p)
+{
+	const int flag = GET_INT_FROM_POINTER(flag_p);
+
+	switch (PyLong_AsLong(value)) {
+		case true:
+			self->data->flag |= flag;
+			return 0;
+		case false:
+			self->data->flag &= ~flag;
+			return 0;
+		default:
+			PyErr_SetString(PyExc_TypeError,
+			                "expected a boolean type 0/1");
+			return -1;
+	}
+}
+
+/* XXX Todo: Make root settable, currently the code to disable all other verts as roots sits within the modifier */
+static PyGetSetDef bpy_bmvertskin_getseters[] = {
+	/* attributes match rna_mesh_gen  */
+	{(char *)"radius",    (getter)bpy_bmvertskin_radius_get, (setter)bpy_bmvertskin_radius_set, (char *)bpy_bmvertskin_radius_doc, NULL},
+	{(char *)"use_root",  (getter)bpy_bmvertskin_flag_get,   (setter)NULL,					   (char *)bpy_bmvertskin_flag__use_root_doc,  (void *)MVERT_SKIN_ROOT},
+	{(char *)"use_loose", (getter)bpy_bmvertskin_flag_get,   (setter)bpy_bmvertskin_flag_set,   (char *)bpy_bmvertskin_flag__use_loose_doc, (void *)MVERT_SKIN_LOOSE},
+
+	{NULL, NULL, NULL, NULL, NULL} /* Sentinel */
+};
+
+PyTypeObject BPy_BMVertSkin_Type = {{{0}}}; /* bm.loops.layers.uv.active */
+
+static void bm_init_types_bmvertskin(void)
+{
+	BPy_BMVertSkin_Type.tp_basicsize = sizeof(BPy_BMVertSkin);
+
+	BPy_BMVertSkin_Type.tp_name = "BMVertSkin";
+
+	BPy_BMVertSkin_Type.tp_doc = NULL; // todo
+
+	BPy_BMVertSkin_Type.tp_getset = bpy_bmvertskin_getseters;
+
+	BPy_BMVertSkin_Type.tp_flags = Py_TPFLAGS_DEFAULT;
+
+	PyType_Ready(&BPy_BMVertSkin_Type);
+}
+
+int BPy_BMVertSkin_AssignPyObject(struct MVertSkin *mvertskin, PyObject *value)
+{
+	if (UNLIKELY(!BPy_BMVertSkin_Check(value))) {
+		PyErr_Format(PyExc_TypeError, "expected BMVertSkin, not a %.200s", Py_TYPE(value)->tp_name);
+		return -1;
+	}
+	else {
+		*((MVertSkin *)mvertskin) = *(((BPy_BMVertSkin *)value)->data);
+		return 0;
+	}
+}
+
+PyObject *BPy_BMVertSkin_CreatePyObject(struct MVertSkin *mvertskin)
+{
+	BPy_BMVertSkin *self = PyObject_New(BPy_BMVertSkin, &BPy_BMVertSkin_Type);
+	self->data = mvertskin;
+	return (PyObject *)self;
+}
+
+/* --- End Mesh Vert Skin --- */
+
 /* Mesh Loop Color
  * *************** */
 
@@ -692,5 +801,6 @@
 	bm_init_types_bmloopuv();
 	bm_init_types_bmloopcol();
 	bm_init_types_bmdvert();
+	bm_init_types_bmvertskin();
 }
 

Modified: trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.h
===================================================================
--- trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.h	2013-10-27 10:01:35 UTC (rev 60954)
+++ trunk/blender/source/blender/python/bmesh/bmesh_py_types_meshdata.h	2013-10-27 12:16:45 UTC (rev 60955)
@@ -51,6 +51,9 @@
 int       BPy_BMLoopUV_AssignPyObject(struct MLoopUV *data, PyObject *value);
 PyObject *BPy_BMLoopUV_CreatePyObject(struct MLoopUV *data);
 
+int       BPy_BMVertSkin_AssignPyObject(struct MVertSkin *data, PyObject *value);
+PyObject *BPy_BMVertSkin_CreatePyObject(struct MVertSkin *data);
+
 int       BPy_BMLoopColor_AssignPyObject(struct MLoopCol *data, PyObject *value);
 PyObject *BPy_BMLoopColor_CreatePyObject(struct MLoopCol *data);
 




More information about the Bf-blender-cvs mailing list