Cleanup: Sculpt: Use C++ Vector for vertex neighbors

This commit is contained in:
Hans Goudey
2024-05-29 08:58:04 -04:00
parent 05820ae1cc
commit 98eecfcff0
4 changed files with 19 additions and 59 deletions

View File

@@ -661,39 +661,12 @@ static void sculpt_vertex_neighbor_add(SculptVertexNeighborIter *iter,
PBVHVertRef neighbor,
int neighbor_index)
{
for (int i = 0; i < iter->size; i++) {
if (iter->neighbors[i].i == neighbor.i) {
return;
}
if (iter->neighbors.contains(neighbor)) {
return;
}
if (iter->size >= iter->capacity) {
iter->capacity += SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY;
if (iter->neighbors == iter->neighbors_fixed) {
iter->neighbors = static_cast<PBVHVertRef *>(
MEM_mallocN(iter->capacity * sizeof(PBVHVertRef), "neighbor array"));
memcpy(iter->neighbors, iter->neighbors_fixed, sizeof(PBVHVertRef) * iter->size);
}
else {
iter->neighbors = static_cast<PBVHVertRef *>(MEM_reallocN_id(
iter->neighbors, iter->capacity * sizeof(PBVHVertRef), "neighbor array"));
}
if (iter->neighbor_indices == iter->neighbor_indices_fixed) {
iter->neighbor_indices = static_cast<int *>(
MEM_mallocN(iter->capacity * sizeof(int), "neighbor array"));
memcpy(iter->neighbor_indices, iter->neighbor_indices_fixed, sizeof(int) * iter->size);
}
else {
iter->neighbor_indices = static_cast<int *>(
MEM_reallocN_id(iter->neighbor_indices, iter->capacity * sizeof(int), "neighbor array"));
}
}
iter->neighbors[iter->size] = neighbor;
iter->neighbor_indices[iter->size] = neighbor_index;
iter->size++;
iter->neighbors.append(neighbor);
iter->neighbor_indices.append(neighbor_index);
}
static void sculpt_vertex_neighbors_get_bmesh(PBVHVertRef vertex, SculptVertexNeighborIter *iter)
@@ -701,11 +674,9 @@ static void sculpt_vertex_neighbors_get_bmesh(PBVHVertRef vertex, SculptVertexNe
BMVert *v = (BMVert *)vertex.i;
BMIter liter;
BMLoop *l;
iter->size = 0;
iter->num_duplicates = 0;
iter->capacity = SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY;
iter->neighbors = iter->neighbors_fixed;
iter->neighbor_indices = iter->neighbor_indices_fixed;
iter->neighbors.clear();
iter->neighbor_indices.clear();
BM_ITER_ELEM (l, &liter, v, BM_LOOPS_OF_VERT) {
const BMVert *adj_v[2] = {l->prev->v, l->next->v};
@@ -723,11 +694,9 @@ static void sculpt_vertex_neighbors_get_faces(const SculptSession &ss,
PBVHVertRef vertex,
SculptVertexNeighborIter *iter)
{
iter->size = 0;
iter->num_duplicates = 0;
iter->capacity = SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY;
iter->neighbors = iter->neighbors_fixed;
iter->neighbor_indices = iter->neighbor_indices_fixed;
iter->neighbors.clear();
iter->neighbor_indices.clear();
for (const int face_i : ss.vert_to_face_map[vertex.i]) {
if (ss.hide_poly && ss.hide_poly[face_i]) {
@@ -774,11 +743,9 @@ static void sculpt_vertex_neighbors_get_grids(const SculptSession &ss,
SubdivCCGNeighbors neighbors;
BKE_subdiv_ccg_neighbor_coords_get(*ss.subdiv_ccg, coord, include_duplicates, neighbors);
iter->size = 0;
iter->num_duplicates = neighbors.num_duplicates;
iter->capacity = SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY;
iter->neighbors = iter->neighbors_fixed;
iter->neighbor_indices = iter->neighbor_indices_fixed;
iter->neighbors.clear();
iter->neighbor_indices.clear();
for (const int i : neighbors.coords.index_range()) {
int v = neighbors.coords[i].grid_index * key->grid_area +

View File

@@ -573,8 +573,8 @@ static Array<float> sculpt_expand_normal_falloff_create(Object &ob,
}
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
if (ni.size > 0.0f) {
dists[i] = avg / ni.size;
if (ni.neighbors.size() > 0.0f) {
dists[i] = avg / ni.neighbors.size();
}
}
}

View File

@@ -80,13 +80,8 @@ struct SculptCursorGeometryInfo {
struct SculptVertexNeighborIter {
/* Storage */
PBVHVertRef *neighbors;
int *neighbor_indices;
int size;
int capacity;
PBVHVertRef neighbors_fixed[SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY];
int neighbor_indices_fixed[SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY];
blender::Vector<PBVHVertRef, SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY> neighbors;
blender::Vector<int, SCULPT_VERTEX_NEIGHBOR_FIXED_CAPACITY> neighbor_indices;
/* Internal iterator. */
int num_duplicates;
@@ -893,7 +888,7 @@ void SCULPT_vertex_neighbors_get(const SculptSession &ss,
/** Iterator over neighboring vertices. */
#define SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator) \
SCULPT_vertex_neighbors_get(ss, v_index, false, &neighbor_iterator); \
for (neighbor_iterator.i = 0; neighbor_iterator.i < neighbor_iterator.size; \
for (neighbor_iterator.i = 0; neighbor_iterator.i < neighbor_iterator.neighbors.size(); \
neighbor_iterator.i++) \
{ \
neighbor_iterator.vertex = neighbor_iterator.neighbors[neighbor_iterator.i]; \
@@ -905,19 +900,17 @@ void SCULPT_vertex_neighbors_get(const SculptSession &ss,
*/
#define SCULPT_VERTEX_DUPLICATES_AND_NEIGHBORS_ITER_BEGIN(ss, v_index, neighbor_iterator) \
SCULPT_vertex_neighbors_get(ss, v_index, true, &neighbor_iterator); \
for (neighbor_iterator.i = neighbor_iterator.size - 1; neighbor_iterator.i >= 0; \
for (neighbor_iterator.i = neighbor_iterator.neighbors.size() - 1; neighbor_iterator.i >= 0; \
neighbor_iterator.i--) \
{ \
neighbor_iterator.vertex = neighbor_iterator.neighbors[neighbor_iterator.i]; \
neighbor_iterator.index = neighbor_iterator.neighbor_indices[neighbor_iterator.i]; \
neighbor_iterator.is_duplicate = (neighbor_iterator.i >= \
neighbor_iterator.size - neighbor_iterator.num_duplicates);
neighbor_iterator.neighbors.size() - \
neighbor_iterator.num_duplicates);
#define SCULPT_VERTEX_NEIGHBORS_ITER_END(neighbor_iterator) \
} \
if (neighbor_iterator.neighbors != neighbor_iterator.neighbors_fixed) { \
MEM_freeN(neighbor_iterator.neighbors); \
} \
((void)0)
PBVHVertRef SCULPT_active_vertex_get(const SculptSession &ss);

View File

@@ -612,7 +612,7 @@ void SCULPT_geometry_preview_lines_update(bContext *C, SculptSession &ss, float
SculptVertexNeighborIter ni;
SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, from_v, ni) {
if (totpoints + (ni.size * 2) < max_preview_verts) {
if (totpoints + (ni.neighbors.size() * 2) < max_preview_verts) {
PBVHVertRef to_v = ni.vertex;
int to_v_i = ni.index;
ss.preview_vert_list[totpoints] = from_v;