Attempt to solve T39950,

Avoid filling up buffers when total buffer triangles are zero.

Better still would be to tag a node as hidden when doing recreation of
the PBVH tree by checking for any visible elements. Original bug report
probably has to do with OpenGL doing something funky but hidden nodes
should be tagged as hidden to completely avoid iterating for painting.
This is to be done in a later commit.

Also some naming cleanup for consistency, GPU_build_pbvh_mesh_buffers to
GPU_build_mesh_pbvh_buffers.
This commit is contained in:
2014-05-05 21:13:27 +03:00
parent fbfaa4770d
commit 9a1c47de44
3 changed files with 26 additions and 7 deletions

View File

@@ -1037,7 +1037,7 @@ static void pbvh_update_draw_buffers(PBVH *bvh, PBVHNode **nodes, int totnode)
break; break;
case PBVH_FACES: case PBVH_FACES:
node->draw_buffers = node->draw_buffers =
GPU_build_pbvh_mesh_buffers(node->face_vert_indices, GPU_build_mesh_pbvh_buffers(node->face_vert_indices,
bvh->faces, bvh->verts, bvh->faces, bvh->verts,
node->prim_indices, node->prim_indices,
node->totprim); node->totprim);

View File

@@ -166,19 +166,22 @@ bool GPU_buffer_legacy(struct DerivedMesh *dm);
/* Buffers for non-DerivedMesh drawing */ /* Buffers for non-DerivedMesh drawing */
typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers; typedef struct GPU_PBVH_Buffers GPU_PBVH_Buffers;
GPU_PBVH_Buffers *GPU_build_pbvh_mesh_buffers(int (*face_vert_indices)[4], /* build */
GPU_PBVH_Buffers *GPU_build_mesh_pbvh_buffers(int (*face_vert_indices)[4],
struct MFace *mface, struct MVert *mvert, struct MFace *mface, struct MVert *mvert,
int *face_indices, int totface); int *face_indices, int totface);
void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
int *vert_indices, int totvert, const float *vmask,
int (*face_vert_indices)[4], bool show_diffuse_color);
GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid, GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid,
unsigned int **grid_hidden, int gridsize); unsigned int **grid_hidden, int gridsize);
GPU_PBVH_Buffers *GPU_build_bmesh_pbvh_buffers(int smooth_shading); GPU_PBVH_Buffers *GPU_build_bmesh_pbvh_buffers(int smooth_shading);
/* update */
void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
int *vert_indices, int totvert, const float *vmask,
int (*face_vert_indices)[4], bool show_diffuse_color);
void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, void GPU_update_bmesh_pbvh_buffers(GPU_PBVH_Buffers *buffers,
struct BMesh *bm, struct BMesh *bm,
struct GSet *bm_faces, struct GSet *bm_faces,
@@ -191,9 +194,11 @@ void GPU_update_grid_pbvh_buffers(GPU_PBVH_Buffers *buffers, struct CCGElem **gr
int *grid_indices, int totgrid, const struct CCGKey *key, int *grid_indices, int totgrid, const struct CCGKey *key,
bool show_diffuse_color); bool show_diffuse_color);
/* draw */
void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial, void GPU_draw_pbvh_buffers(GPU_PBVH_Buffers *buffers, DMSetMaterial setMaterial,
bool wireframe); bool wireframe);
/* debug PBVH draw*/
void GPU_draw_pbvh_BB(float min[3], float max[3], bool leaf); void GPU_draw_pbvh_BB(float min[3], float max[3], bool leaf);
void GPU_end_draw_pbvh_BB(void); void GPU_end_draw_pbvh_BB(void);
void GPU_init_draw_pbvh_BB(void); void GPU_init_draw_pbvh_BB(void);

View File

@@ -1623,7 +1623,7 @@ void GPU_update_mesh_pbvh_buffers(GPU_PBVH_Buffers *buffers, MVert *mvert,
buffers->mvert = mvert; buffers->mvert = mvert;
} }
GPU_PBVH_Buffers *GPU_build_pbvh_mesh_buffers(int (*face_vert_indices)[4], GPU_PBVH_Buffers *GPU_build_mesh_pbvh_buffers(int (*face_vert_indices)[4],
MFace *mface, MVert *mvert, MFace *mface, MVert *mvert,
int *face_indices, int *face_indices,
int totface) int totface)
@@ -1646,6 +1646,16 @@ GPU_PBVH_Buffers *GPU_build_pbvh_mesh_buffers(int (*face_vert_indices)[4],
tottri += f->v4 ? 2 : 1; tottri += f->v4 ? 2 : 1;
} }
if (tottri == 0) {
buffers->tot_tri = 0;
buffers->mface = mface;
buffers->face_indices = face_indices;
buffers->totface = 0;
return buffers;
}
/* An element index buffer is used for smooth shading, but flat /* An element index buffer is used for smooth shading, but flat
* shading requires separate vertex normals so an index buffer is * shading requires separate vertex normals so an index buffer is
* can't be used there. */ * can't be used there. */
@@ -1966,6 +1976,10 @@ GPU_PBVH_Buffers *GPU_build_grid_pbvh_buffers(int *grid_indices, int totgrid,
/* Count the number of quads */ /* Count the number of quads */
totquad = gpu_count_grid_quads(grid_hidden, grid_indices, totgrid, gridsize); totquad = gpu_count_grid_quads(grid_hidden, grid_indices, totgrid, gridsize);
/* totally hidden node, return here to avoid BufferData with zero below. */
if (totquad == 0)
return buffers;
if (totquad == fully_visible_totquad) { if (totquad == fully_visible_totquad) {
buffers->index_buf = gpu_get_grid_buffer(gridsize, &buffers->index_type, &buffers->tot_quad); buffers->index_buf = gpu_get_grid_buffer(gridsize, &buffers->index_type, &buffers->tot_quad);
buffers->has_hidden = 0; buffers->has_hidden = 0;