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
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
Definition: debug.h:45
v[1]
Definition: math.lua:19
w
Definition: strict.lua:12
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
Definition: vec.h:22
T type
Definition: vec.h:23
#define S(v0, v1)
Definition: vec4.h:52