Cleanup: Use BitVector instead of BLI_Bitmap in sculpt expand

This commit is contained in:
Hans Goudey
2023-09-04 21:44:06 -04:00
parent 96f761a17c
commit f4505e7b0a

View File

@@ -11,6 +11,7 @@
#include "MEM_guardedalloc.h" #include "MEM_guardedalloc.h"
#include "BLI_bit_vector.hh"
#include "BLI_linklist_stack.h" #include "BLI_linklist_stack.h"
#include "BLI_task.h" #include "BLI_task.h"
@@ -129,8 +130,8 @@ enum {
* Returns true if the vertex is in a connected component with correctly initialized falloff * Returns true if the vertex is in a connected component with correctly initialized falloff
* values. * values.
*/ */
static bool sculpt_expand_is_vert_in_active_component(SculptSession *ss, static bool sculpt_expand_is_vert_in_active_component(const SculptSession *ss,
ExpandCache *expand_cache, const ExpandCache *expand_cache,
const PBVHVertRef v) const PBVHVertRef v)
{ {
for (int i = 0; i < EXPAND_SYMM_AREAS; i++) { for (int i = 0; i < EXPAND_SYMM_AREAS; i++) {
@@ -144,8 +145,8 @@ static bool sculpt_expand_is_vert_in_active_component(SculptSession *ss,
/** /**
* Returns true if the face is in a connected component with correctly initialized falloff values. * Returns true if the face is in a connected component with correctly initialized falloff values.
*/ */
static bool sculpt_expand_is_face_in_active_component(SculptSession *ss, static bool sculpt_expand_is_face_in_active_component(const SculptSession *ss,
ExpandCache *expand_cache, const ExpandCache *expand_cache,
const int f) const int f)
{ {
PBVHVertRef vertex; PBVHVertRef vertex;
@@ -157,7 +158,6 @@ static bool sculpt_expand_is_face_in_active_component(SculptSession *ss,
case PBVH_GRIDS: { case PBVH_GRIDS: {
const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh); const CCGKey *key = BKE_pbvh_get_grid_key(ss->pbvh);
vertex.i = ss->faces[f].start() * key->grid_area; vertex.i = ss->faces[f].start() * key->grid_area;
break; break;
} }
case PBVH_BMESH: { case PBVH_BMESH: {
@@ -172,8 +172,8 @@ static bool sculpt_expand_is_face_in_active_component(SculptSession *ss,
* Returns the falloff value of a vertex. This function includes texture distortion, which is not * Returns the falloff value of a vertex. This function includes texture distortion, which is not
* precomputed into the initial falloff values. * precomputed into the initial falloff values.
*/ */
static float sculpt_expand_falloff_value_vertex_get(SculptSession *ss, static float sculpt_expand_falloff_value_vertex_get(const SculptSession *ss,
ExpandCache *expand_cache, const ExpandCache *expand_cache,
const PBVHVertRef v) const PBVHVertRef v)
{ {
int v_i = BKE_pbvh_vertex_to_index(ss->pbvh, v); int v_i = BKE_pbvh_vertex_to_index(ss->pbvh, v);
@@ -361,14 +361,14 @@ static float sculpt_expand_gradient_value_get(SculptSession *ss,
* Returns a bitmap indexed by vertex index which contains if the vertex was enabled or not for a * Returns a bitmap indexed by vertex index which contains if the vertex was enabled or not for a
* give expand_cache state. * give expand_cache state.
*/ */
static BLI_bitmap *sculpt_expand_bitmap_from_enabled(SculptSession *ss, ExpandCache *expand_cache) static blender::BitVector<> sculpt_expand_bitmap_from_enabled(SculptSession *ss,
ExpandCache *expand_cache)
{ {
const int totvert = SCULPT_vertex_count_get(ss); const int totvert = SCULPT_vertex_count_get(ss);
BLI_bitmap *enabled_verts = BLI_BITMAP_NEW(totvert, "enabled verts"); blender::BitVector<> enabled_verts(totvert);
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
const bool enabled = sculpt_expand_state_get( enabled_verts[i].set(
ss, expand_cache, BKE_pbvh_index_to_vertex(ss->pbvh, i)); sculpt_expand_state_get(ss, expand_cache, BKE_pbvh_index_to_vertex(ss->pbvh, i)));
BLI_BITMAP_SET(enabled_verts, i, enabled);
} }
return enabled_verts; return enabled_verts;
} }
@@ -378,14 +378,14 @@ static BLI_bitmap *sculpt_expand_bitmap_from_enabled(SculptSession *ss, ExpandCa
* enabled vertices. This is defined as vertices that are enabled and at least have one connected * enabled vertices. This is defined as vertices that are enabled and at least have one connected
* vertex that is not enabled. * vertex that is not enabled.
*/ */
static BLI_bitmap *sculpt_expand_boundary_from_enabled(SculptSession *ss, static blender::BitVector<> sculpt_expand_boundary_from_enabled(
const BLI_bitmap *enabled_verts, SculptSession *ss, const blender::BitSpan enabled_verts, const bool use_mesh_boundary)
const bool use_mesh_boundary)
{ {
const int totvert = SCULPT_vertex_count_get(ss); const int totvert = SCULPT_vertex_count_get(ss);
BLI_bitmap *boundary_verts = BLI_BITMAP_NEW(totvert, "boundary verts");
blender::BitVector<> boundary_verts(totvert);
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
if (!BLI_BITMAP_TEST(enabled_verts, i)) { if (!enabled_verts[i]) {
continue; continue;
} }
@@ -394,7 +394,7 @@ static BLI_bitmap *sculpt_expand_boundary_from_enabled(SculptSession *ss,
bool is_expand_boundary = false; bool is_expand_boundary = false;
SculptVertexNeighborIter ni; SculptVertexNeighborIter ni;
SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) { SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, vertex, ni) {
if (!BLI_BITMAP_TEST(enabled_verts, ni.index)) { if (!enabled_verts[ni.index]) {
is_expand_boundary = true; is_expand_boundary = true;
} }
} }
@@ -404,7 +404,7 @@ static BLI_bitmap *sculpt_expand_boundary_from_enabled(SculptSession *ss,
is_expand_boundary = true; is_expand_boundary = true;
} }
BLI_BITMAP_SET(boundary_verts, i, is_expand_boundary); boundary_verts[i].set(is_expand_boundary);
} }
return boundary_verts; return boundary_verts;
@@ -633,7 +633,7 @@ static float *sculpt_expand_boundary_topology_falloff_create(Object *ob, const P
SculptSession *ss = ob->sculpt; SculptSession *ss = ob->sculpt;
const int totvert = SCULPT_vertex_count_get(ss); const int totvert = SCULPT_vertex_count_get(ss);
float *dists = static_cast<float *>(MEM_calloc_arrayN(totvert, sizeof(float), __func__)); float *dists = static_cast<float *>(MEM_calloc_arrayN(totvert, sizeof(float), __func__));
BLI_bitmap *visited_verts = BLI_BITMAP_NEW(totvert, "visited verts"); blender::BitVector<> visited_verts(totvert);
GSQueue *queue = BLI_gsqueue_new(sizeof(PBVHVertRef)); GSQueue *queue = BLI_gsqueue_new(sizeof(PBVHVertRef));
/* Search and initialize a boundary per symmetry pass, then mark those vertices as visited. */ /* Search and initialize a boundary per symmetry pass, then mark those vertices as visited. */
@@ -653,7 +653,7 @@ static float *sculpt_expand_boundary_topology_falloff_create(Object *ob, const P
for (int i = 0; i < boundary->verts_num; i++) { for (int i = 0; i < boundary->verts_num; i++) {
BLI_gsqueue_push(queue, &boundary->verts[i]); BLI_gsqueue_push(queue, &boundary->verts[i]);
BLI_BITMAP_ENABLE(visited_verts, BKE_pbvh_vertex_to_index(ss->pbvh, boundary->verts[i])); visited_verts[BKE_pbvh_vertex_to_index(ss->pbvh, boundary->verts[i])].set();
} }
SCULPT_boundary_data_free(boundary); SCULPT_boundary_data_free(boundary);
} }
@@ -672,18 +672,17 @@ static float *sculpt_expand_boundary_topology_falloff_create(Object *ob, const P
SculptVertexNeighborIter ni; SculptVertexNeighborIter ni;
SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, v_next, ni) { SCULPT_VERTEX_NEIGHBORS_ITER_BEGIN (ss, v_next, ni) {
if (BLI_BITMAP_TEST(visited_verts, ni.index)) { if (visited_verts[ni.index]) {
continue; continue;
} }
dists[ni.index] = dists[v_next_i] + 1.0f; dists[ni.index] = dists[v_next_i] + 1.0f;
BLI_BITMAP_ENABLE(visited_verts, ni.index); visited_verts[ni.index];
BLI_gsqueue_push(queue, &ni.vertex); BLI_gsqueue_push(queue, &ni.vertex);
} }
SCULPT_VERTEX_NEIGHBORS_ITER_END(ni); SCULPT_VERTEX_NEIGHBORS_ITER_END(ni);
} }
BLI_gsqueue_free(queue); BLI_gsqueue_free(queue);
MEM_freeN(visited_verts);
return dists; return dists;
} }
@@ -706,7 +705,7 @@ static float *sculpt_expand_diagonals_falloff_create(Object *ob, const PBVHVertR
} }
/* Search and mask as visited the initial vertices using the enabled symmetry passes. */ /* Search and mask as visited the initial vertices using the enabled symmetry passes. */
BLI_bitmap *visited_verts = BLI_BITMAP_NEW(totvert, "visited verts"); blender::BitVector<> visited_verts(totvert);
GSQueue *queue = BLI_gsqueue_new(sizeof(PBVHVertRef)); GSQueue *queue = BLI_gsqueue_new(sizeof(PBVHVertRef));
const char symm = SCULPT_mesh_symmetry_xyz_get(ob); const char symm = SCULPT_mesh_symmetry_xyz_get(ob);
for (char symm_it = 0; symm_it <= symm; symm_it++) { for (char symm_it = 0; symm_it <= symm; symm_it++) {
@@ -719,7 +718,7 @@ static float *sculpt_expand_diagonals_falloff_create(Object *ob, const PBVHVertR
int symm_vertex_i = BKE_pbvh_vertex_to_index(ss->pbvh, symm_vertex); int symm_vertex_i = BKE_pbvh_vertex_to_index(ss->pbvh, symm_vertex);
BLI_gsqueue_push(queue, &symm_vertex); BLI_gsqueue_push(queue, &symm_vertex);
BLI_BITMAP_ENABLE(visited_verts, symm_vertex_i); visited_verts[symm_vertex_i].set();
} }
if (BLI_gsqueue_is_empty(queue)) { if (BLI_gsqueue_is_empty(queue)) {
@@ -736,18 +735,17 @@ static float *sculpt_expand_diagonals_falloff_create(Object *ob, const PBVHVertR
for (const int face : ss->pmap[v_next_i]) { for (const int face : ss->pmap[v_next_i]) {
for (const int vert : ss->corner_verts.slice(ss->faces[face])) { for (const int vert : ss->corner_verts.slice(ss->faces[face])) {
const PBVHVertRef neighbor_v = BKE_pbvh_make_vref(vert); const PBVHVertRef neighbor_v = BKE_pbvh_make_vref(vert);
if (BLI_BITMAP_TEST(visited_verts, neighbor_v.i)) { if (visited_verts[neighbor_v.i]) {
continue; continue;
} }
dists[neighbor_v.i] = dists[v_next_i] + 1.0f; dists[neighbor_v.i] = dists[v_next_i] + 1.0f;
BLI_BITMAP_ENABLE(visited_verts, neighbor_v.i); visited_verts[neighbor_v.i].set();
BLI_gsqueue_push(queue, &neighbor_v); BLI_gsqueue_push(queue, &neighbor_v);
} }
} }
} }
BLI_gsqueue_free(queue); BLI_gsqueue_free(queue);
MEM_freeN(visited_verts);
return dists; return dists;
} }
@@ -875,21 +873,21 @@ static void sculpt_expand_mesh_face_falloff_from_vertex_falloff(SculptSession *s
*/ */
static void sculpt_expand_geodesics_from_state_boundary(Object *ob, static void sculpt_expand_geodesics_from_state_boundary(Object *ob,
ExpandCache *expand_cache, ExpandCache *expand_cache,
BLI_bitmap *enabled_verts) const blender::BitSpan enabled_verts)
{ {
SculptSession *ss = ob->sculpt; SculptSession *ss = ob->sculpt;
BLI_assert(BKE_pbvh_type(ss->pbvh) == PBVH_FACES); BLI_assert(BKE_pbvh_type(ss->pbvh) == PBVH_FACES);
GSet *initial_verts = BLI_gset_int_new("initial_verts"); GSet *initial_verts = BLI_gset_int_new("initial_verts");
BLI_bitmap *boundary_verts = sculpt_expand_boundary_from_enabled(ss, enabled_verts, false); const blender::BitVector<> boundary_verts = sculpt_expand_boundary_from_enabled(
ss, enabled_verts, false);
const int totvert = SCULPT_vertex_count_get(ss); const int totvert = SCULPT_vertex_count_get(ss);
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
if (!BLI_BITMAP_TEST(boundary_verts, i)) { if (!boundary_verts[i]) {
continue; continue;
} }
BLI_gset_add(initial_verts, POINTER_FROM_INT(i)); BLI_gset_add(initial_verts, POINTER_FROM_INT(i));
} }
MEM_freeN(boundary_verts);
MEM_SAFE_FREE(expand_cache->vert_falloff); MEM_SAFE_FREE(expand_cache->vert_falloff);
MEM_SAFE_FREE(expand_cache->face_falloff); MEM_SAFE_FREE(expand_cache->face_falloff);
@@ -904,7 +902,7 @@ static void sculpt_expand_geodesics_from_state_boundary(Object *ob,
*/ */
static void sculpt_expand_topology_from_state_boundary(Object *ob, static void sculpt_expand_topology_from_state_boundary(Object *ob,
ExpandCache *expand_cache, ExpandCache *expand_cache,
BLI_bitmap *enabled_verts) const blender::BitSpan enabled_verts)
{ {
MEM_SAFE_FREE(expand_cache->vert_falloff); MEM_SAFE_FREE(expand_cache->vert_falloff);
MEM_SAFE_FREE(expand_cache->face_falloff); MEM_SAFE_FREE(expand_cache->face_falloff);
@@ -913,19 +911,19 @@ static void sculpt_expand_topology_from_state_boundary(Object *ob,
const int totvert = SCULPT_vertex_count_get(ss); const int totvert = SCULPT_vertex_count_get(ss);
float *dists = static_cast<float *>(MEM_calloc_arrayN(totvert, sizeof(float), __func__)); float *dists = static_cast<float *>(MEM_calloc_arrayN(totvert, sizeof(float), __func__));
BLI_bitmap *boundary_verts = sculpt_expand_boundary_from_enabled(ss, enabled_verts, false); const blender::BitVector<> boundary_verts = sculpt_expand_boundary_from_enabled(
ss, enabled_verts, false);
SculptFloodFill flood; SculptFloodFill flood;
SCULPT_floodfill_init(ss, &flood); SCULPT_floodfill_init(ss, &flood);
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
if (!BLI_BITMAP_TEST(boundary_verts, i)) { if (!boundary_verts[i]) {
continue; continue;
} }
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i); PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
SCULPT_floodfill_add_and_skip_initial(&flood, vertex); SCULPT_floodfill_add_and_skip_initial(&flood, vertex);
} }
MEM_freeN(boundary_verts);
ExpandFloodFillData fdata; ExpandFloodFillData fdata;
fdata.dists = dists; fdata.dists = dists;
@@ -947,7 +945,7 @@ static void sculpt_expand_resursion_step_add(Object *ob,
return; return;
} }
BLI_bitmap *enabled_verts = sculpt_expand_bitmap_from_enabled(ss, expand_cache); const blender::BitVector<> enabled_verts = sculpt_expand_bitmap_from_enabled(ss, expand_cache);
/* Each time a new recursion step is created, reset the distortion strength. This is the expected /* Each time a new recursion step is created, reset the distortion strength. This is the expected
* result from the recursion, as otherwise the new falloff will render with undesired distortion * result from the recursion, as otherwise the new falloff will render with undesired distortion
@@ -969,8 +967,6 @@ static void sculpt_expand_resursion_step_add(Object *ob,
ss, static_cast<Mesh *>(ob->data), expand_cache); ss, static_cast<Mesh *>(ob->data), expand_cache);
sculpt_expand_update_max_face_falloff_factor(ss, expand_cache); sculpt_expand_update_max_face_falloff_factor(ss, expand_cache);
} }
MEM_freeN(enabled_verts);
} }
/* Face Set Boundary falloff. */ /* Face Set Boundary falloff. */
@@ -987,7 +983,7 @@ static void sculpt_expand_initialize_from_face_set_boundary(Object *ob,
SculptSession *ss = ob->sculpt; SculptSession *ss = ob->sculpt;
const int totvert = SCULPT_vertex_count_get(ss); const int totvert = SCULPT_vertex_count_get(ss);
BLI_bitmap *enabled_verts = BLI_BITMAP_NEW(totvert, "enabled verts"); blender::BitVector<> enabled_verts(totvert);
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i); PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
@@ -997,7 +993,7 @@ static void sculpt_expand_initialize_from_face_set_boundary(Object *ob,
if (!SCULPT_vertex_has_face_set(ss, vertex, active_face_set)) { if (!SCULPT_vertex_has_face_set(ss, vertex, active_face_set)) {
continue; continue;
} }
BLI_BITMAP_ENABLE(enabled_verts, i); enabled_verts[i].set();
} }
if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) { if (BKE_pbvh_type(ss->pbvh) == PBVH_FACES) {
@@ -1007,8 +1003,6 @@ static void sculpt_expand_initialize_from_face_set_boundary(Object *ob,
sculpt_expand_topology_from_state_boundary(ob, expand_cache, enabled_verts); sculpt_expand_topology_from_state_boundary(ob, expand_cache, enabled_verts);
} }
MEM_freeN(enabled_verts);
if (internal_falloff) { if (internal_falloff) {
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i); PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
@@ -1126,7 +1120,7 @@ static void sculpt_expand_snap_initialize_from_enabled(SculptSession *ss,
expand_cache->snap = false; expand_cache->snap = false;
expand_cache->invert = false; expand_cache->invert = false;
BLI_bitmap *enabled_verts = sculpt_expand_bitmap_from_enabled(ss, expand_cache); const blender::BitVector<> enabled_verts = sculpt_expand_bitmap_from_enabled(ss, expand_cache);
const int totface = ss->totfaces; const int totface = ss->totfaces;
for (int i = 0; i < totface; i++) { for (int i = 0; i < totface; i++) {
@@ -1137,7 +1131,7 @@ static void sculpt_expand_snap_initialize_from_enabled(SculptSession *ss,
for (const int i : ss->faces.index_range()) { for (const int i : ss->faces.index_range()) {
bool any_disabled = false; bool any_disabled = false;
for (const int vert : ss->corner_verts.slice(ss->faces[i])) { for (const int vert : ss->corner_verts.slice(ss->faces[i])) {
if (!BLI_BITMAP_TEST(enabled_verts, vert)) { if (!enabled_verts[vert]) {
any_disabled = true; any_disabled = true;
break; break;
} }
@@ -1148,7 +1142,6 @@ static void sculpt_expand_snap_initialize_from_enabled(SculptSession *ss,
} }
} }
MEM_freeN(enabled_verts);
expand_cache->snap = prev_snap_state; expand_cache->snap = prev_snap_state;
expand_cache->invert = prev_invert_state; expand_cache->invert = prev_invert_state;
} }
@@ -1548,7 +1541,7 @@ static void sculpt_expand_reposition_pivot(bContext *C, Object *ob, ExpandCache
const bool initial_invert_state = expand_cache->invert; const bool initial_invert_state = expand_cache->invert;
expand_cache->invert = false; expand_cache->invert = false;
BLI_bitmap *enabled_verts = sculpt_expand_bitmap_from_enabled(ss, expand_cache); const blender::BitVector<> enabled_verts = sculpt_expand_bitmap_from_enabled(ss, expand_cache);
/* For boundary topology, position the pivot using only the boundary of the enabled vertices, /* For boundary topology, position the pivot using only the boundary of the enabled vertices,
* without taking mesh boundary into account. This allows to create deformations like bending the * without taking mesh boundary into account. This allows to create deformations like bending the
@@ -1556,7 +1549,7 @@ static void sculpt_expand_reposition_pivot(bContext *C, Object *ob, ExpandCache
const float use_mesh_boundary = expand_cache->falloff_type != const float use_mesh_boundary = expand_cache->falloff_type !=
SCULPT_EXPAND_FALLOFF_BOUNDARY_TOPOLOGY; SCULPT_EXPAND_FALLOFF_BOUNDARY_TOPOLOGY;
BLI_bitmap *boundary_verts = sculpt_expand_boundary_from_enabled( blender::BitVector<> boundary_verts = sculpt_expand_boundary_from_enabled(
ss, enabled_verts, use_mesh_boundary); ss, enabled_verts, use_mesh_boundary);
/* Ignore invert state, as this is the expected behavior in most cases and mask are created in /* Ignore invert state, as this is the expected behavior in most cases and mask are created in
@@ -1571,7 +1564,7 @@ static void sculpt_expand_reposition_pivot(bContext *C, Object *ob, ExpandCache
for (int i = 0; i < totvert; i++) { for (int i = 0; i < totvert; i++) {
PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i); PBVHVertRef vertex = BKE_pbvh_index_to_vertex(ss->pbvh, i);
if (!BLI_BITMAP_TEST(boundary_verts, i)) { if (!boundary_verts[i]) {
continue; continue;
} }
@@ -1589,9 +1582,6 @@ static void sculpt_expand_reposition_pivot(bContext *C, Object *ob, ExpandCache
total++; total++;
} }
MEM_freeN(enabled_verts);
MEM_freeN(boundary_verts);
if (total > 0) { if (total > 0) {
mul_v3_v3fl(ss->pivot_pos, avg, 1.0f / total); mul_v3_v3fl(ss->pivot_pos, avg, 1.0f / total);
} }