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;
 


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to