From 5ddc7d64a85d6e01e7eae1ed904bda635478a24e Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 16 Jan 2013 21:09:54 +0000 Subject: optimize bmesh operations that use triangle BMFace's (dyn-topo and mesh conversion). --- source/blender/gpu/intern/gpu_buffers.c | 36 +++++++++++++++++++-------------- 1 file changed, 21 insertions(+), 15 deletions(-) (limited to 'source/blender/gpu/intern') diff --git a/source/blender/gpu/intern/gpu_buffers.c b/source/blender/gpu/intern/gpu_buffers.c index 5f9f68e9c99..c1eb7bdbbac 100644 --- a/source/blender/gpu/intern/gpu_buffers.c +++ b/source/blender/gpu/intern/gpu_buffers.c @@ -1925,15 +1925,17 @@ static int gpu_bmesh_vert_visible_count(GHash *bm_unique_verts, /* Return TRUE if all vertices in the face are visible, FALSE otherwise */ static int gpu_bmesh_face_visible(BMFace *f) { - BMIter bm_iter; - BMVert *v; + BMLoop *l_iter; + BMLoop *l_first; - BM_ITER_ELEM (v, &bm_iter, f, BM_VERTS_OF_FACE) { - if (BM_elem_flag_test(v, BM_ELEM_HIDDEN)) - return FALSE; - } + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + if (BM_elem_flag_test(l_iter->v, BM_ELEM_HIDDEN)) { + return false; + } + } while ((l_iter = l_iter->next) != l_first); - return TRUE; + return true; } /* Return the total number of visible faces */ @@ -2017,19 +2019,20 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers, float fmask = 0; int i; - BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void**)v, 3); + // BM_iter_as_array(bm, BM_VERTS_OF_FACE, f, (void**)v, 3); + BM_face_as_array_vert_tri(f, v); /* Average mask value */ for (i = 0; i < 3; i++) { fmask += *((float*)CustomData_bmesh_get(&bm->vdata, - v[i]->head.data, - CD_PAINT_MASK)); + v[i]->head.data, + CD_PAINT_MASK)); } 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); + &v_index, f->no, &fmask); } } } @@ -2063,12 +2066,15 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers, GHashIterator gh_iter; GHASH_ITER (gh_iter, bm_faces) { - BMIter bm_iter; BMFace *f = BLI_ghashIterator_getKey(&gh_iter); - BMVert *v; if (gpu_bmesh_face_visible(f)) { - BM_ITER_ELEM (v, &bm_iter, f, BM_VERTS_OF_FACE) { + BMLoop *l_iter; + BMLoop *l_first; + + l_iter = l_first = BM_FACE_FIRST_LOOP(f); + do { + BMVert *v = l_iter->v; if (use_short) { unsigned short *elem = tri_data; (*elem) = BM_elem_index_get(v); @@ -2081,7 +2087,7 @@ void GPU_update_bmesh_buffers(GPU_Buffers *buffers, elem++; tri_data = elem; } - } + } while ((l_iter = l_iter->next) != l_first); } } -- cgit v1.2.3