Blender  V3.3
BLI_math_base.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 <algorithm>
11 #include <cmath>
12 #include <type_traits>
13 
14 #include "BLI_math_base_safe.h"
15 #include "BLI_utildefines.h"
16 
17 namespace blender::math {
18 
19 template<typename T> inline constexpr bool is_math_float_type = std::is_floating_point_v<T>;
20 template<typename T> inline constexpr bool is_math_integral_type = std::is_integral_v<T>;
21 
22 template<typename T> inline bool is_zero(const T &a)
23 {
24  return a == T(0);
25 }
26 
27 template<typename T> inline bool is_any_zero(const T &a)
28 {
29  return is_zero(a);
30 }
31 
32 template<typename T> inline T abs(const T &a)
33 {
34  return std::abs(a);
35 }
36 
37 template<typename T> inline T min(const T &a, const T &b)
38 {
39  return std::min(a, b);
40 }
41 
42 template<typename T> inline T max(const T &a, const T &b)
43 {
44  return std::max(a, b);
45 }
46 
47 template<typename T> inline void max_inplace(T &a, const T &b)
48 {
49  a = math::max(a, b);
50 }
51 
52 template<typename T> inline void min_inplace(T &a, const T &b)
53 {
54  a = math::min(a, b);
55 }
56 
57 template<typename T> inline T clamp(const T &a, const T &min, const T &max)
58 {
59  return std::clamp(a, min, max);
60 }
61 
62 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))> inline T mod(const T &a, const T &b)
63 {
64  return std::fmod(a, b);
65 }
66 
67 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))>
68 inline T safe_mod(const T &a, const T &b)
69 {
70  return (b != 0) ? std::fmod(a, b) : 0;
71 }
72 
73 template<typename T> inline void min_max(const T &value, T &min, T &max)
74 {
75  min = math::min(value, min);
76  max = math::max(value, max);
77 }
78 
79 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))>
80 inline T safe_divide(const T &a, const T &b)
81 {
82  return (b != 0) ? a / b : T(0.0f);
83 }
84 
85 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))> inline T floor(const T &a)
86 {
87  return std::floor(a);
88 }
89 
90 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))> inline T ceil(const T &a)
91 {
92  return std::ceil(a);
93 }
94 
95 template<typename T> inline T distance(const T &a, const T &b)
96 {
97  return std::abs(a - b);
98 }
99 
100 template<typename T, BLI_ENABLE_IF((is_math_float_type<T>))> inline T fract(const T &a)
101 {
102  return a - std::floor(a);
103 }
104 
105 template<typename T,
106  typename FactorT,
107  BLI_ENABLE_IF((std::is_arithmetic_v<T>)),
108  BLI_ENABLE_IF((is_math_float_type<FactorT>))>
109 inline T interpolate(const T &a, const T &b, const FactorT &t)
110 {
111  auto result = a * (1 - t) + b * t;
112  if constexpr (std::is_integral_v<T> && std::is_floating_point_v<FactorT>) {
113  result = std::round(result);
114  }
115  return result;
116 }
117 
118 template<typename T> inline T midpoint(const T &a, const T &b)
119 {
120  auto result = (a + b) * T(0.5);
121  if constexpr (std::is_integral_v<T>) {
122  result = std::round(result);
123  }
124  return result;
125 }
126 
127 } // namespace blender::math
#define BLI_ENABLE_IF(condition)
_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
ccl_device_inline float3 ceil(const float3 &a)
Definition: math_float3.h:363
#define T
static unsigned a[3]
Definition: RandGen.cpp:78
T safe_mod(const T &a, const T &b)
constexpr bool is_math_float_type
T clamp(const T &a, const T &min, const T &max)
bool is_any_zero(const T &a)
constexpr bool is_math_integral_type
T distance(const T &a, const T &b)
void min_inplace(T &a, const T &b)
T min(const T &a, const T &b)
bool is_zero(const T &a)
T midpoint(const T &a, const T &b)
void min_max(const T &value, T &min, T &max)
T fract(const T &a)
T ceil(const T &a)
T floor(const T &a)
T mod(const T &a, const T &b)
T max(const T &a, const T &b)
T abs(const T &a)
T safe_divide(const T &a, const T &b)
T interpolate(const T &a, const T &b, const FactorT &t)
void max_inplace(T &a, const T &b)
static const pxr::TfToken b("b", pxr::TfToken::Immortal)