Depsgraph: Move scene builder function to own file
authorSergey Sharybin <sergey.vfx@gmail.com>
Thu, 17 Nov 2016 14:38:03 +0000 (15:38 +0100)
committerSergey Sharybin <sergey.vfx@gmail.com>
Thu, 17 Nov 2016 14:44:32 +0000 (15:44 +0100)
This way it's much easier to grasp what the graph actually contains.

source/blender/depsgraph/CMakeLists.txt
source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc [new file with mode: 0644]
source/blender/depsgraph/intern/builder/deg_builder_relations_keys.cc
source/blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc [new file with mode: 0644]

index ea839d11071a38314ad7b3a7f42922fb307dd229..e635256cda64db7c5e00a47704d7fa6ede6de353 100644 (file)
@@ -44,10 +44,12 @@ set(SRC
        intern/builder/deg_builder_cycle.cc
        intern/builder/deg_builder_nodes.cc
        intern/builder/deg_builder_nodes_rig.cc
+       intern/builder/deg_builder_nodes_scene.cc
        intern/builder/deg_builder_pchanmap.cc
        intern/builder/deg_builder_relations.cc
        intern/builder/deg_builder_relations_keys.cc
        intern/builder/deg_builder_relations_rig.cc
+       intern/builder/deg_builder_relations_scene.cc
        intern/builder/deg_builder_transitive.cc
        intern/debug/deg_debug_graphviz.cc
        intern/eval/deg_eval.cc
index 011eec9e0c17ea4e04e86512216552e80ef4530d..4e6ab73b3530148fd43d794540f846260dfc2aca 100644 (file)
@@ -319,94 +319,6 @@ OperationDepsNode *DepsgraphNodeBuilder::find_operation_node(
 
 /* **** Build functions for entity nodes **** */
 
-void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
-{
-       /* LIB_TAG_DOIT is used to indicate whether node for given ID was already
-        * created or not. This flag is being set in add_id_node(), so functions
-        * shouldn't bother with setting it, they only might query this flag when
-        * needed.
-        */
-       BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
-       /* XXX nested node trees are not included in tag-clearing above,
-        * so we need to do this manually.
-        */
-       FOREACH_NODETREE(bmain, nodetree, id) {
-               if (id != (ID *)nodetree)
-                       nodetree->id.tag &= ~LIB_TAG_DOIT;
-       } FOREACH_NODETREE_END
-
-       /* scene ID block */
-       add_id_node(&scene->id);
-
-       /* timesource */
-       add_time_source(NULL);
-
-       /* build subgraph for set, and link this in... */
-       // XXX: depending on how this goes, that scene itself could probably store its
-       //      own little partial depsgraph?
-       if (scene->set) {
-               build_scene(bmain, scene->set);
-       }
-
-       /* scene objects */
-       LINKLIST_FOREACH (Base *, base, &scene->base) {
-               Object *ob = base->object;
-
-               /* object itself */
-               build_object(scene, base, ob);
-
-               /* object that this is a proxy for */
-               // XXX: the way that proxies work needs to be completely reviewed!
-               if (ob->proxy) {
-                       ob->proxy->proxy_from = ob;
-                       build_object(scene, base, ob->proxy);
-               }
-
-               /* Object dupligroup. */
-               if (ob->dup_group) {
-                       build_group(scene, base, ob->dup_group);
-               }
-       }
-
-       /* rigidbody */
-       if (scene->rigidbody_world) {
-               build_rigidbody(scene);
-       }
-
-       /* scene's animation and drivers */
-       if (scene->adt) {
-               build_animdata(&scene->id);
-       }
-
-       /* world */
-       if (scene->world) {
-               build_world(scene->world);
-       }
-
-       /* compo nodes */
-       if (scene->nodetree) {
-               build_compositor(scene);
-       }
-
-       /* sequencer */
-       // XXX...
-
-       /* grease pencil */
-       if (scene->gpd) {
-               build_gpencil(scene->gpd);
-       }
-
-       /* Cache file. */
-       LINKLIST_FOREACH (CacheFile *, cachefile, &bmain->cachefiles) {
-               build_cachefile(cachefile);
-       }
-
-       /* Masks. */
-       LINKLIST_FOREACH (Mask *, mask, &bmain->mask) {
-               build_mask(mask);
-       }
-}
-
 void DepsgraphNodeBuilder::build_group(Scene *scene,
                                        Base *base,
                                        Group *group)
index 8ba41a4b4b10f85ce019fff02ccfa9b4c1b15942..4a5f3dc86648f569d7d3be542169506d70b2c0db 100644 (file)
@@ -24,7 +24,7 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/depsgraph/intern/builder/deg_builder_nodes.cc
+/** \file blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
  *  \ingroup depsgraph
  *
  * Methods for constructing depsgraph's nodes
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
new file mode 100644 (file)
index 0000000..fb243ab
--- /dev/null
@@ -0,0 +1,154 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2013 Blender Foundation.
+ * All rights reserved.
+ *
+ * Original Author: Joshua Leung
+ * Contributor(s): Based on original depsgraph.c code - Blender Foundation (2005-2013)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
+ *  \ingroup depsgraph
+ *
+ * Methods for constructing depsgraph's nodes
+ */
+
+#include "intern/builder/deg_builder_nodes.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "MEM_guardedalloc.h"
+
+extern "C" {
+#include "BLI_blenlib.h"
+#include "BLI_string.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_main.h"
+#include "BKE_node.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+} /* extern "C" */
+
+#include "intern/builder/deg_builder.h"
+#include "intern/nodes/deg_node.h"
+#include "intern/nodes/deg_node_component.h"
+#include "intern/nodes/deg_node_operation.h"
+#include "intern/depsgraph_types.h"
+#include "intern/depsgraph_intern.h"
+#include "util/deg_util_foreach.h"
+
+namespace DEG {
+
+void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
+{
+       /* LIB_TAG_DOIT is used to indicate whether node for given ID was already
+        * created or not. This flag is being set in add_id_node(), so functions
+        * shouldn't bother with setting it, they only might query this flag when
+        * needed.
+        */
+       BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
+       /* XXX nested node trees are not included in tag-clearing above,
+        * so we need to do this manually.
+        */
+       FOREACH_NODETREE(bmain, nodetree, id) {
+               if (id != (ID *)nodetree)
+                       nodetree->id.tag &= ~LIB_TAG_DOIT;
+       } FOREACH_NODETREE_END
+
+       /* scene ID block */
+       add_id_node(&scene->id);
+
+       /* timesource */
+       add_time_source(NULL);
+
+       /* build subgraph for set, and link this in... */
+       // XXX: depending on how this goes, that scene itself could probably store its
+       //      own little partial depsgraph?
+       if (scene->set) {
+               build_scene(bmain, scene->set);
+       }
+
+       /* scene objects */
+       LINKLIST_FOREACH (Base *, base, &scene->base) {
+               Object *ob = base->object;
+
+               /* object itself */
+               build_object(scene, base, ob);
+
+               /* object that this is a proxy for */
+               // XXX: the way that proxies work needs to be completely reviewed!
+               if (ob->proxy) {
+                       ob->proxy->proxy_from = ob;
+                       build_object(scene, base, ob->proxy);
+               }
+
+               /* Object dupligroup. */
+               if (ob->dup_group) {
+                       build_group(scene, base, ob->dup_group);
+               }
+       }
+
+       /* rigidbody */
+       if (scene->rigidbody_world) {
+               build_rigidbody(scene);
+       }
+
+       /* scene's animation and drivers */
+       if (scene->adt) {
+               build_animdata(&scene->id);
+       }
+
+       /* world */
+       if (scene->world) {
+               build_world(scene->world);
+       }
+
+       /* compo nodes */
+       if (scene->nodetree) {
+               build_compositor(scene);
+       }
+
+       /* sequencer */
+       // XXX...
+
+       /* grease pencil */
+       if (scene->gpd) {
+               build_gpencil(scene->gpd);
+       }
+
+       /* Cache file. */
+       LINKLIST_FOREACH (CacheFile *, cachefile, &bmain->cachefiles) {
+               build_cachefile(cachefile);
+       }
+
+       /* Masks. */
+       LINKLIST_FOREACH (Mask *, mask, &bmain->mask) {
+               build_mask(mask);
+       }
+}
+
+}  // namespace DEG
index 7ada04e8f74254d40d8dfeca3ab1c1e387efd9b4..feae8bca303afe0be0dafd447f6269223731954f 100644 (file)
@@ -24,7 +24,7 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/depsgraph/intern/builder/deg_builder_relations.cc
+/** \file blender/depsgraph/intern/builder/deg_builder_relations_keys.cc
  *  \ingroup depsgraph
  *
  * Methods for constructing depsgraph
index 0fa7a5b18301f9097ec944e79a3c48f1f4debbac..2b4c000f483d9aceaf3627108a9f400fff632776 100644 (file)
@@ -24,7 +24,7 @@
  * ***** END GPL LICENSE BLOCK *****
  */
 
-/** \file blender/depsgraph/intern/builder/deg_builder_relations.cc
+/** \file blender/depsgraph/intern/builder/deg_builder_relations_rig.cc
  *  \ingroup depsgraph
  *
  * Methods for constructing depsgraph
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_relations_scene.cc
new file mode 100644 (file)
index 0000000..946c9da
--- /dev/null
@@ -0,0 +1,157 @@
+/*
+ * ***** BEGIN GPL LICENSE BLOCK *****
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * The Original Code is Copyright (C) 2013 Blender Foundation.
+ * All rights reserved.
+ *
+ * Original Author: Joshua Leung
+ * Contributor(s): Based on original depsgraph.c code - Blender Foundation (2005-2013)
+ *
+ * ***** END GPL LICENSE BLOCK *****
+ */
+
+/** \file blender/depsgraph/intern/builder/deg_builder_relations_scene.cc
+ *  \ingroup depsgraph
+ *
+ * Methods for constructing depsgraph
+ */
+
+#include "intern/builder/deg_builder_relations.h"
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <cstring>  /* required for STREQ later on. */
+
+#include "MEM_guardedalloc.h"
+
+extern "C" {
+#include "BLI_blenlib.h"
+#include "BLI_utildefines.h"
+
+#include "DNA_node_types.h"
+#include "DNA_object_types.h"
+#include "DNA_scene_types.h"
+
+#include "BKE_main.h"
+#include "BKE_node.h"
+
+#include "DEG_depsgraph.h"
+#include "DEG_depsgraph_build.h"
+} /* extern "C" */
+
+#include "intern/builder/deg_builder.h"
+#include "intern/builder/deg_builder_pchanmap.h"
+
+#include "intern/nodes/deg_node.h"
+#include "intern/nodes/deg_node_component.h"
+#include "intern/nodes/deg_node_operation.h"
+
+#include "intern/depsgraph_intern.h"
+#include "intern/depsgraph_types.h"
+
+#include "util/deg_util_foreach.h"
+
+namespace DEG {
+
+void DepsgraphRelationBuilder::build_scene(Main *bmain, Scene *scene)
+{
+       /* LIB_TAG_DOIT is used to indicate whether node for given ID was already
+        * created or not.
+        */
+       BKE_main_id_tag_all(bmain, LIB_TAG_DOIT, false);
+       /* XXX nested node trees are not included in tag-clearing above,
+        * so we need to do this manually.
+        */
+       FOREACH_NODETREE(bmain, nodetree, id) {
+               if (id != (ID *)nodetree)
+                       nodetree->id.tag &= ~LIB_TAG_DOIT;
+       } FOREACH_NODETREE_END
+
+       if (scene->set) {
+               // TODO: link set to scene, especially our timesource...
+       }
+
+       /* scene objects */
+       LINKLIST_FOREACH (Base *, base, &scene->base) {
+               Object *ob = base->object;
+
+               /* object itself */
+               build_object(bmain, scene, ob);
+
+               /* object that this is a proxy for */
+               if (ob->proxy) {
+                       ob->proxy->proxy_from = ob;
+                       build_object(bmain, scene, ob->proxy);
+                       /* TODO(sergey): This is an inverted relation, matches old depsgraph
+                        * behavior and need to be investigated if it still need to be inverted.
+                        */
+                       ComponentKey ob_pose_key(&ob->id, DEPSNODE_TYPE_EVAL_POSE);
+                       ComponentKey proxy_pose_key(&ob->proxy->id, DEPSNODE_TYPE_EVAL_POSE);
+                       add_relation(ob_pose_key, proxy_pose_key, DEPSREL_TYPE_TRANSFORM, "Proxy");
+               }
+
+               /* Object dupligroup. */
+               if (ob->dup_group) {
+                       build_group(bmain, scene, ob, ob->dup_group);
+               }
+       }
+
+       /* rigidbody */
+       if (scene->rigidbody_world) {
+               build_rigidbody(scene);
+       }
+
+       /* scene's animation and drivers */
+       if (scene->adt) {
+               build_animdata(&scene->id);
+       }
+
+       /* world */
+       if (scene->world) {
+               build_world(scene->world);
+       }
+
+       /* compo nodes */
+       if (scene->nodetree) {
+               build_compositor(scene);
+       }
+
+       /* grease pencil */
+       if (scene->gpd) {
+               build_gpencil(&scene->id, scene->gpd);
+       }
+
+       /* Masks. */
+       LINKLIST_FOREACH (Mask *, mask, &bmain->mask) {
+               build_mask(mask);
+       }
+
+       for (Depsgraph::OperationNodes::const_iterator it_op = m_graph->operations.begin();
+            it_op != m_graph->operations.end();
+            ++it_op)
+       {
+               OperationDepsNode *node = *it_op;
+               IDDepsNode *id_node = node->owner->owner;
+               ID *id = id_node->id;
+               if (GS(id->name) == ID_OB) {
+                       Object *object = (Object *)id;
+                       object->customdata_mask |= node->customdata_mask;
+               }
+       }
+}
+
+}  // namespace DEG