[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57603] trunk/blender/source/blender/ editors: editmesh draw optimizations: use customdata offsets rather then per-element lookups.

Campbell Barton ideasman42 at gmail.com
Thu Jun 20 13:18:20 CEST 2013


Revision: 57603
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57603
Author:   campbellbarton
Date:     2013-06-20 11:18:19 +0000 (Thu, 20 Jun 2013)
Log Message:
-----------
editmesh draw optimizations: use customdata offsets rather then per-element lookups.

Modified Paths:
--------------
    trunk/blender/source/blender/editors/space_view3d/drawobject.c
    trunk/blender/source/blender/editors/transform/transform_snap.c

Modified: trunk/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/drawobject.c	2013-06-20 11:05:47 UTC (rev 57602)
+++ trunk/blender/source/blender/editors/space_view3d/drawobject.c	2013-06-20 11:18:19 UTC (rev 57603)
@@ -116,7 +116,7 @@
 	float th_vertex_size;
 
 	/* for skin node drawing */
-	int has_vskin;
+	int cd_vskin_offset;
 	float imat[4][4];
 } drawDMVerts_userData;
 
@@ -155,6 +155,11 @@
 	MVert *mvert;
 } bbsObmodeMeshVerts_userData;
 
+typedef struct drawDMLayer_userData {
+	BMEditMesh *em;
+	int cd_layer_offset;
+} drawDMLayer_userData;
+
 static void draw_bounding_volume(Scene *scene, Object *ob, char type);
 
 static void drawcube_size(float size);
@@ -2130,10 +2135,8 @@
 	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 (data->cd_vskin_offset != -1) {
+			const MVertSkin *vs = BM_ELEM_CD_GET_VOID_P(eve, data->cd_vskin_offset);
 			if (vs->flag & MVERT_SKIN_ROOT) {
 				float radius = (vs->radius[0] + vs->radius[1]) * 0.5f;
 				bglEnd();
@@ -2183,7 +2186,7 @@
 	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);
+	data.cd_vskin_offset = CustomData_get_offset(&em->bm->vdata, CD_MVERT_SKIN);
 	/* view-aligned matrix */
 	mul_m4_m4m4(data.imat, rv3d->viewmat, em->ob->obmat);
 	invert_m4(data.imat);
@@ -2449,36 +2452,43 @@
 
 static DMDrawOption draw_dm_creases__setDrawOptions(void *userData, int index)
 {
-	BMEditMesh *em = userData;
-	BMEdge *eed = EDBM_edge_at_index(userData, index);
-	float *crease = eed ? (float *)CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_CREASE) : NULL;
+	drawDMLayer_userData *data = userData;
+	BMEditMesh *em = data->em;
+	BMEdge *eed = EDBM_edge_at_index(em, index);
 	
-	if (!crease)
-		return DM_DRAW_OPTION_SKIP;
-	
-	if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN) && *crease != 0.0f) {
-		UI_ThemeColorBlend(TH_WIRE_EDIT, TH_EDGE_CREASE, *crease);
-		return DM_DRAW_OPTION_NORMAL;
+	if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
+		const float crease = BM_ELEM_CD_GET_FLOAT(eed, data->cd_layer_offset);
+		if (crease != 0.0f) {
+			UI_ThemeColorBlend(TH_WIRE_EDIT, TH_EDGE_CREASE, crease);
+			return DM_DRAW_OPTION_NORMAL;
+		}
 	}
