[Bf-blender-cvs] [e6978f4d63d] master: Fix T80885: Texture paint camera project crashes after undo/redo

Campbell Barton noreply at git.blender.org
Fri Sep 18 06:39:28 CEST 2020


Commit: e6978f4d63d130b61de7d8f3bdc497750377ae71
Author: Campbell Barton
Date:   Fri Sep 18 14:17:17 2020 +1000
Branches: master
https://developer.blender.org/rBe6978f4d63d130b61de7d8f3bdc497750377ae71

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.

===================================================================

M	source/blender/editors/sculpt_paint/paint_image_proj.c
M	source/blender/editors/space_image/image_undo.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list