From ab6e67767e730309e51fca7a7f086cbcbadb41a9 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 15 Mar 2021 23:29:33 +1100 Subject: Comments: notes on sculpt/image undo looping logic --- source/blender/editors/sculpt_paint/sculpt_undo.c | 4 ++++ source/blender/editors/space_image/image_undo.c | 5 ++++- 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'source/blender/editors') diff --git a/source/blender/editors/sculpt_paint/sculpt_undo.c b/source/blender/editors/sculpt_paint/sculpt_undo.c index 4d063099216..b6205db6f45 100644 --- a/source/blender/editors/sculpt_paint/sculpt_undo.c +++ b/source/blender/editors/sculpt_paint/sculpt_undo.c @@ -1490,6 +1490,8 @@ static void sculpt_undosys_step_decode_undo(struct bContext *C, SculptUndoStep *us, const bool is_final) { + /* Walk forward over any applied steps of same type, + * then walk back in the next loop, un-applying them. */ SculptUndoStep *us_iter = us; while (us_iter->step.next && (us_iter->step.next->type == us_iter->step.type)) { if (us_iter->step.next->is_applied == false) { @@ -1499,6 +1501,7 @@ static void sculpt_undosys_step_decode_undo(struct bContext *C, } while ((us_iter != us) || (!is_final && us_iter == us)) { + BLI_assert(us_iter->step.type == us->step.type); /* Previous loop ensures this. */ sculpt_undosys_step_decode_undo_impl(C, depsgraph, us_iter); if (us_iter == us) { break; @@ -1530,6 +1533,7 @@ static void sculpt_undosys_step_decode_redo(struct bContext *C, static void sculpt_undosys_step_decode( struct bContext *C, struct Main *bmain, UndoStep *us_p, const eUndoStepDir dir, bool is_final) { + /* NOTE: behavior for undo/redo closely matches image undo. */ BLI_assert(dir != STEP_INVALID); Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C); diff --git a/source/blender/editors/space_image/image_undo.c b/source/blender/editors/space_image/image_undo.c index 391c68f4231..feee268c6d3 100644 --- a/source/blender/editors/space_image/image_undo.c +++ b/source/blender/editors/space_image/image_undo.c @@ -911,6 +911,8 @@ static void image_undosys_step_decode_redo_impl(ImageUndoStep *us) static void image_undosys_step_decode_undo(ImageUndoStep *us, bool is_final) { + /* Walk forward over any applied steps of same type, + * then walk back in the next loop, un-applying them. */ ImageUndoStep *us_iter = us; while (us_iter->step.next && (us_iter->step.next->type == us_iter->step.type)) { if (us_iter->step.next->is_applied == false) { @@ -919,7 +921,7 @@ static void image_undosys_step_decode_undo(ImageUndoStep *us, bool is_final) us_iter = (ImageUndoStep *)us_iter->step.next; } while (us_iter != us || (!is_final && us_iter == us)) { - + BLI_assert(us_iter->step.type == us->step.type); /* Previous loop ensures this. */ image_undosys_step_decode_undo_impl(us_iter, is_final); if (us_iter == us) { break; @@ -949,6 +951,7 @@ static void image_undosys_step_decode_redo(ImageUndoStep *us) static void image_undosys_step_decode( struct bContext *C, struct Main *bmain, UndoStep *us_p, const eUndoStepDir dir, bool is_final) { + /* NOTE: behavior for undo/redo closely matches sculpt undo. */ BLI_assert(dir != STEP_INVALID); ImageUndoStep *us = (ImageUndoStep *)us_p; -- cgit v1.2.3