From 7f570a7174f3724ea9d6b407ddc97f027ac8f19b Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Tue, 15 Jun 2021 11:39:36 +0200 Subject: Cleanup: Split mesh_render_data_loose_geom into multiple functions. --- .../intern/draw_cache_extract_mesh_render_data.c | 139 +++++++++++++-------- 1 file changed, 90 insertions(+), 49 deletions(-) (limited to 'source/blender/draw') diff --git a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c index 4741bcb06c9..3007e31dcdb 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh_render_data.c @@ -39,9 +39,20 @@ #include "draw_cache_extract_mesh_private.h" /* ---------------------------------------------------------------------- */ -/** \name Mesh/BMesh Interface (indirect, partially cached access to complex data). +/** \name Update Loose Geometry * \{ */ +static void mesh_render_data_lverts_bm(const MeshRenderData *mr, + MeshBufferExtractionCache *cache, + BMesh *bm); +static void mesh_render_data_ledges_bm(const MeshRenderData *mr, + MeshBufferExtractionCache *cache, + BMesh *bm); +static void mesh_render_data_loose_geom_mesh(const MeshRenderData *mr, + MeshBufferExtractionCache *cache); +static void mesh_render_data_loose_geom_build(const MeshRenderData *mr, + MeshBufferExtractionCache *cache); + static void mesh_render_data_loose_geom_load(MeshRenderData *mr, MeshBufferExtractionCache *cache) { mr->ledges = cache->ledges; @@ -60,71 +71,101 @@ static void mesh_render_data_loose_geom_ensure(const MeshRenderData *mr, if (cache->lverts) { return; } + mesh_render_data_loose_geom_build(mr, cache) +} +static void mesh_render_data_loose_geom_build(const MeshRenderData *mr, + MeshBufferExtractionCache *cache) +{ cache->vert_loose_len = 0; cache->edge_loose_len = 0; if (mr->extract_type != MR_EXTRACT_BMESH) { /* Mesh */ - - BLI_bitmap *lvert_map = BLI_BITMAP_NEW(mr->vert_len, __func__); - - cache->ledges = MEM_mallocN(mr->edge_len * sizeof(*cache->ledges), __func__); - const MEdge *med = mr->medge; - for (int med_index = 0; med_index < mr->edge_len; med_index++, med++) { - if (med->flag & ME_LOOSEEDGE) { - cache->ledges[cache->edge_loose_len++] = med_index; - } - /* Tag verts as not loose. */ - BLI_BITMAP_ENABLE(lvert_map, med->v1); - BLI_BITMAP_ENABLE(lvert_map, med->v2); - } - if (cache->edge_loose_len < mr->edge_len) { - cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges)); - } - - cache->lverts = MEM_mallocN(mr->vert_len * sizeof(*mr->lverts), __func__); - for (int v = 0; v < mr->vert_len; v++) { - if (!BLI_BITMAP_TEST(lvert_map, v)) { - cache->lverts[cache->vert_loose_len++] = v; - } - } - if (cache->vert_loose_len < mr->vert_len) { - cache->lverts = MEM_reallocN(cache->lverts, cache->vert_loose_len * sizeof(*cache->lverts)); - } - - MEM_freeN(lvert_map); + mesh_render_data_loose_geom_mesh(mr, cache); } else { /* #BMesh */ BMesh *bm = mr->bm; - int elem_id; - BMIter iter; - BMVert *eve; - BMEdge *ede; - - cache->lverts = MEM_mallocN(mr->vert_len * sizeof(*cache->lverts), __func__); - BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, elem_id) { - if (eve->e == NULL) { - cache->lverts[cache->vert_loose_len++] = elem_id; - } + mesh_render_data_lverts_bm(mr, cache, bm); + mesh_render_data_ledges_bm(mr, cache, bm); + } +} + +static void mesh_render_data_loose_geom_mesh(const MeshRenderData *mr, + MeshBufferExtractionCache *cache) +{ + BLI_bitmap *lvert_map = BLI_BITMAP_NEW(mr->vert_len, __func__); + + cache->ledges = MEM_mallocN(mr->edge_len * sizeof(*cache->ledges), __func__); + const MEdge *med = mr->medge; + for (int med_index = 0; med_index < mr->edge_len; med_index++, med++) { + if (med->flag & ME_LOOSEEDGE) { + cache->ledges[cache->edge_loose_len++] = med_index; } - if (cache->vert_loose_len < mr->vert_len) { - cache->lverts = MEM_reallocN(cache->lverts, cache->vert_loose_len * sizeof(*cache->lverts)); + /* Tag verts as not loose. */ + BLI_BITMAP_ENABLE(lvert_map, med->v1); + BLI_BITMAP_ENABLE(lvert_map, med->v2); + } + if (cache->edge_loose_len < mr->edge_len) { + cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges)); + } + + cache->lverts = MEM_mallocN(mr->vert_len * sizeof(*mr->lverts), __func__); + for (int v = 0; v < mr->vert_len; v++) { + if (!BLI_BITMAP_TEST(lvert_map, v)) { + cache->lverts[cache->vert_loose_len++] = v; } + } + if (cache->vert_loose_len < mr->vert_len) { + cache->lverts = MEM_reallocN(cache->lverts, cache->vert_loose_len * sizeof(*cache->lverts)); + } - cache->ledges = MEM_mallocN(mr->edge_len * sizeof(*cache->ledges), __func__); - BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) { - if (ede->l == NULL) { - cache->ledges[cache->edge_loose_len++] = elem_id; - } + MEM_freeN(lvert_map); +} + +static void mesh_render_data_lverts_bm(const MeshRenderData *mr, + MeshBufferExtractionCache *cache, + BMesh *bm) +{ + int elem_id; + BMIter iter; + BMVert *eve; + cache->lverts = MEM_mallocN(mr->vert_len * sizeof(*cache->lverts), __func__); + BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, elem_id) { + if (eve->e == NULL) { + cache->lverts[cache->vert_loose_len++] = elem_id; } - if (cache->edge_loose_len < mr->edge_len) { - cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges)); + } + if (cache->vert_loose_len < mr->vert_len) { + cache->lverts = MEM_reallocN(cache->lverts, cache->vert_loose_len * sizeof(*cache->lverts)); + } +} + +static void mesh_render_data_ledges_bm(const MeshRenderData *mr, + MeshBufferExtractionCache *cache, + BMesh *bm) +{ + int elem_id; + BMIter iter; + BMEdge *ede; + cache->ledges = MEM_mallocN(mr->edge_len * sizeof(*cache->ledges), __func__); + BM_ITER_MESH_INDEX (ede, &iter, bm, BM_EDGES_OF_MESH, elem_id) { + if (ede->l == NULL) { + cache->ledges[cache->edge_loose_len++] = elem_id; } } + if (cache->edge_loose_len < mr->edge_len) { + cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges)); + } } +/** \} */ + +/* ---------------------------------------------------------------------- */ +/** \name Mesh/BMesh Interface (indirect, partially cached access to complex data). + * \{ */ + /** * Part of the creation of the #MeshRenderData that happens in a thread. */ @@ -368,4 +409,4 @@ void mesh_render_data_free(MeshRenderData *mr) MEM_freeN(mr); } -/** \} */ \ No newline at end of file +/** \} */ -- cgit v1.2.3