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);
        }
 }
 

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

Reply via email to