diff options
author | Campbell Barton <ideasman42@gmail.com> | 2019-01-18 15:15:22 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2019-01-18 16:25:55 +0300 |
commit | 985712e5ee178789dbdf9124a896252db042ba50 (patch) | |
tree | 3362fd14f079071fa12ba9404105a96ba90c13df | |
parent | c8067a555932b122b9495dacbac86992a5ff1a8e (diff) |
Fix loading a file saved w/ dyntopo
Ensure ED_editors_init doesn't create any undo steps
before the initial memfile undo is written.
-rw-r--r-- | source/blender/editors/sculpt_paint/sculpt.c | 13 | ||||
-rw-r--r-- | source/blender/editors/util/ed_util.c | 8 |
2 files changed, 14 insertions, 7 deletions
diff --git a/source/blender/editors/sculpt_paint/sculpt.c b/source/blender/editors/sculpt_paint/sculpt.c index e315f88836a..e72b5490f8a 100644 --- a/source/blender/editors/sculpt_paint/sculpt.c +++ b/source/blender/editors/sculpt_paint/sculpt.c @@ -5739,11 +5739,18 @@ void ED_object_sculptmode_enter_ex( } if (message_unsupported == NULL) { + /* Needed because we may be entering this mode before the undo system loads. */ + wmWindowManager *wm = bmain->wm.first; + bool has_undo = wm->undo_stack != NULL; /* undo push is needed to prevent memory leak */ - sculpt_undo_push_begin("Dynamic topology enable"); + if (has_undo) { + sculpt_undo_push_begin("Dynamic topology enable"); + } sculpt_dynamic_topology_enable_ex(depsgraph, scene, ob); - sculpt_undo_push_node(ob, NULL, SCULPT_UNDO_DYNTOPO_BEGIN); - sculpt_undo_push_end(); + if (has_undo) { + sculpt_undo_push_node(ob, NULL, SCULPT_UNDO_DYNTOPO_BEGIN); + sculpt_undo_push_end(); + } } else { BKE_reportf(reports, RPT_WARNING, diff --git a/source/blender/editors/util/ed_util.c b/source/blender/editors/util/ed_util.c index abc4f20ac71..3bd87314c12 100644 --- a/source/blender/editors/util/ed_util.c +++ b/source/blender/editors/util/ed_util.c @@ -95,16 +95,15 @@ void ED_editors_init(bContext *C) Scene *scene = CTX_data_scene(C); wmWindowManager *wm = CTX_wm_manager(C); - if (wm->undo_stack == NULL) { - wm->undo_stack = BKE_undosys_stack_create(); - } - /* This is called during initialization, so we don't want to store any reports */ ReportList *reports = CTX_wm_reports(C); int reports_flag_prev = reports->flag & ~RPT_STORE; SWAP(int, reports->flag, reports_flag_prev); + /* Don't do undo pushes when calling an operator. */ + wm->op_undo_depth++; + /* toggle on modes for objects that were saved with these enabled. for * e.g. linked objects we have to ensure that they are actually the * active object in this scene. */ @@ -177,6 +176,7 @@ void ED_editors_init(bContext *C) } SWAP(int, reports->flag, reports_flag_prev); + wm->op_undo_depth--; } /* frees all editmode stuff */ |