[Bf-blender-cvs] [fb896182b1f] blender2.8: Depsgraph; Introduce new scene update routines which gets an explicit graph

Sergey Sharybin noreply at git.blender.org
Wed Oct 25 15:50:38 CEST 2017


Commit: fb896182b1f23c9b0e3e108458ec3aed390c6845
Author: Sergey Sharybin
Date:   Wed Oct 25 15:23:06 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBfb896182b1f23c9b0e3e108458ec3aed390c6845

Depsgraph; Introduce new scene update routines which gets an explicit graph

They are still modifying global state, such as ID recalc tags stored in bmain,
need some solution for this.

===================================================================

M	source/blender/blenkernel/BKE_scene.h
M	source/blender/blenkernel/intern/scene.c

===================================================================

diff --git a/source/blender/blenkernel/BKE_scene.h b/source/blender/blenkernel/BKE_scene.h
index 8e2e37bf39a..4c507267050 100644
--- a/source/blender/blenkernel/BKE_scene.h
+++ b/source/blender/blenkernel/BKE_scene.h
@@ -146,6 +146,18 @@ float BKE_scene_frame_get_from_ctime(const struct Scene *scene, const float fram
 void  BKE_scene_frame_set(struct Scene *scene, double cfra);
 
 /* **  Scene evaluation ** */
+
+void BKE_scene_graph_update_tagged(struct EvaluationContext *eval_ctx,
+                                   struct Depsgraph *depsgraph,
+                                   struct Main *bmain,
+                                   struct Scene *scene);
+
+void BKE_scene_graph_update_for_newframe(struct EvaluationContext *eval_ctx,
+                                         struct Depsgraph *depsgraph,
+                                         struct Main *bmain,
+                                         struct Scene *sce);
+
+/* NOTE: DO NOT USE THOSE IN NEW CODE! */
 void BKE_scene_update_tagged(struct EvaluationContext *eval_ctx, struct Main *bmain, struct Scene *sce);
 void BKE_scene_update_for_newframe(struct EvaluationContext *eval_ctx, struct Main *bmain, struct Scene *sce);
 
diff --git a/source/blender/blenkernel/intern/scene.c b/source/blender/blenkernel/intern/scene.c
index 72a953627ca..1736e824a94 100644
--- a/source/blender/blenkernel/intern/scene.c
+++ b/source/blender/blenkernel/intern/scene.c
@@ -1587,93 +1587,118 @@ static void prepare_mesh_for_viewport_render(Main *bmain, Scene *scene)
 	}
 }
 
-void BKE_scene_update_tagged(EvaluationContext *eval_ctx, Main *bmain, Scene *scene)
+void BKE_scene_graph_update_tagged(EvaluationContext *eval_ctx,
+                                   Depsgraph *depsgraph,
+                                   Main *bmain,
+                                   Scene *scene)
 {
-	/* (re-)build dependency graph if needed */
-	DEG_scene_relations_update(bmain, scene);
-
+	/* TODO(sergey): Some functions here are changing global state,
+	 * for example, clearing update tags from bmain.
+	 */
+	/* (Re-)build dependency graph if needed. */
+	DEG_graph_relations_update(depsgraph, bmain, scene);
 	/* Uncomment this to check if graph was properly tagged for update. */
-	// DEG_debug_graph_relations_validate(scene->depsgraph_legacy, bmain, scene);
-
-	/* flush editing data if needed */
+	// DEG_debug_graph_relations_validate(depsgraph, bmain, scene);
+	/* Flush editing data if needed. */
 	prepare_mesh_for_viewport_render(bmain, scene);
-
-	/* flush recalc flags to dependencies */
-	DEG_graph_flush_update(bmain, scene->depsgraph_legacy);
-
-	/* removed calls to quick_cache, see pointcache.c */
-
-	/* clear "LIB_TAG_DOIT" flag from all materials, to prevent infinite recursion problems later
-	 * when trying to find materials with drivers that need evaluating [#32017]
+	/* Flush recalc flags to dependencies. */
+	DEG_graph_flush_update(bmain, depsgraph);
+	/* Clear "LIB_TAG_DOIT" flag from all materials, to prevent infinite recursion problems later
+	 * when trying to find materials with drivers that need evaluating [#32017].
 	 */
 	BKE_main_id_tag_idcode(bmain, ID_MA, LIB_TAG_DOIT, false);
 	BKE_main_id_tag_idcode(bmain, ID_LA, LIB_TAG_DOIT, false);
-
-	/* update all objects: drivers, matrices, displists, etc. flags set
+	/* Update all objects: drivers, matrices, displists, etc. flags set
 	 * by depgraph or manual, no layer check here, gets correct flushed.
 	 */
-	DEG_evaluate_on_refresh(eval_ctx, scene->depsgraph_legacy);
-
-	/* update sound system animation (TODO, move to depsgraph) */
+	DEG_evaluate_on_refresh(eval_ctx, depsgraph);
+	/* Update sound system animation (TODO, move to depsgraph). */
 	BKE_sound_update_scene(bmain, scene);
-
 	/* Inform editors about possible changes. */
 	DEG_ids_check_recalc(bmain, scene, false);
-
-	/* clear recalc flags */
+	/* Clear recalc flags. */
 	DEG_ids_clear_recalc(bmain);
 }
 
 /* applies changes right away, does all sets too */
