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-02-27 17:15:26 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2019-02-28 18:28:24 +0300
commit8d6732d1f7b801fc1353e6f7f83e079ae7d14c91 (patch)
tree3e8d83836033890dfda03e95104747bc6b52e95f /source/blender/depsgraph
parent9eaa577b9b3c69c444855460edc7d6f5de7b59b7 (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.cc45
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;
}