Commit: f84684694113f60e9d8de5e30c7af8f340e52106
Author: Sergey Sharybin
Date: Tue Aug 29 12:51:56 2017 +0200
Branches: blender2.8
https://developer.blender.org/rBf84684694113f60e9d8de5e30c7af8f340e52106
Depsgraph: Fix missing updates when tweaking node tree parameters
The is following: split copy on write update for node trees, and if we are only
tagging for uniform buffer update we skip whole datablock copy and only invoke
copy default_values form original nodetree to a copied one.
Thing which i'm not sure is: whether we need to use different branches in graph
itself to control such a conditional behavior, or whether we need to store tag
somewhere in the dependency graph. There are obviously cons and pros in both
approaches, and need to think about this. Maybe with more examples it becomes
more obvious which way is better.
This only fixes manual tweaks for now, animation support is coming.
===================================================================
M source/blender/blenkernel/BKE_node.h
M source/blender/blenkernel/intern/node.c
M source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
M source/blender/depsgraph/intern/builder/deg_builder_relations.cc
M source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
M source/blender/depsgraph/intern/depsgraph_tag.cc
M source/blender/depsgraph/intern/depsgraph_types.h
M source/blender/depsgraph/intern/eval/deg_eval_flush.cc
M source/blender/depsgraph/intern/nodes/deg_node_component.cc
M source/blender/depsgraph/intern/nodes/deg_node_component.h
===================================================================
diff --git a/source/blender/blenkernel/BKE_node.h
b/source/blender/blenkernel/BKE_node.h
index 5bc47f62b64..ea0b350b8af 100644
--- a/source/blender/blenkernel/BKE_node.h
+++ b/source/blender/blenkernel/BKE_node.h
@@ -1053,8 +1053,13 @@ void free_nodesystem(void);
/* -------------------------------------------------------------------- */
/* evaluation support, */
+struct EvaluationContext;
+
void BKE_nodetree_copy_default_values(struct bNodeTree *ntree_dst,
const struct bNodeTree *ntree_src);
+void BKE_nodetree_shading_params_eval(const struct EvaluationContext *eval_ctx,
+ struct bNodeTree *ntree_dst,
+ const struct bNodeTree *ntree_src);
#endif /* __BKE_NODE_H__ */
diff --git a/source/blender/blenkernel/intern/node.c
b/source/blender/blenkernel/intern/node.c
index 1c24d72759e..3ff4885f7fc 100644
--- a/source/blender/blenkernel/intern/node.c
+++ b/source/blender/blenkernel/intern/node.c
@@ -3826,6 +3826,9 @@ static void node_copy_default_values(bNode *node_dst,
const bNode *node_src)
void BKE_nodetree_copy_default_values(bNodeTree *ntree_dst,
const bNodeTree *ntree_src)
{
+ if (ntree_dst == ntree_src) {
+ return;
+ }
bNode *node_dst = ntree_dst->nodes.first;
const bNode *node_src = ntree_src->nodes.first;
while (node_dst != NULL) {
@@ -3834,3 +3837,13 @@ void BKE_nodetree_copy_default_values(bNodeTree
*ntree_dst,
node_src = node_src->next;
}
}
+
+void BKE_nodetree_shading_params_eval(const struct EvaluationContext
*UNUSED(eval_ctx),
+ bNodeTree *ntree_dst,
+ const bNodeTree *ntree_src)
+{
+ if (G.debug & G_DEBUG_DEPSGRAPH) {
+ printf("%s on %s (%p)\n", __func__, ntree_src->id.name,
ntree_dst);
+ }
+ BKE_nodetree_copy_default_values(ntree_dst, ntree_src);
+}
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
index 66849370739..d29b87a0742 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_nodes.cc
@@ -1095,28 +1095,33 @@ void DepsgraphNodeBuilder::build_lamp(Object *ob)
void DepsgraphNodeBuilder::build_nodetree(bNodeTree *ntree)
{
- if (!ntree)
+ if (ntree == NULL) {
return;
-
+ }
/* nodetree itself */
ID *ntree_id = &ntree->id;
OperationDepsNode *op_node;
-
+ add_id_node(ntree_id);
+ bNodeTree *ntree_cow = get_cow_datablock(ntree);
+ /* Animation, */
build_animdata(ntree_id);
-
/* Parameters for drivers. */
op_node = add_operation_node(ntree_id,
DEG_NODE_TYPE_PARAMETERS,
NULL,
DEG_OPCODE_PARAMETERS_EVAL);
op_node->set_as_exit();
-
/* Shading update. */
add_operation_node(ntree_id,
DEG_NODE_TYPE_SHADING,
NULL,
DEG_OPCODE_MATERIAL_UPDATE);
+ add_operation_node(ntree_id,
+ DEG_NODE_TYPE_SHADING_PARAMETERS,
+ function_bind(BKE_nodetree_shading_params_eval,
+ _1, ntree_cow, ntree),
+ DEG_OPCODE_MATERIAL_UPDATE);
/* nodetree's nodes... */
LINKLIST_FOREACH (bNode *, bnode, &ntree->nodes) {
ID *id = bnode->id;
diff --git a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
index 18326baab45..87f7117bb14 100644
--- a/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
+++ b/source/blender/depsgraph/intern/builder/deg_builder_relations.cc
@@ -1853,7 +1853,11 @@ void DepsgraphRelationBuilder::build_nodetree(bNodeTree
*ntree)
OperationKey shading_update_key(ntree_id,
DEG_NODE_TYPE_SHADING,
DEG_OPCODE_MATERIAL_UPDATE);
+ OperationKey shading_parameters_key(ntree_id,
+ DEG_NODE_TYPE_SHADING_PARAMETERS,
+ DEG_OPCODE_MATERIAL_UPDATE);
add_relation(parameters_key, shading_update_key, "NTree Parameters");
+ add_relation(shading_parameters_key, shading_update_key, "NTree Shading
Parameters");
}
/* Recursively build graph for material */
@@ -2005,6 +2009,10 @@ void
DepsgraphRelationBuilder::build_copy_on_write_relations(IDDepsNode *id_node
/* Copy-on-write component never depends on itself. */
continue;
}
+ if (!comp_node->depends_on_cow()) {
+ /* Component explicitly requests to not add relation. */
+ continue;
+ }
/* All entry operations of each component should wait for a
proper
* copy of ID.
*/
diff --git a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
index 66b63f861ee..ba1b91629db 100644
--- a/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
+++ b/source/blender/depsgraph/intern/debug/deg_debug_graphviz.cc
@@ -88,9 +88,10 @@ static const int deg_debug_node_type_color_map[][2] = {
{DEG_NODE_TYPE_GEOMETRY, 6},
{DEG_NODE_TYPE_SEQUENCER, 7},
{DEG_NODE_TYPE_SHADING, 8},
- {DEG_NODE_TYPE_CACHE, 9},
- {DEG_NODE_TYPE_LAYER_COLLECTIONS, 10},
- {DEG_NODE_TYPE_COPY_ON_WRITE, 11},
+ {DEG_NODE_TYPE_SHADING_PARAMETERS,9},
+ {DEG_NODE_TYPE_CACHE, 10},
+ {DEG_NODE_TYPE_LAYER_COLLECTIONS, 11},
+ {DEG_NODE_TYPE_COPY_ON_WRITE, 12},
{-1, 0}
};
#endif
@@ -377,6 +378,7 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
case DEG_NODE_TYPE_EVAL_POSE:
case DEG_NODE_TYPE_BONE:
case DEG_NODE_TYPE_SHADING:
+ case DEG_NODE_TYPE_SHADING_PARAMETERS:
case DEG_NODE_TYPE_CACHE:
case DEG_NODE_TYPE_LAYER_COLLECTIONS:
case DEG_NODE_TYPE_EVAL_PARTICLES:
@@ -395,7 +397,9 @@ static void deg_debug_graphviz_node(const DebugContext &ctx,
}
break;
}
- default:
+ case DEG_NODE_TYPE_UNDEFINED:
+ case DEG_NODE_TYPE_TIMESOURCE:
+ case DEG_NODE_TYPE_OPERATION:
deg_debug_graphviz_node_single(ctx, node);
break;
}
diff --git a/source/blender/depsgraph/intern/depsgraph_tag.cc
b/source/blender/depsgraph/intern/depsgraph_tag.cc
index 9f2081c8169..839865d0dfb 100644
--- a/source/blender/depsgraph/intern/depsgraph_tag.cc
+++ b/source/blender/depsgraph/intern/depsgraph_tag.cc
@@ -248,8 +248,13 @@ void id_tag_update_particle(Depsgraph *graph, IDDepsNode
*id_node, int tag)
void id_tag_update_shading(Depsgraph *graph, IDDepsNode *id_node)
{
- ComponentDepsNode *shading_comp =
- id_node->find_component(DEG_NODE_TYPE_SHADING);
+ ComponentDepsNode *shading_comp;
+ if (GS(id_node->id_orig->name) == ID_NT) {
+ shading_comp =
id_node->find_component(DEG_NODE_TYPE_SHADING_PARAMETERS);
+ }
+ else {
+ shading_comp = id_node->find_component(DEG_NODE_TYPE_SHADING);
+ }
if (shading_comp == NULL) {
#ifdef STRICT_COMPONENT_TAGGING
DEG_ERROR_PRINTF("ERROR: Unable to find shading component for
%s\n",
diff --git a/source/blender/depsgraph/intern/depsgraph_types.h
b/source/blender/depsgraph/intern/depsgraph_types.h
index 57a47c4084b..9ea6dfedefe 100644
--- a/source/blender/depsgraph/intern/depsgraph_types.h
+++ b/source/blender/depsgraph/intern/depsgraph_types.h
@@ -130,6 +130,7 @@ typedef enum eDepsNode_Type {
DEG_NODE_TYPE_EVAL_PARTICLES,
/* Material Shading Component */
DEG_NODE_TYPE_SHADING,
+ DEG_NODE_TYPE_SHADING_PARAMETERS,
/* Cache Component */
DEG_NODE_TYPE_CACHE,
} eDepsNode_Type;
diff --git a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
index 3eaa9cdaa17..6777c21f2ed 100644
--- a/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
+++ b/source/blender/depsgraph/intern/eval/deg_eval_flush.cc
@@ -144,9 +144,11 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph)
*
* TODO(sergey): This is something we need to
avoid.
*/
- ComponentDepsNode *cow_comp =
-
id_node->find_component(DEG_NODE_TYPE_COPY_ON_WRITE);
- cow_comp->tag_update(graph);
+ if (comp_node->depends_on_cow()) {
+ ComponentDepsNode *cow_comp =
+
id_node->find_component(DEG_NODE_TYPE_COPY_ON_WRITE);
+ cow_comp->tag_update(graph);
+ }
#endif
}
@@ -202,6 +204,8 @@ void deg_graph_flush_updates(Main *bmain, Depsgraph *graph)
case DEG_NODE_TYPE_PROXY:
object->recalc |=
OB_RECALC_DATA;
break;
+ case
DEG_NODE_TYPE_SHADING_PARAMETERS:
+ break;
}
/* TODO : replace with more granular
flags */
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.cc
b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
index bd9583a7b67..a250dce1239 100644
--- a/source/blender/depsgraph/intern/nodes/deg_node_component.cc
+++ b/source/blender/depsgraph/intern/nodes/deg_node_component.cc
@@ -396,6 +396,11 @@ static DepsNodeFactoryImpl<ParticlesComponentDepsNode>
DNTI_EVAL_PARTICLES;
DEG_DEPSNODE_DEFINE(ShadingComponentDepsNode, DEG_NODE_TYPE_SHADING, "Shading
Component");
static DepsNodeFactoryImpl<ShadingComponentDepsNode> DNTI_SHADING;
+/* Shading Parameters Component Defines ============================ */
+
+DEG_DEPSNODE_DEFINE(ShadingParametersComponentDepsNode,
DEG_NODE_TYPE_SHADING_PARAMETERS, "Shading Parameters Component");
+static DepsNodeFactoryImpl<ShadingParametersComponentDepsNode>
DNTI_SHADING_PARAMETERS;
+
/* Cache Component Defines ============================ */
DEG_DEPSNODE_DEFINE(CacheComponentDepsNode, DEG_NODE_TYPE_CACHE, "Cache
Component");
@@ -426,7 +431,9 @@ void deg_register_component_depsnodes()
deg_register_node_typeinfo(&DNTI_BONE);
deg_register_node_typeinfo(&DNTI_EVAL_PARTICLES);
+
deg_register_node_typeinfo(&DNTI_SHADING);
+ deg_register_node_typeinfo(&DNTI_SHADING_PARAMETERS);
deg_register_node_typeinfo(&DNTI_CACHE);
diff --git a/source/blender/depsgraph/intern/nodes/deg_node_component.h
b/source/blender/depsgraph/intern/nodes/deg_node_component.h
index 955d197b33a..36945daf1b8
@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs