[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [27664] trunk/blender/source/blender: Fix #20548: flat shading not drawing right in sculpt mode.

Brecht Van Lommel brecht at blender.org
Mon Mar 22 18:17:36 CET 2010


Revision: 27664
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=27664
Author:   blendix
Date:     2010-03-22 18:17:36 +0100 (Mon, 22 Mar 2010)

Log Message:
-----------
Fix #20548: flat shading not drawing right in sculpt mode.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
    trunk/blender/source/blender/blenlib/BLI_pbvh.h
    trunk/blender/source/blender/blenlib/intern/pbvh.c
    trunk/blender/source/blender/gpu/gpu_buffers.h
    trunk/blender/source/blender/gpu/intern/gpu_buffers.c

Modified: trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-03-22 17:12:08 UTC (rev 27663)
+++ trunk/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2010-03-22 17:17:36 UTC (rev 27664)
@@ -426,7 +426,7 @@
 				return;
 
 			glShadeModel((mface->flag & ME_SMOOTH)? GL_SMOOTH: GL_FLAT);
-			BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors);
+			BLI_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors, (mface->flag & ME_SMOOTH));
 			glShadeModel(GL_FLAT);
 		}
 

Modified: trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2010-03-22 17:12:08 UTC (rev 27663)
+++ trunk/blender/source/blender/blenkernel/intern/subsurf_ccg.c	2010-03-22 17:17:36 UTC (rev 27664)
@@ -1251,7 +1251,7 @@
 				return;
 
 			glShadeModel((faceFlags[0] & ME_SMOOTH)? GL_SMOOTH: GL_FLAT);
-			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL);
+			BLI_pbvh_draw(ccgdm->pbvh, partial_redraw_planes, NULL, (faceFlags[0] & ME_SMOOTH));
 			glShadeModel(GL_FLAT);
 		}
 

Modified: trunk/blender/source/blender/blenlib/BLI_pbvh.h
===================================================================
--- trunk/blender/source/blender/blenlib/BLI_pbvh.h	2010-03-22 17:12:08 UTC (rev 27663)
+++ trunk/blender/source/blender/blenlib/BLI_pbvh.h	2010-03-22 17:17:36 UTC (rev 27664)
@@ -79,7 +79,7 @@
 
 void BLI_pbvh_node_draw(PBVHNode *node, void *data);
 int BLI_pbvh_node_planes_contain_AABB(PBVHNode *node, void *data);
-void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3]);
+void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smooth);
 
 /* Node Access */
 

Modified: trunk/blender/source/blender/blenlib/intern/pbvh.c
===================================================================
--- trunk/blender/source/blender/blenlib/intern/pbvh.c	2010-03-22 17:12:08 UTC (rev 27663)
+++ trunk/blender/source/blender/blenlib/intern/pbvh.c	2010-03-22 17:17:36 UTC (rev 27664)
@@ -353,6 +353,8 @@
 				  node->uniq_verts,
 				  node->uniq_verts + node->face_verts);
 
+	node->flag |= PBVH_UpdateDrawBuffers;
+
 	BLI_ghash_free(map, NULL, NULL);
 }
 
@@ -361,6 +363,8 @@
 	node->draw_buffers =
 		GPU_build_grid_buffers(bvh->grids, node->prim_indices,
 				node->totprim, bvh->gridsize);
