QmlMaterial 0.1.0
Loading...
Searching...
No Matches
scalar.hpp
1#pragma once
2
3#include <algorithm>
4#include <cmath>
5
6namespace qml_material::math
7{
8
9using scalar = float;
10
11inline constexpr scalar k_scalar_one = 1.0f;
12inline constexpr scalar k_nearly_zero = k_scalar_one / (1 << 12);
13inline constexpr scalar k_float_sqrt2 = 1.41421356f;
14
15template<class T>
16[[nodiscard]] constexpr const T& pin(const T& x, const T& lo, const T& hi) {
17 return std::max(lo, std::min(x, hi));
18}
19
20[[nodiscard]] inline float divide_and_pin(float numer, float denom, float lo, float hi) {
21 return std::max(lo, std::min(numer / denom, hi));
22}
23
24[[nodiscard]] constexpr int saturate_to_int(float x) {
25 constexpr int k_max_s32_fits_in_float = 2147483520;
26 constexpr int k_min_s32_fits_in_float = -k_max_s32_fits_in_float;
27 x = x < k_max_s32_fits_in_float ? x : (float)k_max_s32_fits_in_float;
28 x = x > k_min_s32_fits_in_float ? x : (float)k_min_s32_fits_in_float;
29 return (int)x;
30}
31
32[[nodiscard]] constexpr float round(double x) { return (float)std::floor(x + 0.5); }
33
34[[nodiscard]] constexpr int round_to_int(double x) { return saturate_to_int(round(x)); }
35
36} // namespace qml_material::math