Berserk
MathUtils.hpp
Go to the documentation of this file.
1 /**********************************************************************************/
2 /* This file is part of Berserk Engine project */
3 /* https://github.com/EgorOrachyov/Berserk */
4 /**********************************************************************************/
5 /* MIT License */
6 /* */
7 /* Copyright (c) 2018 - 2021 Egor Orachyov */
8 /* */
9 /* Permission is hereby granted, free of charge, to any person obtaining a copy */
10 /* of this software and associated documentation files (the "Software"), to deal */
11 /* in the Software without restriction, including without limitation the rights */
12 /* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell */
13 /* copies of the Software, and to permit persons to whom the Software is */
14 /* furnished to do so, subject to the following conditions: */
15 /* */
16 /* The above copyright notice and this permission notice shall be included in all */
17 /* copies or substantial portions of the Software. */
18 /* */
19 /* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR */
20 /* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, */
21 /* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE */
22 /* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER */
23 /* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, */
24 /* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE */
25 /* SOFTWARE. */
26 /**********************************************************************************/
27 
28 #ifndef BERSERK_MATHUTILS_HPP
29 #define BERSERK_MATHUTILS_HPP
30 
31 #include <core/Config.hpp>
32 #include <core/Typedefs.hpp>
33 
34 #include <cmath>
35 
37 
47 class MathUtils {
48 public:
49  BRK_API static const float BIG_NUMBER_FLOAT32;
50  BRK_API static const float SMALL_NUMBER_FLOAT32;
51 
52  /* Float calculations mistake */
53  BRK_API static const float THRESH_FLOAT32;
54  BRK_API static const float THRESH_POINT_ON_PLANE;
55  BRK_API static const float THRESH_POINTS_ARE_SAME;
56  BRK_API static const float THRESH_ZERO_NORM_SQUARED;
57  BRK_API static const float THRESH_COMPARE_FLOAT32;
58  BRK_API static const float THRESH_COMPARE_FLOAT64;
59 
60  /* (from c math lib) */
61  BRK_API static const double PI;
62  BRK_API static const double HALF_PI;
63  BRK_API static const double QUARTER_PI;
64  BRK_API static const double SQRT2;
65  BRK_API static const double E;
66 
67  /* (from c math lib) */
68  BRK_API static const float PIf;
69  BRK_API static const float HALF_PIf;
70  BRK_API static const float QUARTER_PIf;
71  BRK_API static const float SQRT2f;
72  BRK_API static const float Ef;
73 
74  static void Split(float v, float &integer, float &fractional) {
75  fractional = std::modf(v, &integer);
76  }
77 
78  static void Split(double v, double &integer, double &fractional) {
79  fractional = std::modf(v, &integer);
80  }
81 
82  static float Min(float a, float b) { return std::fminf(a, b); }
83  static double Min(double a, double b) { return std::fmin(a, b); }
84 
85  static float Max(float a, float b) { return std::fmaxf(a, b); }
86  static double Max(double a, double b) { return std::fmax(a, b); }
87 
88  static float Sin(float a) { return std::sin(a); }
89  static double Sin(double a) { return std::sin(a); }
90 
91  static float Cos(float a) { return std::cos(a); }
92  static double Cos(double a) { return std::cos(a); }
93 
94  static float Tan(float a) { return std::tan(a); }
95  static double Tan(double a) { return std::tan(a); }
96 
97  static float Asin(float a) { return std::asin(a); }
98  static double Asin(double a) { return std::asin(a); }
99 
100  static float Acos(float a) { return std::acos(a); }
101  static double Acos(double a) { return std::acos(a); }
102 
103  static float Atan(float a) { return std::atan(a); }
104  static double Atan(double a) { return std::atan(a); }
105 
106  static float Sqrt(float a) { return std::sqrt(a); }
107  static double Sqrt(double a) { return std::sqrt(a); }
108 
109  static float Exp(float a) { return std::exp(a); }
110  static double Exp(double a) { return std::exp(a); }
111 
112  static float Pow(float a, float p) { return std::pow(a, p); }
113  static double Pow(double a, double p) { return std::pow(a, p); }
114 
115  static float Log(float a) { return std::log(a); }
116  static double Log(double a) { return std::log(a); }
117 
118  static float Log2(float a) { return std::log2(a); }
119  static double Log2(double a) { return std::log2(a); }
120 
121  static float Log10(float a) { return std::log10(a); }
122  static double Log10(double a) { return std::log10(a); }
123 
124  static float Abs(float a) { return std::fabs(a); }
125  static double Abs(double a) { return std::abs(a); }
126 
127  static float DegToRad(float a) { return a / 180.0f * PIf; }
128  static double DegToRad(double a) { return a / 180.0 * PI; }
129 
130  static float RadToDeg(float a) { return a * 180.0f / PIf; }
131  static double RadToDeg(double a) { return a * 180.0 / PI; }
132 
134  static float Round(float a) { return std::round(a); }
136  static double Round(double a) { return std::round(a); }
137 
139  static float Ceil(float a) { return std::ceil(a); }
141  static double Ceil(double a) { return std::ceil(a); }
142 
144  static float Floor(float a) { return std::floor(a); }
146  static double Floor(double a) { return std::floor(a); }
147 
148  static bool Same(float a, float b) {
149  return Abs(a - b) < THRESH_COMPARE_FLOAT32;
150  }
151 
152  static bool Same(double a, double b) {
153  return Abs(a - b) < THRESH_COMPARE_FLOAT64;
154  }
155 
156  static float Lerp(float t, float left, float right) {
157  return left * (1.0f - t) + right * t;
158  }
159 
160  static double Lerp(double t, double left, double right) {
161  return left * (1.0 - t) + right * t;
162  }
163 
164  static float SmoothStep(float t, float left, float right) {
165  t = Clamp((t - left) / (right - left), 0.0f, 1.0f);
166  return 2.0f * t * t * (1.5f - t);
167  }
168 
169  static double SmoothStep(double t, double left, double right) {
170  t = Clamp((t - left) / (right - left), 0.0, 1.0);
171  return 2.0 * t * t * (1.5 - t);
172  }
173 
174  static float SmootherStep(float t, float left, float right) {
175  t = Clamp((t - left) / (right - left), 0.0f, 1.0f);
176  return t * t * t * (t * (t * 6.0f - 15.0f) + 10.0f);
177  }
178 
179  static double SmootherStep(double t, double left, double right) {
180  t = Clamp((t - left) / (right - left), 0.0, 1.0);
181  return t * t * t * (t * (t * 6.0 - 15.0) + 10.0);
182  }
183 
184  template<typename T>
185  static bool Between(T t, T left, T right) { return (t >= left) && (t <= right); }
186 
187  template<typename T>
188  static T Clamp(T t, T left, T right) { return (t < left ? left : (t > right ? right : t)); }
189 
190  template<typename T>
191  static T Min(T a, T b) { return (a < b ? a : b); }
192 
193  template<typename T>
194  static T Max(T a, T b) { return (a > b ? a : b); }
195 
196  template<typename T>
197  static T Abs(T a) { return (a > 0 ? a : -a); }
198 
199  template<typename T, T a>
200  static constexpr T ConstMax() noexcept { return a; };
201 
202  template<typename T, T a, T b, T... args>
203  static constexpr T ConstMax() noexcept {
204  return (a > b ? ConstMax<T, a, args...>() : ConstMax<T, b, args...>());
205  };
206 
207  template<typename T, T a>
208  static constexpr T ConstMin() noexcept { return a; };
209 
210  template<typename T, T a, T b, T... args>
211  static constexpr T ConstMin() noexcept {
212  return (a < b ? ConstMin<T, a, args...>() : ConstMin<T, b, args...>());
213  };
214 };
215 
221 
222 #endif//BERSERK_MATHUTILS_HPP
#define BRK_NS_END
Definition: Config.hpp:48
#define BRK_API
Definition: Config.hpp:32
Math basic functions and constants.
Definition: MathUtils.hpp:47
static float Log(float a)
Definition: MathUtils.hpp:115
static float SmootherStep(float t, float left, float right)
Definition: MathUtils.hpp:174
static float Floor(float a)
Definition: MathUtils.hpp:144
static double Pow(double a, double p)
Definition: MathUtils.hpp:113
static double Lerp(double t, double left, double right)
Definition: MathUtils.hpp:160
static BRK_API const double QUARTER_PI
Definition: MathUtils.hpp:63
static double Ceil(double a)
Definition: MathUtils.hpp:141
static double Abs(double a)
Definition: MathUtils.hpp:125
static double Sqrt(double a)
Definition: MathUtils.hpp:107
static double Exp(double a)
Definition: MathUtils.hpp:110
static BRK_API const double E
Definition: MathUtils.hpp:65
static BRK_API const double HALF_PI
Definition: MathUtils.hpp:62
static double Min(double a, double b)
Definition: MathUtils.hpp:83
static double Round(double a)
Definition: MathUtils.hpp:136
static BRK_API const double PI
Definition: MathUtils.hpp:61
static BRK_API const float Ef
Definition: MathUtils.hpp:72
static double Log10(double a)
Definition: MathUtils.hpp:122
static BRK_API const float HALF_PIf
Definition: MathUtils.hpp:69
static bool Same(float a, float b)
Definition: MathUtils.hpp:148
static float Lerp(float t, float left, float right)
Definition: MathUtils.hpp:156
static double Log(double a)
Definition: MathUtils.hpp:116
static float Min(float a, float b)
Definition: MathUtils.hpp:82
static BRK_API const float THRESH_POINTS_ARE_SAME
Definition: MathUtils.hpp:55
static float Log2(float a)
Definition: MathUtils.hpp:118
static T Abs(T a)
Definition: MathUtils.hpp:197
static float RadToDeg(float a)
Definition: MathUtils.hpp:130
static BRK_API const float QUARTER_PIf
Definition: MathUtils.hpp:70
static double Sin(double a)
Definition: MathUtils.hpp:89
static double Asin(double a)
Definition: MathUtils.hpp:98
static double Cos(double a)
Definition: MathUtils.hpp:92
static double Tan(double a)
Definition: MathUtils.hpp:95
static double Acos(double a)
Definition: MathUtils.hpp:101
static T Clamp(T t, T left, T right)
Definition: MathUtils.hpp:188
static float Pow(float a, float p)
Definition: MathUtils.hpp:112
static float Atan(float a)
Definition: MathUtils.hpp:103
static float Asin(float a)
Definition: MathUtils.hpp:97
static BRK_API const float SQRT2f
Definition: MathUtils.hpp:71
static BRK_API const float THRESH_COMPARE_FLOAT64
Definition: MathUtils.hpp:58
static constexpr T ConstMin() noexcept
Definition: MathUtils.hpp:208
static BRK_API const float THRESH_COMPARE_FLOAT32
Definition: MathUtils.hpp:57
static float Tan(float a)
Definition: MathUtils.hpp:94
static BRK_API const float PIf
Definition: MathUtils.hpp:68
static double DegToRad(double a)
Definition: MathUtils.hpp:128
static double Log2(double a)
Definition: MathUtils.hpp:119
static float Exp(float a)
Definition: MathUtils.hpp:109
static float Sqrt(float a)
Definition: MathUtils.hpp:106
static constexpr T ConstMax() noexcept
Definition: MathUtils.hpp:203
static float Round(float a)
Definition: MathUtils.hpp:134
static float Acos(float a)
Definition: MathUtils.hpp:100
static constexpr T ConstMax() noexcept
Definition: MathUtils.hpp:200
static T Max(T a, T b)
Definition: MathUtils.hpp:194
static void Split(double v, double &integer, double &fractional)
Definition: MathUtils.hpp:78
static T Min(T a, T b)
Definition: MathUtils.hpp:191
static float Cos(float a)
Definition: MathUtils.hpp:91
static double RadToDeg(double a)
Definition: MathUtils.hpp:131
static double Atan(double a)
Definition: MathUtils.hpp:104
static BRK_API const float BIG_NUMBER_FLOAT32
Definition: MathUtils.hpp:49
static double SmoothStep(double t, double left, double right)
Definition: MathUtils.hpp:169
static float Log10(float a)
Definition: MathUtils.hpp:121
static double Max(double a, double b)
Definition: MathUtils.hpp:86
static BRK_API const double SQRT2
Definition: MathUtils.hpp:64
static BRK_API const float THRESH_FLOAT32
Definition: MathUtils.hpp:53
static BRK_API const float THRESH_ZERO_NORM_SQUARED
Definition: MathUtils.hpp:56
static bool Between(T t, T left, T right)
Definition: MathUtils.hpp:185
static float Max(float a, float b)
Definition: MathUtils.hpp:85
static constexpr T ConstMin() noexcept
Definition: MathUtils.hpp:211
static float DegToRad(float a)
Definition: MathUtils.hpp:127
static double SmootherStep(double t, double left, double right)
Definition: MathUtils.hpp:179
static void Split(float v, float &integer, float &fractional)
Definition: MathUtils.hpp:74
static float Abs(float a)
Definition: MathUtils.hpp:124
static double Floor(double a)
Definition: MathUtils.hpp:146
static float Sin(float a)
Definition: MathUtils.hpp:88
static BRK_API const float SMALL_NUMBER_FLOAT32
Definition: MathUtils.hpp:50
static float Ceil(float a)
Definition: MathUtils.hpp:139
static BRK_API const float THRESH_POINT_ON_PLANE
Definition: MathUtils.hpp:54
static float SmoothStep(float t, float left, float right)
Definition: MathUtils.hpp:164
static bool Same(double a, double b)
Definition: MathUtils.hpp:152
Definition: GLDevice.cpp:46