Cleanup: Sculpt: Use references for undo nodes

This commit is contained in:
Hans Goudey
2024-06-20 11:06:34 -04:00
parent 89ba454fe8
commit 94d720832a

View File

@@ -1155,7 +1155,7 @@ const Node *get_node(const PBVHNode *node, const Type type)
return step_data->undo_nodes_by_pbvh_node.lookup_default({node, type}, nullptr);
}
static size_t alloc_and_store_hidden(const SculptSession &ss, const PBVHNode &node, Node *unode)
static size_t alloc_and_store_hidden(const SculptSession &ss, const PBVHNode &node, Node &unode)
{
if (!ss.subdiv_ccg) {
return 0;
@@ -1166,12 +1166,12 @@ static size_t alloc_and_store_hidden(const SculptSession &ss, const PBVHNode &no
}
const Span<int> grid_indices = bke::pbvh::node_grid_indices(node);
unode->grid_hidden = BitGroupVector<>(grid_indices.size(), grid_hidden.group_size());
unode.grid_hidden = BitGroupVector<>(grid_indices.size(), grid_hidden.group_size());
for (const int i : grid_indices.index_range()) {
unode->grid_hidden[i].copy_from(grid_hidden[grid_indices[i]]);
unode.grid_hidden[i].copy_from(grid_hidden[grid_indices[i]]);
}
return unode->grid_hidden.all_bits().full_ints_num() / bits::BitsPerInt;
return unode.grid_hidden.all_bits().full_ints_num() / bits::BitsPerInt;
}
/* Allocate node and initialize its default fields specific for the given undo type.
@@ -1210,61 +1210,61 @@ static Node *alloc_node(const Object &object, const PBVHNode *node, const Type t
StepData *step_data = get_step_data();
const SculptSession &ss = *object.sculpt;
Node *unode = alloc_node_type(type);
step_data->undo_nodes_by_pbvh_node.add({node, type}, unode);
Node &unode = *alloc_node_type(type);
step_data->undo_nodes_by_pbvh_node.add({node, type}, &unode);
const Mesh &mesh = *static_cast<Mesh *>(object.data);
int verts_num;
if (BKE_pbvh_type(*ss.pbvh) == PBVH_GRIDS) {
unode->mesh_grids_num = ss.subdiv_ccg->grids.size();
unode->grid_size = ss.subdiv_ccg->grid_size;
unode.mesh_grids_num = ss.subdiv_ccg->grids.size();
unode.grid_size = ss.subdiv_ccg->grid_size;
unode->grids = bke::pbvh::node_grid_indices(*node);
step_data->undo_size += unode->grids.as_span().size_in_bytes();
unode.grids = bke::pbvh::node_grid_indices(*node);
step_data->undo_size += unode.grids.as_span().size_in_bytes();
const int grid_area = unode->grid_size * unode->grid_size;
verts_num = unode->grids.size() * grid_area;
const int grid_area = unode.grid_size * unode.grid_size;
verts_num = unode.grids.size() * grid_area;
}
else {
unode->mesh_verts_num = ss.totvert;
unode.mesh_verts_num = ss.totvert;
unode->vert_indices = bke::pbvh::node_verts(*node);
unode->unique_verts_num = bke::pbvh::node_unique_verts(*node).size();
unode.vert_indices = bke::pbvh::node_verts(*node);
unode.unique_verts_num = bke::pbvh::node_unique_verts(*node).size();
verts_num = unode->vert_indices.size();
verts_num = unode.vert_indices.size();
step_data->undo_size += unode->vert_indices.as_span().size_in_bytes();
step_data->undo_size += unode.vert_indices.as_span().size_in_bytes();
}
bool need_loops = type == Type::Color;
const bool need_faces = ELEM(type, Type::FaceSet, Type::HideFace);
if (need_loops) {
unode->corner_indices = bke::pbvh::node_corners(*node);
unode->mesh_corners_num = mesh.corners_num;
unode.corner_indices = bke::pbvh::node_corners(*node);
unode.mesh_corners_num = mesh.corners_num;
step_data->undo_size += unode->corner_indices.as_span().size_in_bytes();
step_data->undo_size += unode.corner_indices.as_span().size_in_bytes();
}
if (need_faces) {
if (BKE_pbvh_type(*ss.pbvh) == PBVH_FACES) {
bke::pbvh::node_face_indices_calc_mesh(mesh.corner_tri_faces(), *node, unode->face_indices);
bke::pbvh::node_face_indices_calc_mesh(mesh.corner_tri_faces(), *node, unode.face_indices);
}
else {
bke::pbvh::node_face_indices_calc_grids(*ss.pbvh, *node, unode->face_indices);
bke::pbvh::node_face_indices_calc_grids(*ss.pbvh, *node, unode.face_indices);
}
step_data->undo_size += unode->face_indices.as_span().size_in_bytes();
step_data->undo_size += unode.face_indices.as_span().size_in_bytes();
}
switch (type) {
case Type::Position: {
unode->position.reinitialize(verts_num);
step_data->undo_size += unode->position.as_span().size_in_bytes();
unode.position.reinitialize(verts_num);
step_data->undo_size += unode.position.as_span().size_in_bytes();
/* Needed for original data lookup. */
unode->normal.reinitialize(verts_num);
step_data->undo_size += unode->normal.as_span().size_in_bytes();
unode.normal.reinitialize(verts_num);
step_data->undo_size += unode.normal.as_span().size_in_bytes();
break;
}
case Type::HideVert: {
@@ -1272,32 +1272,32 @@ static Node *alloc_node(const Object &object, const PBVHNode *node, const Type t
step_data->undo_size += alloc_and_store_hidden(ss, *node, unode);
}
else {
unode->vert_hidden.resize(unode->vert_indices.size());
step_data->undo_size += unode->vert_hidden.size() / 8;
unode.vert_hidden.resize(unode.vert_indices.size());
step_data->undo_size += unode.vert_hidden.size() / 8;
}
break;
}
case Type::HideFace: {
unode->face_hidden.resize(unode->face_indices.size());
step_data->undo_size += unode->face_hidden.size() / 8;
unode.face_hidden.resize(unode.face_indices.size());
step_data->undo_size += unode.face_hidden.size() / 8;
break;
}
case Type::Mask: {
unode->mask.reinitialize(verts_num);
step_data->undo_size += unode->mask.as_span().size_in_bytes();
unode.mask.reinitialize(verts_num);
step_data->undo_size += unode.mask.as_span().size_in_bytes();
break;
}
case Type::Color: {
/* Allocate vertex colors, even for loop colors we still
* need this for original data lookup. */
unode->col.reinitialize(verts_num);
step_data->undo_size += unode->col.as_span().size_in_bytes();
unode.col.reinitialize(verts_num);
step_data->undo_size += unode.col.as_span().size_in_bytes();
/* Allocate loop colors separately too. */
if (ss.vcol_domain == bke::AttrDomain::Corner) {
unode->loop_col.reinitialize(unode->corner_indices.size());
unode->undo_size += unode->loop_col.as_span().size_in_bytes();
unode.loop_col.reinitialize(unode.corner_indices.size());
unode.undo_size += unode.loop_col.as_span().size_in_bytes();
}
break;
}
@@ -1312,44 +1312,44 @@ static Node *alloc_node(const Object &object, const PBVHNode *node, const Type t
BLI_assert_unreachable();
break;
case Type::FaceSet: {
unode->face_sets.reinitialize(unode->face_indices.size());
step_data->undo_size += unode->face_sets.as_span().size_in_bytes();
unode.face_sets.reinitialize(unode.face_indices.size());
step_data->undo_size += unode.face_sets.as_span().size_in_bytes();
break;
}
}
if (ss.deform_modifiers_active) {
unode->orig_position.reinitialize(unode->vert_indices.size());
step_data->undo_size += unode->orig_position.as_span().size_in_bytes();
unode.orig_position.reinitialize(unode.vert_indices.size());
step_data->undo_size += unode.orig_position.as_span().size_in_bytes();
}
return unode;
return &unode;
}
static void store_coords(const Object &object, Node *unode)
static void store_coords(const Object &object, Node &unode)
{
SculptSession &ss = *object.sculpt;
if (!unode->grids.is_empty()) {
if (!unode.grids.is_empty()) {
const SubdivCCG &subdiv_ccg = *ss.subdiv_ccg;
const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
const Span<CCGElem *> grids = subdiv_ccg.grids;
{
int index = 0;
for (const int grid : unode->grids) {
for (const int grid : unode.grids) {
CCGElem *elem = grids[grid];
for (const int i : IndexRange(key.grid_area)) {
unode->position[index] = CCG_elem_offset_co(key, elem, i);
unode.position[index] = CCG_elem_offset_co(key, elem, i);
index++;
}
}
}
if (key.has_normals) {
int index = 0;
for (const int grid : unode->grids) {
for (const int grid : unode.grids) {
CCGElem *elem = grids[grid];
for (const int i : IndexRange(key.grid_area)) {
unode->normal[index] = CCG_elem_offset_no(key, elem, i);
unode.normal[index] = CCG_elem_offset_no(key, elem, i);
index++;
}
}
@@ -1357,22 +1357,22 @@ static void store_coords(const Object &object, Node *unode)
}
else {
array_utils::gather(BKE_pbvh_get_vert_positions(*ss.pbvh).as_span(),
unode->vert_indices.as_span(),
unode->position.as_mutable_span());
unode.vert_indices.as_span(),
unode.position.as_mutable_span());
array_utils::gather(BKE_pbvh_get_vert_normals(*ss.pbvh),
unode->vert_indices.as_span(),
unode->normal.as_mutable_span());
unode.vert_indices.as_span(),
unode.normal.as_mutable_span());
if (ss.deform_modifiers_active) {
array_utils::gather(ss.orig_cos.as_span(),
unode->vert_indices.as_span(),
unode->orig_position.as_mutable_span());
unode.vert_indices.as_span(),
unode.orig_position.as_mutable_span());
}
}
}
static void store_hidden(const Object &object, const PBVHNode &node, Node *unode)
static void store_hidden(const Object &object, const PBVHNode &node, Node &unode)
{
if (!unode->grids.is_empty()) {
if (!unode.grids.is_empty()) {
/* Already stored during allocation. */
}
@@ -1386,7 +1386,7 @@ static void store_hidden(const Object &object, const PBVHNode &node, Node *unode
const Span<int> verts = bke::pbvh::node_verts(node);
for (const int i : verts.index_range()) {
unode->vert_hidden[i].set(hide_vert[verts[i]]);
unode.vert_hidden[i].set(hide_vert[verts[i]]);
}
}
@@ -1405,41 +1405,41 @@ static void store_face_hidden(const Object &object, Node &unode)
}
}
static void store_mask(const Object &object, Node *unode)
static void store_mask(const Object &object, Node &unode)
{
const SculptSession &ss = *object.sculpt;
if (!unode->grids.is_empty()) {
if (!unode.grids.is_empty()) {
const SubdivCCG &subdiv_ccg = *ss.subdiv_ccg;
const CCGKey key = BKE_subdiv_ccg_key_top_level(subdiv_ccg);
if (key.has_mask) {
const Span<CCGElem *> grids = subdiv_ccg.grids;
int index = 0;
for (const int grid : unode->grids) {
for (const int grid : unode.grids) {
CCGElem *elem = grids[grid];
for (const int i : IndexRange(key.grid_area)) {
unode->mask[index] = CCG_elem_offset_mask(key, elem, i);
unode.mask[index] = CCG_elem_offset_mask(key, elem, i);
index++;
}
}
}
else {
unode->mask.fill(0.0f);
unode.mask.fill(0.0f);
}
}
else {
const Mesh &mesh = *static_cast<const Mesh *>(object.data);
const bke::AttributeAccessor attributes = mesh.attributes();
if (const VArray mask = *attributes.lookup<float>(".sculpt_mask", bke::AttrDomain::Point)) {
array_utils::gather(mask, unode->vert_indices.as_span(), unode->mask.as_mutable_span());
array_utils::gather(mask, unode.vert_indices.as_span(), unode.mask.as_mutable_span());
}
else {
unode->mask.fill(0.0f);
unode.mask.fill(0.0f);
}
}
}
static void store_color(const Object &object, Node *unode)
static void store_color(const Object &object, Node &unode)
{
const Mesh &mesh = *static_cast<const Mesh *>(object.data);
SculptSession &ss = *object.sculpt;
@@ -1450,23 +1450,23 @@ static void store_color(const Object &object, Node *unode)
* vertex colors for original data lookup. */
BKE_pbvh_store_colors_vertex(*ss.pbvh,
mesh.vert_to_face_map(),
unode->vert_indices.as_span().take_front(unode->unique_verts_num),
unode->col);
unode.vert_indices.as_span().take_front(unode.unique_verts_num),
unode.col);
if (!unode->loop_col.is_empty() && !unode->corner_indices.is_empty()) {
BKE_pbvh_store_colors(*ss.pbvh, unode->corner_indices, unode->loop_col);
if (!unode.loop_col.is_empty() && !unode.corner_indices.is_empty()) {
BKE_pbvh_store_colors(*ss.pbvh, unode.corner_indices, unode.loop_col);
}
}
static NodeGeometry *geometry_get(Node *unode)
static NodeGeometry *geometry_get(Node &unode)
{
if (!unode->geometry_original.is_initialized) {
return &unode->geometry_original;
if (!unode.geometry_original.is_initialized) {
return &unode.geometry_original;
}
BLI_assert(!unode->geometry_modified.is_initialized);
BLI_assert(!unode.geometry_modified.is_initialized);
return &unode->geometry_modified;
return &unode.geometry_modified;
}
static Node *geometry_push(const Object &object)
@@ -1475,7 +1475,7 @@ static Node *geometry_push(const Object &object)
unode->applied = false;
unode->geometry_clear_pbvh = true;
NodeGeometry *geometry = geometry_get(unode);
NodeGeometry *geometry = geometry_get(*unode);
store_geometry_data(geometry, object);
return unode;
@@ -1605,19 +1605,19 @@ Node *push_node(const Object &object, const PBVHNode *node, Type type)
* fully initialized. */
switch (type) {
case Type::Position:
store_coords(object, unode);
store_coords(object, *unode);
break;
case Type::HideVert:
store_hidden(object, *node, unode);
store_hidden(object, *node, *unode);
break;
case Type::HideFace:
store_face_hidden(object, *unode);
break;
case Type::Mask:
store_mask(object, unode);
store_mask(object, *unode);
break;
case Type::Color:
store_color(object, unode);
store_color(object, *unode);
break;
case Type::DyntopoBegin:
case Type::DyntopoEnd: