9#include "translate2.hpp"
10#include "translate3.hpp"
15#include "perspective.hpp"
23#include "rectangle.hpp"
28#include "../macros.hpp"
32namespace hi {
inline namespace v1 {
67 return matrix2{lhs * get<0>(rhs), lhs * get<1>(rhs), lhs * get<2>(rhs), lhs * get<3>(rhs)};
74 return matrix3{lhs * get<0>(rhs), lhs * get<1>(rhs), lhs * get<2>(rhs), lhs * get<3>(rhs)};
77[[nodiscard]]
constexpr matrix2 operator*(translate2
const& lhs, matrix2
const& rhs)
noexcept
79 return matrix2{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs) + f32x4{lhs}};
84 return matrix3{get<0>(rhs), get<1>(rhs), get<2>(rhs), get<3>(rhs) + f32x4{lhs}};
99 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
100 return matrix2{f32x4{rhs}.x000(), f32x4{rhs}._0y00(), f32x4{rhs}._00z0(), f32x4{lhs}.xyz1()};
105 return matrix3{f32x4{rhs}.x000(), f32x4{rhs}._0y00(), f32x4{rhs}._00z0(), f32x4{lhs}.xyz1()};
120 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
121 return matrix2{f32x4{lhs}.x000(), f32x4{lhs}._0y00(), f32x4{lhs}._00z0(), f32x4{lhs} * f32x4{rhs}.xyz1()};
126 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
127 return matrix3{f32x4{lhs}.x000(), f32x4{lhs}._0y00(), f32x4{lhs}._00z0(), f32x4{lhs} * f32x4{rhs}.xyz1()};
130[[nodiscard]]
constexpr scale2 operator*(
scale2 const& lhs,
scale2 const& rhs)
noexcept
132 return scale2{f32x4{lhs} * f32x4{rhs}};
135[[nodiscard]]
constexpr scale3 operator*(
scale3 const& lhs,
scale3 const& rhs)
noexcept
137 return scale3{f32x4{lhs} * f32x4{rhs}};
147[[nodiscard]]
inline float operator*(
matrix2 const& lhs,
float const& rhs)
noexcept
150 hilet abs_scale = hypot<0b0011>(get<0>(lhs) * f32x4::broadcast(rhs));
161[[nodiscard]]
inline float operator*(
matrix3 const &lhs,
float const& rhs)
noexcept
164 hilet abs_scale = hypot<0b0111>(get<0>(lhs) * f32x4::broadcast(rhs));
170[[nodiscard]]
constexpr float operator*(translate2
const&,
float const& rhs)
noexcept
175[[nodiscard]]
constexpr float operator*(
translate3 const&,
float const& rhs)
noexcept
180[[nodiscard]]
constexpr float operator*(
scale2 const& lhs,
float const& rhs)
noexcept
182 return lhs.x() * rhs;
185[[nodiscard]]
constexpr float operator*(
scale3 const& lhs,
float const& rhs)
noexcept
187 return lhs.x() * rhs;
190[[nodiscard]]
constexpr float operator*(
rotate2 const&,
float const& rhs)
noexcept
195[[nodiscard]]
constexpr float operator*(
rotate3 const&,
float const& rhs)
noexcept
209 return vector2{get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy()};
212[[nodiscard]]
constexpr vector2 operator*(translate2
const&, vector2
const& rhs)
noexcept
224 return vector2{f32x4{lhs} * f32x4{rhs}};
229 return vector2{f32x4{lhs} * f32x4{rhs}};
241 return vector3{get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy() + get<2>(lhs) * f32x4{rhs}.zzzz()};
244[[nodiscard]]
constexpr vector3 operator*(translate3
const&, vector3
const& rhs)
noexcept
251 return vector3{f32x4{lhs} * f32x4{rhs}};
259[[nodiscard]]
constexpr point2 operator*(
matrix2 const& lhs, point2
const& rhs)
noexcept
261 return point2{get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy() + get<3>(lhs)};
264[[nodiscard]]
constexpr point2 operator*(translate2
const& lhs, point2
const& rhs)
noexcept
266 return point2{f32x4{lhs} + f32x4{rhs}};
269[[nodiscard]]
constexpr point2 operator*(
scale2 const& lhs, point2
const& rhs)
noexcept
271 return point2{f32x4{lhs} * f32x4{rhs}};
274[[nodiscard]]
constexpr point2 operator*(
scale3 const& lhs, point2
const& rhs)
noexcept
276 return point2{f32x4{lhs} * f32x4{rhs}};
284[[nodiscard]]
constexpr point3 operator*(
matrix3 const& lhs, point3
const& rhs)
noexcept
287 get<0>(lhs) * f32x4{rhs}.xxxx() + get<1>(lhs) * f32x4{rhs}.yyyy() + get<2>(lhs) * f32x4{rhs}.zzzz() +
288 get<3>(lhs) * f32x4{rhs}.wwww()};
291[[nodiscard]]
constexpr point3 operator*(translate3
const& lhs, point3
const& rhs)
noexcept
293 return point3{f32x4{lhs} + f32x4{rhs}};
296[[nodiscard]]
constexpr point3 operator*(
scale3 const& lhs, point3
const& rhs)
noexcept
298 return point3{f32x4{lhs} * f32x4{rhs}};
306[[nodiscard]]
constexpr extent3 operator*(
transformer3 auto const& lhs, std::convertible_to<extent3>
auto const& rhs)
noexcept
313 return aarectangle{lhs * get<0>(rhs), lhs * get<3>(rhs)};
320 return aarectangle{lhs * get<0>(rhs), lhs * get<3>(rhs)};
335 return rectangle{lhs * rhs_.origin, lhs * rhs_.right, lhs * rhs_.up};
344[[deprecated(
"Use full_mul() or fast_mul() instead.")]] [[nodiscard]]
constexpr rectangle
348 return rectangle{lhs * rhs_.origin, lhs * rhs_.right, lhs * rhs_.up};
360 return rectangle{lhs * rhs_.origin, lhs * rhs_.right, lhs * rhs_.up};
371 return aarectangle{lhs * get<0>(rhs), lhs * get<3>(rhs)};
380[[nodiscard]]
constexpr rectangle operator*(transformer
auto const& lhs,
rectangle const& rhs)
noexcept
382 return rectangle{lhs * rhs.origin, lhs * rhs.right, lhs * rhs.up};
390[[nodiscard]]
constexpr quad operator*(transformer
auto const& lhs, quad
const& rhs)
noexcept
392 return quad{lhs * rhs.p0, lhs * rhs.p1, lhs * rhs.p2, lhs * rhs.p3};
400[[nodiscard]]
constexpr circle operator*(transformer
auto const& lhs,
circle const& rhs)
noexcept
402 return circle{lhs * midpoint(rhs), lhs * rhs.radius()};
412 return line_segment{lhs * rhs.origin(), lhs * rhs.direction()};
422 return {lhs * get<0>(rhs), lhs * get<1>(rhs), lhs * get<2>(rhs), lhs * get<3>(rhs)};
431template<
typename Lhs, transformer Rhs>
433 requires requires(Lhs& a, Rhs
const& b) { a = b * a; }
435 return lhs = rhs * lhs;
446 hilet translate_from_p0 =
max(
vector2{}, get<0>(bounds) - get<0>(resized_rectangle));
447 hilet translate_from_p3 =
min(
vector2{}, get<3>(bounds) - get<3>(resized_rectangle));
448 return translate2{translate_from_p0 + translate_from_p3} * resized_rectangle;
461 hilet top_extra = (lhs.top() * rhs.x() - lhs.top()) * 0.5f;
462 hilet bottom_extra = (lhs.bottom() * rhs.x() - lhs.bottom()) * 0.5f;
463 hilet left_extra = (lhs.left() * rhs.y() - lhs.left()) * 0.5f;
464 hilet right_extra = (lhs.right() * rhs.y() - lhs.right()) * 0.5f;
467 lhs.p0 - bottom_extra - left_extra,
468 lhs.p1 + bottom_extra - right_extra,
469 lhs.p2 - top_extra + left_extra,
470 lhs.p3 + top_extra + right_extra};
Defined the corner_radii type.
Defined the geo::extent, extent2 and extent3 types.
Defined the geo::extent, extent2 and extent3 types.
@ rectangle
The gui_event has rectangle data.
Definition gui_event_variant.hpp:42
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
The HikoGUI API version 1.
Definition lookahead_iterator.hpp:6
constexpr aarectangle fast_mul(matrix2 const &lhs, aarectangle const &rhs) noexcept
Transform an axis-aligned rectangle without rotation by the matrix.
Definition transform.hpp:369
constexpr rectangle full_mul(matrix2 const &lhs, aarectangle const &rhs) noexcept
Transform an axis-aligned rectangle without rotation by the matrix.
Definition transform.hpp:357
constexpr Lhs & operator*=(Lhs &lhs, Rhs const &rhs) noexcept
Inplace geometric translation.
Definition transform.hpp:432
constexpr quad scale_from_center(quad const &lhs, scale2 const &rhs) noexcept
scale the quad.
Definition transform.hpp:459
Class which represents an axis-aligned rectangle.
Definition aarectangle.hpp:29
A type defining a 2D circle.
Definition circle.hpp:19
The 4 radii of the corners of a quad or rectangle.
Definition corner_radii.hpp:19
A high-level geometric extent.
Definition extent2.hpp:29
A high-level geometric extent.
Definition extent3.hpp:30
Line segment.
Definition line_segment.hpp:21
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix2.hpp:27
A 2D or 3D homogenius matrix for transforming homogenious vectors and points.
Definition matrix3.hpp:30
Perspective transform.
Definition perspective.hpp:18
A rectangle / parallelogram in 3D space.
Definition rectangle.hpp:21
float height() const noexcept
The height, or length of the up vector.
Definition rectangle.hpp:148
float width() const noexcept
The width, or length of the right vector.
Definition rectangle.hpp:141
Definition rotate2.hpp:10
Definition rotate3.hpp:12
Definition transform.hpp:35
Definition transform.hpp:37
Definition translate2.hpp:14
Definition translate3.hpp:18
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector2.hpp:19
A high-level geometric vector Part of the high-level vector, point, mat and color types.
Definition vector3.hpp:20
Definition transform.hpp:57
Definition transform.hpp:59
Definition transform.hpp:61