[Bf-blender-cvs] [2b7e1c6] master: Cleanup GPU: get rid of some extremely legacy draw code.

Antony Riakiotakis noreply at git.blender.org
Fri Nov 28 15:44:55 CET 2014


Commit: 2b7e1c6011d5a3ba18d3296e20b048835dfd1602
Author: Antony Riakiotakis
Date:   Fri Nov 28 14:38:18 2014 +0100
Branches: master
https://developer.blender.org/rB2b7e1c6011d5a3ba18d3296e20b048835dfd1602

Cleanup GPU: get rid of some extremely legacy draw code.

Basically this commit gets rid of most of the derived mesh immediate mode
drawing (cases such as subsurf excluded). Even when VBO is turned off
in user preferences, we still use vertex arrays, which are very similar to
VBOs but memory is client side. Vertex arrays are OpenGL 1.1 so compatibility
is not an issue here.

Reviewers: campbellbarton, sergey, jwilkins

Differential Revision: https://developer.blender.org/D919

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

M	source/blender/blenkernel/intern/cdderivedmesh.c
M	source/blender/editors/sculpt_paint/paint_vertex.c
M	source/blender/editors/space_view3d/drawmesh.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 7f49fc6..e395056 100644
--- a/source/blender/blenkernel/intern/cdderivedmesh.c
+++ b/source/blender/blenkernel/intern/cdderivedmesh.c
@@ -343,106 +343,64 @@ static void cdDM_update_normals_from_pbvh(DerivedMesh *dm)
 
 static void cdDM_drawVerts(DerivedMesh *dm)
 {
-	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-	MVert *mv = cddm->mvert;
-	int i;
-
-	if (GPU_buffer_legacy(dm)) {
-		glBegin(GL_POINTS);
-		for (i = 0; i < dm->numVertData; i++, mv++)
-			glVertex3fv(mv->co);
-		glEnd();
-	}
-	else {  /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
-		GPU_vertex_setup(dm);
-		if (!GPU_buffer_legacy(dm)) {
-			if (dm->drawObject->tot_triangle_point)
-				glDrawArrays(GL_POINTS, 0, dm->drawObject->tot_triangle_point);
-			else
-				glDrawArrays(GL_POINTS, 0, dm->drawObject->tot_loose_point);
-		}
-		GPU_buffer_unbind();
-	}
+	GPU_vertex_setup(dm);
+	if (dm->drawObject->tot_triangle_point)
+		glDrawArrays(GL_POINTS, 0, dm->drawObject->tot_triangle_point);
+	else
+		glDrawArrays(GL_POINTS, 0, dm->drawObject->tot_loose_point);
+	GPU_buffer_unbind();
 }
 
 static void cdDM_drawUVEdges(DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
 	MFace *mf = cddm->mface;
-	MTFace *tf = DM_get_tessface_data_layer(dm, CD_MTFACE);
 	int i;
 
 	if (mf) {
-		if (GPU_buffer_legacy(dm)) {
-			glBegin(GL_LINES);
-			for (i = 0; i < dm->numTessFaceData; i++, mf++, tf++) {
-				if (!(mf->flag & ME_HIDE)) {
-					glVertex2fv(tf->uv[0]);
-					glVertex2fv(tf->uv[1]);
-
-					glVertex2fv(tf->uv[1]);
-					glVertex2fv(tf->uv[2]);
-
-					if (!mf->v4) {
-						glVertex2fv(tf->uv[2]);
-						glVertex2fv(tf->uv[0]);
-					}
-					else {
-						glVertex2fv(tf->uv[2]);
-						glVertex2fv(tf->uv[3]);
-
-						glVertex2fv(tf->uv[3]);
-						glVertex2fv(tf->uv[0]);
-					}
-				}
+		int prevstart = 0;
+		int prevdraw = 1;
+		int draw = 1;
+		int curpos = 0;
+		
+		GPU_uvedge_setup(dm);
+		for (i = 0; i < dm->numTessFaceData; i++, mf++) {
+			if (!(mf->flag & ME_HIDE)) {
+				draw = 1;
 			}
-			glEnd();
-		}
-		else {
-			int prevstart = 0;
-			int prevdraw = 1;
-			int draw = 1;
-			int curpos = 0;
-
-			GPU_uvedge_setup(dm);
-			if (!GPU_buffer_legacy(dm)) {
-				for (i = 0; i < dm->numTessFaceData; i++, mf++) {
-					if (!(mf->flag & ME_HIDE)) {
-						draw = 1;
-					}
-					else {
-						draw = 0;
-					}
-					if (prevdraw != draw) {
-						if (prevdraw > 0 && (curpos - prevstart) > 0) {
-							glDrawArrays(GL_LINES, prevstart, curpos - prevstart);
-						}
-						prevstart = curpos;
-					}
-					if (mf->v4) {
-						curpos += 8;
-					}
-					else {
-						curpos += 6;
-					}
-					prevdraw = draw;
-				}
+			else {
+				draw = 0;
+			}
+			if (prevdraw != draw) {
 				if (prevdraw > 0 && (curpos - prevstart) > 0) {
 					glDrawArrays(GL_LINES, prevstart, curpos - prevstart);
 				}
+				prevstart = curpos;
+			}
+			if (mf->v4) {
+				curpos += 8;
 			}
-			GPU_buffer_unbind();
+			else {
+				curpos += 6;
+			}
+			prevdraw = draw;
+		}
+		if (prevdraw > 0 && (curpos - prevstart) > 0) {
+			glDrawArrays(GL_LINES, prevstart, curpos - prevstart);
 		}
+		GPU_buffer_unbind();
 	}
 }
 
 static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdges)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-	MVert *mvert = cddm->mvert;
 	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)
 	{
@@ -451,97 +409,60 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg
 		return;
 	}
 	
-	if (GPU_buffer_legacy(dm)) {
-		DEBUG_VBO("Using legacy code. cdDM_drawEdges\n");
-		glBegin(GL_LINES);
-		for (i = 0; i < dm->numEdgeData; i++, medge++) {
-			if ((drawAllEdges || (medge->flag & ME_EDGEDRAW)) &&
-			    (drawLooseEdges || !(medge->flag & ME_LOOSEEDGE)))
-			{
-				glVertex3fv(mvert[medge->v1].co);
-				glVertex3fv(mvert[medge->v2].co);
-			}
+	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;
 		}
-		glEnd();
-	}
-	else {  /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
-		int prevstart = 0;
-		int prevdraw = 1;
-		bool draw = true;
-
-		GPU_edge_setup(dm);
-		if (!GPU_buffer_legacy(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;
-			}
+		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;
 		}
-		GPU_buffer_unbind();
+		prevdraw = draw;
 	}
+	if (prevdraw > 0 && (i - prevstart) > 0) {
+		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
+	}
+	GPU_buffer_unbind();
 }
 
 static void cdDM_drawLooseEdges(DerivedMesh *dm)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-	MVert *mvert = cddm->mvert;
 	MEdge *medge = cddm->medge;
 	int i;
