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
#define T(f0, f1, f2)
Definition audio.cpp:7
v[1]
Definition math.lua:22
local 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:33