nngn
Loading...
Searching...
No Matches
vec4.h
Go to the documentation of this file.
1#ifndef NNGN_MATH_VEC4_H
2#define NNGN_MATH_VEC4_H
3
4#include <cstdint>
5
6#include "vec.h"
7#include "vec3.h"
8
9namespace nngn {
10
11template<typename T>
12struct vec4_base : public vec<vec4_base, T, 4> {
13 T x, y, z, w;
14 constexpr vec4_base() = default;
15 explicit constexpr vec4_base(T v) : vec4_base{v, v, v, v} {}
16 constexpr vec4_base(T p_x, T p_y)
17 : vec4_base{p_x, p_y, {}, {}} {}
18 constexpr vec4_base(T p_x, T p_y, T p_z)
19 : vec4_base{p_x, p_y, p_z, {}} {}
20 constexpr vec4_base(T p_x, T p_y, T p_z, T p_w)
21 : x{p_x}, y{p_y}, z{p_z}, w{p_w} {}
22 constexpr vec4_base(const vec2_base<T> &v, T p_z, T p_w)
23 : vec4_base{v.x, v.y, p_z, p_w} {}
24 constexpr vec4_base(T p_x, const vec2_base<T> &v, T p_w)
25 : vec4_base{p_x, v.x, v.y, p_w} {}
26 constexpr vec4_base(const vec2_base<T> &u, const vec2_base<T> &v)
27 : vec4_base{u.x, u.y, v.x, v.y} {}
28 constexpr vec4_base(const vec3_base<T> &v, T p_w)
29 : vec4_base{v.x, v.y, v.z, p_w} {}
30 constexpr vec4_base(T p_x, const vec3_base<T> &v)
31 : vec4_base{p_x, v.x, v.y, v.z} {}
32 constexpr vec3_base<T> persp_div() const { return this->xyz() / this->w; }
33#define S(v0, v1) \
34 constexpr vec2_base<T> v0 ## v1() const { return {this->v0, this->v1}; }
35 S(x,x) S(x,y) S(x,z) S(x,w)
36 S(y,x) S(y,y) S(y,z) S(y,w)
37 S(z,x) S(z,y) S(z,z) S(z,w)
38 S(w,x) S(w,y) S(w,z) S(w,w)
39#undef S
40#define S(v0, v1, v2) \
41 constexpr vec3_base<T> v0 ## v1 ## v2() const \
42 { return {this->v0, this->v1, this->v2}; }
43 S(x,x,x) S(x,x,y) S(x,x,z) S(x,x,w) S(x,y,x) S(x,y,y) S(x,y,z) S(x,y,w)
44 S(x,z,x) S(x,z,y) S(x,z,z) S(x,z,w) S(x,w,x) S(x,w,y) S(x,w,z) S(x,w,w)
45 S(y,x,x) S(y,x,y) S(y,x,z) S(y,x,w) S(y,y,x) S(y,y,y) S(y,y,z) S(y,y,w)
46 S(y,z,x) S(y,z,y) S(y,z,z) S(y,z,w) S(y,w,x) S(y,w,y) S(y,w,z) S(y,w,w)
47 S(z,x,x) S(z,x,y) S(z,x,z) S(z,x,w) S(z,y,x) S(z,y,y) S(z,y,z) S(z,y,w)
48 S(z,z,x) S(z,z,y) S(z,z,z) S(z,z,w) S(z,w,x) S(z,w,y) S(z,w,z) S(z,w,w)
49 S(w,x,x) S(w,x,y) S(w,x,z) S(w,x,w) S(w,y,x) S(w,y,y) S(w,y,z) S(w,y,w)
50 S(w,z,x) S(w,z,y) S(w,z,z) S(w,z,w) S(w,w,x) S(w,w,y) S(w,w,z) S(w,w,w)
51#undef S
52#define S(v0, v1, v2, v3) \
53 constexpr vec4_base<T> v0 ## v1 ## v2 ## v3() const \
54 { return {this->v0, this->v1, this->v2, this->v3}; }
55 S(x,x,x,x) S(x,x,x,y) S(x,x,x,z) S(x,x,x,w)
56 S(x,x,y,x) S(x,x,y,y) S(x,x,y,z) S(x,x,y,w)
57 S(x,x,z,x) S(x,x,z,y) S(x,x,z,z) S(x,x,z,w)
58 S(x,x,w,x) S(x,x,w,y) S(x,x,w,z) S(x,x,w,w)
59 S(x,y,x,x) S(x,y,x,y) S(x,y,x,z) S(x,y,x,w)
60 S(x,y,y,x) S(x,y,y,y) S(x,y,y,z) S(x,y,y,w)
61 S(x,y,z,x) S(x,y,z,y) S(x,y,z,z) S(x,y,z,w)
62 S(x,y,w,x) S(x,y,w,y) S(x,y,w,z) S(x,y,w,w)
63 S(x,z,x,x) S(x,z,x,y) S(x,z,x,z) S(x,z,x,w)
64 S(x,z,y,x) S(x,z,y,y) S(x,z,y,z) S(x,z,y,w)
65 S(x,z,z,x) S(x,z,z,y) S(x,z,z,z) S(x,z,z,w)
66 S(x,z,w,x) S(x,z,w,y) S(x,z,w,z) S(x,z,w,w)
67 S(x,w,x,x) S(x,w,x,y) S(x,w,x,z) S(x,w,x,w)
68 S(x,w,y,x) S(x,w,y,y) S(x,w,y,z) S(x,w,y,w)
69 S(x,w,z,x) S(x,w,z,y) S(x,w,z,z) S(x,w,z,w)
70 S(x,w,w,x) S(x,w,w,y) S(x,w,w,z) S(x,w,w,w)
71 S(y,x,x,x) S(y,x,x,y) S(y,x,x,z) S(y,x,x,w)
72 S(y,x,y,x) S(y,x,y,y) S(y,x,y,z) S(y,x,y,w)
73 S(y,x,z,x) S(y,x,z,y) S(y,x,z,z) S(y,x,z,w)
74 S(y,x,w,x) S(y,x,w,y) S(y,x,w,z) S(y,x,w,w)
75 S(y,y,x,x) S(y,y,x,y) S(y,y,x,z) S(y,y,x,w)
76 S(y,y,y,x) S(y,y,y,y) S(y,y,y,z) S(y,y,y,w)
77 S(y,y,z,x) S(y,y,z,y) S(y,y,z,z) S(y,y,z,w)
78 S(y,y,w,x) S(y,y,w,y) S(y,y,w,z) S(y,y,w,w)
79 S(y,z,x,x) S(y,z,x,y) S(y,z,x,z) S(y,z,x,w)
80 S(y,z,y,x) S(y,z,y,y) S(y,z,y,z) S(y,z,y,w)
81 S(y,z,z,x) S(y,z,z,y) S(y,z,z,z) S(y,z,z,w)
82 S(y,z,w,x) S(y,z,w,y) S(y,z,w,z) S(y,z,w,w)
83 S(y,w,x,x) S(y,w,x,y) S(y,w,x,z) S(y,w,x,w)
84 S(y,w,y,x) S(y,w,y,y) S(y,w,y,z) S(y,w,y,w)
85 S(y,w,z,x) S(y,w,z,y) S(y,w,z,z) S(y,w,z,w)
86 S(y,w,w,x) S(y,w,w,y) S(y,w,w,z) S(y,w,w,w)
87 S(z,x,x,x) S(z,x,x,y) S(z,x,x,z) S(z,x,x,w)
88 S(z,x,y,x) S(z,x,y,y) S(z,x,y,z) S(z,x,y,w)
89 S(z,x,z,x) S(z,x,z,y) S(z,x,z,z) S(z,x,z,w)
90 S(z,x,w,x) S(z,x,w,y) S(z,x,w,z) S(z,x,w,w)
91 S(z,y,x,x) S(z,y,x,y) S(z,y,x,z) S(z,y,x,w)
92 S(z,y,y,x) S(z,y,y,y) S(z,y,y,z) S(z,y,y,w)
93 S(z,y,z,x) S(z,y,z,y) S(z,y,z,z) S(z,y,z,w)
94 S(z,y,w,x) S(z,y,w,y) S(z,y,w,z) S(z,y,w,w)
95 S(z,z,x,x) S(z,z,x,y) S(z,z,x,z) S(z,z,x,w)
96 S(z,z,y,x) S(z,z,y,y) S(z,z,y,z) S(z,z,y,w)
97 S(z,z,z,x) S(z,z,z,y) S(z,z,z,z) S(z,z,z,w)
98 S(z,z,w,x) S(z,z,w,y) S(z,z,w,z) S(z,z,w,w)
99 S(z,w,x,x) S(z,w,x,y) S(z,w,x,z) S(z,w,x,w)
100 S(z,w,y,x) S(z,w,y,y) S(z,w,y,z) S(z,w,y,w)
101 S(z,w,z,x) S(z,w,z,y) S(z,w,z,z) S(z,w,z,w)
102 S(z,w,w,x) S(z,w,w,y) S(z,w,w,z) S(z,w,w,w)
103 S(w,x,x,x) S(w,x,x,y) S(w,x,x,z) S(w,x,x,w)
104 S(w,x,y,x) S(w,x,y,y) S(w,x,y,z) S(w,x,y,w)
105 S(w,x,z,x) S(w,x,z,y) S(w,x,z,z) S(w,x,z,w)
106 S(w,x,w,x) S(w,x,w,y) S(w,x,w,z) S(w,x,w,w)
107 S(w,y,x,x) S(w,y,x,y) S(w,y,x,z) S(w,y,x,w)
108 S(w,y,y,x) S(w,y,y,y) S(w,y,y,z) S(w,y,y,w)
109 S(w,y,z,x) S(w,y,z,y) S(w,y,z,z) S(w,y,z,w)
110 S(w,y,w,x) S(w,y,w,y) S(w,y,w,z) S(w,y,w,w)
111 S(w,z,x,x) S(w,z,x,y) S(w,z,x,z) S(w,z,x,w)
112 S(w,z,y,x) S(w,z,y,y) S(w,z,y,z) S(w,z,y,w)
113 S(w,z,z,x) S(w,z,z,y) S(w,z,z,z) S(w,z,z,w)
114 S(w,z,w,x) S(w,z,w,y) S(w,z,w,z) S(w,z,w,w)
115 S(w,w,x,x) S(w,w,x,y) S(w,w,x,z) S(w,w,x,w)
116 S(w,w,y,x) S(w,w,y,y) S(w,w,y,z) S(w,w,y,w)
117 S(w,w,z,x) S(w,w,z,y) S(w,w,z,z) S(w,w,z,w)
118 S(w,w,w,x) S(w,w,w,y) S(w,w,w,z) S(w,w,w,w)
119#undef S
120};
121
122template<typename T>
123struct vec_type<T, 4> : std::type_identity<vec4_base<T>> {};
124
125using ivec4 = vec4_base<std::int32_t>;
126using uvec4 = vec4_base<std::uint32_t>;
127using zvec4 = vec4_base<std::size_t>;
128using vec4 = vec4_base<float>;
129using dvec4 = vec4_base<double>;
130
131static_assert(offsetof(ivec4, y) == sizeof(ivec4::type));
132static_assert(offsetof(uvec4, y) == sizeof(uvec4::type));
133static_assert(offsetof( vec4, y) == sizeof( vec4::type));
134static_assert(offsetof(dvec4, y) == sizeof(dvec4::type));
135static_assert(offsetof(ivec4, z) == sizeof(ivec4::type) * 2);
136static_assert(offsetof(uvec4, z) == sizeof(uvec4::type) * 2);
137static_assert(offsetof( vec4, z) == sizeof( vec4::type) * 2);
138static_assert(offsetof(dvec4, z) == sizeof(dvec4::type) * 2);
139static_assert(offsetof(ivec4, w) == sizeof(ivec4::type) * 3);
140static_assert(offsetof(uvec4, w) == sizeof(uvec4::type) * 3);
141static_assert(offsetof( vec4, w) == sizeof( vec4::type) * 3);
142static_assert(offsetof(dvec4, w) == sizeof(dvec4::type) * 3);
143
144}
145
146#endif
z
Definition: input.lua:25
v[1]
Definition: math.lua:19
w
Definition: strict.lua:12
#define S(v0, v1)
Definition: vec4.h:52
#define T(f0, f1, f2)
Definition: audio.cpp:7
Definition: vec2.h:11
Definition: vec3.h:12
Definition: vec4.h:12
constexpr vec4_base(T p_x, T p_y, T p_z)
Definition: vec4.h:18
T x
Definition: vec4.h:13
T z
Definition: vec4.h:13
constexpr vec4_base(T v)
Definition: vec4.h:15
constexpr vec4_base(T p_x, const vec2_base< T > &v, T p_w)
Definition: vec4.h:24
constexpr vec3_base< T > persp_div() const
Definition: vec4.h:32
constexpr vec4_base()=default
constexpr vec4_base(const vec2_base< T > &u, const vec2_base< T > &v)
Definition: vec4.h:26
T y
Definition: vec4.h:13
constexpr vec4_base(const vec2_base< T > &v, T p_z, T p_w)
Definition: vec4.h:22
constexpr vec4_base(T p_x, T p_y, T p_z, T p_w)
Definition: vec4.h:20
constexpr vec4_base(const vec3_base< T > &v, T p_w)
Definition: vec4.h:28
constexpr vec4_base(T p_x, const vec3_base< T > &v)
Definition: vec4.h:30
constexpr vec4_base(T p_x, T p_y)
Definition: vec4.h:16
T w
Definition: vec4.h:13
Definition: vec.h:16