-
-	if (GPU_buffer_legacy(dm)) {
-		DEBUG_VBO("Using legacy code. cdDM_drawLooseEdges\n");
-		glBegin(GL_LINES);
-		for (i = 0; i < dm->numEdgeData; i++, medge++) {
-			if (medge->flag & ME_LOOSEEDGE) {
-				glVertex3fv(mvert[medge->v1].co);
-				glVertex3fv(mvert[medge->v2].co);
-			}
+	
+	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;
 		}
-		glEnd();
-	}
-	else {  /* use OpenGL VBOs or Vertex Arrays instead for better, faster rendering */
-		int prevstart = 0;
-		int prevdraw = 1;
-		int draw = 1;
-
-		GPU_edge_setup(dm);
-		if (!GPU_buffer_legacy(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;
-			}
+		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;
 		}
-		GPU_buffer_unbind();
+		prevdraw = draw;
+	}
+	if (prevdraw > 0 && (i - prevstart) > 0) {
+		GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2);
 	}
+	GPU_buffer_unbind();
 }
 
 static void cdDM_drawFacesSolid(DerivedMesh *dm,
@@ -549,11 +470,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm,
                                 bool UNUSED(fast), DMSetMaterial setMaterial)
 {
 	CDDerivedMesh *cddm = (CDDerivedMesh *) dm;
-	MVert *mvert = cddm->mvert;
-	MFace *mface = cddm->mface;
-	const float *nors = dm->getTessFaceDataArray(dm, CD_NORMAL);
-	const short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
-	int a, glmode = -1, shademodel = -1, matnr = -1, drawCurrentMat = 1;
+	int a;
 
 	if (cddm->pbvh && cddm->pbvh_draw) {
 		if (dm->numTessFaceData) {
@@ -566,101 +483,17 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm,
 
 		return;
 	}
-
-	if (GPU_buffer_legacy(dm)) {
-		DEBUG_VBO("Using legacy code. cdDM_drawFacesSolid\n");
-		glBegin(glmode = GL_QUADS);
-		for (a = 0; a < dm->numTessFaceData; a++, mface++) {
-			int new_glmode, new_matnr, new_shademodel;
-
-			new_glmode = mface->v4 ? GL_QUADS : GL_TRIANGLES;
-			new_matnr = mface->mat_nr + 1;
-			new_shademodel = (lnors || (mface->flag & ME_SMOOTH)) ? GL_SMOOTH : GL_FLAT;
-
-
-			if ((new_glmode != glmode) || (new_shademodel != shademodel) ||
-			    (setMaterial && (new_matnr != matnr)))
-			{
-				glEnd();
-
-				if (setMaterial) {
-					drawCurrentMat = setMaterial(matnr = new_matnr, NULL);
-				}
-
-				glShadeModel(shademodel = new_shademodel);
-				glBegin(glmode = new_glmode);
-			}
-			
-			if (drawCurrentMat) {
-				if (lnors) {
-					glNormal3sv((const GLshort *)lnors[0][0]);
-					glVertex3fv(mvert[mface->v1].co);
-					glNormal3sv((const GLshort *)lnors[0][1]);
-					glVertex3fv(mvert[mface->v2].co);
-					glNormal3sv((const GLshort *)lnors[0][2]);
-					glVertex3fv(mvert[mface->v3].co);
-					if (mface->v4) {
-						glNormal3sv((const GLshort *)lnors[0][3]);
-						glVertex3fv(mvert[mface->v4].co);
-					}
-				}
-				else if (shademodel == GL_FLAT) {
-					if (nors) {
-						glNormal3fv(nors);
-					}
-					else {
-						/* TODO make this better (cache facenormals as layer?) */
-						float nor[3];
-						if (mface->v4) {
-							normal_quad_v3(nor, mvert[mface->v1].co, mvert[mface->v2].co, mvert[mface->v3].co, mvert[mface->v4].co);
-						}
-						else {
-							normal_tri_v3(nor, mvert[mface->v1].co, mvert[mface->v2].co, mvert[mface->v3].co);
-						}
-						glNormal3fv(nor);
-					}
-					glVertex3fv(mvert[mface->v1].co);
-					glVertex3fv(mvert[mface->v2].co);
-					glVertex3fv(mvert[mface->v3].co);
-					if (mface->v4) {
-						glVertex3fv(mvert[mface->v4].co);
-					}
-				}
-				else {  /* shademodel == GL_SMOOTH */
-					glNormal3sv(mvert[mface->v1].no);
-					glVertex3fv(mvert[mface->v1].co);
-					glNormal3sv(mvert[mface->v2].no);
-					glVertex3fv(mvert[mface->v2].co);
-					glNormal3sv(mvert[mface->v3].no);
-					glVertex3fv(mvert[mface->v3].co);
-					if (mface->v4) {
-						glNormal3sv(mvert[mface->v4].no);
-						glVertex3fv(mvert[mface->v4].co);
-					}
-				}
-			}
-
-			if (nors)
-				nors += 3;
-			if (lnors)
-				lnors++;
-		}
-		glE

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list