Blender V4.3
math_util.h
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2011-2022 Blender Foundation
2 *
3 * SPDX-License-Identifier: Apache-2.0 */
4
5#pragma once
6
8
12 float3 a,
13 float3 b,
14 float3 c,
15 float param1)
16{
17 switch (type) {
19 *vector = a + b;
20 break;
22 *vector = a - b;
23 break;
25 *vector = a * b;
26 break;
28 *vector = safe_divide(a, b);
29 break;
31 *vector = cross(a, b);
32 break;
34 *vector = project(a, b);
35 break;
38 break;
40 *vector = refract(a, safe_normalize(b), param1);
41 break;
43 *vector = faceforward(a, b, c);
44 break;
46 *vector = a * b + c;
47 break;
49 *value = dot(a, b);
50 break;
52 *value = distance(a, b);
53 break;
55 *value = len(a);
56 break;
58 *vector = a * param1;
59 break;
62 break;
64 *vector = floor(safe_divide(a, b)) * b;
65 break;
67 *vector = floor(a);
68 break;
70 *vector = ceil(a);
71 break;
73 *vector = make_float3(safe_modulo(a.x, b.x), safe_modulo(a.y, b.y), safe_modulo(a.z, b.z));
74 break;
76 *vector = make_float3(wrapf(a.x, b.x, c.x), wrapf(a.y, b.y, c.y), wrapf(a.z, b.z, c.z));
77 break;
79 *vector = a - floor(a);
80 break;
82 *vector = fabs(a);
83 break;
85 *vector = min(a, b);
86 break;
88 *vector = max(a, b);
89 break;
91 *vector = make_float3(sinf(a.x), sinf(a.y), sinf(a.z));
92 break;
94 *vector = make_float3(cosf(a.x), cosf(a.y), cosf(a.z));
95 break;
97 *vector = make_float3(tanf(a.x), tanf(a.y), tanf(a.z));
98 break;
99 default:
100 *vector = zero_float3();
101 *value = 0.0f;
102 }
103}
104
105ccl_device float svm_math(NodeMathType type, float a, float b, float c)
106{
107 switch (type) {
108 case NODE_MATH_ADD:
109 return a + b;
111 return a - b;
113 return a * b;
114 case NODE_MATH_DIVIDE:
115 return safe_divide(a, b);
116 case NODE_MATH_POWER:
117 return safe_powf(a, b);
119 return safe_logf(a, b);
120 case NODE_MATH_SQRT:
121 return safe_sqrtf(a);
123 return inversesqrtf(a);
125 return fabsf(a);
127 return a * (M_PI_F / 180.0f);
129 return a * (180.0f / M_PI_F);
131 return fminf(a, b);
133 return fmaxf(a, b);
135 return a < b;
137 return a > b;
138 case NODE_MATH_ROUND:
139 return floorf(a + 0.5f);
140 case NODE_MATH_FLOOR:
141 return floorf(a);
142 case NODE_MATH_CEIL:
143 return ceilf(a);
145 return a - floorf(a);
146 case NODE_MATH_MODULO:
147 return safe_modulo(a, b);
149 return safe_floored_modulo(a, b);
150 case NODE_MATH_TRUNC:
151 return a >= 0.0f ? floorf(a) : ceilf(a);
152 case NODE_MATH_SNAP:
153 return floorf(safe_divide(a, b)) * b;
154 case NODE_MATH_WRAP:
155 return wrapf(a, b, c);
157 return pingpongf(a, b);
158 case NODE_MATH_SINE:
159 return sinf(a);
160 case NODE_MATH_COSINE:
161 return cosf(a);
163 return tanf(a);
164 case NODE_MATH_SINH:
165 return sinhf(a);
166 case NODE_MATH_COSH:
167 return coshf(a);
168 case NODE_MATH_TANH:
169 return tanhf(a);
171 return safe_asinf(a);
173 return safe_acosf(a);
175 return atanf(a);
177 return compatible_atan2(a, b);
178 case NODE_MATH_SIGN:
179 return compatible_signf(a);
181 return expf(a);
183 return ((a == b) || (fabsf(a - b) <= fmaxf(c, FLT_EPSILON))) ? 1.0f : 0.0f;
185 return a * b + c;
187 return smoothminf(a, b, c);
189 return -smoothminf(-a, -b, c);
190 default:
191 return 0.0f;
192 }
193}
194
196{
197 /* Calculate color in range 800..12000 using an approximation
198 * a/x+bx+c for R and G and ((at + b)t + c)t + d) for B.
199 *
200 * The result of this can be negative to support gamut wider than
201 * than rec.709, just needs to be clamped. */
202
203 if (t >= 12000.0f) {
204 return make_float3(0.8262954810464208f, 0.9945080501520986f, 1.566307710274283f);
205 }
206 else if (t < 800.0f) {
207 /* Arbitrary lower limit where light is very dim, matching OSL. */
208 return make_float3(5.413294490189271f, -0.20319390035873933f, -0.0822535242887164f);
209 }
210
211 int i = (t >= 6365.0f) ? 6 :
212 (t >= 3315.0f) ? 5 :
213 (t >= 1902.0f) ? 4 :
214 (t >= 1449.0f) ? 3 :
215 (t >= 1167.0f) ? 2 :
216 (t >= 965.0f) ? 1 :
217 0;
218
219 ccl_constant float *r = blackbody_table_r[i];
220 ccl_constant float *g = blackbody_table_g[i];
221 ccl_constant float *b = blackbody_table_b[i];
222
223 const float t_inv = 1.0f / t;
224 return make_float3(r[0] * t_inv + r[1] * t + r[2],
225 g[0] * t_inv + g[1] * t + g[2],
226 ((b[0] * t + b[1]) * t + b[2]) * t + b[3]);
227}
228
230{
231 if (gamma == 0.0f)
232 return make_float3(1.0f, 1.0f, 1.0f);
233
234 if (color.x > 0.0f)
235 color.x = powf(color.x, gamma);
236 if (color.y > 0.0f)
237 color.y = powf(color.y, gamma);
238 if (color.z > 0.0f)
239 color.z = powf(color.z, gamma);
240
241 return color;
242}
243
245{
246 float ii = (lambda_nm - 380.0f) * (1.0f / 5.0f); // scaled 0..80
247 int i = float_to_int(ii);
249
250 if (i < 0 || i >= 80) {
251 color = make_float3(0.0f, 0.0f, 0.0f);
252 }
253 else {
254 ii -= i;
255 ccl_constant float *c = cie_color_match[i];
256 color = interp(make_float3(c[0], c[1], c[2]), make_float3(c[3], c[4], c[5]), ii);
257 }
258
259 return color;
260}
261
MINLINE float safe_sqrtf(float a)
MINLINE float safe_logf(float a, float base)
MINLINE float safe_acosf(float a)
MINLINE float safe_powf(float base, float exponent)
MINLINE float safe_divide(float a, float b)
MINLINE float safe_asinf(float a)
@ NODE_VECTOR_MATH_NORMALIZE
@ NODE_VECTOR_MATH_LENGTH
@ NODE_VECTOR_MATH_CROSS_PRODUCT
@ NODE_VECTOR_MATH_CEIL
@ NODE_VECTOR_MATH_MODULO
@ NODE_VECTOR_MATH_ADD
@ NODE_VECTOR_MATH_COSINE
@ NODE_VECTOR_MATH_REFLECT
@ NODE_VECTOR_MATH_WRAP
@ NODE_VECTOR_MATH_REFRACT
@ NODE_VECTOR_MATH_DOT_PRODUCT
@ NODE_VECTOR_MATH_ABSOLUTE
@ NODE_VECTOR_MATH_DIVIDE
@ NODE_VECTOR_MATH_TANGENT
@ NODE_VECTOR_MATH_DISTANCE
@ NODE_VECTOR_MATH_FLOOR
@ NODE_VECTOR_MATH_SNAP
@ NODE_VECTOR_MATH_SINE
@ NODE_VECTOR_MATH_FRACTION
@ NODE_VECTOR_MATH_PROJECT
@ NODE_VECTOR_MATH_MULTIPLY
@ NODE_VECTOR_MATH_SCALE
@ NODE_VECTOR_MATH_MAXIMUM
@ NODE_VECTOR_MATH_FACEFORWARD
@ NODE_VECTOR_MATH_SUBTRACT
@ NODE_VECTOR_MATH_MULTIPLY_ADD
@ NODE_VECTOR_MATH_MINIMUM
@ NODE_MATH_SINH
@ NODE_MATH_SMOOTH_MIN
@ NODE_MATH_TRUNC
@ NODE_MATH_COSH
@ NODE_MATH_SIGN
@ NODE_MATH_DEGREES
@ NODE_MATH_MODULO
@ NODE_MATH_ABSOLUTE
@ NODE_MATH_DIVIDE
@ NODE_MATH_SINE
@ NODE_MATH_FLOORED_MODULO
@ NODE_MATH_ARCTAN2
@ NODE_MATH_ARCCOSINE
@ NODE_MATH_MULTIPLY_ADD
@ NODE_MATH_POWER
@ NODE_MATH_WRAP
@ NODE_MATH_ARCTANGENT
@ NODE_MATH_MINIMUM
@ NODE_MATH_SQRT
@ NODE_MATH_CEIL
@ NODE_MATH_TANH
@ NODE_MATH_GREATER_THAN
@ NODE_MATH_ADD
@ NODE_MATH_FRACTION
@ NODE_MATH_EXPONENT
@ NODE_MATH_LESS_THAN
@ NODE_MATH_ARCSINE
@ NODE_MATH_MAXIMUM
@ NODE_MATH_LOGARITHM
@ NODE_MATH_COMPARE
@ NODE_MATH_INV_SQRT
@ NODE_MATH_MULTIPLY
@ NODE_MATH_PINGPONG
@ NODE_MATH_ROUND
@ NODE_MATH_FLOOR
@ NODE_MATH_SUBTRACT
@ NODE_MATH_COSINE
@ NODE_MATH_SNAP
@ NODE_MATH_TANGENT
@ NODE_MATH_SMOOTH_MAX
@ NODE_MATH_RADIANS
Group Output data from inside of a node group A color picker Mix two input colors RGB to Convert a color s luminance to a grayscale value Generate a normal vector and a dot product Brightness Control the brightness and contrast of the input color Vector Map input vector components with curves Camera Retrieve information about the camera and how it relates to the current shading point s position Clamp a value between a minimum and a maximum Vector Perform vector math operation Invert Invert a color
static const float blackbody_table_r[7][3]
static float cie_color_match[81][3]
static const float blackbody_table_g[7][3]
static const float blackbody_table_b[7][4]
local_group_size(16, 16) .push_constant(Type b
additional_info("compositor_sum_squared_difference_float_shared") .push_constant(Type output_img float dot(value.rgb, luminance_coefficients)") .define("LOAD(value)"
#define sinf(x)
#define cosf(x)
#define ccl_device
#define ccl_constant
#define expf(x)
#define ccl_private
#define ccl_device_inline
#define tanf(x)
#define powf(x, y)
#define CCL_NAMESPACE_END
ccl_device_forceinline float3 make_float3(const float x, const float y, const float z)
#define fmaxf(x, y)
#define ceilf(x)
#define atanf(x)
#define fminf(x, y)
#define floorf(x)
#define tanhf(x)
#define sinhf(x)
#define coshf(x)
#define fabsf(x)
int len
NodeMathType
NodeVectorMathType
MINLINE float smoothminf(float a, float b, float c)
MINLINE float pingpongf(float value, float scale)
MINLINE float compatible_signf(float f)
MINLINE float wrapf(float value, float max, float min)
ccl_device_inline float2 floor(const float2 a)
ccl_device_inline float2 safe_normalize(const float2 a)
ccl_device_inline float cross(const float2 a, const float2 b)
ccl_device_inline float2 fabs(const float2 a)
ccl_device_inline float2 interp(const float2 a, const float2 b, float t)
ccl_device_inline float3 reflect(const float3 incident, const float3 unit_normal)
ccl_device_inline float3 refract(const float3 incident, const float3 normal, const float eta)
ccl_device_inline float3 faceforward(const float3 vector, const float3 incident, const float3 reference)
CCL_NAMESPACE_BEGIN ccl_device_inline float3 zero_float3()
Definition math_float3.h:15
ccl_device_inline float3 ceil(const float3 a)
CCL_NAMESPACE_BEGIN ccl_device void svm_vector_math(ccl_private float *value, ccl_private float3 *vector, NodeVectorMathType type, float3 a, float3 b, float3 c, float param1)
Definition math_util.h:9
ccl_device float3 svm_math_wavelength_color_xyz(float lambda_nm)
Definition math_util.h:244
ccl_device float svm_math(NodeMathType type, float a, float b, float c)
Definition math_util.h:105
ccl_device float3 svm_math_blackbody_color_rec709(float t)
Definition math_util.h:195
ccl_device_inline float3 svm_math_gamma_color(float3 color, float gamma)
Definition math_util.h:229
#define M_PI_F
Definition mikk_util.hh:15
float safe_floored_modulo(float a, float b)
Definition node_math.h:22
vector project(vector v, vector v_proj)
Definition node_math.h:59
float distance(float a, float b)
ccl_device_forceinline int safe_modulo(int a, int b)
#define min(a, b)
Definition sort.c:32
float max
ccl_device_inline int float_to_int(float f)
Definition util/math.h:424
ccl_device_inline float compatible_atan2(const float y, const float x)
Definition util/math.h:492
ccl_device_inline float inversesqrtf(float f)
Definition util/math.h:711