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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user