Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'intern/cycles/render/graph.cpp')
-rw-r--r--intern/cycles/render/graph.cpp44
1 files changed, 39 insertions, 5 deletions
diff --git a/intern/cycles/render/graph.cpp b/intern/cycles/render/graph.cpp
index e888cb37137..8468690841d 100644
--- a/intern/cycles/render/graph.cpp
+++ b/intern/cycles/render/graph.cpp
@@ -297,7 +297,7 @@ void ShaderGraph::finalize(Scene *scene,
finalized = true;
}
else if(do_simplify) {
- simplify_nodes(scene);
+ simplify_settings(scene);
}
}
@@ -562,11 +562,44 @@ void ShaderGraph::remove_unneeded_nodes()
}
}
+/* Step 2: Constant folding.
+ * Try to constant fold some nodes, and pipe result directly to
+ * the input socket of connected nodes.
+ */
+void ShaderGraph::constant_fold(set<ShaderNode*>& done, ShaderNode *node)
+{
+ /* Only fold each node once. */
+ if(done.find(node) != done.end())
+ return;
+
+ done.insert(node);
+
+ /* Fold nodes connected to inputs first. */
+ foreach(ShaderInput *in, node->inputs) {
+ if(in->link) {
+ constant_fold(done, in->link->parent);
+ }
+ }
+
+ /* Then fold self. */
+ foreach(ShaderOutput *sock, node->outputs) {
+ float3 optimized_value = make_float3(0.0f, 0.0f, 0.0f);
+
+ if(node->constant_fold(sock, &optimized_value)) {
+ /* Apply optimized value to connected sockets */
+ foreach(ShaderInput *in, sock->links) {
+ in->value = optimized_value;
+ disconnect(in);
+ }
+ }
+ }
+}
+
/* Step 3: Simplification.*/
-void ShaderGraph::simplify_nodes(Scene *scene)
+void ShaderGraph::simplify_settings(Scene *scene)
{
foreach(ShaderNode *node, nodes) {
- node->optimize(scene);
+ node->simplify_settings(scene);
}
}
@@ -607,10 +640,11 @@ void ShaderGraph::clean(Scene *scene)
remove_unneeded_nodes();
/* 2: Constant folding. */
- /* TODO(dingto): Implement */
+ set<ShaderNode*> done;
+ constant_fold(done, output());
/* 3: Simplification. */
- simplify_nodes(scene);
+ simplify_settings(scene);
/* 4: De-duplication. */
/* TODO(dingto): Implement */