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
This commit is contained in:
@@ -244,6 +244,7 @@ static ShaderNode *add_node(BL::BlendData b_data, BL::Scene b_scene, ShaderGraph
|
|||||||
BL::ShaderNodeMath b_math_node(b_node);
|
BL::ShaderNodeMath b_math_node(b_node);
|
||||||
MathNode *math = new MathNode();
|
MathNode *math = new MathNode();
|
||||||
math->type = MathNode::type_enum[b_math_node.operation()];
|
math->type = MathNode::type_enum[b_math_node.operation()];
|
||||||
|
math->use_clamp = b_math_node.use_clamp();
|
||||||
node = math;
|
node = math;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@@ -40,6 +40,7 @@ float safe_log(float a, float b)
|
|||||||
|
|
||||||
shader node_math(
|
shader node_math(
|
||||||
string type = "Add",
|
string type = "Add",
|
||||||
|
int Clamp = false,
|
||||||
float Value1 = 0.0,
|
float Value1 = 0.0,
|
||||||
float Value2 = 0.0,
|
float Value2 = 0.0,
|
||||||
output float Value = 0.0)
|
output float Value = 0.0)
|
||||||
@@ -80,5 +81,8 @@ shader node_math(
|
|||||||
Value = Value1 < Value2;
|
Value = Value1 < Value2;
|
||||||
if(type == "Greater Than")
|
if(type == "Greater Than")
|
||||||
Value = Value1 > Value2;
|
Value = Value1 > Value2;
|
||||||
|
|
||||||
|
if(Clamp)
|
||||||
|
Value = clamp(Value1, 0.0, 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -108,6 +108,8 @@ __device float svm_math(NodeMath type, float Fac1, float Fac2)
|
|||||||
Fac = Fac1 < Fac2;
|
Fac = Fac1 < Fac2;
|
||||||
else if(type == NODE_MATH_GREATER_THAN)
|
else if(type == NODE_MATH_GREATER_THAN)
|
||||||
Fac = Fac1 > Fac2;
|
Fac = Fac1 > Fac2;
|
||||||
|
else if(type == NODE_MATH_CLAMP)
|
||||||
|
Fac = clamp(Fac1, 0.0f, 1.0f);
|
||||||
else
|
else
|
||||||
Fac = 0.0f;
|
Fac = 0.0f;
|
||||||
|
|
||||||
|
@@ -183,7 +183,8 @@ typedef enum NodeMath {
|
|||||||
NODE_MATH_MAXIMUM,
|
NODE_MATH_MAXIMUM,
|
||||||
NODE_MATH_ROUND,
|
NODE_MATH_ROUND,
|
||||||
NODE_MATH_LESS_THAN,
|
NODE_MATH_LESS_THAN,
|
||||||
NODE_MATH_GREATER_THAN
|
NODE_MATH_GREATER_THAN,
|
||||||
|
NODE_MATH_CLAMP /* used for the clamp UI option */
|
||||||
} NodeMath;
|
} NodeMath;
|
||||||
|
|
||||||
typedef enum NodeVectorMath {
|
typedef enum NodeVectorMath {
|
||||||
|
@@ -2391,6 +2391,8 @@ MathNode::MathNode()
|
|||||||
{
|
{
|
||||||
type = ustring("Add");
|
type = ustring("Add");
|
||||||
|
|
||||||
|
use_clamp = false;
|
||||||
|
|
||||||
add_input("Value1", SHADER_SOCKET_FLOAT);
|
add_input("Value1", SHADER_SOCKET_FLOAT);
|
||||||
add_input("Value2", SHADER_SOCKET_FLOAT);
|
add_input("Value2", SHADER_SOCKET_FLOAT);
|
||||||
add_output("Value", 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, type_enum[type], value1_in->stack_offset, value2_in->stack_offset);
|
||||||
compiler.add_node(NODE_MATH, value_out->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)
|
void MathNode::compile(OSLCompiler& compiler)
|
||||||
{
|
{
|
||||||
compiler.parameter("type", type);
|
compiler.parameter("type", type);
|
||||||
|
compiler.parameter("Clamp", use_clamp);
|
||||||
compiler.add(this, "node_math");
|
compiler.add(this, "node_math");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -385,6 +385,8 @@ class MathNode : public ShaderNode {
|
|||||||
public:
|
public:
|
||||||
SHADER_NODE_CLASS(MathNode)
|
SHADER_NODE_CLASS(MathNode)
|
||||||
|
|
||||||
|
bool use_clamp;
|
||||||
|
|
||||||
ustring type;
|
ustring type;
|
||||||
static ShaderEnum type_enum;
|
static ShaderEnum type_enum;
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user