Cycles/Compositor: Add arctan2 operation to the Math node
The Math node currently has the normal atan() function, but for actual angles this is fairly useless without additional nodes to handle the signs. Since the node has two inputs anyways, it only makes sense to add an arctan2 option. Reviewers: sergey, brecht Differential Revision: https://developer.blender.org/D3430
This commit is contained in:
parent
8d9faf840b
commit
6862762685
|
@ -116,6 +116,7 @@
|
|||
#define asinf(x) asin(((float)(x)))
|
||||
#define acosf(x) acos(((float)(x)))
|
||||
#define atanf(x) atan(((float)(x)))
|
||||
#define atan2f(x, y) atan2(((float)(x)), ((float)(y)))
|
||||
#define floorf(x) floor(((float)(x)))
|
||||
#define ceilf(x) ceil(((float)(x)))
|
||||
#define hypotf(x, y) hypot(((float)(x)), ((float)(y)))
|
||||
|
|
|
@ -95,6 +95,8 @@ shader node_math(
|
|||
Value = safe_modulo(Value1, Value2);
|
||||
else if (type == "absolute")
|
||||
Value = fabs(Value1);
|
||||
else if (type == "arctan2")
|
||||
Value = atan2(Value1, Value2);
|
||||
|
||||
if (use_clamp)
|
||||
Value = clamp(Value, 0.0, 1.0);
|
||||
|
|
|
@ -92,6 +92,8 @@ ccl_device float svm_math(NodeMath type, float Fac1, float Fac2)
|
|||
Fac = safe_modulo(Fac1, Fac2);
|
||||
else if(type == NODE_MATH_ABSOLUTE)
|
||||
Fac = fabsf(Fac1);
|
||||
else if(type == NODE_MATH_ARCTAN2)
|
||||
Fac = atan2f(Fac1, Fac2);
|
||||
else if(type == NODE_MATH_CLAMP)
|
||||
Fac = saturate(Fac1);
|
||||
else
|
||||
|
|
|
@ -259,6 +259,7 @@ typedef enum NodeMath {
|
|||
NODE_MATH_GREATER_THAN,
|
||||
NODE_MATH_MODULO,
|
||||
NODE_MATH_ABSOLUTE,
|
||||
NODE_MATH_ARCTAN2,
|
||||
NODE_MATH_CLAMP /* used for the clamp UI option */
|
||||
} NodeMath;
|
||||
|
||||
|
|
|
@ -4953,6 +4953,7 @@ NODE_DEFINE(MathNode)
|
|||
type_enum.insert("greater_than", NODE_MATH_GREATER_THAN);
|
||||
type_enum.insert("modulo", NODE_MATH_MODULO);
|
||||
type_enum.insert("absolute", NODE_MATH_ABSOLUTE);
|
||||
type_enum.insert("arctan2", NODE_MATH_ARCTAN2);
|
||||
SOCKET_ENUM(type, "Type", type_enum, NODE_MATH_ADD);
|
||||
|
||||
SOCKET_BOOLEAN(use_clamp, "Use Clamp", false);
|
||||
|
|
|
@ -86,6 +86,9 @@ void MathNode::convertToOperations(NodeConverter &converter, const CompositorCon
|
|||
case NODE_MATH_ABS:
|
||||
operation = new MathAbsoluteOperation();
|
||||
break;
|
||||
case NODE_MATH_ATAN2:
|
||||
operation = new MathArcTan2Operation();
|
||||
break;
|
||||
}
|
||||
|
||||
if (operation) {
|
||||
|
|
|
@ -343,3 +343,16 @@ void MathAbsoluteOperation::executePixelSampled(float output[4], float x, float
|
|||
|
||||
clampIfNeeded(output);
|
||||
}
|
||||
|
||||
void MathArcTan2Operation::executePixelSampled(float output[4], float x, float y, PixelSampler sampler)
|
||||
{
|
||||
float inputValue1[4];
|
||||
float inputValue2[4];
|
||||
|
||||
this->m_inputValue1Operation->readSampled(inputValue1, x, y, sampler);
|
||||
this->m_inputValue2Operation->readSampled(inputValue2, x, y, sampler);
|
||||
|
||||
output[0] = atan2(inputValue1[0], inputValue2[0]);
|
||||
|
||||
clampIfNeeded(output);
|
||||
}
|
|
@ -169,4 +169,10 @@ public:
|
|||
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler);
|
||||
};
|
||||
|
||||
class MathArcTan2Operation : public MathBaseOperation {
|
||||
public:
|
||||
MathArcTan2Operation() : MathBaseOperation() {}
|
||||
void executePixelSampled(float output[4], float x, float y, PixelSampler sampler);
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -413,6 +413,11 @@ void math_abs(float val1, out float outval)
|
|||
outval = abs(val1);
|
||||
}
|
||||
|
||||
void math_atan2(float val1, float val2, out float outval)
|
||||
{
|
||||
outval = atan(val1, val2);
|
||||
}
|
||||
|
||||
void squeeze(float val, float width, float center, out float outval)
|
||||
{
|
||||
outval = 1.0 / (1.0 + pow(2.71828183, -((val - center) * width)));
|
||||
|
|
|
@ -1060,6 +1060,7 @@ enum {
|
|||
NODE_MATH_GREATER = 16,
|
||||
NODE_MATH_MOD = 17,
|
||||
NODE_MATH_ABS = 18,
|
||||
NODE_MATH_ATAN2 = 19,
|
||||
};
|
||||
|
||||
/* mix rgb node flags */
|
||||
|
|
|
@ -140,6 +140,7 @@ const EnumPropertyItem rna_enum_node_math_items[] = {
|
|||
{NODE_MATH_GREATER, "GREATER_THAN", 0, "Greater Than", ""},
|
||||
{NODE_MATH_MOD, "MODULO", 0, "Modulo", ""},
|
||||
{NODE_MATH_ABS, "ABSOLUTE", 0, "Absolute", ""},
|
||||
{NODE_MATH_ATAN2, "ARCTAN2", 0, "Arctan2", ""},
|
||||
{0, NULL, 0, NULL, NULL}
|
||||
};
|
||||
|
||||
|
|
|
@ -221,6 +221,11 @@ static void node_shader_exec_math(void *UNUSED(data), int UNUSED(thread), bNode
|
|||
r = fabsf(a);
|
||||
break;
|
||||
}
|
||||
case NODE_MATH_ATAN2:
|
||||
{
|
||||
r = atan2(a, b);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (node->custom2 & SHD_MATH_CLAMP) {
|
||||
CLAMP(r, 0.0f, 1.0f);
|
||||
|
@ -235,6 +240,7 @@ static int gpu_shader_math(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(
|
|||
"math_divide", "math_sine", "math_cosine", "math_tangent", "math_asin",
|
||||
"math_acos", "math_atan", "math_pow", "math_log", "math_min", "math_max",
|
||||
"math_round", "math_less_than", "math_greater_than", "math_modulo", "math_abs",
|
||||
"math_atan2"
|
||||
};
|
||||
|
||||
switch (node->custom1) {
|
||||
|
@ -249,6 +255,7 @@ static int gpu_shader_math(GPUMaterial *mat, bNode *node, bNodeExecData *UNUSED(
|
|||
case NODE_MATH_LESS:
|
||||
case NODE_MATH_GREATER:
|
||||
case NODE_MATH_MOD:
|
||||
case NODE_MATH_ATAN2:
|
||||
GPU_stack_link(mat, names[node->custom1], in, out);
|
||||
break;
|
||||
case NODE_MATH_SIN:
|
||||
|
|
|
@ -189,6 +189,12 @@ static void valuefn(float *out, TexParams *p, bNode *node, bNodeStack **in, shor
|
|||
break;
|
||||
}
|
||||
|
||||
case NODE_MATH_ATAN2:
|
||||
{
|
||||
*out = atan2(in0, in1);
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
{
|
||||
BLI_assert(0);
|
||||
|
|
Loading…
Reference in New Issue