HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
transform.hpp
1// Copyright Take Vos 2021.
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 "matrix.hpp"
8#include "identity.hpp"
9#include "translate.hpp"
10#include "rotate.hpp"
11#include "scale.hpp"
12#include <type_traits>
13
14namespace hi::inline v1 { namespace geo {
15
16template<int D>
17[[nodiscard]] constexpr matrix<D> operator*(identity const &lhs, matrix<D> const &rhs) noexcept
18{
19 return rhs;
20}
21
22template<int D>
23[[nodiscard]] constexpr translate<D> operator*(identity const &lhs, translate<D> const &rhs) noexcept
24{
25 return rhs;
26}
27
28template<int D>
29[[nodiscard]] constexpr scale<D> operator*(identity const &lhs, scale<D> const &rhs) noexcept
30{
31 return rhs;
32}
33
34template<int D>
35[[nodiscard]] constexpr rotate<D> operator*(identity const &lhs, rotate<D> const &rhs) noexcept
36{
37 return rhs;
38}
39
40template<int D, int E>
41[[nodiscard]] constexpr auto operator*(translate<D> const &lhs, scale<E> const &rhs) noexcept
42{
43 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
44 return matrix<std::max(D, E)>{
45 static_cast<f32x4>(rhs).x000(),
46 static_cast<f32x4>(rhs)._0y00(),
47 static_cast<f32x4>(rhs)._00z0(),
48 static_cast<f32x4>(lhs).xyz1()};
49}
50
51template<int D, int E>
52[[nodiscard]] constexpr auto operator*(scale<D> const &lhs, translate<E> const &rhs) noexcept
53{
54 hi_axiom(lhs.holds_invariant() && rhs.holds_invariant());
55 return matrix<std::max(D, E)>{
56 static_cast<f32x4>(lhs).x000(),
57 static_cast<f32x4>(lhs)._0y00(),
58 static_cast<f32x4>(lhs)._00z0(),
59 static_cast<f32x4>(lhs) * static_cast<f32x4>(rhs).xyz1()};
60}
61
62template<typename T>
63struct transform : public std::false_type {
64};
65
66// clang-format off
67template<> struct transform<matrix<2>> : public std::true_type {};
68template<> struct transform<matrix<3>> : public std::true_type {};
69template<> struct transform<identity> : public std::true_type {};
70template<> struct transform<translate<2>> : public std::true_type {};
71template<> struct transform<translate<3>> : public std::true_type {};
72template<> struct transform<rotate<2>> : public std::true_type {};
73template<> struct transform<rotate<3>> : public std::true_type {};
74template<> struct transform<scale<2>> : public std::true_type {};
75template<> struct transform<scale<3>> : public std::true_type {};
76// clang-format on
77
78template<typename T>
79constexpr bool transform_v = transform<T>::value;
80
81template<typename T>
82concept transformer = transform_v<T>;
83
84}} // namespace hi::inline v1::geo
DOXYGEN BUG.
Definition algorithm.hpp:15
Definition scale.hpp:16
Definition identity.hpp:11
Definition matrix.hpp:22
Definition rotate.hpp:14
Definition transform.hpp:63
Definition translate.hpp:15
Definition transform.hpp:82
T max(T... args)