Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2019-10-30 17:15:07 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-10-30 17:15:56 +0300
commit20881bcffd530bfc997015801738a14bb201cb6d (patch)
treecb7e0b32cf1483ef2f1acc42f02b5761958d82aa /source/blender/depsgraph
parent0f9757b12dd92c8beb684fb6d469ec9ded2a5010 (diff)
Fix T71212: Drivers using scene.frame_current don't refresh on playback
Need to make such drivers explicitly dependent on time.
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r--source/blender/depsgraph/intern/builder/deg_builder_relations.cc61
1 files changed, 50 insertions, 11 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 116cd07e6a5..f68b03034a9 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -123,26 +123,65 @@ namespace DEG {
namespace {
/* TODO(sergey): This is somewhat weak, but we don't want neither false-positive
- * time dependencies nor special exceptions in the depsgraph evaluation.
- */
-bool python_driver_depends_on_time(ChannelDriver *driver)
+ * time dependencies nor special exceptions in the depsgraph evaluation. */
+
+bool python_driver_exression_depends_on_time(const char *expression)
{
- if (driver->expression[0] == '\0') {
+ if (expression[0] == '\0') {
/* Empty expression depends on nothing. */
return false;
}
- if (strchr(driver->expression, '(') != NULL) {
+ if (strchr(expression, '(') != NULL) {
/* Function calls are considered dependent on a time. */
return true;
}
- if (strstr(driver->expression, "frame") != NULL) {
+ if (strstr(expression, "frame") != NULL) {
/* Variable `frame` depends on time. */
- /* TODO(sergey): This is a bit weak, but not sure about better way of
- * handling this. */
+ /* TODO(sergey): This is a bit weak, but not sure about better way of handling this. */
+ return true;
+ }
+ /* Possible indirect time relation s should be handled via variable targets. */
+ return false;
+}
+
+bool driver_target_depends_on_time(const DriverTarget *target)
+{
+ if (target->idtype == ID_SCE && STREQ(target->rna_path, "frame_current")) {
+ return true;
+ }
+ return false;
+}
+
+bool driver_variable_depends_on_time(const DriverVar *variable)
+{
+ for (int i = 0; i < variable->num_targets; ++i) {
+ if (driver_target_depends_on_time(&variable->targets[i])) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool driver_variables_depends_on_time(const ListBase *variables)
+{
+ LISTBASE_FOREACH (const DriverVar *, variable, variables) {
+ if (driver_variable_depends_on_time(variable)) {
+ return true;
+ }
+ }
+ return false;
+}
+
+bool driver_depends_on_time(ChannelDriver *driver)
+{
+ if (driver->type == DRIVER_TYPE_PYTHON) {
+ if (python_driver_exression_depends_on_time(driver->expression)) {
+ return true;
+ }
+ }
+ if (driver_variables_depends_on_time(&driver->variables)) {
return true;
}
- /* Possible indirect time relation s should be handled via variable
- * targets. */
return false;
}
@@ -1384,7 +1423,7 @@ void DepsgraphRelationBuilder::build_driver(ID *id, FCurve *fcu)
/* It's quite tricky to detect if the driver actually depends on time or
* not, so for now we'll be quite conservative here about optimization and
* consider all python drivers to be depending on time. */
- if ((driver->type == DRIVER_TYPE_PYTHON) && python_driver_depends_on_time(driver)) {
+ if (driver_depends_on_time(driver)) {
TimeSourceKey time_src_key;
add_relation(time_src_key, driver_key, "TimeSrc -> Driver");
}