Cleanup: Rework sculpt_undo.cc for readability

* Avoid usage of `applied` in favor of helper methods to indicate
  undo and redo requirements
* Rename `bmesh_restore_begin` and `bmesh_restore_end` to avoid
  similarity with geometry methods
* Swap `geometry_original` and `geometry_modified` to match
  expected meaning

Pull Request: https://projects.blender.org/blender/blender/pulls/139244
This commit is contained in:
Sean Kim
2025-05-22 06:39:02 +02:00
committed by Sean Kim
parent 22a2582844
commit f5276ac09e

View File

@@ -182,6 +182,10 @@ struct NodeGeometry {
struct Node;
struct StepData {
private:
bool applied_ = true;
public:
/**
* The type of data stored in this undo step. For historical reasons this is often set when the
* first undo node is pushed.
@@ -236,8 +240,6 @@ struct StepData {
/* Modified geometry is stored after the modification and is restored from when redoing. */
NodeGeometry geometry_modified;
bool applied;
Mutex nodes_mutex;
/**
@@ -255,6 +257,22 @@ struct StepData {
Vector<std::unique_ptr<Node>> nodes;
size_t undo_size;
/** Whether processing code needs to handle the current data as an undo step. */
bool needs_undo() const
{
return applied_;
}
void tag_needs_undo()
{
applied_ = true;
}
void tag_needs_redo()
{
applied_ = false;
}
};
struct SculptUndoStep {
@@ -573,13 +591,13 @@ static bool restore_face_sets(Object &object,
static void bmesh_restore_generic(StepData &step_data, Object &object, const SculptSession &ss)
{
if (step_data.applied) {
if (step_data.needs_undo()) {
BM_log_undo(ss.bm, ss.bm_log);
step_data.applied = false;
step_data.tag_needs_redo();
}
else {
BM_log_redo(ss.bm, ss.bm_log);
step_data.applied = true;
step_data.tag_needs_undo();
}
if (step_data.type == Type::Mask) {
@@ -618,42 +636,42 @@ static void bmesh_enable(Object &object, const StepData &step_data)
ss.bm_log = BM_log_from_existing_entries_create(ss.bm, step_data.bmesh.bm_entry);
}
static void bmesh_restore_begin(bContext *C,
StepData &step_data,
Object &object,
const SculptSession &ss)
static void bmesh_handle_dyntopo_begin(bContext *C,
StepData &step_data,
Object &object,
const SculptSession &ss)
{
if (step_data.applied) {
if (step_data.needs_undo()) {
dyntopo::disable(C, &step_data);
step_data.applied = false;
step_data.tag_needs_redo();
}
else {
else /* needs_redo */ {
bmesh_enable(object, step_data);
/* Restore the mesh from the first log entry. */
BM_log_redo(ss.bm, ss.bm_log);
step_data.applied = true;
step_data.tag_needs_undo();
}
}
static void bmesh_restore_end(bContext *C,
StepData &step_data,
Object &object,
const SculptSession &ss)
static void bmesh_handle_dyntopo_end(bContext *C,
StepData &step_data,
Object &object,
const SculptSession &ss)
{
if (step_data.applied) {
if (step_data.needs_undo()) {
bmesh_enable(object, step_data);
/* Restore the mesh from the last log entry. */
BM_log_undo(ss.bm, ss.bm_log);
step_data.applied = false;
step_data.tag_needs_redo();
}
else {
else /* needs_redo */ {
/* Disable dynamic topology sculpting. */
dyntopo::disable(C, nullptr);
step_data.applied = true;
step_data.tag_needs_undo();
}
}
@@ -726,13 +744,13 @@ static void restore_geometry(StepData &step_data, Object &object)
Mesh *mesh = static_cast<Mesh *>(object.data);
if (step_data.applied) {
restore_geometry_data(&step_data.geometry_modified, mesh);
step_data.applied = false;
if (step_data.needs_undo()) {
restore_geometry_data(&step_data.geometry_original, mesh);
step_data.tag_needs_redo();
}
else {
restore_geometry_data(&step_data.geometry_original, mesh);
step_data.applied = true;
restore_geometry_data(&step_data.geometry_modified, mesh);
step_data.tag_needs_undo();
}
}
@@ -749,12 +767,12 @@ static int bmesh_restore(bContext *C,
switch (step_data.type) {
case Type::DyntopoBegin:
BKE_sculpt_update_object_for_edit(&depsgraph, &object, false);
bmesh_restore_begin(C, step_data, object, ss);
bmesh_handle_dyntopo_begin(C, step_data, object, ss);
return true;
case Type::DyntopoEnd:
BKE_sculpt_update_object_for_edit(&depsgraph, &object, false);
bmesh_restore_end(C, step_data, object, ss);
bmesh_handle_dyntopo_end(C, step_data, object, ss);
return true;
default:
if (ss.bm_log) {
@@ -1286,8 +1304,6 @@ static void geometry_push(const Object &object)
step_data->type = Type::Geometry;
step_data->applied = false;
NodeGeometry *geometry = geometry_get(*step_data);
store_geometry_data(geometry, object);
}
@@ -1456,7 +1472,6 @@ BLI_NOINLINE static void bmesh_push(const Object &object,
unode = step_data->nodes.last().get();
step_data->type = type;
step_data->applied = true;
if (type == Type::DyntopoEnd) {
step_data->bmesh.bm_entry = BM_log_entry_add(ss.bm_log);