diff options
author | Alexander Gavrilov <angavrilov@gmail.com> | 2018-09-15 15:32:40 +0300 |
---|---|---|
committer | Alexander Gavrilov <angavrilov@gmail.com> | 2018-09-18 13:25:28 +0300 |
commit | bf2a54b0584c1e568af7ecf67ae2a623bc5263fe (patch) | |
tree | f123a9ca55d475dd676351d635bf944a31a27200 /source/blender/editors/space_graph | |
parent | 34ee9ab97c0cf629987f8f3f72b529ca7e73e027 (diff) |
Support evaluating simple driver expressions without Python interpreter.
Recently @sergey found that hard-coding evaluation of certain very
common driver expressions without calling the Python interpreter
produces a 30-40% performance improvement. Since hard-coding is
obviously not suitable for production, I implemented a proper
parser and interpreter for simple arithmetic expressions in C.
The evaluator supports +, -, *, /, (), ==, !=, <, <=, >, >=,
and, or, not, ternary if; driver variables, frame, pi, True, False,
and a subset of standard math functions that seem most useful.
Booleans are represented as numbers, since within the supported
operation set it seems to be impossible to distinguish True/False
from 1.0/0.0. Boolean operations properly implement lazy evaluation
with jumps, and comparisons support chaining like 'a < b < c...'.
Expressions are parsed into a very simple stack machine program
that can then be safely evaluated in multiple threads.
Reviewers: sergey, campbellbarton
Differential Revision: https://developer.blender.org/D3698
Diffstat (limited to 'source/blender/editors/space_graph')
-rw-r--r-- | source/blender/editors/space_graph/graph_buttons.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/source/blender/editors/space_graph/graph_buttons.c b/source/blender/editors/space_graph/graph_buttons.c index 642e8e074fa..1dc57a0da7d 100644 --- a/source/blender/editors/space_graph/graph_buttons.c +++ b/source/blender/editors/space_graph/graph_buttons.c @@ -817,13 +817,18 @@ static void graph_draw_driver_settings_panel(uiLayout *layout, ID *id, FCurve *f col = uiLayoutColumn(layout, true); block = uiLayoutGetBlock(col); - if ((G.f & G_SCRIPT_AUTOEXEC) == 0) { - /* TODO: Add button to enable? */ - uiItemL(col, IFACE_("WARNING: Python expressions limited for security"), ICON_ERROR); - } - else if (driver->flag & DRIVER_FLAG_INVALID) { + if (driver->flag & DRIVER_FLAG_INVALID) { uiItemL(col, IFACE_("ERROR: Invalid Python expression"), ICON_CANCEL); } + else if (!BKE_driver_has_simple_expression(driver)) { + if ((G.f & G_SCRIPT_AUTOEXEC) == 0) { + /* TODO: Add button to enable? */ + uiItemL(col, IFACE_("WARNING: Python expressions limited for security"), ICON_ERROR); + } + else { + uiItemL(col, IFACE_("Slow Python expression"), ICON_INFO); + } + } /* Explicit bpy-references are evil. Warn about these to prevent errors */ /* TODO: put these in a box? */ |