CSEngine
Loading...
Searching...
No Matches
Vector.h
1#pragma once
2
3#include <cmath>
4
5namespace CSE {
6
7 const float Pi = 4 * std::atan(1.0f);
8 const float TwoPi = 2 * Pi;
9
10 template <typename T>
11 class Vector2 {
12
13 public:
14 Vector2() {}
15
16 Vector2(T x, T y) : x(x), y(y) {}
17
18 ~Vector2() {}
19
20 void Set(T x, T y) {
21 this->x = x;
22 this->y = y;
23 }
24
25 T Dot(const Vector2& v) const {
26 return x * v.x + y * v.y;
27 }
28
29 Vector2 operator+(const Vector2& v) const {
30 return Vector2(x + v.x, y + v.y);
31 }
32
33 Vector2 operator-(const Vector2& v) const {
34 return Vector2(x - v.x, y - v.y);
35 }
36
37 Vector2 operator-() const {
38 return Vector2(-x, -y);
39 }
40
41 void operator+=(const Vector2& v) {
42 *this = Vector2(x + v.x, y + v.y);
43 }
44
45 void operator-=(const Vector2& v) {
46 *this = Vector2(x - v.x, y - v.y);
47 }
48
49 Vector2 operator/(T s) const {
50 return Vector2(x / s, y / s);
51 }
52
53 Vector2 operator*(float s) const {
54 return Vector2(x * s, y * s);
55 }
56
57 void operator/=(float s) {
58 *this = Vector2(x / s, y / s);
59 }
60
61 void operator*=(float s) {
62 *this = Vector2(x * s, y * s);
63 }
64
65 void Normalize() {
66 float s = 1.0f / Length();
67 x *= s;
68 y *= s;
69 }
70
71 Vector2 Normalized() const {
72 Vector2 v = *this;
73 v.Normalize();
74 return v;
75 }
76
77 T LengthSquared() const {
78 return x * x + y * y;
79 }
80
81 T Length() const {
82 return sqrt(LengthSquared());
83 }
84
85 explicit operator Vector2<float>() const {
86 return Vector2<float>(x, y);
87 }
88
89 bool operator==(const Vector2& v) const {
90 return x == v.x && y == v.y;
91 }
92
93 Vector2 Lerp(float t, const Vector2& v) const {
94 return Vector2(x * (1 - t) + v.x * t,
95 y * (1 - t) + v.y * t);
96 }
97
98 static float Distance(const Vector2& a, const Vector2& b) {
99 return sqrtf(powf(a.x - b.x, 2) + powf(a.y - b.y, 2));
100 }
101
102 const T* Pointer() const {
103 return &x;
104 }
105
106 template <typename P>
107 P* Write(P* pData) {
108 Vector2* pVector = (Vector2*) pData;
109 *pVector++ = *this;
110 return (P*) pVector;
111 }
112
113 T x;
114 T y;
115 };
116
117 template <typename T>
118 class Vector3 {
119 public:
120 static Vector3<T> Zero;
121
122 public:
123 Vector3() : x(0.0f), y(0.0f), z(0.0f) {}
124
125 Vector3(T x, T y, T z) : x(x), y(y), z(z) {}
126
127 ~Vector3() {}
128
129 void Set(T x, T y, T z) {
130 this->x = x;
131 this->y = y;
132 this->z = z;
133 }
134
135 void Normalize() {
136 float s = 1.0f / std::sqrt(x * x + y * y + z * z);
137 x *= s;
138 y *= s;
139 z *= s;
140 }
141
142 Vector3 Normalized() const {
143 Vector3 v = *this;
144 v.Normalize();
145 return v;
146 }
147
148 Vector3 Cross(const Vector3& v) const {
149 return Vector3(y * v.z - z * v.y,
150 z * v.x - x * v.z,
151 x * v.y - y * v.x);
152 }
153
154 T Dot(const Vector3& v) const {
155 return x * v.x + y * v.y + z * v.z;
156 }
157
158 Vector3 operator+(const Vector3& v) const {
159 return Vector3(x + v.x, y + v.y, z + v.z);
160 }
161
162 void operator+=(const Vector3& v) {
163 x += v.x;
164 y += v.y;
165 z += v.z;
166 }
167
168 void operator-=(const Vector3& v) {
169 x -= v.x;
170 y -= v.y;
171 z -= v.z;
172 }
173
174 void operator/=(T s) {
175 x /= s;
176 y /= s;
177 z /= s;
178 }
179
180 Vector3 operator-(const Vector3& v) const {
181 return Vector3(x - v.x, y - v.y, z - v.z);
182 }
183
184 Vector3 operator-() const {
185 return Vector3(-x, -y, -z);
186 }
187
188 Vector3 operator*(T s) const {
189 return Vector3(x * s, y * s, z * s);
190 }
191
192 Vector3 operator/(T s) const {
193 return Vector3(x / s, y / s, z / s);
194 }
195
196 bool operator==(const Vector3& v) const {
197 return x == v.x && y == v.y && z == v.z;
198 }
199
200 Vector3 Lerp(float t, const Vector3& v) const {
201 return Vector3(x * (1 - t) + v.x * t,
202 y * (1 - t) + v.y * t,
203 z * (1 - t) + v.z * t);
204 }
205
206 static Vector3 Lerp(float t, const Vector3& a, Vector3& b) {
207 return Vector3(a.x * (1 - t) + b.x * t,
208 a.y * (1 - t) + b.y * t,
209 a.z * (1 - t) + b.z * t);
210 }
211
212 static float Distance(const Vector3& a, const Vector3& b) {
213 return sqrtf(powf(a.x - b.x, 2) + powf(a.y - b.y, 2) + powf(a.z - b.z, 2));
214 }
215
216 const T* Pointer() const {
217 return &x;
218 }
219
220 template <typename P>
221 P* Write(P* pData) {
222 Vector3<T>* pVector = (Vector3<T>*) pData;
223 *pVector++ = *this;
224 return (P*) pVector;
225 }
226
227 T x;
228 T y;
229 T z;
230 };
231
232 template <typename T>
233 class Vector4 {
234
235 public:
236 Vector4() {}
237
238 Vector4(T x, T y, T z, T w) : x(x), y(y), z(z), w(w) {}
239
240 Vector4(const Vector3<T>& v, T w) : x(v.x), y(v.y), z(v.z), w(w) {}
241
242 ~Vector4() {}
243
244 void Set(T x, T y, T z, T w) {
245 this->x = x;
246 this->y = y;
247 this->z = z;
248 this->w = w;
249
250 }
251
252 T Dot(const Vector4& v) const {
253 return x * v.x + y * v.y + z * v.z + w * v.w;
254 }
255
256 Vector4 operator-() const {
257 return Vector4(-x, -y, -z, -w);
258 }
259
260 Vector4 Lerp(float t, const Vector4& v) const {
261 return Vector4(x * (1 - t) + v.x * t,
262 y * (1 - t) + v.y * t,
263 z * (1 - t) + v.z * t,
264 w * (1 - t) + v.w * t);
265 }
266
267 Vector4 Lerp(float t, const Vector4& a, const Vector4& b) const {
268 return Vector4(a.x * (1 - t) + b.x * t,
269 a.y * (1 - t) + b.y * t,
270 a.z * (1 - t) + b.z * t,
271 a.w * (1 - t) + b.w * t);
272 }
273
274 static float Distance(const Vector4& a, const Vector4& b) {
275 return sqrtf(powf(a.x - b.x, 2) + powf(a.y - b.y, 2) + powf(a.z - b.z, 2) + powf(a.w - b.w, 2));
276 }
277
278 Vector4 operator+(const Vector4& v) const {
279 return Vector4(x + v.x, y + v.y, z + v.z, w + v.w);
280 }
281
282 Vector4 operator*(T s) const {
283 return Vector4(x * s, y * s, z * s, w * s);
284 }
285
286 const T* Pointer() const {
287 return &x;
288 }
289
290 T x;
291 T y;
292 T z;
293 T w;
294 };
295
296 typedef Vector2<bool> bvec2;
297
298 typedef Vector2<int> ivec2;
299 typedef Vector3<int> ivec3;
300 typedef Vector4<int> ivec4;
301
302 typedef Vector2<float> vec2;
303 typedef Vector3<float> vec3;
304 typedef Vector4<float> vec4;
305
306 template<class T> Vector3<T> Vector3<T>::Zero = Vector3<T>{0, 0, 0};
307}