From cd5ee246565d06240f578e0ffba1310254bbec3e Mon Sep 17 00:00:00 2001 From: Bastien Montagne Date: Fri, 3 Aug 2018 10:15:34 +0200 Subject: Operators: add a new flag stating that operator needs access to evaluated data. For now, that flag is only used in redo code, since after undo step depsgraph is totally empty... We *may* want to add at least an assert in op calling code too, though? --- source/blender/editors/undo/ed_undo.c | 10 ++++++++++ source/blender/makesrna/intern/rna_wm.c | 2 ++ source/blender/windowmanager/WM_types.h | 1 + 3 files changed, 13 insertions(+) (limited to 'source/blender') diff --git a/source/blender/editors/undo/ed_undo.c b/source/blender/editors/undo/ed_undo.c index 7c1dc148dde..ffe4008f7d6 100644 --- a/source/blender/editors/undo/ed_undo.c +++ b/source/blender/editors/undo/ed_undo.c @@ -48,6 +48,7 @@ #include "BKE_context.h" #include "BKE_global.h" #include "BKE_main.h" +#include "BKE_scene.h" #include "BKE_screen.h" #include "BKE_layer.h" #include "BKE_undo_system.h" @@ -414,6 +415,15 @@ int ED_undo_operator_repeat(bContext *C, wmOperator *op) } } + if (op->type->flag & OPTYPE_USE_EVAL_DATA) { + /* We need to force refresh of depsgraph after undo step, + * redoing the operator *may* rely on some valid evaluated data. */ + Main *bmain = CTX_data_main(C); + scene = CTX_data_scene(C); + ViewLayer *view_layer = CTX_data_view_layer(C); + BKE_scene_view_layer_graph_evaluated_ensure(bmain, scene, view_layer); + } + retval = WM_operator_repeat(C, op); if ((retval & OPERATOR_FINISHED) == 0) { if (G.debug & G_DEBUG) diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c index 3432adc6eb3..a4c8dfbbdef 100644 --- a/source/blender/makesrna/intern/rna_wm.c +++ b/source/blender/makesrna/intern/rna_wm.c @@ -432,6 +432,8 @@ static const EnumPropertyItem operator_flag_items[] = { "is enabled"}, {OPTYPE_PRESET, "PRESET", 0, "Preset", "Display a preset button with the operators settings"}, {OPTYPE_INTERNAL, "INTERNAL", 0, "Internal", "Removes the operator from search results"}, + {OPTYPE_USE_EVAL_DATA, "USE_EVAL_DATA", 0, "Use Evaluated Data", + "Uses evaluated data (i.e. needs a valid depsgraph for current context)"}, {0, NULL, 0, NULL, NULL} }; #endif diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h index 60dd9ad2e72..6b1bb8f4806 100644 --- a/source/blender/windowmanager/WM_types.h +++ b/source/blender/windowmanager/WM_types.h @@ -145,6 +145,7 @@ enum { OPTYPE_LOCK_BYPASS = (1 << 7), /* Allow operator to run when interface is locked */ OPTYPE_UNDO_GROUPED = (1 << 8), /* Special type of undo which doesn't store itself multiple times */ + OPTYPE_USE_EVAL_DATA = (1 << 9), /* Need evaluated data (i.e. a valid, up-to-date depsgraph for current context) */ }; /* context to call operator in for WM_operator_name_call */ -- cgit v1.2.3