16 static_assert(D == 2 || D == 3,
"Only 2D or 3D translation-matrices are supported");
23 [[nodiscard]]
constexpr operator matrix<D>()
const noexcept
26 ttlet ones = f32x4::broadcast(1.0);
27 return matrix<D>{ones.x000(), ones._0y00(), ones._00z0(), ones._000w() + _v};
30 [[nodiscard]]
constexpr translate() noexcept : _v() {}
34 [[nodiscard]]
constexpr explicit operator f32x4()
const noexcept
40 [[nodiscard]]
constexpr explicit translate(
f32x4 const &other) noexcept : _v(other)
45 [[nodiscard]]
constexpr explicit translate(
aarect const &other) noexcept : _v(other.p0().xy00())
57 requires(E <= D) [[nodiscard]]
constexpr explicit translate(
vector<E> const &other) noexcept : _v(
static_cast<f32x4>(other))
62 [[nodiscard]]
constexpr translate(
float x,
float y)
noexcept requires(D == 2) : _v(x, y, 0.0, 0.0) {}
64 [[nodiscard]]
constexpr translate(
float x,
float y,
float z = 0.0)
noexcept requires(D == 3) : _v(x, y, z, 0.0) {}
75 if (alignment == horizontal_alignment::left) {
76 x = dst_rectangle.p0().x();
78 }
else if (alignment == horizontal_alignment::right) {
79 x = dst_rectangle.p3().x() - src_rectangle.width();
81 }
else if (alignment == horizontal_alignment::center) {
82 x = (dst_rectangle.p0().x() + (dst_rectangle.width() * 0.5f)) - (src_rectangle.width() * 0.5f);
89 if (alignment == vertical_alignment::bottom) {
90 y = dst_rectangle.p0().y();
92 }
else if (alignment == vertical_alignment::top) {
93 y = dst_rectangle.p3().y() - src_rectangle.height();
95 }
else if (alignment == vertical_alignment::middle) {
96 y = (dst_rectangle.p0().y() + (dst_rectangle.height() * 0.5f)) - (src_rectangle.height() * 0.5f);
102 return translate{x - src_rectangle.x(), y - src_rectangle.y()};
109 tt_axiom(is_valid() && rhs.is_valid());
113 [[nodiscard]]
constexpr f32x4 operator*(
f32x4 const &rhs)
const noexcept
115 return rhs + _v * f32x4::broadcast(rhs.w());
119 [[nodiscard]]
constexpr point<
std::max(D, E)> operator*(point<E>
const &rhs)
const noexcept
121 tt_axiom(is_valid() && rhs.is_valid());
122 return point<
std::max(D, E)>{_v +
static_cast<f32x4
>(rhs)};
125 [[nodiscard]]
constexpr aarect operator*(aarect
const &rhs)
const noexcept requires(D == 2)
130 [[nodiscard]]
constexpr rect operator*(rect
const &rhs)
const noexcept
132 return rect{_v + rhs.corner<0>(), _v + rhs.corner<1>(), _v + rhs.corner<2>(), _v + rhs.corner<3>()};
135 [[nodiscard]]
constexpr translate operator*(identity
const &)
const noexcept
137 tt_axiom(is_valid());
142 [[nodiscard]]
constexpr auto operator*(matrix<E>
const &rhs)
const noexcept
144 tt_axiom(is_valid() && rhs.is_valid());
145 return matrix<
std::max(D, E)>{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs) + _v};
149 [[nodiscard]]
constexpr auto operator*(translate<E>
const &rhs)
const noexcept
151 tt_axiom(is_valid() && rhs.is_valid());
152 return translate<
std::max(D, E)>{_v +
static_cast<f32x4
>(rhs)};
156 [[nodiscard]]
constexpr bool operator==(translate<E>
const &rhs)
const noexcept
158 tt_axiom(is_valid() && rhs.is_valid());
159 return {_v ==
static_cast<f32x4
>(rhs)};
162 [[nodiscard]]
constexpr translate operator~() const noexcept
164 return translate{-_v};
167 [[nodiscard]]
constexpr bool is_valid() const noexcept
169 return _v.w() == 0.0f && (D == 3 || _v.z() == 0.0f);
static constexpr translate align(aarect src_rectangle, aarect dst_rectangle, alignment alignment) noexcept
Align a rectangle within another rectangle.
Definition translate.hpp:72