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:
authorJeroen Bakker <jeroen@blender.org>2021-06-15 12:39:36 +0300
committerJeroen Bakker <jeroen@blender.org>2021-06-15 12:39:36 +0300
commit7f570a7174f3724ea9d6b407ddc97f027ac8f19b (patch)
tree3fe295e11310ce30ee6f6cc05f0f6d342c57b587
parent9cd2e80d5d7a3a3f0ece3809a17f4225ae960214 (diff)
Cleanup: Split mesh_render_data_loose_geom into multiple functions.
-rw-r--r--source/blender/draw/intern/draw_cache_extract_mesh_render_data.c139
1 files changed, 90 insertions, 49 deletions
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
+/** \} */