From 0408684763c469bf675b4f374a034957cc71a3bc Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Thu, 2 May 2013 06:09:05 +0000 Subject: avoid per-vertex mask layer lookups for dyntopo. --- source/blender/gpu/intern/gpu_buffers.c | 44 +++++++++++++++++++-------------- 1 file changed, 25 insertions(+), 19 deletions(-) (limited to 'source/blender/gpu') diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 5bef7a8ae0b..ff48e273619 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -1872,26 +1872,28 @@ GPU_Buffers *GPU_build_grid_buffers(int *grid_indices, int totgrid, * index '*v_index' in the 'vert_data' array and '*v_index' is * incremented. */ -static void gpu_bmesh_vert_to_buffer_copy(BMVert *v, BMesh *bm, - VertexBufferFormat *vert_data, - int *v_index, - const float fno[3], - const float *fmask) +static void gpu_bmesh_vert_to_buffer_copy(BMVert *v, + VertexBufferFormat *vert_data, + int *v_index, + const float fno[3], + const float *fmask, + const int cd_vert_mask_offset) { - VertexBufferFormat *vd = &vert_data[*v_index]; - float *mask; - if (!BM_elem_flag_test(v, BM_ELEM_HIDDEN)) { + VertexBufferFormat *vd = &vert_data[*v_index]; + /* TODO: should use material color */ float diffuse_color[4] = {0.8f, 0.8f, 0.8f, 1.0f}; /* Set coord, normal, and mask */ copy_v3_v3(vd->co, v->co); normal_float_to_short_v3(vd->no, fno ? fno : v->no); - mask = CustomData_bmesh_get(&bm->vdata, v->head.data, CD_PAINT_MASK); - gpu_color_from_mask_copy(fmask ? *fmask : *mask, - diffuse_color, - vd->color); + + gpu_color_from_mask_copy( + fmask ? *fmask : + BM_ELEM_CD_GET_FLOAT(v, cd_vert_mask_offset), + diffuse_color, + vd->color); /* Assign index for use in the triangle index buffer */ @@ -1950,6 +1952,9 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers, void *tri_data; int tottri, totvert, maxvert = 0; + /* TODO, make mask layer optional for bmesh buffer */ + const int cd_vert_mask_offset = CustomData_get_offset(&bm->vdata, CD_PAINT_MASK); + if (!buffers->vert_buf || (buffers->smooth && !buffers->index_buf)) return; @@ -1982,12 +1987,14 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers, GHASH_ITER (gh_iter, bm_unique_verts) { gpu_bmesh_vert_to_buffer_copy(BLI_ghashIterator_getKey(&gh_iter), - bm, vert_data, &v_index, NULL, NULL); + vert_data, &v_index, NULL, NULL, + cd_vert_mask_offset); } GHASH_ITER (gh_iter, bm_other_verts) { gpu_bmesh_vert_to_buffer_copy(BLI_ghashIterator_getKey(&gh_iter), - bm, vert_data, &v_index, NULL, NULL); + vert_data, &v_index, NULL, NULL, + cd_vert_mask_offset); } maxvert = v_index; @@ -2008,15 +2015,14 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers, /* Average mask value */ for (i = 0; i < 3; i++) { - fmask += *((float*)CustomData_bmesh_get(&bm->vdata, - v[i]->head.data, - CD_PAINT_MASK)); + fmask += BM_ELEM_CD_GET_FLOAT(v[i], cd_vert_mask_offset); } fmask /= 3.0f; for (i = 0; i < 3; i++) { - gpu_bmesh_vert_to_buffer_copy(v[i], bm, vert_data, - &v_index, f->no, &fmask); + gpu_bmesh_vert_to_buffer_copy(v[i], vert_data, + &v_index, f->no, &fmask, + cd_vert_mask_offset); } } } -- cgit v1.2.3