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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2010-03-22 20:17:36 +0300
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2010-03-22 20:17:36 +0300
commita2778a262b42cc6af2428cbd5196e9163d6673a9 (patch)
tree4173de3b77c76faace9e6c100e67ea575eb0c9cd /source/blender/gpu
parent867cad85b7af1059b79b5ad70b046c3f68f17b69 (diff)
Fix #20548: flat shading not drawing right in sculpt mode.
Diffstat (limited to 'source/blender/gpu')
-rw-r--r--source/blender/gpu/gpu_buffers.h2
-rw-r--r--source/blender/gpu/intern/gpu_buffers.c25
2 files changed, 21 insertions, 6 deletions
diff --git a/source/blender/gpu/gpu_buffers.h b/source/blender/gpu/gpu_buffers.h
index 945cccced8d..98cefa7a696 100644
--- a/source/blender/gpu/gpu_buffers.h
+++ b/source/blender/gpu/gpu_buffers.h
@@ -137,7 +137,7 @@ void GPU_update_mesh_buffers(void *buffers, struct MVert *mvert,
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);
diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c
index 868930f4056..74bef43e928 100644
--- a/source/blender/gpu/intern/gpu_buffers.c
+++ b/source/blender/gpu/intern/gpu_buffers.c
@@ -520,11 +520,11 @@ void *GPU_build_mesh_buffers(GHash *map, MVert *mvert, MFace *mface,
}
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 @@ void GPU_update_grid_buffers(void *buffers_v, DMGridData **grids,
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 @@ void *GPU_build_grid_buffers(DMGridData **grids,
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 @@ void *GPU_build_grid_buffers(DMGridData **grids,
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 @@ void *GPU_build_grid_buffers(DMGridData **grids,
/* 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;