HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
interval_vec2.hpp
1// Copyright Take Vos 2020.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "interval.hpp"
8#include "numeric_array.hpp"
9
10namespace tt {
11
19public:
20 [[nodiscard]] interval_vec2(interval_vec2 const &other) noexcept = default;
21 [[nodiscard]] interval_vec2(interval_vec2 &&other) noexcept = default;
22 [[nodiscard]] interval_vec2 &operator=(interval_vec2 const &other) noexcept = default;
23 [[nodiscard]] interval_vec2 &operator=(interval_vec2 &&other) noexcept = default;
24
25 [[nodiscard]] interval_vec2(f32x4 min, f32x4 max) noexcept : value(-min + max._00xy())
26 {
27 tt_axiom(min.z() == 0.0f && min.w() == 0.0f);
28 tt_axiom(max.z() == 0.0f && max.w() == 0.0f);
29 tt_axiom(min.x() <= max.x());
30 tt_axiom(min.y() <= max.y());
31 }
32
33 [[nodiscard]] interval_vec2(finterval x, finterval y) noexcept :
34 interval_vec2(f32x4{x.minimum(), y.minimum()}, f32x4{x.maximum(), y.maximum()}) {}
35
36 [[nodiscard]] interval_vec2() noexcept :
40 {
41 }
42
43 [[nodiscard]] interval_vec2(f32x4 other) noexcept : interval_vec2(other, other) {}
44
45 [[nodiscard]] interval_vec2(float x, float y) noexcept : interval_vec2(f32x4{x, y}) {}
46
47 [[nodiscard]] static interval_vec2 make_minimum(f32x4 other) noexcept
48 {
50 }
51
52 [[nodiscard]] static interval_vec2 make_minimum(float x, float y) noexcept
53 {
54 return make_minimum(f32x4{x, y});
55 }
56
57 [[nodiscard]] static interval_vec2 make_maximum(f32x4 other) noexcept
58 {
60 }
61
62 [[nodiscard]] static interval_vec2 make_maximum(float x, float y) noexcept
63 {
64 return make_maximum(f32x4{x, y});
65 }
66
67 [[nodiscard]] static interval_vec2 make_zero_to_maximum(f32x4 other) noexcept
68 {
69 return {f32x4{}, other};
70 }
71
72 [[nodiscard]] static interval_vec2 make_zero_to_maximum(float x, float y) noexcept
73 {
74 return make_zero_to_maximum(f32x4{x, y});
75 }
76
77 [[nodiscard]] f32x4 minimum() const noexcept
78 {
79 return (-value).xy00();
80 }
81
82 [[nodiscard]] f32x4 maximum() const noexcept
83 {
84 return value.zw00();
85 }
86
87 [[nodiscard]] finterval x() const noexcept
88 {
89 return finterval(-value.x(), value.z());
90 }
91
92 [[nodiscard]] finterval y() const noexcept
93 {
94 return finterval(-value.y(), value.w());
95 }
96
97 [[nodiscard]] finterval width() const noexcept
98 {
99 return x();
100 }
101
102 [[nodiscard]] finterval height() const noexcept
103 {
104 return y();
105 }
106
107 [[nodiscard]] interval_vec2 x0() const noexcept
108 {
109 return make(value.x0z0());
110 }
111
112 [[nodiscard]] interval_vec2 _0y() const noexcept
113 {
114 return make(value._0y0w());
115 }
116
117 [[nodiscard]] interval_vec2 &operator+=(interval_vec2 const &rhs) noexcept
118 {
119 value += rhs.value;
120 return *this;
121 }
122
123 [[nodiscard]] interval_vec2 &operator-=(interval_vec2 const &rhs) noexcept
124 {
125 value -= rhs.value.yxwz();
126 return *this;
127 }
128
129 [[nodiscard]] friend interval_vec2 operator+(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
130 {
131 return make(lhs.value + rhs.value);
132 }
133
134 [[nodiscard]] friend interval_vec2 operator-(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
135 {
136 return make(lhs.value - rhs.value.yxwz());
137 }
138
139 [[nodiscard]] friend bool operator==(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
140 {
141 return lhs.value == rhs.value;
142 }
143
146 [[nodiscard]] friend bool operator<<(f32x4 const &lhs, interval_vec2 const &rhs) noexcept
147 {
148 return lhs.x() < rhs.minimum().x() || lhs.y() < rhs.minimum().y();
149 }
150
153 [[nodiscard]] friend bool operator>>(f32x4 const &lhs, interval_vec2 const &rhs) noexcept
154 {
155 return lhs.x() > rhs.maximum().x() || lhs.y() > rhs.maximum().y();
156 }
157 [[nodiscard]] friend std::string to_string(interval_vec2 const &rhs) noexcept
158 {
159 return fmt::format("({}:{}, {}:{})", rhs.value.x(), rhs.value.z(), rhs.value.y(), rhs.value.w());
160 }
161
162 friend std::ostream &operator<<(std::ostream &lhs, interval_vec2 const &rhs)
163 {
164 return lhs << to_string(rhs);
165 }
166
172 [[nodiscard]] friend interval_vec2 intersect(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
173 {
174 return make(min(lhs.value, rhs.value));
175 }
176
180 [[nodiscard]] friend interval_vec2 merge(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
181 {
182 return make(max(lhs.value, rhs.value));
183 }
184
187 [[nodiscard]] friend interval_vec2 min(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
188 {
189 ttlet tmp_max = max(lhs.value, rhs.value);
190 ttlet tmp_min = min(lhs.value, rhs.value);
191 return make(tmp_max.xy00() + tmp_min._00zw());
192 }
193
196 [[nodiscard]] friend interval_vec2 max(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
197 {
198 ttlet tmp_max = max(lhs.value, rhs.value);
199 ttlet tmp_min = min(lhs.value, rhs.value);
200 return make(tmp_min.xy00() + tmp_max._00zw());
201 }
202
203private:
204 [[nodiscard]] static interval_vec2 make(f32x4 other) noexcept
205 {
206 tt_axiom(-other.x() <= other.z());
207 tt_axiom(-other.y() <= other.w());
208
210 r.value = other;
211 return r;
212 }
213
216 f32x4 value;
217};
218
219} // namespace tt
Definition interval.hpp:17
A 2D vector using interval arithmetic.
Definition interval_vec2.hpp:18
friend interval_vec2 merge(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
Merge two intervals.
Definition interval_vec2.hpp:180
friend interval_vec2 min(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
Get the maximum interval of both operants.
Definition interval_vec2.hpp:187
friend interval_vec2 intersect(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
Intersect two intervals.
Definition interval_vec2.hpp:172
friend bool operator>>(f32x4 const &lhs, interval_vec2 const &rhs) noexcept
Check if lhs.x or lhs.y is larger then rhs.maximum.
Definition interval_vec2.hpp:153
friend interval_vec2 max(interval_vec2 const &lhs, interval_vec2 const &rhs) noexcept
Get the minimum interval of both operants.
Definition interval_vec2.hpp:196
friend bool operator<<(f32x4 const &lhs, interval_vec2 const &rhs) noexcept
Check if lhs.x or lhs.y is smaller then rhs.minimum.
Definition interval_vec2.hpp:146
T infinity(T... args)