[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46885] trunk/blender/source/blender: Add MVertSkin DNA/RNA and customdata (CD_MVERT_SKIN).

Nicholas Bishop nicholasbishop at gmail.com
Tue May 22 17:18:44 CEST 2012


Revision: 46885
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46885
Author:   nicholasbishop
Date:     2012-05-22 15:18:43 +0000 (Tue, 22 May 2012)
Log Message:
-----------
Add MVertSkin DNA/RNA and customdata (CD_MVERT_SKIN).

The MVertSkin currently just stores local skin radii and skin
flags (MVertSkinFlag).

Skin modifier documentation:
http://wiki.blender.org/index.php/User:Nicholasbishop/SkinModifier

Reviewed by Campbell Barton.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/makesdna/DNA_customdata_types.h
    trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
    trunk/blender/source/blender/makesrna/RNA_access.h
    trunk/blender/source/blender/makesrna/intern/rna_mesh.c

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-05-22 14:13:33 UTC (rev 46884)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-05-22 15:18:43 UTC (rev 46885)
@@ -992,6 +992,38 @@
 	}
 }
 
+static void layerDefault_mvert_skin(void *data, int count)
+{
+	MVertSkin *vs = data;
+	int i;
+	
+	for(i = 0; i < count; i++) {
+		copy_v3_fl(vs[i].radius, 0.25f);
+		vs[i].flag = 0;
+	}
+}
+ 
+static void layerInterp_mvert_skin(void **sources, float *weights,
+								   float *UNUSED(sub_weights),
+								   int count, void *dest)
+{
+	float radius[3], w;
+	MVertSkin *vs;
+	int i;
+
+	zero_v3(radius);
+	for(i = 0; i < count; i++) {
+		w = weights ? weights[i] : 1.0f;
+		vs = sources[i];
+
+		madd_v3_v3fl(radius, vs->radius, w);
+	}
+
+	vs = dest;
+	copy_v3_v3(vs->radius, radius);
+	vs->flag &= ~MVERT_SKIN_ROOT;
+}
+
 static const LayerTypeInfo LAYERTYPEINFO[CD_NUMTYPES] = {
 	/* 0: CD_MVERT */
 	{sizeof(MVert), "MVert", 1, NULL, NULL, NULL, NULL, NULL, NULL},
@@ -1093,7 +1125,10 @@
 	{sizeof(float), "", 0, NULL, NULL, NULL, NULL, NULL, NULL},
 	/* 35: CD_GRID_PAINT_MASK */
 	{sizeof(GridPaintMask), "GridPaintMask", 1, NULL, layerCopy_grid_paint_mask,
-	 layerFree_grid_paint_mask, NULL, NULL, NULL}
+	 layerFree_grid_paint_mask, NULL, NULL, NULL},
+	/* 36: CD_SKIN_NODE */
+	{sizeof(MVertSkin), "MVertSkin", 1, "Skin", NULL, NULL,
+	 layerInterp_mvert_skin, NULL, layerDefault_mvert_skin}
 };
 
 /* note, numbers are from trunk and need updating for bmesh */
@@ -1108,10 +1143,7 @@
 /* BMESH ONLY */
 	/* 25-29 */ "CDMPoly", "CDMLoop", "CDShapeKeyIndex", "CDShapeKey", "CDBevelWeight",
 	/* 30-34 */ "CDSubSurfCrease", "CDOrigSpaceLoop", "CDPreviewLoopCol", "CDBMElemPyPtr", "CDPaintMask",
-	/*    35 */ "CDGridPaintMask"
-
-/* END BMESH ONLY */
-
+	/* 35-36 */ "CDGridPaintMask", "CDMVertSkin"
 };
 
 
@@ -1123,7 +1155,7 @@
     CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR | CD_MASK_MDISPS |
     CD_MASK_MLOOPUV | CD_MASK_MLOOPCOL | CD_MASK_MPOLY | CD_MASK_MLOOP |
     CD_MASK_MTEXPOLY | CD_MASK_NORMAL | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN;
 const CustomDataMask CD_MASK_EDITMESH =
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE | CD_MASK_MLOOPUV |
     CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX |
@@ -1142,7 +1174,7 @@
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_PROP_FLT | CD_MASK_PROP_INT |
     CD_MASK_PROP_STR | CD_MASK_SHAPEKEY | CD_MASK_SHAPE_KEYINDEX | CD_MASK_MDISPS |
     CD_MASK_CREASE | CD_MASK_BWEIGHT | CD_MASK_RECAST | CD_MASK_PAINT_MASK |
-    CD_MASK_GRID_PAINT_MASK;
+    CD_MASK_GRID_PAINT_MASK | CD_MASK_MVERT_SKIN;
 const CustomDataMask CD_MASK_FACECORNERS =
     CD_MASK_MTFACE | CD_MASK_MCOL | CD_MASK_MTEXPOLY | CD_MASK_MLOOPUV |
     CD_MASK_MLOOPCOL;

Modified: trunk/blender/source/blender/makesdna/DNA_customdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_customdata_types.h	2012-05-22 14:13:33 UTC (rev 46884)
+++ trunk/blender/source/blender/makesdna/DNA_customdata_types.h	2012-05-22 15:18:43 UTC (rev 46885)
@@ -63,12 +63,11 @@
  * layers, each with a data type (e.g. MTFace, MDeformVert, etc.). */
 typedef struct CustomData {
 	CustomDataLayer *layers;      /* CustomDataLayers, ordered by type */
-	int typemap[36];              /* runtime only! - maps types to indices of first layer of that type,
+	int typemap[37];              /* runtime only! - maps types to indices of first layer of that type,
 	                               * MUST be >= CD_NUMTYPES, but we cant use a define here.
 	                               * Correct size is ensured in CustomData_update_typemap assert() */
-
 	int totlayer, maxlayer;       /* number of layers, size of layers array */
-	int totsize, pad2;             /* in editmode, total size of all data layers */
+	int totsize;                  /* in editmode, total size of all data layers */
 	void *pool;                   /* Bmesh: Memory pool for allocation of blocks */
 	CustomDataExternal *external; /* external file storing customdata layers */
 } CustomData;
@@ -114,9 +113,9 @@
 
 #define CD_PAINT_MASK	34
 #define CD_GRID_PAINT_MASK	35
+#define CD_MVERT_SKIN	36
+#define CD_NUMTYPES		37
 
-#define CD_NUMTYPES		36
-
 /* Bits for CustomDataMask */
 #define CD_MASK_MVERT		(1 << CD_MVERT)
 #define CD_MASK_MSTICKY		(1 << CD_MSTICKY)
@@ -156,6 +155,7 @@
 
 #define CD_MASK_PAINT_MASK		(1LL << CD_PAINT_MASK)
 #define CD_MASK_GRID_PAINT_MASK	(1LL << CD_GRID_PAINT_MASK)
+#define CD_MASK_MVERT_SKIN		(1LL << CD_MVERT_SKIN)
 
 /* CustomData.flag */
 

Modified: trunk/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2012-05-22 14:13:33 UTC (rev 46884)
+++ trunk/blender/source/blender/makesdna/DNA_meshdata_types.h	2012-05-22 15:18:43 UTC (rev 46885)
@@ -257,6 +257,27 @@
 	int pad;
 } GridPaintMask;
 
+typedef enum MVertSkinFlag {
+	/* Marks a vertex as the edge-graph root, used for calculating
+	   rotations for all connected edges (recursively.) Also used to
+	   choose a root when generating an armature. */
+	MVERT_SKIN_ROOT = 1,
+
+	/* Marks a branch vertex (vertex with more than two connected
+	   edges) so that it's neighbors are directly hulled together,
+	   rather than the default of generating intermediate frames. */
+	MVERT_SKIN_LOOSE = 2
+} MVertSkinFlag;
+
+typedef struct MVertSkin {
+	/* Radii of the skin, define how big the generated frames
+	   are. Currently only the first two elements are used. */
+	float radius[3];
+
+	/* MVertSkinFlag */
+	int flag;
+} MVertSkin;
+
 /* mvert->flag (1=SELECT) */
 #define ME_SPHERETEST		2
 #define ME_VERT_TMP_TAG		4

Modified: trunk/blender/source/blender/makesrna/RNA_access.h
===================================================================
--- trunk/blender/source/blender/makesrna/RNA_access.h	2012-05-22 14:13:33 UTC (rev 46884)
+++ trunk/blender/source/blender/makesrna/RNA_access.h	2012-05-22 15:18:43 UTC (rev 46885)
@@ -318,6 +318,8 @@
 extern StructRNA RNA_MeshFloatPropertyLayer;
 extern StructRNA RNA_MeshIntProperty;
 extern StructRNA RNA_MeshIntPropertyLayer;
+extern StructRNA RNA_MeshSkinVertexLayer;
+extern StructRNA RNA_MeshSkinVertex;
 extern StructRNA RNA_MeshSticky;
 extern StructRNA RNA_MeshStringProperty;
 extern StructRNA RNA_MeshStringPropertyLayer;

Modified: trunk/blender/source/blender/makesrna/intern/rna_mesh.c
===================================================================
--- trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2012-05-22 14:13:33 UTC (rev 46884)
+++ trunk/blender/source/blender/makesrna/intern/rna_mesh.c	2012-05-22 15:18:43 UTC (rev 46885)
@@ -76,6 +76,11 @@
 	return me;
 }
 
