diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-02-27 17:15:26 +0300 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2019-02-28 18:28:24 +0300 |
commit | 8d6732d1f7b801fc1353e6f7f83e079ae7d14c91 (patch) | |
tree | 3e8d83836033890dfda03e95104747bc6b52e95f /source/blender/depsgraph | |
parent | 9eaa577b9b3c69c444855460edc7d6f5de7b59b7 (diff) |
Depsgraph: Keep objects which has animated visibility
This allows dependency graph to evaluate drivers of those objects
and put them to a correct state. It will increase memory usage
since now we can no longer save it by skipping copy-on-write for
such objects. It will also currently make things slower, because
we do not have granular enough visibility update of components in
the dependency graph. Can do it later when the rest of the changes
are finished.
This commit does not update restriction flags on the base, since
that is somewhat tricky to do currently: need to somehow see whether
object is disabled due to flags on collection or due to own flags.
Differential Revision: https://developer.blender.org/D4419
Diffstat (limited to 'source/blender/depsgraph')
-rw-r--r-- | source/blender/depsgraph/intern/builder/deg_builder.cc | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/source/blender/depsgraph/intern/builder/deg_builder.cc b/source/blender/depsgraph/intern/builder/deg_builder.cc index f5cf433aae8..e927d6c9b5c 100644 --- a/source/blender/depsgraph/intern/builder/deg_builder.cc +++ b/source/blender/depsgraph/intern/builder/deg_builder.cc @@ -23,6 +23,8 @@ #include "intern/builder/deg_builder.h" +#include <cstring> + #include "DNA_anim_types.h" #include "DNA_layer_types.h" #include "DNA_ID.h" @@ -53,6 +55,46 @@ namespace DEG { * Base class for builders. */ +namespace { + +struct VisibilityCheckData { + eEvaluationMode eval_mode; + bool is_visibility_animated; +}; + +void visibility_animated_check_cb(ID * /*id*/, FCurve *fcu, void *user_data) +{ + VisibilityCheckData *data = + reinterpret_cast<VisibilityCheckData *>(user_data); + if (data->is_visibility_animated) { + return; + } + if (data->eval_mode == DAG_EVAL_VIEWPORT) { + if (STREQ(fcu->rna_path, "hide_viewport")) { + data->is_visibility_animated = true; + } + } else if (data->eval_mode == DAG_EVAL_RENDER) { + if (STREQ(fcu->rna_path, "hide_render")) { + data->is_visibility_animated = true; + } + } +} + +bool isObjectVisibilityAnimated(Depsgraph *graph, Object *object) +{ + AnimData* anim_data = BKE_animdata_from_id(&object->id); + if (anim_data == NULL) { + return false; + } + VisibilityCheckData data; + data.eval_mode = graph->mode; + data.is_visibility_animated = false; + BKE_fcurves_id_cb(&object->id, visibility_animated_check_cb, &data); + return data.is_visibility_animated; +} + +} // namespace + DepsgraphBuilder::DepsgraphBuilder(Main *bmain, Depsgraph *graph) : bmain_(bmain), graph_(graph) { @@ -65,6 +107,9 @@ bool DepsgraphBuilder::needPullBaseIntoGraph(struct Base *base) if (base->flag & base_flag) { return true; } + if (isObjectVisibilityAnimated(graph_, base->object)) { + return true; + } return false; } |