Blender  V3.3
BLI_math_vector.hh
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later
2  * Copyright 2022 Blender Foundation. */
3 
4 #pragma once
5 
10 #include <cmath>
11 #include <type_traits>
12 
13 #include "BLI_math_base.hh"
14 #include "BLI_math_vec_types.hh"
15 #include "BLI_span.hh"
16 #include "BLI_utildefines.h"
17 
18 namespace blender::math {
19 
20 #ifndef NDEBUG
21 # define BLI_ASSERT_UNIT(v) \
22  { \
23  const float _test_unit = length_squared(v); \
24  BLI_assert(!(std::abs(_test_unit - 1.0f) >= BLI_ASSERT_UNIT_EPSILON) || \
25  !(std::abs(_test_unit) >= BLI_ASSERT_UNIT_EPSILON)); \
26  } \
27  (void)0
28 #else
29 # define BLI_ASSERT_UNIT(v) (void)(v)
30 #endif
31 
32 template<typename T, int Size> inline bool is_zero(const vec_base<T, Size> &a)
33 {
34  for (int i = 0; i < Size; i++) {
35  if (a[i] != T(0)) {
36  return false;
37  }
38  }
39  return true;
40 }
41 
42 template<typename T, int Size> inline bool is_any_zero(const vec_base<T, Size> &a)
43 {
44  for (int i = 0; i < Size; i++) {
45  if (a[i] == T(0)) {
46  return true;
47  }
48  }
49  return false;
50 }
51 
52 template<typename T, int Size>
54  const vec_base<T, Size> &b,
55  const T &epsilon_factor)
56 {
57  for (int i = 0; i < Size; i++) {
58  const float epsilon = epsilon_factor * math::abs(a[i]);
59  if (math::distance(a[i], b[i]) > epsilon) {
60  return false;
61  }
62  }
63  return true;
64 }
65 
66 template<typename T, int Size> inline vec_base<T, Size> abs(const vec_base<T, Size> &a)
67 {
69  for (int i = 0; i < Size; i++) {
70  result[i] = a[i] >= 0 ? a[i] : -a[i];
71  }
72  return result;
73 }
74 
75 template<typename T, int Size>
77 {
79  for (int i = 0; i < Size; i++) {
80  result[i] = a[i] < b[i] ? a[i] : b[i];
81  }
82  return result;
83 }
84 
85 template<typename T, int Size>
87 {
89  for (int i = 0; i < Size; i++) {
90  result[i] = a[i] > b[i] ? a[i] : b[i];
91  }
92  return result;
93 }
94 
95 template<typename T, int Size>
97  const vec_base<T, Size> &min,
98  const vec_base<T, Size> &max)
99 {
101  for (int i = 0; i < Size; i++) {
102  result[i] = std::clamp(result[i], min[i], max[i]);
103  }
104  return result;
105 }
106 
107 template<typename T, int Size>
108 inline vec_base<T, Size> clamp(const vec_base<T, Size> &a, const T &min, const T &max)
109 {
111  for (int i = 0; i < Size; i++) {
112  result[i] = std::clamp(result[i], min, max);
113  }
114  return result;
115 }
116 
117 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
119 {
121  for (int i = 0; i < Size; i++) {
122  BLI_assert(b[i] != 0);
123  result[i] = std::fmod(a[i], b[i]);
124  }
125  return result;
126 }
127 
128 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
129 inline vec_base<T, Size> mod(const vec_base<T, Size> &a, const T &b)
130 {
131  BLI_assert(b != 0);
133  for (int i = 0; i < Size; i++) {
134  result[i] = std::fmod(a[i], b);
135  }
136  return result;
137 }
138 
139 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
141 {
143  for (int i = 0; i < Size; i++) {
144  result[i] = (b[i] != 0) ? std::fmod(a[i], b[i]) : 0;
145  }
146  return result;
147 }
148 
149 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
150 inline T safe_mod(const vec_base<T, Size> &a, const T &b)
151 {
152  if (b == 0) {
153  return vec_base<T, Size>(0);
154  }
156  for (int i = 0; i < Size; i++) {
157  result[i] = std::fmod(a[i], b);
158  }
159  return result;
160 }
161 
167 template<typename T, int Size, BLI_ENABLE_IF((is_math_integral_type<T>))>
169 {
171  for (int i = 0; i < Size; i++) {
172  BLI_assert(a[i] >= 0);
173  BLI_assert(b[i] > 0);
174  result[i] = ((a[i] + b[i] - 1) / b[i]) * b[i];
175  }
176  return result;
177 }
178 
183 template<typename T, int Size, BLI_ENABLE_IF((is_math_integral_type<T>))>
185 {
187  for (int i = 0; i < Size; i++) {
188  BLI_assert(a[i] >= 0);
189  BLI_assert(b[i] > 0);
190  result[i] = (a[i] + b[i] - 1) / b[i];
191  }
192  return result;
193 }
194 
195 template<typename T, int Size>
196 inline void min_max(const vec_base<T, Size> &vector,
199 {
200  min = math::min(vector, min);
201  max = math::max(vector, max);
202 }
203 
204 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
206 {
208  for (int i = 0; i < Size; i++) {
209  result[i] = (b[i] == 0) ? 0 : a[i] / b[i];
210  }
211  return result;
212 }
213 
214 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
216 {
217  return (b != 0) ? a / b : vec_base<T, Size>(0.0f);
218 }
219 
220 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
222 {
224  for (int i = 0; i < Size; i++) {
225  result[i] = std::floor(a[i]);
226  }
227  return result;
228 }
229 
230 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
232 {
234  for (int i = 0; i < Size; i++) {
235  result[i] = std::ceil(a[i]);
236  }
237  return result;
238 }
239 
240 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
242 {
244  for (int i = 0; i < Size; i++) {
245  result[i] = a[i] - std::floor(a[i]);
246  }
247  return result;
248 }
249 
250 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
251 inline T dot(const vec_base<T, Size> &a, const vec_base<T, Size> &b)
252 {
253  T result = a[0] * b[0];
254  for (int i = 1; i < Size; i++) {
255  result += a[i] * b[i];
256  }
257  return result;
258 }
259 
260 template<typename T, int Size> inline T length_manhattan(const vec_base<T, Size> &a)
261 {
262  T result = std::abs(a[0]);
263  for (int i = 1; i < Size; i++) {
264  result += std::abs(a[i]);
265  }
266  return result;
267 }
268 
269 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
271 {
272  return dot(a, a);
273 }
274 
275 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
276 inline T length(const vec_base<T, Size> &a)
277 {
278  return std::sqrt(length_squared(a));
279 }
280 
281 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
283 {
284  return length_manhattan(a - b);
285 }
286 
287 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
289 {
290  return length_squared(a - b);
291 }
292 
293 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
295 {
296  return length(a - b);
297 }
298 
299 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
301  const vec_base<T, Size> &normal)
302 {
304  return incident - 2.0 * dot(normal, incident) * normal;
305 }
306 
307 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
309  const vec_base<T, Size> &normal,
310  const T &eta)
311 {
312  float dot_ni = dot(normal, incident);
313  float k = 1.0f - eta * eta * (1.0f - dot_ni * dot_ni);
314  if (k < 0.0f) {
315  return vec_base<T, Size>(0.0f);
316  }
317  return eta * incident - (eta * dot_ni + sqrt(k)) * normal;
318 }
319 
320 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
322 {
323  if (UNLIKELY(is_zero(v_proj))) {
324  return vec_base<T, Size>(0.0f);
325  }
326  return v_proj * (dot(p, v_proj) / dot(v_proj, v_proj));
327 }
328 
329 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
331 {
332  out_length = length_squared(v);
333  /* A larger value causes normalize errors in a scaled down models with camera extreme close. */
334  constexpr T threshold = std::is_same_v<T, double> ? 1.0e-70 : 1.0e-35f;
335  if (out_length > threshold) {
336  out_length = sqrt(out_length);
337  return v / out_length;
338  }
339  /* Either the vector is small or one of it's values contained `nan`. */
340  out_length = 0.0;
341  return vec_base<T, Size>(0.0);
342 }
343 
344 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
346 {
347  T len;
348  return normalize_and_get_length(v, len);
349 }
350 
351 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))>
353 {
354  return {a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z, a.x * b.y - a.y * b.x};
355 }
356 
358  const vec_base<float, 3> &b)
359 {
360  return {(float)((double)a.y * b.z - (double)a.z * b.y),
361  (float)((double)a.z * b.x - (double)a.x * b.z),
362  (float)((double)a.x * b.y - (double)a.y * b.x)};
363 }
364 
365 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))>
367 {
368  /* Newell's Method. */
369  int nv = static_cast<int>(poly.size());
370  if (nv < 3) {
371  return vec_base<T, 3>(0, 0, 0);
372  }
373  const vec_base<T, 3> *v_prev = &poly[nv - 1];
374  const vec_base<T, 3> *v_curr = &poly[0];
375  vec_base<T, 3> n(0, 0, 0);
376  for (int i = 0; i < nv;) {
377  n[0] = n[0] + ((*v_prev)[1] - (*v_curr)[1]) * ((*v_prev)[2] + (*v_curr)[2]);
378  n[1] = n[1] + ((*v_prev)[2] - (*v_curr)[2]) * ((*v_prev)[0] + (*v_curr)[0]);
379  n[2] = n[2] + ((*v_prev)[0] - (*v_curr)[0]) * ((*v_prev)[1] + (*v_curr)[1]);
380  v_prev = v_curr;
381  ++i;
382  if (i < nv) {
383  v_curr = &poly[i];
384  }
385  }
386  return n;
387 }
388 
389 template<typename T, typename FactorT, int Size, BLI_ENABLE_IF((is_math_float_type<FactorT>))>
391  const vec_base<T, Size> &b,
392  const FactorT &t)
393 {
394  return a * (1 - t) + b * t;
395 }
396 
397 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
399 {
400  return (a + b) * 0.5;
401 }
402 
403 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
405  const vec_base<T, Size> &incident,
406  const vec_base<T, Size> &reference)
407 {
408  return (dot(reference, incident) < 0) ? vector : -vector;
409 }
410 
411 template<typename T> inline int dominant_axis(const vec_base<T, 3> &a)
412 {
413  vec_base<T, 3> b = abs(a);
414  return ((b.x > b.y) ? ((b.x > b.z) ? 0 : 2) : ((b.y > b.z) ? 1 : 2));
415 }
416 
419 template<typename T> struct isect_result {
420  enum {
425  } kind;
426  typename T::base_type lambda;
427 };
428 
429 template<typename T, int Size, BLI_ENABLE_IF((is_math_float_type<T>))>
431  const vec_base<T, Size> &v2,
432  const vec_base<T, Size> &v3,
433  const vec_base<T, Size> &v4);
434 
435 } // namespace blender::math
typedef float(TangentPoint)[2]
#define BLI_assert(a)
Definition: BLI_assert.h:46
sqrt(x)+1/max(0
#define BLI_ASSERT_UNIT(v)
#define UNLIKELY(x)
typedef double(DMatrix)[4][4]
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble u2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLdouble GLdouble v2 _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLdouble GLdouble nz _GL_VOID_RET _GL_VOID GLfloat GLfloat nz _GL_VOID_RET _GL_VOID GLint GLint nz _GL_VOID_RET _GL_VOID GLshort GLshort nz _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const GLfloat *values _GL_VOID_RET _GL_VOID GLsizei const GLushort *values _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID const GLuint const GLclampf *priorities _GL_VOID_RET _GL_VOID GLdouble y _GL_VOID_RET _GL_VOID GLfloat y _GL_VOID_RET _GL_VOID GLint y _GL_VOID_RET _GL_VOID GLshort y _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLfloat GLfloat z _GL_VOID_RET _GL_VOID GLint GLint z _GL_VOID_RET _GL_VOID GLshort GLshort z _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble w _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat w _GL_VOID_RET _GL_VOID GLint GLint GLint w _GL_VOID_RET _GL_VOID GLshort GLshort GLshort w _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble y2 _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat y2 _GL_VOID_RET _GL_VOID GLint GLint GLint y2 _GL_VOID_RET _GL_VOID GLshort GLshort GLshort y2 _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLdouble GLdouble z _GL_VOID_RET _GL_VOID GLuint *buffer _GL_VOID_RET _GL_VOID GLdouble t _GL_VOID_RET _GL_VOID GLfloat t _GL_VOID_RET _GL_VOID GLint t _GL_VOID_RET _GL_VOID GLshort t _GL_VOID_RET _GL_VOID GLdouble t
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
in reality light always falls off quadratically Particle Retrieve the data of the particle that spawned the object for example to give variation to multiple instances of an object Point Retrieve information about points in a point cloud Retrieve the edges of an object as it appears to Cycles topology will always appear triangulated Convert a blackbody temperature to an RGB value Normal Generate a perturbed normal from an RGB normal map image Typically used for faking highly detailed surfaces Generate an OSL shader from a file or text data block Image Sample an image file as a texture Sky Generate a procedural sky texture Noise Generate fractal Perlin noise Wave Generate procedural bands or rings with noise Voronoi Generate Worley noise based on the distance to random points Typically used to generate textures such as or biological cells Brick Generate a procedural texture producing bricks Texture Retrieve multiple types of texture coordinates nTypically used as inputs for texture nodes Vector Convert a vector
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
int len
Definition: draw_manager.c:108
IconTextureDrawCall normal
ccl_gpu_kernel_postfix ccl_global float int int int int float threshold
ccl_device_inline float3 ceil(const float3 &a)
Definition: math_float3.h:363
#define T
static unsigned a[3]
Definition: RandGen.cpp:78
T distance_squared(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
T distance_manhattan(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
T safe_mod(const T &a, const T &b)
vec_base< T, Size > abs(const vec_base< T, Size > &a)
T dot(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
vec_base< T, 3 > cross(const vec_base< T, 3 > &a, const vec_base< T, 3 > &b)
T clamp(const T &a, const T &min, const T &max)
bool is_any_zero(const T &a)
T length_manhattan(const vec_base< T, Size > &a)
vec_base< T, Size > ceil_to_multiple(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
T length(const vec_base< T, Size > &a)
T distance(const T &a, const T &b)
bool almost_equal_relative(const vec_base< T, Size > &a, const vec_base< T, Size > &b, const T &epsilon_factor)
T min(const T &a, const T &b)
vec_base< T, Size > normalize(const vec_base< T, Size > &v)
bool is_zero(const T &a)
T midpoint(const T &a, const T &b)
vec_base< T, Size > faceforward(const vec_base< T, Size > &vector, const vec_base< T, Size > &incident, const vec_base< T, Size > &reference)
vec_base< T, Size > project(const vec_base< T, Size > &p, const vec_base< T, Size > &v_proj)
vec_base< T, Size > divide_ceil(const vec_base< T, Size > &a, const vec_base< T, Size > &b)
isect_result< vec_base< T, Size > > isect_seg_seg(const vec_base< T, Size > &v1, const vec_base< T, Size > &v2, const vec_base< T, Size > &v3, const vec_base< T, Size > &v4)
vec_base< T, Size > refract(const vec_base< T, Size > &incident, const vec_base< T, Size > &normal, const T &eta)
void min_max(const T &value, T &min, T &max)
T fract(const T &a)
T ceil(const T &a)
vec_base< T, 3 > cross_poly(Span< vec_base< T, 3 >> poly)
vec_base< T, Size > normalize_and_get_length(const vec_base< T, Size > &v, T &out_length)
T floor(const T &a)
T mod(const T &a, const T &b)
T max(const T &a, const T &b)
vec_base< T, Size > clamp(const vec_base< T, Size > &a, const T &min, const T &max)
T abs(const T &a)
T safe_divide(const T &a, const T &b)
vec_base< T, Size > reflect(const vec_base< T, Size > &incident, const vec_base< T, Size > &normal)
T length_squared(const vec_base< T, Size > &a)
int dominant_axis(const vec_base< T, 3 > &a)
vec_base< T, Size > floor(const vec_base< T, Size > &a)
T interpolate(const T &a, const T &b, const FactorT &t)
vec_base< float, 3 > cross_high_precision(const vec_base< float, 3 > &a, const vec_base< float, 3 > &b)
static double epsilon
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
enum blender::math::isect_result::@118 kind