HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
rect.hpp
1// Copyright 2020 Pokitec
2// All rights reserved.
3
4#pragma once
5
6#include "TTauri/Foundation/vec.hpp"
7#include "TTauri/Foundation/aarect.hpp"
8#include "TTauri/Foundation/attributes.hpp"
9#include <array>
10
11namespace tt {
12
15class rect {
18 std::array<vec,4> corners;
19
20public:
21 tt_force_inline rect() noexcept : corners({vec{}, vec{}, vec{}, vec{}}) {}
22 tt_force_inline rect(rect const &rhs) noexcept = default;
23 tt_force_inline rect &operator=(rect const &rhs) noexcept = default;
24 tt_force_inline rect(rect &&rhs) noexcept = default;
25 tt_force_inline rect &operator=(rect &&rhs) noexcept = default;
26
27 rect(vec corner0, vec corner1, vec corner2, vec corner3) noexcept :
28 corners({corner0, corner1, corner2, corner3}) {}
29
30 rect(aarect rhs) noexcept :
31 corners({rhs.corner<0>(), rhs.corner<1>(), rhs.corner<2>(), rhs.corner<3>()}) {}
32
33 rect &operator=(aarect rhs) noexcept {
34 corners[0] = rhs.corner<0>();
35 corners[1] = rhs.corner<1>();
36 corners[2] = rhs.corner<2>();
37 corners[3] = rhs.corner<3>();
38 return *this;
39 }
40
41 rect(vec corner0, vec extent) noexcept :
42 corners({
43 corner0,
44 corner0 + extent.x000(),
45 corner0 + extent._0y00(),
46 corner0 + extent.xy00()
47 })
48 {
49 tt_assume(corner0.is_point());
50 tt_assume(extent.is_vector());
51 tt_assume(extent.z() == 0.0);
52 }
53
56 vec right() const noexcept {
57 return corner<1>() - corner<0>();
58 }
59
62 vec up() const noexcept {
63 return corner<2>() - corner<0>();
64 }
65
66 float width() const noexcept {
67 return length(right());
68 }
69
70 float height() const noexcept {
71 return length(up());
72 }
73
74 vec extent() const noexcept {
75 return {width(), height()};
76 }
77
83 template<size_t I>
84 [[nodiscard]] tt_force_inline vec corner() const noexcept {
85 static_assert(I <= 3);
86 return std::get<I>(corners);
87 }
88
89 [[nodiscard]] friend rect expand(rect const &lhs, float rhs) noexcept {
90 ttlet rightDirection = normalize(lhs.right());
91 ttlet upDirection = normalize(lhs.up());
92
93 return {
94 lhs.corner<0>() + rhs * -rightDirection + rhs * -upDirection,
95 lhs.corner<1>() + rhs * rightDirection + rhs * -upDirection,
96 lhs.corner<2>() + rhs * -rightDirection + rhs * upDirection,
97 lhs.corner<3>() + rhs * rightDirection + rhs * upDirection
98 };
99 }
100};
101
102}
103
Class which represents an axis-aligned rectangle.
Definition aarect.hpp:13
Class which represents an axis-aligned rectangle.
Definition rect.hpp:15
tt_force_inline vec corner() const noexcept
Get coordinate of a corner.
Definition rect.hpp:84
vec right() const noexcept
Get the right vector of a rectangle.
Definition rect.hpp:56
vec up() const noexcept
Get the up vector of a rectangle.
Definition rect.hpp:62
A 4D vector.
Definition vec.hpp:37