-	else {
-		return DM_DRAW_OPTION_SKIP;
-	}
+	return DM_DRAW_OPTION_SKIP;
 }
 static void draw_dm_creases(BMEditMesh *em, DerivedMesh *dm)
 {
-	glLineWidth(3.0);
-	dm->drawMappedEdges(dm, draw_dm_creases__setDrawOptions, em);
-	glLineWidth(1.0);
+	drawDMLayer_userData data;
+
+	data.em = em;
+	data.cd_layer_offset = CustomData_get_offset(&em->bm->edata, CD_CREASE);
+
+	if (data.cd_layer_offset != -1) {
+		glLineWidth(3.0);
+		dm->drawMappedEdges(dm, draw_dm_creases__setDrawOptions, &data);
+		glLineWidth(1.0);
+	}
 }
 
 static DMDrawOption draw_dm_bweights__setDrawOptions(void *userData, int index)
 {
-	BMEditMesh *em = userData;
-	BMEdge *eed = EDBM_edge_at_index(userData, index);
+	drawDMLayer_userData *data = userData;
+	BMEditMesh *em = data->em;
+	BMEdge *eed = EDBM_edge_at_index(em, index);
+
 	if (!BM_elem_flag_test(eed, BM_ELEM_HIDDEN)) {
-		const float *bweight = (float *)CustomData_bmesh_get(&em->bm->edata, eed->head.data, CD_BWEIGHT);
-		if (*bweight != 0.0f) {
-			UI_ThemeColorBlend(TH_WIRE_EDIT, TH_EDGE_SELECT, *bweight);
+		const float bweight = BM_ELEM_CD_GET_FLOAT(eed, data->cd_layer_offset);
+		if (bweight != 0.0f) {
+			UI_ThemeColorBlend(TH_WIRE_EDIT, TH_EDGE_SELECT, bweight);
 			return DM_DRAW_OPTION_NORMAL;
 		}
 	}
@@ -2487,13 +2497,14 @@
 static void draw_dm_bweights__mapFunc(void *userData, int index, const float co[3],
                                       const float UNUSED(no_f[3]), const short UNUSED(no_s[3]))
 {
-	BMEditMesh *em = userData;
-	BMVert *eve = EDBM_vert_at_index(userData, index);
+	drawDMLayer_userData *data = userData;
+	BMEditMesh *em = data->em;
+	BMVert *eve = EDBM_vert_at_index(em, index);
 
 	if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
-		const float *bweight = (float *)CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_BWEIGHT);
-		if (*bweight != 0.0f) {
-			UI_ThemeColorBlend(TH_VERTEX, TH_VERTEX_SELECT, *bweight);
+		const float bweight = BM_ELEM_CD_GET_FLOAT(eve, data->cd_layer_offset);
+		if (bweight != 0.0f) {
+			UI_ThemeColorBlend(TH_VERTEX, TH_VERTEX_SELECT, bweight);
 			bglVertex3fv(co);
 		}
 	}
@@ -2503,17 +2514,27 @@
 	ToolSettings *ts = scene->toolsettings;
 
 	if (ts->selectmode & SCE_SELECT_VERTEX) {
-		if (CustomData_has_layer(&em->bm->vdata, CD_BWEIGHT)) {
+		drawDMLayer_userData data;
+
+		data.em = em;
+		data.cd_layer_offset = CustomData_get_offset(&em->bm->vdata, CD_BWEIGHT);
+
+		if (data.cd_layer_offset != -1) {
 			glPointSize(UI_GetThemeValuef(TH_VERTEX_SIZE) + 2);
 			bglBegin(GL_POINTS);
-			dm->foreachMappedVert(dm, draw_dm_bweights__mapFunc, em);
+			dm->foreachMappedVert(dm, draw_dm_bweights__mapFunc, &data);
 			bglEnd();
 		}
 	}
 	else {
-		if (CustomData_has_layer(&em->bm->edata, CD_BWEIGHT)) {
+		drawDMLayer_userData data;
+
+		data.em = em;
+		data.cd_layer_offset = CustomData_get_offset(&em->bm->edata, CD_BWEIGHT);
+
+		if (data.cd_layer_offset != -1) {
 			glLineWidth(3.0);
-			dm->drawMappedEdges(dm, draw_dm_bweights__setDrawOptions, em);
+			dm->drawMappedEdges(dm, draw_dm_bweights__setDrawOptions, &data);
 			glLineWidth(1.0);
 		}
 	}
@@ -3148,7 +3169,7 @@
 		}
 #endif
 	
-		if (me->drawflag & ME_DRAWCREASES && CustomData_has_layer(&em->bm->edata, CD_CREASE)) {
+		if (me->drawflag & ME_DRAWCREASES) {
 			draw_dm_creases(em, cageDM);
 		}
 		if (me->drawflag & ME_DRAWBWEIGHTS) {

Modified: trunk/blender/source/blender/editors/transform/transform_snap.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_snap.c	2013-06-20 11:05:47 UTC (rev 57602)
+++ trunk/blender/source/blender/editors/transform/transform_snap.c	2013-06-20 11:18:19 UTC (rev 57603)
@@ -1446,7 +1446,9 @@
 							else {
 								eve = EDBM_vert_at_index(em, index);
 								
-								if (eve && (BM_elem_flag_test(eve, BM_ELEM_HIDDEN) || BM_elem_flag_test(eve, BM_ELEM_SELECT))) {
+								if ((BM_elem_flag_test(eve, BM_ELEM_HIDDEN) ||
+								     BM_elem_flag_test(eve, BM_ELEM_SELECT)))
+								{
 									test = 0;
 								}
 							}




More information about the Bf-blender-cvs mailing list