[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44283] trunk/blender/source/blender/gpu/ intern/gpu_buffers.c: Fix normals for flat-shaded non-VBO sculpt drawing.

Nicholas Bishop nicholasbishop at gmail.com
Mon Feb 20 22:25:32 CET 2012


Revision: 44283
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44283
Author:   nicholasbishop
Date:     2012-02-20 21:25:24 +0000 (Mon, 20 Feb 2012)
Log Message:
-----------
Fix normals for flat-shaded non-VBO sculpt drawing.

Example here, original on left, fixed normals on right:
http://www.pasteall.org/pic/show.php?id=26925

Modified Paths:
--------------
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2012-02-20 20:55:30 UTC (rev 44282)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2012-02-20 21:25:24 UTC (rev 44283)
@@ -1294,6 +1294,7 @@
 	int gridsize;
 
 	unsigned int tot_tri, tot_quad;
+	int smooth;
 };
 
 void GPU_update_mesh_buffers(GPU_Buffers *buffers, MVert *mvert,
@@ -1462,6 +1463,7 @@
 	buffers->grid_indices = grid_indices;
 	buffers->totgrid = totgrid;
 	buffers->gridsize = gridsize;
+	buffers->smooth = smooth;
 
 	//printf("node updated %p\n", buffers);
 }
@@ -1556,6 +1558,78 @@
 	return buffers;
 }
 
+static void gpu_draw_buffers_legacy_mesh(GPU_Buffers *buffers)
+{
+	int i;
+
+	for(i = 0; i < buffers->totface; ++i) {
+		MFace *f = buffers->mface + buffers->face_indices[i];
+
+		glBegin((f->v4)? GL_QUADS: GL_TRIANGLES);
+		glNormal3sv(buffers->mvert[f->v1].no);
+		glVertex3fv(buffers->mvert[f->v1].co);
+		glNormal3sv(buffers->mvert[f->v2].no);
+		glVertex3fv(buffers->mvert[f->v2].co);
+		glNormal3sv(buffers->mvert[f->v3].no);
+		glVertex3fv(buffers->mvert[f->v3].co);
+		if(f->v4) {
+			glNormal3sv(buffers->mvert[f->v4].no);
+			glVertex3fv(buffers->mvert[f->v4].co);
+		}
+		glEnd();
+	}
+}
+
+static void gpu_draw_buffers_legacy_grids(GPU_Buffers *buffers)
+{
+	int i, x, y, gridsize = buffers->gridsize;
+
+	if(buffers->smooth) {
+		for(i = 0; i < buffers->totgrid; ++i) {
+			DMGridData *grid = buffers->grids[buffers->grid_indices[i]];
+
+			for(y = 0; y < gridsize-1; y++) {
+				glBegin(GL_QUAD_STRIP);
+				for(x = 0; x < gridsize; x++) {
+					DMGridData *a = &grid[y*gridsize + x];
+					DMGridData *b = &grid[(y+1)*gridsize + x];
+
+					glNormal3fv(a->no);
+					glVertex3fv(a->co);
+					glNormal3fv(b->no);
+					glVertex3fv(b->co);
+				}
+				glEnd();
+			}
+		}
+	}
+	else {
+		for(i = 0; i < buffers->totgrid; ++i) {
+			DMGridData *grid = buffers->grids[buffers->grid_indices[i]];
+
+			for(y = 0; y < gridsize-1; y++) {
+				glBegin(GL_QUAD_STRIP);
+				for(x = 0; x < gridsize; x++) {
+					DMGridData *a = &grid[y*gridsize + x];
+					DMGridData *b = &grid[(y+1)*gridsize + x];
+
+					if(x > 0) {
+						DMGridData *c = &grid[y*gridsize + x-1];
+						DMGridData *d = &grid[(y+1)*gridsize + x-1];
+						float fno[3];
+						normal_quad_v3(fno, d->co, b->co, a->co, c->co);
+						glNormal3fv(fno);
+					}
+
+					glVertex3fv(a->co);
+					glVertex3fv(b->co);
+				}
+				glEnd();
+			}
+		}
+	}
+}
+
 void GPU_draw_buffers(GPU_Buffers *buffers)
 {
 	if(buffers->vert_buf && buffers->index_buf) {
@@ -1584,47 +1658,12 @@
 		glDisableClientState(GL_VERTEX_ARRAY);
 		glDisableClientState(GL_NORMAL_ARRAY);
 	}
+	/* fallbacks if we are out of memory or VBO is disabled */
 	else if(buffers->totface) {
-		/* fallback if we are out of memory */
-		int i;
-
-		for(i = 0; i < buffers->totface; ++i) {
-			MFace *f = buffers->mface + buffers->face_indices[i];
-
-			glBegin((f->v4)? GL_QUADS: GL_TRIANGLES);
-			glNormal3sv(buffers->mvert[f->v1].no);
-			glVertex3fv(buffers->mvert[f->v1].co);
-			glNormal3sv(buffers->mvert[f->v2].no);
-			glVertex3fv(buffers->mvert[f->v2].co);
-			glNormal3sv(buffers->mvert[f->v3].no);
-			glVertex3fv(buffers->mvert[f->v3].co);
-			if(f->v4) {
-				glNormal3sv(buffers->mvert[f->v4].no);
-				glVertex3fv(buffers->mvert[f->v4].co);
-			}
-			glEnd();
-		}
+		gpu_draw_buffers_legacy_mesh(buffers);
 	}
 	else if(buffers->totgrid) {
-		int i, x, y, gridsize = buffers->gridsize;
-
-		for(i = 0; i < buffers->totgrid; ++i) {
-			DMGridData *grid = buffers->grids[buffers->grid_indices[i]];
-
-			for(y = 0; y < gridsize-1; y++) {
-				glBegin(GL_QUAD_STRIP);
-				for(x = 0; x < gridsize; x++) {
-					DMGridData *a = &grid[y*gridsize + x];
-					DMGridData *b = &grid[(y+1)*gridsize + x];
-
-					glNormal3fv(a->no);
-					glVertex3fv(a->co);
-					glNormal3fv(b->no);
-					glVertex3fv(b->co);
-				}
-				glEnd();
-			}
-		}
+		gpu_draw_buffers_legacy_grids(buffers);
 	}
 }
 




More information about the Bf-blender-cvs mailing list