23template <
typename T>
struct vec2;
25namespace map_range_detail {
28template <
typename T,
typename U>
struct map_range_math;
29template <
typename T>
bool equals(T a, T b) {
return a == b; }
33template <
typename T,
typename U>
38 using namespace map_range_detail;
39 if (equals(value, in_min)) {
42 if (equals(value, in_max)) {
45 return map_range_math<T, U>::map(value, in_min, in_max, out_min, out_max);
48template <
typename T,
typename U>
53 using namespace map_range_detail;
54 value =
clamp(value, in_min, in_max);
55 return map_range<T, U>(value, in_min, in_max, out_min, out_max);
61namespace map_range_detail {
64template <
typename T,
typename U>
struct map_range_math {
65 static U map(T value, T in_min, T in_max, U out_min, U out_max) {
69 (value - in_min) * (out_max - out_min) / (in_max - in_min);
73template <>
struct map_range_math<u8, u8> {
74 static u8 map(u8 value, u8 in_min, u8 in_max,
75 u8 out_min, u8 out_max) {
76 if (value == in_min) {
79 if (value == in_max) {
84 i16 in_min16 = in_min;
85 i16 in_max16 = in_max;
86 i16 out_min16 = out_min;
87 i16 out_max16 = out_max;
88 i16 out16 = map_range<i16, i16>(v16, in_min16, in_max16,
89 out_min16, out_max16);
92 }
else if (out16 > 255) {
95 return static_cast<u8
>(out16);
100template <
typename T,
typename V>
struct map_range_math<T, vec2<V>> {
101 static vec2<V> map(T value, T in_min, T in_max, vec2<V> out_min,
103 if (in_min == in_max) {
107 T
scale = (value - in_min) / T(in_max - in_min);
109 V dx = out_max.x - out_min.x;
110 V dy = out_max.y - out_min.y;
112 V
x = out_min.x + V(dx *
scale);
113 V
y = out_min.y + V(dy *
scale);