[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