HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
interval_extent2.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 "geometry/extent.hpp"
9
10namespace tt {
11
19public:
20 [[nodiscard]] interval_extent2(interval_extent2 const &other) noexcept = default;
21 [[nodiscard]] interval_extent2(interval_extent2 &&other) noexcept = default;
22 [[nodiscard]] interval_extent2 &operator=(interval_extent2 const &other) noexcept = default;
23 [[nodiscard]] interval_extent2 &operator=(interval_extent2 &&other) noexcept = default;
24
25 [[nodiscard]] interval_extent2(extent2 min, extent2 max) noexcept : value(-static_cast<f32x4>(min) + static_cast<f32x4>(max)._00xy())
26 {
27 tt_axiom(min.is_valid() && max.is_valid());
28 tt_axiom(min.width() <= max.width());
29 tt_axiom(min.height() <= max.height());
30 }
31
32 [[nodiscard]] interval_extent2(finterval x, finterval y) noexcept :
33 interval_extent2(extent2{x.minimum(), y.minimum()}, extent2{x.maximum(), y.maximum()})
34 {
35 }
36
37 [[nodiscard]] interval_extent2() noexcept :
39 extent2{0.0f, 0.0f},
41 {
42 }
43
44 [[nodiscard]] interval_extent2(extent2 other) noexcept : interval_extent2(other, other) {}
45
46 [[nodiscard]] interval_extent2(float x, float y) noexcept : interval_extent2(extent2{x, y}) {}
47
48 [[nodiscard]] static interval_extent2 make_minimum(extent2 other) noexcept
49 {
51 }
52
53 [[nodiscard]] static interval_extent2 make_minimum(float x, float y) noexcept
54 {
55 return make_minimum(extent2{x, y});
56 }
57
58 [[nodiscard]] static interval_extent2 make_maximum(extent2 other) noexcept
59 {
61 }
62
63 [[nodiscard]] static interval_extent2 make_maximum(float x, float y) noexcept
64 {
65 return make_maximum(extent2{x, y});
66 }
67
68 [[nodiscard]] static interval_extent2 make_zero_to_maximum(extent2 other) noexcept
69 {
70 return {extent2{}, other};
71 }
72
73 [[nodiscard]] static interval_extent2 make_zero_to_maximum(float x, float y) noexcept
74 {
75 return make_zero_to_maximum(extent2{x, y});
76 }
77
78 [[nodiscard]] extent2 minimum() const noexcept
79 {
80 return extent2{(-value).xy00()};
81 }
82
83 [[nodiscard]] extent2 maximum() const noexcept
84 {
85 return extent2{value.zw00()};
86 }
87
88 [[nodiscard]] finterval width() const noexcept
89 {
90 return finterval(-value.x(), value.z());
91 }
92
93 [[nodiscard]] finterval height() const noexcept
94 {
95 return finterval(-value.y(), value.w());
96 }
97
98 [[nodiscard]] interval_extent2 &operator+=(interval_extent2 const &rhs) noexcept
99 {
100 value += rhs.value;
101 return *this;
102 }
103
104 [[nodiscard]] interval_extent2 &operator-=(interval_extent2 const &rhs) noexcept
105 {
106 value -= rhs.value.yxwz();
107 return *this;
108 }
109
110 [[nodiscard]] friend interval_extent2 operator+(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
111 {
112 return make(lhs.value + rhs.value);
113 }
114
115 [[nodiscard]] friend interval_extent2 operator-(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
116 {
117 return make(lhs.value - rhs.value.yxwz());
118 }
119
120 [[nodiscard]] friend bool operator==(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
121 {
122 return lhs.value == rhs.value;
123 }
124
127 [[nodiscard]] friend bool operator<<(extent2 const &lhs, interval_extent2 const &rhs) noexcept
128 {
129 return lhs.width() < rhs.minimum().width() || lhs.height() < rhs.minimum().height();
130 }
131
134 [[nodiscard]] friend bool operator>>(extent2 const &lhs, interval_extent2 const &rhs) noexcept
135 {
136 return lhs.width() > rhs.maximum().width() || lhs.height() > rhs.maximum().height();
137 }
138 [[nodiscard]] friend std::string to_string(interval_extent2 const &rhs) noexcept
139 {
140 return fmt::format("({}:{}, {}:{})", rhs.value.x(), rhs.value.z(), rhs.value.y(), rhs.value.w());
141 }
142
143 friend std::ostream &operator<<(std::ostream &lhs, interval_extent2 const &rhs)
144 {
145 return lhs << to_string(rhs);
146 }
147
153 [[nodiscard]] friend interval_extent2 intersect(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
154 {
155 return make(min(lhs.value, rhs.value));
156 }
157
161 [[nodiscard]] friend interval_extent2 merge(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
162 {
163 return make(max(lhs.value, rhs.value));
164 }
165
168 [[nodiscard]] friend interval_extent2 min(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
169 {
170 ttlet tmp_max = max(lhs.value, rhs.value);
171 ttlet tmp_min = min(lhs.value, rhs.value);
172 return make(tmp_max.xy00() + tmp_min._00zw());
173 }
174
177 [[nodiscard]] friend interval_extent2 max(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
178 {
179 ttlet tmp_max = max(lhs.value, rhs.value);
180 ttlet tmp_min = min(lhs.value, rhs.value);
181 return make(tmp_min.xy00() + tmp_max._00zw());
182 }
183
184private:
185 [[nodiscard]] static interval_extent2 make(f32x4 other) noexcept
186 {
187 tt_axiom(-other.x() <= other.z());
188 tt_axiom(-other.y() <= other.w());
189
191 r.value = other;
192 return r;
193 }
194
197 f32x4 value;
198};
199
200} // namespace tt
constexpr float & width() noexcept
Access the x-as-width element from the extent.
Definition extent.hpp:91
constexpr float & height() noexcept
Access the y-as-height element from the extent.
Definition extent.hpp:102
Definition interval.hpp:17
A 2D vector using interval arithmetic.
Definition interval_extent2.hpp:18
friend interval_extent2 merge(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
Merge two intervals.
Definition interval_extent2.hpp:161
friend bool operator>>(extent2 const &lhs, interval_extent2 const &rhs) noexcept
Check if lhs.x or lhs.y is larger then rhs.maximum.
Definition interval_extent2.hpp:134
friend interval_extent2 max(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
Get the minimum interval of both operants.
Definition interval_extent2.hpp:177
friend interval_extent2 intersect(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
Intersect two intervals.
Definition interval_extent2.hpp:153
friend interval_extent2 min(interval_extent2 const &lhs, interval_extent2 const &rhs) noexcept
Get the maximum interval of both operants.
Definition interval_extent2.hpp:168
friend bool operator<<(extent2 const &lhs, interval_extent2 const &rhs) noexcept
Check if lhs.x or lhs.y is smaller then rhs.minimum.
Definition interval_extent2.hpp:127
T infinity(T... args)