Cleanup: Split mesh_render_data_loose_geom into multiple functions.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
if (cache->edge_loose_len < mr->edge_len) {
|
||||
cache->ledges = MEM_reallocN(cache->ledges, cache->edge_loose_len * sizeof(*cache->ledges));
|
||||
}
|
||||
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;
|
||||
}
|
||||
/* 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);
|
||||
}
|
||||
|
||||
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->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);
|
||||
}
|
||||
|
||||
/** \} */
|
||||
/** \} */
|
||||
|
Reference in New Issue
Block a user