[Bf-blender-cvs] [aab2da9] master: Optimize drawing of outlines as well

Antony Riakiotakis noreply at git.blender.org
Tue Jun 16 21:44:57 CEST 2015


Commit: aab2da9e651d5f58372ef64ae48c294f2c29c0ad
Author: Antony Riakiotakis
Date:   Tue Jun 16 21:44:40 2015 +0200
Branches: master
https://developer.blender.org/rBaab2da9e651d5f58372ef64ae48c294f2c29c0ad

Optimize drawing of outlines as well

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

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 4ad7156..c0489a9 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -392,11 +392,6 @@ static void cdDM_drawUVEdges(DerivedMesh *dm)
 static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdges)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-	MEdge *medge = cddm->medge;
-	int i;
-	int prevstart = 0;
-	int prevdraw = 1;
-	bool draw = true;
 	
 	if (cddm->pbvh && cddm->pbvh_draw &&
 	    BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH)
@@ -407,25 +402,15 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
 	}
 	
 	GPU_edge_setup(dm);
-	for (i = 0; i < dm->numEdgeData; i++, medge++) {
-		if ((drawAllEdges || (medge->flag & ME_EDGEDRAW)) &&
-		        (drawLooseEdges || !(medge->flag & ME_LOOSEEDGE)))
-		{
-			draw = true;
-		}
-		else {
-			draw = false;
-		}
-		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 (drawAllEdges && drawLooseEdges) {
+		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, 0, dm->drawObject->totedge * 2);
 	}
-	if (prevdraw > 0 && (i - prevstart) > 0) {
-		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
+	else if (drawAllEdges) {
+		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, 0, dm->drawObject->loose_edge_offset * 2);
+	}
+	else {
+		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, 0, dm->drawObject->tot_edge_drawn * 2);
+		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, dm->drawObject->loose_edge_offset * 2, dm->drawObject->tot_loose_edge_drawn * 2);
 	}
 	GPU_buffer_unbind();
 }
@@ -433,7 +418,7 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
 static void cdDM_drawLooseEdges(DerivedMesh *dm)
 {
 	GPU_edge_setup(dm);
-	GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, dm->drawObject->loose_edge_offset * 2, dm->drawObject->tot_loose_edge * 2);
+	GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, dm->drawObject->loose_edge_offset * 2, (dm->drawObject->totedge - dm->drawObject->loose_edge_offset) * 2);
 	GPU_buffer_unbind();
 }
 
diff --git a/source/blender/gpu/GPU_buffers.h b/source/blender/gpu/GPU_buffers.h
index 842553a..a8630d0 100644
--- a/source/blender/gpu/GPU_buffers.h
+++ b/source/blender/gpu/GPU_buffers.h
@@ -115,7 +115,8 @@ typedef struct GPUDrawObject {
 	int totedge;
 
 	int loose_edge_offset;
-	int tot_loose_edge;
+	int tot_loose_edge_drawn;
+	int tot_edge_drawn;
 } GPUDrawObject;
 
 /* used for GLSL materials */
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index c863e3e..62843f0 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -940,33 +940,62 @@ static void GPU_buffer_copy_mcol(DerivedMesh *dm, float *varray_, int *index, in
 
 static void GPU_buffer_copy_edge(DerivedMesh *dm, float *varray_, int *UNUSED(index), int *UNUSED(mat_orig_to_new), void *UNUSED(user))
 {
-	MEdge *medge;
+	MEdge *medge, *medge_base;
 	unsigned int *varray = (unsigned int *)varray_;
-	int i, totedge, iloose, inorm;
+	int i, totedge, iloose, inorm, iloosehidden, inormhidden;
+	int tot_loose_hidden = 0, tot_loose = 0;
+	int tot_hidden = 0, tot = 0;
 
-	medge = dm->getEdgeArray(dm);
+	medge_base = medge = dm->getEdgeArray(dm);
 	totedge = dm->getNumEdges(dm);
 
+	for (i = 0; i < totedge; i++, medge++) {
+		if (medge->flag & ME_EDGEDRAW) {
+			if (medge->flag & ME_LOOSEEDGE) tot_loose++;
+			else tot++;
+		}
+		else {
+			if (medge->flag & ME_LOOSEEDGE) tot_loose_hidden++;
+			else tot_hidden++;
+		}
+	}
+
 	inorm = 0;
-	iloose = totedge - 1;
+	inormhidden = tot;
+	iloose = tot + tot_hidden;
+	iloosehidden = iloose + tot_loose;
 
+	medge = medge_base;
 	for (i = 0; i < totedge; i++, medge++) {
-		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--;
+		if (medge->flag & ME_EDGEDRAW) {
+			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++;
+			}
 		}
 		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++;
+			if (medge->flag & ME_LOOSEEDGE) {
+				varray[iloosehidden * 2] = dm->drawObject->vert_points[medge->v1].point_index;
+				varray[iloosehidden * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
+				iloosehidden++;
+			}
+			else {
+				varray[inormhidden * 2] = dm->drawObject->vert_points[medge->v1].point_index;
+				varray[inormhidden * 2 + 1] = dm->drawObject->vert_points[medge->v2].point_index;
+				inormhidden++;
+			}
 		}
 	}
 
-	iloose++;
-	dm->drawObject->tot_loose_edge = totedge - iloose;
-	dm->drawObject->loose_edge_offset = iloose;
-
+	dm->drawObject->tot_loose_edge_drawn = tot_loose;
+	dm->drawObject->loose_edge_offset = tot + tot_hidden;
+	dm->drawObject->tot_edge_drawn = tot;
 }
 
 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