diff options
author | Campbell Barton <ideasman42@gmail.com> | 2020-09-18 07:17:17 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2020-09-18 07:38:23 +0300 |
commit | e6978f4d63d130b61de7d8f3bdc497750377ae71 (patch) | |
tree | 373e375ac54fc41835ae17e3fb8e6439e8ad6b6d | |
parent | 14b2de37dbc3563164bb37fb6fe493bf77190948 (diff) |
Fix T80885: Texture paint camera project crashes after undo/redo
Unmatched ED_image_undo_push_{begin/end},
add doc-strings noting why this is needed.
Thanks to @Baardaap for the initial fix.
-rw-r--r-- | source/blender/editors/sculpt_paint/paint_image_proj.c | 6 | ||||
-rw-r--r-- | source/blender/editors/space_image/image_undo.c | 12 |
2 files changed, 16 insertions, 2 deletions
diff --git a/source/blender/editors/sculpt_paint/paint_image_proj.c b/source/blender/editors/sculpt_paint/paint_image_proj.c index d44654f4fd5..b0ad3ae1302 100644 --- a/source/blender/editors/sculpt_paint/paint_image_proj.c +++ b/source/blender/editors/sculpt_paint/paint_image_proj.c @@ -6091,8 +6091,6 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op) scene->toolsettings->imapaint.flag |= IMAGEPAINT_DRAWING; - ED_image_undo_push_begin(op->type->name, PAINT_MODE_TEXTURE_3D); - /* allocate and initialize spatial data structures */ project_paint_begin(C, &ps, false, 0); @@ -6102,6 +6100,8 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op) return OPERATOR_CANCELLED; } + ED_image_undo_push_begin(op->type->name, PAINT_MODE_TEXTURE_3D); + const float pos[2] = {0.0, 0.0}; const float lastpos[2] = {0.0, 0.0}; int a; @@ -6117,6 +6117,8 @@ static int texture_paint_camera_project_exec(bContext *C, wmOperator *op) project_paint_end(&ps); + ED_image_undo_push_end(); + scene->toolsettings->imapaint.flag &= ~IMAGEPAINT_DRAWING; BKE_brush_size_set(scene, ps.brush, orig_brush_size); diff --git a/source/blender/editors/space_image/image_undo.c b/source/blender/editors/space_image/image_undo.c index 27b84307f7d..7b1329793dc 100644 --- a/source/blender/editors/space_image/image_undo.c +++ b/source/blender/editors/space_image/image_undo.c @@ -1004,6 +1004,14 @@ void ED_image_undosys_type(UndoType *ut) /* -------------------------------------------------------------------- */ /** \name Utilities + * + * \note image undo exposes #ED_image_undo_push_begin, #ED_image_undo_push_end + * which must be called by the operator directly. + * + * Unlike most other undo stacks this is needed: + * - So we can always access the state before the image was painted onto, + * which is needed if previous undo states aren't image-type. + * - So operators can access the pixel-data before the stroke was applied, at run-time. * \{ */ ListBase *ED_image_paint_tile_list_get(void) @@ -1041,6 +1049,10 @@ static ImageUndoStep *image_undo_push_begin(const char *name, int paint_mode) return us; } +/** + * The caller is responsible for running #ED_image_undo_push_end, + * failure to do so causes an invalid state for the undo system. + */ void ED_image_undo_push_begin(const char *name, int paint_mode) { image_undo_push_begin(name, paint_mode); |