16 #define _USE_MATH_DEFINES
23 namespace d = s::detail;
28 template <
typename T>
inline T __fclamp(T x, T minval, T maxval) {
29 return std::fmin(std::fmax(x, minval), maxval);
32 template <
typename T>
inline T __degrees(T radians) {
33 return (180 / M_PI) * radians;
36 template <
typename T>
inline T __mix(T x, T y, T a) {
return x + (y - x) * a; }
38 template <
typename T>
inline T __radians(T degrees) {
39 return (M_PI / 180) * degrees;
42 template <
typename T>
inline T __step(T edge, T x) {
43 return (x < edge) ? 0.0 : 1.0;
46 template <
typename T>
inline T __smoothstep(T edge0, T edge1, T x) {
48 T v = (x - edge0) / (edge1 - edge0);
49 t = __fclamp(v, T(0), T(1));
50 return t * t * (3 - 2 * t);
53 template <
typename T>
inline T __sign(T x) {
70 return __fclamp(x, minval, maxval);
74 return __fclamp(x, minval, maxval);
78 return __fclamp(x, minval, maxval);
88 return __degrees(radians);
91 return __degrees(radians);
94 return __degrees(radians);
103 return std::fmin(x, y);
107 return std::fmin(x, y);
111 return std::fmin(x, y);
120 return std::fmax(x, y);
124 return std::fmax(x, y);
128 return std::fmax(x, y);
137 return __mix(x, y, a);
141 return __mix(x, y, a);
145 return __mix(x, y, a);
154 return __radians(degrees);
157 return __radians(degrees);
160 return __radians(degrees);
169 return __step(edge, x);
173 return __step(edge, x);
176 return __step(edge, x);
186 return __smoothstep(edge0, edge1, x);
191 return __smoothstep(edge0, edge1, x);
195 return __smoothstep(edge0, edge1, x);