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.
This commit is contained in:
parent
14b2de37db
commit
e6978f4d63
Notes:
blender-bot
2023-02-14 05:28:01 +01:00
Referenced by issue #80885, Unpaired ED_image_undo_push_begin(..) Referenced by issue #80396, Potential candidates for corrective releases Referenced by issue #77348, Blender LTS: Maintenance Task 2.83
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue