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:
authorLukas Stockner <lukas.stockner@freenet.de>2016-06-21 01:19:51 +0300
committerLukas Stockner <lukas.stockner@freenet.de>2016-06-21 01:19:51 +0300
commit93c6cf496edff358c919d62295c031fc5eebb155 (patch)
tree28fc7eba70a7c7f08e57aad8221ee2a454d9c498 /intern/cycles
parenta170607578b8911df30039dacf7399506476be87 (diff)
Cycles: Deduplicate Vector and RGB Curve nodes
Since most of the code for these two nodes was identical, this commit now instead uses a common base class that implements all the functionality.
Diffstat (limited to 'intern/cycles')
-rw-r--r--intern/cycles/render/nodes.cpp108
-rw-r--r--intern/cycles/render/nodes.h24
2 files changed, 70 insertions, 62 deletions
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 5efbf65a198..1a9adb08194 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -4885,42 +4885,25 @@ bool BumpNode::constant_fold(ShaderGraph *graph, ShaderOutput *, ShaderInput *)
return false;
}
-/* RGBCurvesNode */
-
-NODE_DEFINE(RGBCurvesNode)
-{
- NodeType* type = NodeType::add("rgb_curves", create, NodeType::SHADER);
-
- SOCKET_COLOR_ARRAY(curves, "Curves", array<float3>());
- SOCKET_FLOAT(min_x, "Min X", 0.0f);
- SOCKET_FLOAT(max_x, "Max X", 1.0f);
-
- SOCKET_IN_FLOAT(fac, "Fac", 0.0f);
- SOCKET_IN_COLOR(color, "Color", make_float3(0.0f, 0.0f, 0.0f));
- SOCKET_OUT_COLOR(color, "Color");
-
- return type;
-}
+/* Curve node */
-RGBCurvesNode::RGBCurvesNode()
+CurvesNode::CurvesNode(const NodeType *node_type)
: ShaderNode(node_type)
{
}
-void RGBCurvesNode::compile(SVMCompiler& compiler)
+void CurvesNode::compile(SVMCompiler& compiler, int type, ShaderInput *value_in, ShaderOutput *value_out)
{
if(curves.size() == 0)
return;
ShaderInput *fac_in = input("Fac");
- ShaderInput *color_in = input("Color");
- ShaderOutput *color_out = output("Color");
- compiler.add_node(NODE_RGB_CURVES,
+ compiler.add_node(type,
compiler.encode_uchar4(compiler.stack_assign(fac_in),
- compiler.stack_assign(color_in),
- compiler.stack_assign(color_out)),
+ compiler.stack_assign(value_in),
+ compiler.stack_assign(value_out)),
__float_as_int(min_x),
__float_as_int(max_x));
@@ -4929,7 +4912,7 @@ void RGBCurvesNode::compile(SVMCompiler& compiler)
compiler.add_node(float3_to_float4(curves[i]));
}
-void RGBCurvesNode::compile(OSLCompiler& compiler)
+void CurvesNode::compile(OSLCompiler& compiler, const char* name)
{
if(curves.size() == 0)
return;
@@ -4937,7 +4920,50 @@ void RGBCurvesNode::compile(OSLCompiler& compiler)
compiler.parameter_color_array("ramp", curves);
compiler.parameter(this, "min_x");
compiler.parameter(this, "max_x");
- compiler.add(this, "node_rgb_curves");
+ compiler.add(this, name);
+}
+
+void CurvesNode::compile(SVMCompiler& /*compiler*/)
+{
+ assert(0);
+}
+
+void CurvesNode::compile(OSLCompiler& /*compiler*/)
+{
+ assert(0);
+}
+
+/* RGBCurvesNode */
+
+NODE_DEFINE(RGBCurvesNode)
+{
+ NodeType* type = NodeType::add("rgb_curves", create, NodeType::SHADER);
+
+ SOCKET_COLOR_ARRAY(curves, "Curves", array<float3>());
+ SOCKET_FLOAT(min_x, "Min X", 0.0f);
+ SOCKET_FLOAT(max_x, "Max X", 1.0f);
+
+ SOCKET_IN_FLOAT(fac, "Fac", 0.0f);
+ SOCKET_IN_COLOR(value, "Color", make_float3(0.0f, 0.0f, 0.0f));
+
+ SOCKET_OUT_COLOR(value, "Color");
+
+ return type;
+}
+
+RGBCurvesNode::RGBCurvesNode()
+: CurvesNode(node_type)
+{
+}
+
+void RGBCurvesNode::compile(SVMCompiler& compiler)
+{
+ CurvesNode::compile(compiler, NODE_RGB_CURVES, input("Color"), output("Color"));
+}
+
+void RGBCurvesNode::compile(OSLCompiler& compiler)
+{
+ CurvesNode::compile(compiler, "node_rgb_curves");
}
/* VectorCurvesNode */
@@ -4951,48 +4977,26 @@ NODE_DEFINE(VectorCurvesNode)
SOCKET_FLOAT(max_x, "Max X", 1.0f);
SOCKET_IN_FLOAT(fac, "Fac", 0.0f);
- SOCKET_IN_VECTOR(vector, "Vector", make_float3(0.0f, 0.0f, 0.0f));
+ SOCKET_IN_VECTOR(value, "Vector", make_float3(0.0f, 0.0f, 0.0f));
- SOCKET_OUT_VECTOR(vector, "Vector");
+ SOCKET_OUT_VECTOR(value, "Vector");
return type;
}
VectorCurvesNode::VectorCurvesNode()
-: ShaderNode(node_type)
+: CurvesNode(node_type)
{
}
void VectorCurvesNode::compile(SVMCompiler& compiler)
{
- if(curves.size() == 0)
- return;
-
- ShaderInput *fac_in = input("Fac");
- ShaderInput *vector_in = input("Vector");
- ShaderOutput *vector_out = output("Vector");
-
- compiler.add_node(NODE_VECTOR_CURVES,
- compiler.encode_uchar4(compiler.stack_assign(fac_in),
- compiler.stack_assign(vector_in),
- compiler.stack_assign(vector_out)),
- __float_as_int(min_x),
- __float_as_int(max_x));
-
- compiler.add_node(curves.size());
- for(int i = 0; i < curves.size(); i++)
- compiler.add_node(float3_to_float4(curves[i]));
+ CurvesNode::compile(compiler, NODE_VECTOR_CURVES, input("Vector"), output("Vector"));
}
void VectorCurvesNode::compile(OSLCompiler& compiler)
{
- if(curves.size() == 0)
- return;
-
- compiler.parameter_color_array("ramp", curves);
- compiler.parameter(this, "min_x");
- compiler.parameter(this, "max_x");
- compiler.add(this, "node_vector_curves");
+ CurvesNode::compile(compiler, "node_vector_curves");
}
/* RGBRampNode */
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index 978908f4c78..3245fdfb6d9 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -875,26 +875,30 @@ public:
float distance;
};
-class RGBCurvesNode : public ShaderNode {
+class CurvesNode : public ShaderNode {
public:
- SHADER_NODE_CLASS(RGBCurvesNode)
+ explicit CurvesNode(const NodeType *node_type);
+ SHADER_NODE_BASE_CLASS(CurvesNode);
virtual int get_group() { return NODE_GROUP_LEVEL_3; }
+ bool has_spatial_varying() { return true; }
+ void compile(SVMCompiler& compiler, int type, ShaderInput *value_in, ShaderOutput *value_out);
+ void compile(OSLCompiler& compiler, const char *name);
+
array<float3> curves;
float min_x, max_x, fac;
- float3 color;
+ float3 value;
};
-class VectorCurvesNode : public ShaderNode {
+class RGBCurvesNode : public CurvesNode {
public:
- SHADER_NODE_CLASS(VectorCurvesNode)
-
- virtual int get_group() { return NODE_GROUP_LEVEL_3; }
+ SHADER_NODE_CLASS(RGBCurvesNode)
+};
- array<float3> curves;
- float min_x, max_x, fac;
- float3 vector;
+class VectorCurvesNode : public CurvesNode {
+public:
+ SHADER_NODE_CLASS(VectorCurvesNode)
};
class RGBRampNode : public ShaderNode {