[Bf-blender-cvs] [535adcdaa3c] blender2.8: Depsgraph: Iterates over ID Nodes instead of Bases
Dalai Felinto
noreply at git.blender.org
Mon Nov 6 20:52:30 CET 2017
Commit: 535adcdaa3cc83c62abe211b0f645cf0a8237eba
Author: Dalai Felinto
Date: Mon Nov 6 17:44:39 2017 -0200
Branches: blender2.8
https://developer.blender.org/rB535adcdaa3cc83c62abe211b0f645cf0a8237eba
Depsgraph: Iterates over ID Nodes instead of Bases
Although this works by itself, it should actually happen after:
"Reshuffle collections base flags evaluation, make it so object is gathering
its base flags from collections."
Meanwhile we have one single hacky function (deg_flush_base_flags_and_settings)
to be removed once the task above is tackled.
Reviewers: sergey
Differential Revision: https://developer.blender.org/D2899
===================================================================
M source/blender/depsgraph/DEG_depsgraph_query.h
M source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M source/blender/depsgraph/intern/builder/deg_builder_nodes.h
M source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
M source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
M source/blender/depsgraph/intern/depsgraph_build.cc
M source/blender/depsgraph/intern/depsgraph_query.cc
M source/blender/depsgraph/intern/depsgraph_types.h
M source/blender/depsgraph/intern/nodes/deg_node.cc
M source/blender/depsgraph/intern/nodes/deg_node.h
===================================================================
diff --git a/source/blender/depsgraph/DEG_depsgraph_query.h b/source/blender/depsgraph/DEG_depsgraph_query.h
index 1020d4e606e..59158ef0454 100644
--- a/source/blender/depsgraph/DEG_depsgraph_query.h
+++ b/source/blender/depsgraph/DEG_depsgraph_query.h
@@ -33,6 +33,8 @@
#ifndef __DEG_DEPSGRAPH_QUERY_H__
#define __DEG_DEPSGRAPH_QUERY_H__
+#include "BLI_ghash.h"
+
#include "DEG_depsgraph.h"
struct ID;
@@ -81,9 +83,6 @@ typedef struct DEGObjectsIteratorData {
struct Scene *scene;
struct EvaluationContext eval_ctx;
- /* TODO(sergey): Base should never be a thing coming FROM depsgraph. */
- struct Base *base;
- int base_flag;
int flag;
/* **** Iteration over dupli-list. *** */
@@ -102,13 +101,16 @@ typedef struct DEGObjectsIteratorData {
* other users of the iterator.
*/
struct Object temp_dupli_object;
+
+ /* **** ghash **** */
+ struct GHashIterator gh_iter;
+
} DEGObjectsIteratorData;
void DEG_objects_iterator_begin(struct BLI_Iterator *iter, DEGObjectsIteratorData *data);
void DEG_objects_iterator_next(struct BLI_Iterator *iter);
void DEG_objects_iterator_end(struct BLI_Iterator *iter);
-/* Temporary hacky solution waiting for cow depsgraph implementation. */
#define DEG_OBJECT_ITER(graph_, instance_, flag_) \
{ \
DEGObjectsIteratorData data_ = { \
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index ec60d86ec82..464a1454749 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -128,7 +128,7 @@ static void modifier_walk(void *user_data,
{
BuilderWalkUserData *data = (BuilderWalkUserData *)user_data;
if (*obpoin) {
- data->builder->build_object(data->scene, *obpoin);
+ data->builder->build_object(data->scene, *obpoin, DEG_ID_LINKED_INDIRECTLY);
}
}
@@ -141,7 +141,7 @@ void constraint_walk(bConstraint * /*con*/,
if (*idpoin) {
ID *id = *idpoin;
if (GS(id->name) == ID_OB) {
- data->builder->build_object(data->scene, (Object *)id);
+ data->builder->build_object(data->scene, (Object *)id, DEG_ID_LINKED_INDIRECTLY);
}
}
}
@@ -203,6 +203,11 @@ IDDepsNode *DepsgraphNodeBuilder::add_id_node(ID *id, bool do_tag)
return id_node;
}
+IDDepsNode *DepsgraphNodeBuilder::find_id_node(ID *id)
+{
+ return m_graph->find_id_node(id);
+}
+
TimeSourceDepsNode *DepsgraphNodeBuilder::add_time_source()
{
return m_graph->add_time_source();
@@ -392,27 +397,33 @@ void DepsgraphNodeBuilder::build_group(Scene *scene, Group *group)
group_id->tag |= LIB_TAG_DOIT;
LINKLIST_FOREACH (GroupObject *, go, &group->gobject) {
- build_object(scene, go->ob);
+ build_object(scene, go->ob, DEG_ID_LINKED_INDIRECTLY);
}
}
-void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
+void DepsgraphNodeBuilder::build_object(Scene *scene,
+ Object *ob,
+ eDepsNode_LinkedState_Type linked_state)
{
/* Skip rest of components if the ID node was already there. */
if (ob->id.tag & LIB_TAG_DOIT) {
+ IDDepsNode *id_node = find_id_node(&ob->id);
+ id_node->linked_state = std::max(id_node->linked_state, linked_state);
return;
}
ob->id.tag |= LIB_TAG_DOIT;
- /* Create ID node for obejct and begin init. */
+ /* Create ID node for object and begin init. */
IDDepsNode *id_node = add_id_node(&ob->id);
+ id_node->linked_state = linked_state;
+
ob->customdata_mask = 0;
/* Standard components. */
build_object_transform(scene, ob);
if (ob->parent != NULL) {
- build_object(scene, ob->parent);
+ build_object(scene, ob->parent, linked_state);
}
if (ob->modifiers.first != NULL) {
BuilderWalkUserData data;
@@ -502,7 +513,7 @@ void DepsgraphNodeBuilder::build_object(Scene *scene, Object *ob)
/* Object that this is a proxy for. */
if (ob->proxy) {
ob->proxy->proxy_from = ob;
- build_object(scene, ob->proxy);
+ build_object(scene, ob->proxy, DEG_ID_LINKED_INDIRECTLY);
}
/* Object dupligroup. */
@@ -1003,13 +1014,13 @@ void DepsgraphNodeBuilder::build_obdata_geom(Scene *scene, Object *ob)
*/
Curve *cu = (Curve *)obdata;
if (cu->bevobj != NULL) {
- build_object(scene, cu->bevobj);
+ build_object(scene, cu->bevobj, DEG_ID_LINKED_INDIRECTLY);
}
if (cu->taperobj != NULL) {
- build_object(scene, cu->taperobj);
+ build_object(scene, cu->taperobj, DEG_ID_LINKED_INDIRECTLY);
}
if (ob->type == OB_FONT && cu->textoncurve != NULL) {
- build_object(scene, cu->textoncurve);
+ build_object(scene, cu->textoncurve, DEG_ID_LINKED_INDIRECTLY);
}
break;
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
index dbb126e2078..e7bf8c9998d 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.h
@@ -111,6 +111,7 @@ struct DepsgraphNodeBuilder {
void begin_build(Main *bmain);
IDDepsNode *add_id_node(ID *id, bool do_tag = true);
+ IDDepsNode *find_id_node(ID *id);
TimeSourceDepsNode *add_time_source();
ComponentDepsNode *add_component_node(ID *id,
@@ -156,9 +157,13 @@ struct DepsgraphNodeBuilder {
const char *name = "",
int name_tag = -1);
- void build_scene(Main *bmain, Scene *scene);
+ void build_scene(Main *bmain,
+ Scene *scene,
+ eDepsNode_LinkedState_Type linked_state);
void build_group(Scene *scene, Group *group);
- void build_object(Scene *scene, Object *ob);
+ void build_object(Scene *scene,
+ Object *ob,
+ eDepsNode_LinkedState_Type linked_state);
void build_object_transform(Scene *scene, Object *ob);
void build_object_constraints(Scene *scene, Object *ob);
void build_pose_constraints(Scene *scene, Object *ob, bPoseChannel *pchan);
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
index 20263e1d751..dabebb9d4a9 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_rig.cc
@@ -304,7 +304,7 @@ void DepsgraphNodeBuilder::build_rig(Scene *scene, Object *object)
/* Custom shape. */
/* NOTE: Custom shape datablock is already remapped to CoW version. */
if (pchan->custom != NULL) {
- build_object(scene, get_orig_datablock(pchan->custom));
+ build_object(scene, get_orig_datablock(pchan->custom), DEG_ID_LINKED_INDIRECTLY);
}
}
}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
index a8acc88f7f3..097720f514a 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes_scene.cc
@@ -65,7 +65,7 @@ extern "C" {
namespace DEG {
-void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
+void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene, eDepsNode_LinkedState_Type linked_state)
{
/* scene ID block */
add_id_node(&scene->id);
@@ -77,7 +77,7 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
// 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);
+ build_scene(bmain, scene->set, DEG_ID_LINKED_VIA_SET);
}
/* scene objects */
@@ -85,12 +85,12 @@ void DepsgraphNodeBuilder::build_scene(Main *bmain, Scene *scene)
for (SceneLayer *sl = (SceneLayer *)scene->render_layers.first; sl; sl = sl->next) {
for (Base *base = (Base *)sl->object_bases.first; base; base = base->next) {
/* object itself */
- build_object(scene, base->object);
+ build_object(scene, base->object, linked_state);
base->object->select_color = select_color++;
}
}
if (scene->camera != NULL) {
- build_object(scene, scene->camera);
+ build_object(scene, scene->camera, linked_state);
}
/* rigidbody */
diff --git a/source/blender/depsgraph/intern/depsgraph_build.cc b/source/blender/depsgraph/intern/depsgraph_build.cc
index d58f61a5077..e58a5707bc9 100644
--- a/source/blender/depsgraph/intern/depsgraph_build.cc
+++ b/source/blender/depsgraph/intern/depsgraph_build.cc
@@ -209,7 +209,7 @@ void DEG_graph_build_from_scene(Depsgraph *graph, Main *bmain, Scene *scene)
/* 1) Generate all the nodes in the graph first */
DEG::DepsgraphNodeBuilder node_builder(bmain, deg_graph);
node_builder.begin_build(bmain);
- node_builder.build_scene(bmain, scene);
+ node_builder.build_scene(bmain, scene, DEG::DEG_ID_LINKED_DIRECTLY);
/* 2) Hook up relationships between operations - to determine evaluation
* order.
diff --git a/source/blender/depsgraph/intern/depsgraph_query.cc b/source/blender/depsgraph/intern/depsgraph_query.cc
index 9e9a2c38993..156b98a6421 100644
--- a/source/blender/depsgraph/intern/depsgraph_query.cc
+++ b/source/blender/depsgraph/intern/depsgraph_query.cc
@@ -33,6 +33,7 @@
#include "MEM_guardedalloc.h"
extern "C" {
+#include "BLI_ghash.h"
#include "BLI_math.h"
#include "BKE_anim.h"
#include "BKE_idcode.h"
@@ -116,42 +117,57 @@ ID *DEG_get_evaluated_id(struct Depsgraph *depsgraph, ID *id)
return id_node->id_cow;
}
-/* ************************ DAG ITERATORS ********************* */
+/* ************************ DEG ITERATORS ********************* */
-#define BASE_FLUSH_FLAGS (BASE_FROM_SET | BASE_FROMDUPLI)
-
-void DEG_objects_iterator_begin(BLI_Iterator *iter, DEGObjectsIteratorData *data)
+/**
+ * XXX (dfelinto/sergey) big hack, waiting for:
+ * "Reshuffle collections base flags evaluation, make it so object is gathering its base flags from collections."
+ *
+ * Returns false if object shouldn't be found (which should never happen in the final imple
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list