17 static_assert(D == 2 || D == 3,
"Only 2D or 3D translation-matrices are supported");
24 [[nodiscard]]
constexpr operator matrix<2>()
const noexcept requires(D == 2)
27 hilet ones = f32x4::broadcast(1.0);
28 return matrix<2>{ones.x000(), ones._0y00(), ones._00z0(), ones._000w() + _v};
31 [[nodiscard]]
constexpr operator matrix<3>()
const noexcept
34 hilet ones = f32x4::broadcast(1.0);
35 return matrix<3>{ones.x000(), ones._0y00(), ones._00z0(), ones._000w() + _v};
38 [[nodiscard]]
constexpr translate() noexcept : _v() {}
42 [[nodiscard]]
constexpr explicit operator f32x4()
const noexcept
48 [[nodiscard]]
constexpr explicit translate(
f32x4 const &other) noexcept : _v(other)
53 [[nodiscard]]
constexpr explicit translate(
aarectangle const &other) noexcept : _v(
static_cast<f32x4>(get<0>(other)).xy00())
58 [[nodiscard]]
constexpr explicit translate(
aarectangle const &other,
float z)
noexcept requires(D == 3) :
59 _v(
static_cast<f32x4>(get<0>(other)).xy00())
72 requires(E <= D) [[nodiscard]]
constexpr explicit translate(
vector<E> const &other) noexcept : _v(
static_cast<f32x4>(other))
78 requires(E <= D) [[nodiscard]]
constexpr explicit translate(
point<E> const &other) noexcept :
79 _v(
static_cast<f32x4>(other).xyz0())
84 [[nodiscard]]
constexpr translate(
float x,
float y)
noexcept requires(D == 2) : _v(x, y, 0.0, 0.0) {}
86 [[nodiscard]]
constexpr translate(
float x,
float y,
float z = 0.0)
noexcept requires(D == 3) : _v(x, y, z, 0.0) {}
98 if (
alignment == horizontal_alignment::left) {
99 x = dst_rectangle.left();
101 }
else if (
alignment == horizontal_alignment::right) {
102 x = dst_rectangle.right() - src_rectangle.width();
104 }
else if (
alignment == horizontal_alignment::center) {
105 x = dst_rectangle.center() - src_rectangle.width() * 0.5f;
112 if (
alignment == vertical_alignment::bottom) {
113 y = dst_rectangle.bottom();
115 }
else if (
alignment == vertical_alignment::top) {
116 y = dst_rectangle.top() - src_rectangle.height();
118 }
else if (
alignment == vertical_alignment::middle) {
119 y = dst_rectangle.middle() - src_rectangle.height() * 0.5f;
125 return translate{x - src_rectangle.left(), y - src_rectangle.bottom()};
132 hi_axiom(holds_invariant() && rhs.holds_invariant());
137 [[nodiscard]]
constexpr point<
std::max(D, E)> operator*(point<E>
const &rhs)
const noexcept
139 hi_axiom(holds_invariant() && rhs.holds_invariant());
143 [[nodiscard]]
constexpr aarectangle operator*(aarectangle
const &rhs)
const noexcept requires(D == 2)
145 return aarectangle{*
this * get<0>(rhs), *
this * get<3>(rhs)};
148 [[nodiscard]]
constexpr rectangle operator*(aarectangle
const &rhs)
const noexcept requires(D == 3)
153 [[nodiscard]]
constexpr rectangle operator*(rectangle
const &rhs)
const noexcept
155 return rectangle{*
this * rhs.origin, rhs.right, rhs.up};
158 [[nodiscard]]
constexpr quad operator*(quad
const &rhs)
const noexcept
160 return quad{*
this * rhs.p0, *
this * rhs.p1, *
this * rhs.p2, *
this * rhs.p3};
163 [[nodiscard]]
constexpr circle operator*(circle
const &rhs)
const noexcept
165 return circle{f32x4{rhs} + _v};
168 [[nodiscard]]
constexpr line_segment operator*(line_segment
const &rhs)
const noexcept
170 return line_segment{*
this * rhs.origin(), rhs.direction()};
173 [[nodiscard]]
constexpr translate operator*(identity
const &)
const noexcept
180 [[nodiscard]]
constexpr auto operator*(matrix<E>
const &rhs)
const noexcept
182 hi_axiom(holds_invariant() && rhs.holds_invariant());
183 return matrix<
std::max(D, E)>{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs) + _v};
187 [[nodiscard]]
constexpr auto operator*(rotate<E>
const &rhs)
const noexcept
189 return *
this * matrix<E>(rhs);
193 [[nodiscard]]
constexpr auto operator*(translate<E>
const &rhs)
const noexcept
195 hi_axiom(holds_invariant() && rhs.holds_invariant());
196 return translate<
std::max(D, E)>{_v +
static_cast<f32x4
>(rhs)};
200 [[nodiscard]]
constexpr bool operator==(translate<E>
const &rhs)
const noexcept
202 hi_axiom(holds_invariant() && rhs.holds_invariant());
203 return _v ==
static_cast<f32x4
>(rhs);
206 [[nodiscard]]
constexpr translate operator~() const noexcept
208 return translate{-_v};
211 [[nodiscard]]
constexpr bool holds_invariant() const noexcept
213 return _v.w() == 0.0f && (D == 3 || _v.z() == 0.0f);
216 [[nodiscard]]
friend constexpr translate
round(translate
const &rhs)
noexcept
218 return translate{
round(rhs._v)};
#define hi_axiom(expression)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
static constexpr translate align(aarectangle src_rectangle, aarectangle dst_rectangle, alignment alignment) noexcept
Align a rectangle within another rectangle.
Definition translate.hpp:95