Depsgraph: Move scene builder function to own file

This way it's much easier to grasp what the graph actually contains.
This commit is contained in:
Sergey Sharybin 2016-11-17 15:38:03 +01:00
parent 48a8a20e2a
commit 317431461f
7 changed files with 316 additions and 91 deletions

View 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

View 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)

View 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

View File

@ -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

View 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

View 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

View File

@ -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