14 return x * x * x * (x * (x * 6.0f - 15.0f) + 10.0f);
20 uint value_stack_offset,
21 uint parameters_stack_offsets,
22 uint results_stack_offsets,
25 uint from_min_stack_offset, from_max_stack_offset, to_min_stack_offset, to_max_stack_offset;
26 uint type_stack_offset, steps_stack_offset, result_stack_offset;
28 &from_min_stack_offset,
29 &from_max_stack_offset,
31 &to_max_stack_offset);
33 results_stack_offsets, &type_stack_offset, &steps_stack_offset, &result_stack_offset);
47 if (from_max != from_min) {
49 switch (type_stack_offset) {
52 factor = (value - from_min) / (from_max - from_min);
55 factor = (value - from_min) / (from_max - from_min);
60 factor = (from_min > from_max) ? 1.0f -
smoothstep(from_max, from_min, factor) :
65 factor = (from_min > from_max) ? 1.0f -
smootherstep(from_max, from_min, factor) :
70 result = to_min + factor * (to_max - to_min);
82 uint value_stack_offset,
83 uint parameters_stack_offsets,
84 uint results_stack_offsets,
87 uint from_min_stack_offset, from_max_stack_offset, to_min_stack_offset, to_max_stack_offset;
88 uint steps_stack_offset, clamp_stack_offset, range_type_stack_offset, result_stack_offset;
90 &from_min_stack_offset,
91 &from_max_stack_offset,
93 &to_max_stack_offset);
97 &range_type_stack_offset,
98 &result_stack_offset);
107 int type = range_type_stack_offset;
113 switch (range_type_stack_offset) {
116 factor =
safe_divide((value - from_min), (from_max - from_min));
119 factor =
safe_divide((value - from_min), (from_max - from_min));
127 factor =
safe_divide((value - from_min), (from_max - from_min));
129 factor = (
make_float3(3.0f, 3.0f, 3.0f) - 2.0f * factor) * (factor * factor);
133 factor =
safe_divide((value - from_min), (from_max - from_min));
135 factor = factor * factor * factor * (factor * (factor * 6.0f - 15.0f) + 10.0f);
139 result = to_min + factor * (to_max - to_min);
141 result.
x = (to_min.
x > to_max.
x) ?
clamp(result.x, to_max.
x, to_min.
x) :
142 clamp(result.x, to_min.
x, to_max.
x);
143 result.y = (to_min.
y > to_max.
y) ?
clamp(result.y, to_max.
y, to_min.
y) :
144 clamp(result.y, to_min.
y, to_max.
y);
145 result.z = (to_min.
z > to_max.
z) ?
clamp(result.z, to_max.
z, to_min.
z) :
146 clamp(result.z, to_min.
z, to_max.
z);
MINLINE float safe_divide(float a, float b)
@ NODE_MAP_RANGE_SMOOTHERSTEP
@ NODE_MAP_RANGE_SMOOTHSTEP
const KernelGlobalsCPU *ccl_restrict KernelGlobals
#define ccl_device_inline
#define ccl_device_noinline
#define CCL_NAMESPACE_END
ccl_device_inline void stack_store_float3(ccl_private float *stack, uint a, float3 f)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 stack_load_float3(ccl_private float *stack, uint a)
ccl_device_inline uint4 read_node(KernelGlobals kg, ccl_private int *offset)
ccl_device_forceinline void svm_unpack_node_uchar3(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z)
ccl_device_inline float stack_load_float_default(ccl_private float *stack, uint a, uint value)
ccl_device_inline void stack_store_float(ccl_private float *stack, uint a, float f)
ccl_device_inline float stack_load_float(ccl_private float *stack, uint a)
ccl_device_forceinline void svm_unpack_node_uchar4(uint i, ccl_private uint *x, ccl_private uint *y, ccl_private uint *z, ccl_private uint *w)
ccl_device_noinline int svm_node_vector_map_range(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint value_stack_offset, uint parameters_stack_offsets, uint results_stack_offsets, int offset)
ccl_device_noinline int svm_node_map_range(KernelGlobals kg, ccl_private ShaderData *sd, ccl_private float *stack, uint value_stack_offset, uint parameters_stack_offsets, uint results_stack_offsets, int offset)
CCL_NAMESPACE_BEGIN ccl_device_inline float smootherstep(float edge0, float edge1, float x)
MINLINE float smoothstep(float edge0, float edge1, float x)
ccl_device_inline float3 one_float3()
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
ccl_device_inline int clamp(int a, int mn, int mx)