+
+	node->flag |= PBVH_UpdateDrawBuffers;
 }
 
 /* Recursively build a node in the tree
@@ -855,7 +859,7 @@
 	}
 }
 
-static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode)
+static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode, int smooth)
 {
 	PBVHNode *node;
 	int n;
@@ -870,7 +874,8 @@
 						   bvh->grids,
 						   node->prim_indices,
 						   node->totprim,
-						   bvh->gridsize);
+						   bvh->gridsize,
+						   smooth);
 			}
 			else {
 				GPU_update_mesh_buffers(node->draw_buffers,
@@ -930,9 +935,6 @@
 	if(flag & (PBVH_UpdateBB|PBVH_UpdateOriginalBB|PBVH_UpdateRedraw))
 		pbvh_update_BB_redraw(bvh, nodes, totnode, flag);
 
-	if(flag & PBVH_UpdateDrawBuffers)
-		pbvh_update_draw_buffers(bvh, nodes, totnode);
-
 	if(flag & (PBVH_UpdateBB|PBVH_UpdateOriginalBB))
 		pbvh_flush_bb(bvh, bvh->nodes, flag);
 
@@ -1297,10 +1299,19 @@
 	return 1;
 }
 
-void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3])
+void BLI_pbvh_draw(PBVH *bvh, float (*planes)[4], float (*face_nors)[3], int smooth)
 {
-	BLI_pbvh_update(bvh, PBVH_UpdateNormals|PBVH_UpdateDrawBuffers, face_nors);
+	PBVHNode **nodes;
+	int totnode;
 
+	BLI_pbvh_search_gather(bvh, update_search_cb, SET_INT_IN_POINTER(PBVH_UpdateNormals|PBVH_UpdateDrawBuffers),
+		&nodes, &totnode);
+
+	pbvh_update_normals(bvh, nodes, totnode, face_nors);
+	pbvh_update_draw_buffers(bvh, nodes, totnode, smooth);
+
+	if(nodes) MEM_freeN(nodes);
+
 	if(planes) {
 		BLI_pbvh_search_callback(bvh, BLI_pbvh_node_planes_contain_AABB,
 				planes, BLI_pbvh_node_draw, NULL);

Modified: trunk/blender/source/blender/gpu/gpu_buffers.h
===================================================================
--- trunk/blender/source/blender/gpu/gpu_buffers.h	2010-03-22 17:12:08 UTC (rev 27663)
+++ trunk/blender/source/blender/gpu/gpu_buffers.h	2010-03-22 17:17:36 UTC (rev 27664)
@@ -137,7 +137,7 @@
 void *GPU_build_grid_buffers(struct DMGridData **grids,
 	int *grid_indices, int totgrid, int gridsize);
 void GPU_update_grid_buffers(void *buffers_v, struct DMGridData **grids,
-	int *grid_indices, int totgrid, int gridsize);
+	int *grid_indices, int totgrid, int gridsize, int smooth);
 void GPU_draw_buffers(void *buffers);
 void GPU_free_buffers(void *buffers);
 

Modified: trunk/blender/source/blender/gpu/intern/gpu_buffers.c
===================================================================
--- trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2010-03-22 17:12:08 UTC (rev 27663)
+++ trunk/blender/source/blender/gpu/intern/gpu_buffers.c	2010-03-22 17:17:36 UTC (rev 27664)
@@ -520,11 +520,11 @@
 }
 
 void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids,
-	int *grid_indices, int totgrid, int gridsize)
+	int *grid_indices, int totgrid, int gridsize, int smooth)
 {
 	GPU_Buffers *buffers = buffers_v;
 	DMGridData *vert_data;
-	int i, totvert;
+	int i, j, k, totvert;
 
 	totvert= gridsize*gridsize*totgrid;
 
@@ -539,6 +539,22 @@
 			for(i = 0; i < totgrid; ++i) {
 				DMGridData *grid= grids[grid_indices[i]];
 				memcpy(vert_data, grid, sizeof(DMGridData)*gridsize*gridsize);
+
+				if(!smooth) {
+					/* for flat shading, recalc normals and set the last vertex of
+					   each quad in the index buffer to have the flat normal as
+					   that is what opengl will use */
+					for(j = 0; j < gridsize-1; ++j) {
+						for(k = 0; k < gridsize-1; ++k) {
+							normal_quad_v3(vert_data[(j+1)*gridsize + (k+1)].no,
+								vert_data[(j+1)*gridsize + k].co,
+								vert_data[(j+1)*gridsize + k+1].co,
+								vert_data[j*gridsize + k+1].co,
+								vert_data[j*gridsize + k].co);
+						}
+					}
+				}
+
 				vert_data += gridsize*gridsize;
 			}
 			glUnmapBufferARB(GL_ARRAY_BUFFER_ARB);
@@ -589,10 +605,10 @@
 				for(i = 0; i < totgrid; ++i) {
 					for(j = 0; j < gridsize-1; ++j) {
 						for(k = 0; k < gridsize-1; ++k) {
+							*(quad_data++)= offset + j*gridsize + k+1;
 							*(quad_data++)= offset + j*gridsize + k;
 							*(quad_data++)= offset + (j+1)*gridsize + k;
 							*(quad_data++)= offset + (j+1)*gridsize + k+1;
-							*(quad_data++)= offset + j*gridsize + k+1;
 						}
 					}
 
@@ -619,10 +635,10 @@
 				for(i = 0; i < totgrid; ++i) {
 					for(j = 0; j < gridsize-1; ++j) {
 						for(k = 0; k < gridsize-1; ++k) {
+							*(quad_data++)= offset + j*gridsize + k+1;
 							*(quad_data++)= offset + j*gridsize + k;
 							*(quad_data++)= offset + (j+1)*gridsize + k;
 							*(quad_data++)= offset + (j+1)*gridsize + k+1;
-							*(quad_data++)= offset + j*gridsize + k+1;
 						}
 					}
 
@@ -642,7 +658,6 @@
 	/* Build VBO */
 	if(buffers->index_buf)
 		glGenBuffersARB(1, &buffers->vert_buf);
-	GPU_update_grid_buffers(buffers, grids, grid_indices, totgrid, gridsize);
 
 	buffers->tot_quad = totquad;
 





More information about the Bf-blender-cvs mailing list