Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Bishop <nicholasbishop@gmail.com>2012-02-21 01:25:24 +0400
committerNicholas Bishop <nicholasbishop@gmail.com>2012-02-21 01:25:24 +0400
commitd31e1533a38f9560ee91c75116fcc877006ed771 (patch)
tree1a771e6a42819954d093e1b289f348d3ab55d16e /source/blender/gpu
parent83aeb9cbd5359403cc0b17c533cc72f11cb25173 (diff)
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
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c115
1 files changed, 77 insertions, 38 deletions
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index b128a6e46e7..8318d906f72 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -1294,6 +1294,7 @@ struct GPU_Buffers {
int gridsize;
unsigned int tot_tri, tot_quad;
+ int smooth;
};
void GPU_update_mesh_buffers(GPU_Buffers *buffers, MVert *mvert,
@@ -1462,6 +1463,7 @@ void GPU_update_grid_buffers(GPU_Buffers *buffers, DMGridData **grids,
buffers->grid_indices = grid_indices;
buffers->totgrid = totgrid;
buffers->gridsize = gridsize;
+ buffers->smooth = smooth;
//printf("node updated %p\n", buffers);
}
@@ -1556,6 +1558,78 @@ GPU_Buffers *GPU_build_grid_buffers(DMGridData **UNUSED(grids), int *UNUSED(grid
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 @@ void GPU_draw_buffers(GPU_Buffers *buffers)
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);
}
}