+static CustomData *rna_mesh_vdata_helper(Mesh *me)
+{
+	return (me->edit_btmesh) ? &me->edit_btmesh->bm->vdata : &me->vdata;
+}
+
 static CustomData *rna_mesh_pdata_helper(Mesh *me)
 {
 	return (me->edit_btmesh) ? &me->edit_btmesh->bm->pdata : &me->pdata;
@@ -91,6 +96,11 @@
 	return (me->edit_btmesh) ? NULL : &me->fdata;
 }
 
+static CustomData *rna_mesh_vdata(PointerRNA *ptr)
+{
+	Mesh *me = rna_mesh(ptr);
+	return rna_mesh_vdata_helper(me);
+}
 static CustomData *rna_mesh_pdata(PointerRNA *ptr)
 {
 	Mesh *me = rna_mesh(ptr);
@@ -856,6 +866,42 @@
 	return CustomData_number_of_layers(rna_mesh_pdata(ptr), CD_PROP_STR);
 }
 
+/* Skin vertices */
+DEFINE_CUSTOMDATA_LAYER_COLLECTION(skin_vertice, vdata, CD_MVERT_SKIN);
+
+static char *rna_MeshSkinVertexLayer_path(PointerRNA *ptr)
+{
+	return BLI_sprintfN("skin_vertices[\"%s\"]", ((CustomDataLayer *)ptr->data)->name);
+}
+
+static char *rna_VertCustomData_data_path(PointerRNA *ptr, char *collection, int type);
+static char *rna_MeshSkinVertex_path(PointerRNA *ptr)
+{
+	return rna_VertCustomData_data_path(ptr, "skin_vertices", CD_MVERT_SKIN);
+}
+
+static void rna_MeshSkinVertexLayer_data_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
+{
+	Mesh *me = rna_mesh(ptr);
+	CustomDataLayer *layer = (CustomDataLayer *)ptr->data;
+	rna_iterator_array_begin(iter, layer->data, sizeof(MVertSkin), me->totvert, 0, NULL);
+}
+
+static int rna_MeshSkinVertexLayer_data_length(PointerRNA *ptr)
+{
+	Mesh *me = rna_mesh(ptr);
+	return me->totvert;
+}
+
+static void rna_MeshSkinVertexLayer_name_set(PointerRNA *ptr, const char *value)
+{
+	CustomDataLayer *cdl = (CustomDataLayer *)ptr->data;
+	BLI_strncpy_utf8(cdl->name, value, sizeof(cdl->name));
+	CustomData_set_layer_unique_name(rna_mesh_vdata(ptr), cdl - rna_mesh_vdata(ptr)->layers);
+}
+
+/* End skin vertices */
+
 static void rna_TexturePoly_image_set(PointerRNA *ptr, PointerRNA value)
 {
 	MTexPoly *tf = (MTexPoly *)ptr->data;
@@ -1056,6 +1102,24 @@
 	return BLI_sprintfN("uv_textures[\"%s\"]", ((CustomDataLayer *)ptr->data)->name);
 }
 
+static char *rna_VertCustomData_data_path(PointerRNA *ptr, char *collection, int type)
+{
+	CustomDataLayer *cdl;
+	Mesh *me = rna_mesh(ptr);
+	CustomData *vdata = rna_mesh_vdata(ptr);
+	int a, b, totvert = (me->edit_btmesh) ? 0 : me->totvert;
+
+	for (cdl = vdata->layers, a = 0; a < vdata->totlayer; cdl++, a++) {
+		if (cdl->type == type) {
+			b = ((char *)ptr->data - ((char *)cdl->data)) / CustomData_sizeof(type);
+			if (b >= 0 && b < totvert)
+				return BLI_sprintfN("%s[\"%s\"].data[%d]", collection, cdl->name, b);
+		}
+	}
+
+	return NULL;
+}
+
 static char *rna_PolyCustomData_data_path(PointerRNA *ptr, char *collection, int type)
 {
 	CustomDataLayer *cdl;
@@ -2499,6 +2563,54 @@
 	RNA_def_property_update(prop, 0, "rna_Mesh_update_data");
 }
 
+static void rna_def_skin_vertices(BlenderRNA *brna, PropertyRNA *cprop)
+{
+	StructRNA *srna;
+	PropertyRNA *prop;
+
+	srna = RNA_def_struct(brna, "MeshSkinVertexLayer", NULL);
+	RNA_def_struct_ui_text(srna, "Mesh Skin Vertex Layer", "Per-vertex skin data for use with the Skin modifier");
+	RNA_def_struct_sdna(srna, "CustomDataLayer");
+	RNA_def_struct_path_func(srna, "rna_MeshSkinVertexLayer_path");
+
+	prop = RNA_def_property(srna, "name", PROP_STRING, PROP_NONE);
+	RNA_def_struct_name_property(srna, prop);
+	RNA_def_property_string_funcs(prop, NULL, NULL, "rna_MeshSkinVertexLayer_name_set");

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list