-void BKE_scene_update_for_newframe(EvaluationContext *eval_ctx, Main *bmain, Scene *sce)
+void BKE_scene_graph_update_for_newframe(EvaluationContext *eval_ctx,
+                                         Depsgraph *depsgraph,
+                                         Main *bmain,
+                                         Scene *scene)
 {
-	float ctime = BKE_scene_frame_get(sce);
-
-	DEG_editors_update_pre(bmain, sce, true);
-
-	/* keep this first */
-	BLI_callback_exec(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_PRE);
-
-	/* update animated image textures for particles, modifiers, gpu, etc,
-	 * call this at the start so modifiers with textures don't lag 1 frame */
-	BKE_image_update_frame(bmain, sce->r.cfra);
-
-	BKE_sound_set_cfra(sce->r.cfra);
-
-	/* clear animation overrides */
-	/* XXX TODO... */
-
-	DEG_scene_relations_update(bmain, sce);
-
-	/* Update animated cache files for modifiers. */
-	BKE_cachefile_update_frame(bmain, sce, ctime, (((double)sce->r.frs_sec) / (double)sce->r.frs_sec_base));
-
+	/* TODO(sergey): Some functions here are changing global state,
+	 * for example, clearing update tags from bmain.
+	 */
+	const float ctime = BKE_scene_frame_get(scene);
+	/* Inform editors we are starting scene update. */
+	DEG_editors_update_pre(bmain, scene, true);
+	/* Keep this first.
+	 * TODO(sergey): Should it be after the editors update?
+	 */
+	BLI_callback_exec(bmain, &scene->id, BLI_CB_EVT_FRAME_CHANGE_PRE);
+	/* Update animated image textures for particles, modifiers, gpu, etc,
+	 * call this at the start so modifiers with textures don't lag 1 frame.
+	 */
+	BKE_image_update_frame(bmain, scene->r.cfra);
+	BKE_sound_set_cfra(scene->r.cfra);
+	DEG_graph_relations_update(depsgraph, bmain, scene);
+	/* Update animated cache files for modifiers.
+	 *
+	 * TODO(sergey): Make this a depsgraph node?
+	 */
+	BKE_cachefile_update_frame(bmain, scene, ctime,
+	                           (((double)scene->r.frs_sec) / (double)scene->r.frs_sec_base));
 #ifdef POSE_ANIMATION_WORKAROUND
 	scene_armature_depsgraph_workaround(bmain);
 #endif
-
-	/* clear "LIB_TAG_DOIT" flag from all materials, to prevent infinite recursion problems later
-	 * when trying to find materials with drivers that need evaluating [#32017]
+	/* Clear "LIB_TAG_DOIT" flag from all materials, to prevent infinite recursion problems later
+	 * when trying to find materials with drivers that need evaluating [#32017].
 	 */
 	BKE_main_id_tag_idcode(bmain, ID_MA, LIB_TAG_DOIT, false);
 	BKE_main_id_tag_idcode(bmain, ID_LA, LIB_TAG_DOIT, false);
-
-	/* BKE_object_handle_update() on all objects, groups and sets */
-	DEG_evaluate_on_framechange(eval_ctx, bmain, sce->depsgraph_legacy, ctime);
-
-	/* update sound system animation (TODO, move to depsgraph) */
-	BKE_sound_update_scene(bmain, sce);
-
-	/* notify editors and python about recalc */
-	BLI_callback_exec(bmain, &sce->id, BLI_CB_EVT_FRAME_CHANGE_POST);
-
+	/* Update all objects: drivers, matrices, displists, etc. flags set
+	 * by depgraph or manual, no layer check here, gets correct flushed.
+	 */
+	DEG_evaluate_on_framechange(eval_ctx, bmain, depsgraph, ctime);
+	/* Update sound system animation (TODO, move to depsgraph). */
+	BKE_sound_update_scene(bmain, scene);
+	/* Notify editors and python about recalc. */
+	BLI_callback_exec(bmain, &scene->id, BLI_CB_EVT_FRAME_CHANGE_POST);
 	/* Inform editors about possible changes. */
-	DEG_ids_check_recalc(bmain, sce, true);
-
+	DEG_ids_check_recalc(bmain, scene, true);
 	/* clear recalc flags */
 	DEG_ids_clear_recalc(bmain);
 }
 
+static void scene_ensure_legacy_depsgraph(Main *bmain, Scene *scene)
+{
+	if (scene->depsgraph_legacy == NULL) {
+		scene->depsgraph_legacy = DEG_graph_new();
+		DEG_graph_build_from_scene(scene->depsgraph_legacy, bmain, scene);
+		/* TODO(sergey): When we first create dependency graph we consider
+		 * it is first time became visible. This is true for viewports, but
+		 * will fail when render engines will start having their own graphs.
+		 */
+		DEG_graph_on_visible_update(bmain, scene->depsgraph_legacy);
+	}
+}
+
+void BKE_scene_update_tagged(EvaluationContext *eval_ctx, Main *bmain, Scene *scene)
+{
+	/* Make sure graph is allocated. This is not always guaranteed now. */
+	scene_ensure_legacy_depsgraph(bmain, scene);
+	/* Do actual graph evaluation. */
+	BKE_scene_graph_update_tagged(eval_ctx, scene->depsgraph_legacy, bmain, scene);
+}
+
+void BKE_scene_update_for_newframe(EvaluationContext *eval_ctx, Main *bmain, Scene *scene)
+{
+	/* Make sure graph is allocated. This is not always guaranteed now. */
+	scene_ensure_legacy_depsgraph(bmain, scene);
+	/* Do actual graph evaluation. */
+	BKE_scene_graph_update_for_newframe(eval_ctx, scene->depsgraph_legacy, bmain, scene);
+}
+
 /* return default layer, also used to patch old files */
 SceneRenderLayer *BKE_scene_add_render_layer(Scene *sce, const char *name)
 {



More information about the Bf-blender-cvs mailing list