[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