[Bf-blender-cvs] [fbff0e6] master: Drawing speedup:

Antony Riakiotakis noreply at git.blender.org
Tue Jun 16 20:55:54 CEST 2015


Commit: fbff0e68a4cb43d24f0e034b084307930114908b
Author: Antony Riakiotakis
Date:   Tue Jun 16 20:55:37 2015 +0200
Branches: master
https://developer.blender.org/rBfbff0e68a4cb43d24f0e034b084307930114908b

Drawing speedup:

We really don't need to iterate all edges of the mesh every frame to
search for loose edges, this calculation can be cached when filling the
edge index buffer.

===================================================================

M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/gpu/GPU_buffers.h
M	source/blender/gpu/intern/gpu_buffers.c

===================================================================

diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c
index 3feea12..4ad7156 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -432,33 +432,8 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
 
 static void cdDM_drawLooseEdges(DerivedMesh *dm)
 {
-	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-	MEdge *medge = cddm->medge;
-	int i;
-	
-	int prevstart = 0;
-	int prevdraw = 1;
-	int draw = 1;
-	
 	GPU_edge_setup(dm);
-	for (i = 0; i < dm->numEdgeData; i++, medge++) {
-		if (medge->flag & ME_LOOSEEDGE) {
-			draw = 1;
-		}
-		else {
-			draw = 0;
-		}
-		if (prevdraw != draw) {
-			if (prevdraw > 0 && (i - prevstart) > 0) {
-				GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
-			}
-			prevstart = i;
-		}
-		prevdraw = draw;
-	}
-	if (prevdraw > 0 && (i - prevstart) > 0) {
-		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
-	}
+	GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, dm->drawObject->loose_edge_offset * 2, dm->drawObject->tot_loose_edge * 2);
 	GPU_buffer_unbind();
 }
 
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 8b65666..842553a 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -113,6 +113,9 @@ typedef struct GPUDrawObject {
 	/* caches of the original DerivedMesh values */
 	int totvert;
 	int totedge;
+
+	int loose_edge_offset;
+	int tot_loose_edge;
 } GPUDrawObject;
 
 /* used for GLSL materials */
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 4b7dc7f..c863e3e 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -942,15 +942,31 @@ static void GPU_buffer_copy_edge(DerivedMesh *dm, float *varray_, int *UNUSED(in
 {
 	MEdge *medge;
 	unsigned int *varray = (unsigned int *)varray_;
-	int i, totedge;
+	int i, totedge, iloose, inorm;
 
 	medge = dm->getEdgeArray(dm);
 	totedge = dm->getNumEdges(dm);
 
+	inorm = 0;
+	iloose = totedge - 1;
+
 	for (i = 0; i < totedge; i++, medge++) {
-		varray[i * 2] = dm->drawObject->vert_points[medge->v1].point_index;
-		varray[i * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
+		if (medge->flag & ME_LOOSEEDGE) {
+			varray[iloose * 2] = dm->drawObject->vert_points[medge->v1].point_index;
+			varray[iloose * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
+			iloose--;
+		}
+		else {
+			varray[inorm * 2] = dm->drawObject->vert_points[medge->v1].point_index;
+			varray[inorm * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
+			inorm++;
+		}
 	}
+
+	iloose++;
+	dm->drawObject->tot_loose_edge = totedge - iloose;
+	dm->drawObject->loose_edge_offset = iloose;
+
 }
 
 static void GPU_buffer_copy_uvedge(DerivedMesh *dm, float *varray, int *UNUSED(index), int *UNUSED(mat_orig_to_new), void *UNUSED(user))




More information about the Bf-blender-cvs mailing list