IceShard 1
A personal game engine project, with development focused on 2D/2.5D games.
Loading...
Searching...
No Matches
common.hxx
Go to the documentation of this file.
1
3
4#pragma once
5#include <ice/types.hxx>
6#include <ice/math/angles.hxx>
7#include <cmath>
8
9namespace ice::math
10{
11
12 constexpr auto radians(deg degrees) noexcept -> rad;
13
14 constexpr auto degrees(rad radians) noexcept -> deg;
15
16 constexpr auto sqrt(f32 val) noexcept -> f32;
17
18 constexpr auto sin(rad radians) noexcept -> f32;
19
20 constexpr auto cos(rad radians) noexcept -> f32;
21
22 constexpr auto tan(rad radians) noexcept -> f32;
23
24 inline auto atan(rad x) noexcept -> f32;
25
26 inline auto atan2(f32 x, f32 y) noexcept -> f32;
27
28 constexpr auto clamp(f32 val, f32 min, f32 max) noexcept -> f32
29 {
30 return std::max(min, std::min(val, max));
31 }
32
33 constexpr auto radians(deg32 degrees) noexcept -> rad
34 {
35 return degrees.to_rad32();
36 }
37
38 constexpr auto radians(deg64 degrees) noexcept -> rad64
39 {
40 return degrees.to_rad64();
41 }
42
43 constexpr auto degrees(rad32 radians) noexcept -> deg
44 {
45 return radians.to_deg32();
46 }
47
48 constexpr auto degrees(rad64 radians) noexcept -> deg64
49 {
50 return radians.to_deg64();
51 }
52
53 constexpr auto sgn(f32 val) noexcept -> f32
54 {
55 return ice::f32(0.0f < val) - ice::f32(val < 0.0f);
56 }
57
58 constexpr auto abs(f32 val) noexcept -> f32
59 {
60 return val * ice::math::sgn(val);
61 }
62
63 inline auto pow(f32 base, f32 exp) noexcept -> f32
64 {
65 return std::pow(base, exp);
66 }
67
68 constexpr auto cbrt(f32 val) noexcept -> f32
69 {
70 // constexpr cube root using Newton-Raphson
71 if consteval
72 {
73 static constexpr ice::f32 one_over_three = 1.0f / 3.0f;
74
75 if (val == 0.0f)
76 {
77 return 0.0f;
78 }
79
80 ice::f32 guess = abs(val); // initial guess
81 for (ice::u32 i = 0; i < 20; ++i)
82 {
83 guess = (2.0f * guess + val / (guess * guess)) * one_over_three;
84 }
85 return guess;
86 }
87 else
88 {
89 return std::cbrt(val);
90 }
91 }
92
93 constexpr auto sqrt(f32 val) noexcept -> f32
94 {
95 // constexpr square root using Newton-Raphson
96 if consteval
97 {
98 if (val < 0.0f)
99 {
100 return std::numeric_limits<ice::f32>::quiet_NaN();
101 }
102 else if (val == 0.0f || val == 1.0f)
103 {
104 return val;
105 }
106
107 ice::f32 guess = val * 0.5f; // initial guess
108 for (ice::u32 i = 0; i < 20; ++i)
109 {
110 guess = 0.5f * (guess + val / guess);
111 }
112 return sgn(val) * guess;
113 }
114 else
115 {
116 return std::sqrt(val);
117 }
118 }
119
120 constexpr auto factorial(u32 n) noexcept -> u32
121 {
122 if (n <= 1)
123 {
124 return 1;
125 }
126 else
127 {
128 return n * factorial(n - 1);
129 }
130 }
131
132 constexpr auto sin(rad64 angle) noexcept -> f64
133 {
134 if consteval
135 {
136 const f64 muls[]{ 1.0, -1.0 };
137
138 const f64 val = angle.raw_value();
139 f64 valp = val;
140 f64 fact = 1.0;
141 f64 sum = val;
142 for (ice::u32 n = 1; n < 23; ++n)
143 {
144 fact *= (n * 2) * ((n * 2) + 1);
145 valp *= val * val;
146 sum += muls[(n & 1)] * valp / fact;
147 }
148 return sum;
149 }
150 else
151 {
152 return std::sin(angle.raw_value());
153 }
154 }
155
156 constexpr auto sin(rad angle) noexcept -> f32
157 {
158 return f32(ice::math::sin(angle.to_rad64()));
159 }
160
161 constexpr auto cos(rad64 angle) noexcept -> f64
162 {
163 if consteval
164 {
165 const f64 muls[]{ 1.0, -1.0 };
166
167 const f64 val = angle.raw_value();
168 f64 valp = 1.0;
169 f64 fact = 1.0;
170 f64 sum = 0.0;
171 for (ice::u32 n = 1; n < 23; ++n)
172 {
173 fact *= (n * 2);
174 valp *= val * val;
175 sum += muls[(n & 1)] * valp / fact;
176 fact *= ((n * 2) + 1);
177 }
178 return sum + 1.0;
179 }
180 else
181 {
182 return std::cos(angle.raw_value());
183 }
184 }
185
186 constexpr auto cos(rad angle) noexcept -> f32
187 {
188 return f32(ice::math::cos(angle.to_rad64()));
189 }
190
191 constexpr auto tan(rad64 radians) noexcept -> f64
192 {
193 if consteval
194 {
195 return sin(radians) / cos(radians);
196 }
197 else
198 {
199 return std::tan(radians.raw_value());
200 }
201 }
202
203 constexpr auto tan(rad radians) noexcept -> f32
204 {
205 if consteval
206 {
207 return sin(radians) / cos(radians);
208 }
209 else
210 {
211 return std::tan(radians.raw_value());
212 }
213 }
214
215 inline auto atan(rad64 angle) noexcept -> f64
216 {
217 return std::atan(angle.raw_value());
218 }
219
220 inline auto atan(rad x) noexcept -> f32
221 {
222 return std::atan(x.raw_value());
223 }
224
225 inline auto atan2(f64 x, f64 y) noexcept -> f64
226 {
227 return std::atan2(x, y);
228 }
229
230 inline auto atan2(f32 x, f32 y) noexcept -> f32
231 {
232 return std::atan2(x, y);
233 }
234
235} // namespace ice::math
Definition algorithm.hxx:8
rad32 rad
Definition angles.hxx:170
auto atan(rad x) noexcept -> f32
Definition common.hxx:220
constexpr auto max(arr_t< Size, T > left, arr_t< Size, U > right) noexcept -> arr_t< Size, T >
Definition array_operations.hxx:49
constexpr auto degrees(rad radians) noexcept -> deg
Definition common.hxx:43
constexpr auto min(arr_t< Size, T > left, arr_t< Size, U > right) noexcept -> arr_t< Size, T >
Definition array_operations.hxx:60
auto atan2(f32 x, f32 y) noexcept -> f32
Definition common.hxx:230
deg32 deg
Definition angles.hxx:169
constexpr auto cbrt(f32 val) noexcept -> f32
Definition common.hxx:68
constexpr auto sgn(f32 val) noexcept -> f32
Definition common.hxx:53
constexpr auto sin(rad radians) noexcept -> f32
Definition common.hxx:156
constexpr auto tan(rad radians) noexcept -> f32
Definition common.hxx:203
constexpr auto sum(U first, Args... args) noexcept
Definition algorithm.hxx:22
constexpr auto cos(rad radians) noexcept -> f32
Definition common.hxx:186
auto pow(f32 base, f32 exp) noexcept -> f32
Definition common.hxx:63
constexpr auto sqrt(f32 val) noexcept -> f32
Definition common.hxx:93
constexpr auto abs(f32 val) noexcept -> f32
Definition common.hxx:58
constexpr auto radians(deg degrees) noexcept -> rad
Definition common.hxx:33
constexpr auto clamp(f32 val, f32 min, f32 max) noexcept -> f32
Definition common.hxx:28
constexpr auto factorial(u32 n) noexcept -> u32
Definition common.hxx:120
double f64
Definition types.hxx:17
std::uint32_t u32
Definition types.hxx:26
float f32
Definition types.hxx:16
Definition angles.hxx:46
Definition angles.hxx:24
Definition angles.hxx:77
Definition angles.hxx:67