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:
authorDalai Felinto <dfelinto@gmail.com>2012-08-29 21:30:14 +0400
committerDalai Felinto <dfelinto@gmail.com>2012-08-29 21:30:14 +0400
commitc052ebda8e13df7dfb662a4ebb9fd42fbe74d23e (patch)
tree5055fe630b240e0b68093045384cdf05535184d7
parent7a13bc2196336c4ec45e86947d9fcb0b8d61f74e (diff)
Cycles bugfix: [32431] Cycles Math Node : Clamp does not work
the OSL solution is slightly different than the svm, but I think it's fine. thanks Lukas Toenne for helping with a fix on the original patch
-rw-r--r--intern/cycles/blender/blender_shader.cpp1
-rw-r--r--intern/cycles/kernel/osl/nodes/node_math.osl4
-rw-r--r--intern/cycles/kernel/svm/svm_math.h2
-rw-r--r--intern/cycles/kernel/svm/svm_types.h3
-rw-r--r--intern/cycles/render/nodes.cpp8
-rw-r--r--intern/cycles/render/nodes.h2
6 files changed, 19 insertions, 1 deletions
diff --git a/intern/cycles/blender/blender_shader.cpp b/intern/cycles/blender/blender_shader.cpp
index 2c15a60dab6..37ab1ddac26 100644
--- a/intern/cycles/blender/blender_shader.cpp
+++ b/intern/cycles/blender/blender_shader.cpp
@@ -244,6 +244,7 @@ static ShaderNode *add_node(BL::BlendData b_data, BL::Scene b_scene, ShaderGraph
BL::ShaderNodeMath b_math_node(b_node);
MathNode *math = new MathNode();
math->type = MathNode::type_enum[b_math_node.operation()];
+ math->use_clamp = b_math_node.use_clamp();
node = math;
break;
}
diff --git a/intern/cycles/kernel/osl/nodes/node_math.osl b/intern/cycles/kernel/osl/nodes/node_math.osl
index be9bb71d511..b62403600ff 100644
--- a/intern/cycles/kernel/osl/nodes/node_math.osl
+++ b/intern/cycles/kernel/osl/nodes/node_math.osl
@@ -40,6 +40,7 @@ float safe_log(float a, float b)
shader node_math(
string type = "Add",
+ int Clamp = false,
float Value1 = 0.0,
float Value2 = 0.0,
output float Value = 0.0)
@@ -80,5 +81,8 @@ shader node_math(
Value = Value1 < Value2;
if(type == "Greater Than")
Value = Value1 > Value2;
+
+ if(Clamp)
+ Value = clamp(Value1, 0.0, 1.0);
}
diff --git a/intern/cycles/kernel/svm/svm_math.h b/intern/cycles/kernel/svm/svm_math.h
index bc2f774097e..e39c7a4ba6c 100644
--- a/intern/cycles/kernel/svm/svm_math.h
+++ b/intern/cycles/kernel/svm/svm_math.h
@@ -108,6 +108,8 @@ __device float svm_math(NodeMath type, float Fac1, float Fac2)
Fac = Fac1 < Fac2;
else if(type == NODE_MATH_GREATER_THAN)
Fac = Fac1 > Fac2;
+ else if(type == NODE_MATH_CLAMP)
+ Fac = clamp(Fac1, 0.0f, 1.0f);
else
Fac = 0.0f;
diff --git a/intern/cycles/kernel/svm/svm_types.h b/intern/cycles/kernel/svm/svm_types.h
index cbff0c099ea..df06b883cae 100644
--- a/intern/cycles/kernel/svm/svm_types.h
+++ b/intern/cycles/kernel/svm/svm_types.h
@@ -183,7 +183,8 @@ typedef enum NodeMath {
NODE_MATH_MAXIMUM,
NODE_MATH_ROUND,
NODE_MATH_LESS_THAN,
- NODE_MATH_GREATER_THAN
+ NODE_MATH_GREATER_THAN,
+ NODE_MATH_CLAMP /* used for the clamp UI option */
} NodeMath;
typedef enum NodeVectorMath {
diff --git a/intern/cycles/render/nodes.cpp b/intern/cycles/render/nodes.cpp
index 250570e1d65..07310cb4461 100644
--- a/intern/cycles/render/nodes.cpp
+++ b/intern/cycles/render/nodes.cpp
@@ -2391,6 +2391,8 @@ MathNode::MathNode()
{
type = ustring("Add");
+ use_clamp = false;
+
add_input("Value1", SHADER_SOCKET_FLOAT);
add_input("Value2", SHADER_SOCKET_FLOAT);
add_output("Value", SHADER_SOCKET_FLOAT);
@@ -2435,11 +2437,17 @@ void MathNode::compile(SVMCompiler& compiler)
compiler.add_node(NODE_MATH, type_enum[type], value1_in->stack_offset, value2_in->stack_offset);
compiler.add_node(NODE_MATH, value_out->stack_offset);
+
+ if(use_clamp) {
+ compiler.add_node(NODE_MATH, NODE_MATH_CLAMP, value_out->stack_offset);
+ compiler.add_node(NODE_MATH, value_out->stack_offset);
+ }
}
void MathNode::compile(OSLCompiler& compiler)
{
compiler.parameter("type", type);
+ compiler.parameter("Clamp", use_clamp);
compiler.add(this, "node_math");
}
diff --git a/intern/cycles/render/nodes.h b/intern/cycles/render/nodes.h
index efd814e4ae6..2e0acc32e51 100644
--- a/intern/cycles/render/nodes.h
+++ b/intern/cycles/render/nodes.h
@@ -385,6 +385,8 @@ class MathNode : public ShaderNode {
public:
SHADER_NODE_CLASS(MathNode)
+ bool use_clamp;
+
ustring type;
static ShaderEnum type_enum;
};