[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [46892] trunk/blender/source/blender: Draw skin vertex roots in edit mode.

Nicholas Bishop nicholasbishop at gmail.com
Tue May 22 17:29:27 CEST 2012


Revision: 46892
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=46892
Author:   nicholasbishop
Date:     2012-05-22 15:29:27 +0000 (Tue, 22 May 2012)
Log Message:
-----------
Draw skin vertex roots in edit mode.

Roots are drawn with a view-oriented dashed red circle around the
vertex location. The circle's radius is the average if the skin
vertex's X and Y radii.

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

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/customdata.c
    trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/space_view3d/view3d_draw.c

Modified: trunk/blender/source/blender/blenkernel/intern/customdata.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/blenkernel/intern/customdata.c	2012-05-22 15:29:27 UTC (rev 46892)
@@ -1161,7 +1161,7 @@
     CD_MASK_MLOOPCOL | CD_MASK_MTEXPOLY | CD_MASK_SHAPE_KEYINDEX |
     CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_PROP_STR |
     CD_MASK_MDISPS | CD_MASK_SHAPEKEY | 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_DERIVEDMESH =
     CD_MASK_MSTICKY | CD_MASK_MDEFORMVERT | CD_MASK_MTFACE |
     CD_MASK_MCOL | CD_MASK_PROP_FLT | CD_MASK_PROP_INT | CD_MASK_CLOTH_ORCO |

Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c	2012-05-22 15:29:27 UTC (rev 46892)
@@ -1688,6 +1688,20 @@
 		}
 	}
 
+	if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
+		BMIter iter;
+		BMVert *eve;
+		int i;
+
+		DM_add_vert_layer(&bmdm->dm, CD_MVERT_SKIN, CD_CALLOC, NULL);
+
+		BM_ITER_MESH_INDEX (eve, &iter, bmdm->tc->bm, BM_VERTS_OF_MESH, i) {
+			DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN,
+							 CustomData_bmesh_get(&bm->vdata, eve->head.data,
+												  CD_MVERT_SKIN));
+		}
+	}
+
 	if (vertexCos) {
 		BMFace *efa;
 		BMVert *eve;

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2012-05-22 15:29:27 UTC (rev 46892)
@@ -143,6 +143,17 @@
 
 	int sel;
 	BMVert *eve_act;
+
+	/* cached theme values */
+	unsigned char th_editmesh_active[4];
+	unsigned char th_vertex_select[4];
+	unsigned char th_vertex[4];
+	unsigned char th_skin_root[4];
+	float th_vertex_size;
+
+	/* for skin node drawing */
+	int has_vskin;
+	float imat[4][4];
 } drawDMVerts_userData;
 
 typedef struct drawDMEdgesSel_userData {
@@ -2400,20 +2411,37 @@
 	BMVert *eve = EDBM_vert_at_index(data->em, index);
 
 	if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN) && BM_elem_flag_test(eve, BM_ELEM_SELECT) == data->sel) {
+		/* skin nodes: draw a red circle around the root
+		   node(s) */
+		if(data->has_vskin) {
+			const MVertSkin *vs = CustomData_bmesh_get(&data->em->bm->vdata,
+													   eve->head.data,
+													   CD_MVERT_SKIN);
+			if (vs->flag & MVERT_SKIN_ROOT) {
+				float radius = (vs->radius[0] + vs->radius[1]) * 0.5f;
+				bglEnd();
+			
+				glColor4ubv(data->th_skin_root);
+				drawcircball(GL_LINES, co, radius, data->imat);
+
+				glColor4ubv(data->sel ? data->th_vertex_select : data->th_vertex);
+				bglBegin(GL_POINTS);
+			}
+		}
+
 		/* draw active larger - need to stop/start point drawing for this :/ */
 		if (eve == data->eve_act) {
-			float size = UI_GetThemeValuef(TH_VERTEX_SIZE);
-			UI_ThemeColor4(TH_EDITMESH_ACTIVE);
+			glColor4ubv(data->th_editmesh_active);
 			
 			bglEnd();
 			
-			glPointSize(size);
+			glPointSize(data->th_vertex_size);
 			bglBegin(GL_POINTS);
 			bglVertex3fv(co);
 			bglEnd();
-			
-			UI_ThemeColor4(data->sel ? TH_VERTEX_SELECT : TH_VERTEX);
-			glPointSize(size);
+
+			glColor4ubv(data->sel ? data->th_vertex_select : data->th_vertex);
+			glPointSize(data->th_vertex_size);
 			bglBegin(GL_POINTS);
 		}
 		else {
@@ -2422,13 +2450,27 @@
 	}
 }
 
-static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert *eve_act)
+static void draw_dm_verts(BMEditMesh *em, DerivedMesh *dm, int sel, BMVert *eve_act,
+						  RegionView3D *rv3d)
 {
 	drawDMVerts_userData data;
 	data.sel = sel;
 	data.eve_act = eve_act;
 	data.em = em;
 
+	/* Cache theme values */
+	UI_GetThemeColor4ubv(TH_EDITMESH_ACTIVE, data.th_editmesh_active);
+	UI_GetThemeColor4ubv(TH_VERTEX_SELECT, data.th_vertex_select);
+	UI_GetThemeColor4ubv(TH_VERTEX, data.th_vertex);
+	UI_GetThemeColor4ubv(TH_SKIN_ROOT, data.th_skin_root);
+	data.th_vertex_size = UI_GetThemeValuef(TH_VERTEX_SIZE);
+
+	/* For skin root drawing */
+	data.has_vskin = CustomData_has_layer(&em->bm->vdata, CD_MVERT_SKIN);
+	/* view-aligned matrix */
+	mult_m4_m4m4(data.imat, rv3d->viewmat, em->ob->obmat);
+	invert_m4(data.imat);
+
 	bglBegin(GL_POINTS);
 	dm->foreachMappedVert(dm, draw_dm_verts__mapFunc, &data);
 	bglEnd();
@@ -2711,7 +2753,8 @@
 /* EditMesh drawing routines*/
 
 static void draw_em_fancy_verts(Scene *scene, View3D *v3d, Object *obedit, 
-                                BMEditMesh *em, DerivedMesh *cageDM, BMVert *eve_act)
+                                BMEditMesh *em, DerivedMesh *cageDM, BMVert *eve_act,
+								RegionView3D *rv3d)
 {
 	ToolSettings *ts = scene->toolsettings;
 	int sel;
@@ -2750,7 +2793,7 @@
 			if (ts->selectmode & SCE_SELECT_VERTEX) {
 				glPointSize(size);
 				glColor4ubv(col);
-				draw_dm_verts(em, cageDM, sel, eve_act);
+				draw_dm_verts(em, cageDM, sel, eve_act, rv3d);
 			}
 			
 			if (check_ob_drawface_dot(scene, v3d, obedit->dt)) {
@@ -3228,7 +3271,7 @@
 		draw_em_fancy_edges(em, scene, v3d, me, cageDM, 0, eed_act);
 	}
 	if (em) {
-		draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act);
+		draw_em_fancy_verts(scene, v3d, ob, em, cageDM, eve_act, rv3d);
 
 		if (me->drawflag & ME_DRAWNORMALS) {
 			UI_ThemeColor(TH_NORMAL);

Modified: trunk/blender/source/blender/editors/space_view3d/view3d_draw.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-05-22 15:29:15 UTC (rev 46891)
+++ trunk/blender/source/blender/editors/space_view3d/view3d_draw.c	2012-05-22 15:29:27 UTC (rev 46892)
@@ -2335,6 +2335,9 @@
 		if (ob->mode & OB_MODE_WEIGHT_PAINT) {
 			mask |= CD_MASK_PREVIEW_MCOL;
 		}
+
+		if (ob->mode & OB_MODE_EDIT)
+			mask |= CD_MASK_MVERT_SKIN;
 	}
 
 	return mask;




More information about the Bf-blender-cvs mailing list