sculpto
vec3.h
Go to the documentation of this file.
1/*!****************************************************************//*!*
2 * \file vec3.h
3 * \brief Euclidean 3D vector implementation module.
4 *
5 * \author Sabitov Kirill
6 * \date 19 June 2022
7 *********************************************************************/
8
9#pragma once
10
11#include "math_common.h"
12
13/*!*
14 * 3D vector to 3 numbers convertion function.
15 *
16 * \param v - vector to convert.
17 * \return 3 numbers.
18 */
19#define SCL_VEC_XYZ(v) SCL_VEC_XY(v), (v).GetZ()
20
21namespace scl::math
22{
23 // Euclidean 3D vector class.
24 template <typename T>
25 class vec3
26 {
28 template<typename T> friend class matr4;
29
30 public:
32 T X { 0 }, Y { 0 }, Z { 0 };
33
34 public:
37 T SetX(T X) { this->X = X; }
39 T SetY(T Y) { this->Y = Y; }
41 T SetZ(T Z) { this->Z = Z; }
43 T GetX() const { return X; }
45 T GetY() const { return Y; }
47 T GetZ() const { return Z; }
48
49 public:
51 vec3() = default;
52
53 /*!*
54 * Vector constructor by one scalar.
55 * All corinates would be set to its value.
56 *
57 * \param A - scalar value of all cordinates.
58 */
59 explicit vec3(T A) : X(A), Y(A), Z(A) {}
60
61 /*!*
62 * Vector constructor by three coordinates.
63 *
64 * \param X, Y - coordiantes of creating vector.
65 */
66 vec3(T X, T Y, T Z) : X(X), Y(Y), Z(Z) {}
67
68 /*!*
69 * Vector constructor by 2D vector and additional component.
70 *
71 * \param V - vector to get X and Y coordinates
72 * \param Z - addition vector component
73 */
74 explicit vec3(vec2<T> V, T Z) : X(V.X), Y(V.Y), Z(Z) {}
75
76 /*!*
77 * Vector constructor by 2D vector and additional component.
78 *
79 * \param X - addition vector component
80 * \param V - vector to get Y and Z coordinates
81 */
82 explicit vec3(T X, vec2<T> V) : X(X), Y(V.X), Z(V.Z) {}
83
84 /*!*
85 * Vector copy constructor.
86 *
87 * \param Other - vector to copy from.
88 */
89 vec3(const vec3 &Other)
90 {
91 if (this != &Other)
92 {
93 X = Other.X;
94 Y = Other.Y;
95 Z = Other.Z;
96 }
97 }
98
99 /*!*
100 * Vector assigments operator overloading.
101 *
102 * \param Other - vector to copy from.
103 * \return self reference.
104 */
105 vec3 &operator=(const vec3 &Other)
106 {
107 if (this != &Other)
108 {
109 X = Other.X;
110 Y = Other.Y;
111 Z = Other.Z;
112 }
113 return *this;
114 }
115
116 public:
117 /*!*
118 * Vector with all components set to 0 creation function.
119 *
120 * \param None.
121 * \return zero vector.
122 */
123 static vec3 Zero() { return vec3(0); }
124
125 /*!*
126 * Vector with all components set to random value in range [Min;Max] creation function.
127 *
128 * \param min - lower bound of random number.
129 * \param Max - upper bound of random number.
130 * \return random number in range [Min; Max].
131 */
132 static vec3 Rnd(T Min = 0, T Max = 1) { return vec3(Rnd(Min, Max)); }
133
134 /*!*
135 * Vector with compund of minimums of specified vectors components.
136 *
137 * \param A, B - vectors to take minimums of components.
138 * \return minimum vector.
139 */
140 static vec3 Min(const vec3 &A, const vec3 &B) { return vec3(math::Min(A.X, B.X), math::Min(A.Y, B.Y), math::Min(A.Z, B.Z)); }
141
142 /*!*
143 * Vector with compund of maximums of specified vectors components.
144 *
145 * \param A, B - vectors to take maximums of components.
146 * \return minimum vector.
147 */
148 static vec3 Max(const vec3 &A, const vec3 &B) { return vec3(math::Max(A.X, B.X), math::Max(A.Y, B.Y), math::Max(A.Z, B.Z)); }
149
150 public:
151 /*!*
152 * Vector squared length getting function.
153 *
154 * \param None.
155 * \return length of vector.
156 */
157 T Length2() const
158 {
159 return X * X + Y * Y + Z * Z;
160 }
161
162 /*!*
163 * Vector length getting function.
164 *
165 * \param None.
166 * \return length of vector.
167 */
168 T Length() const
169 {
170 return sqrt(Length2());
171 }
172
173 /*!*
174 * Distance between two vectors getting function.
175 *
176 * \param Other - vector to get distance to.
177 * \return distance between vectors.
178 */
179 T Distacnce(const vec3 &Other) const
180 {
181 return (*this - Other).Length();
182 }
183
184 /*!*
185 * Normalized vector getting function.
186 *
187 * \param None.
188 * \return normalized vector.
189 */
191 {
192 return *this / Length();
193 }
194
195 /*!*
196 * Normalize vector function.
197 *
198 * \param None.
199 * \return normalized vector.
200 */
202 {
203 *this /= Length();
204 return *this;
205 }
206
207 /*!*
208 * Vectors dot product function.
209 *
210 * \param Other - vector to multiply
211 * \return value of vectors dot product.
212 */
213 T Dot(const vec3 &Other) const
214 {
215 return X * Other.X + Y * Other.Y + Z * Other.Z;
216 }
217
218 /*!*
219 * Vectors cross product function.
220 *
221 * \param Other - vector to multiply
222 * \return cross product resulting rector.
223 */
224 vec3 Cross(const vec3 &Other) const
225 {
226 return vec3(Y * Other.Z - Other.Y * Z,
227 Z * Other.X - Other.Z * X,
228 X * Other.Y - Other.X * Y);
229 }
230
231 public:
232 /*!*
233 * Vector compare function.
234 *
235 * \param Other - vector to compare with.
236 * \return is vectors equal flag.
237 */
238 bool operator==(const vec3 &Other) const
239 {
240 return X == Other.X && Y == Other.Y && Z == Other.Z;
241 }
242
243 /*!*
244 * Getting negative vector operation.
245 *
246 * \param None.
247 * \return negative vector.
248 */
249 const vec3 operator-() const
250 {
251 return vec3(-X, -Y, -Z);
252 }
253
254 /*!*
255 * Vectors addition operator overloading.
256 *
257 * \param Other - vector to add.
258 * \return vector with added coordinates.
259 */
260 const vec3 operator+(const vec3 &Other) const
261 {
262 return vec3(X + Other.X, Y + Other.Y, Z + Other.Z);
263 }
264
265 /*!*
266 * Vectors addition with assigments operator overlaoding.
267 *
268 * \param Other - vector to add.
269 * \return self reference
270 */
271 const vec3 &operator+=(const vec3 &Other)
272 {
273 X += Other.X;
274 Y += Other.Y;
275 Z += Other.Z;
276 return *this;
277 }
278
279 /*!*
280 * Vectors addition operator overloading.
281 *
282 * \param Scalar - scalar value to add to all vetcors components
283 * \return vector with added coordinates.
284 */
285 const vec3 operator+(float Scalar) const
286 {
287 return vec3(X + Scalar,
288 Y + Scalar,
289 Z + Scalar);
290 }
291
292 /*!*
293 * Vectors addition with assigments operator overlaoding.
294 *
295 * \param Other - vector to add.
296 * \return self reference
297 */
298 const vec3 &operator+=(float Scalar)
299 {
300 X += Scalar;
301 Y += Scalar;
302 Z += Scalar;
303 return *this;
304 }
305
306 /*!*
307 * Vectors subtraction operator overloading.
308 *
309 * \param Other - vector to subtract.
310 * \return vector with subtract coordinates.
311 */
312 const vec3 operator-(const vec3 &Other) const
313 {
314 return vec3(X - Other.X, Y - Other.Y, Z - Other.Z);
315 }
316
317 /*!*
318 * Vectors subtraction with assigments operator overlaoding.
319 *
320 * \param Other - vector to subtract.
321 * \return self reference.
322 */
323 const vec3 &operator-=(const vec3 &Other)
324 {
325 X -= Other.X;
326 Y -= Other.Y;
327 Z -= Other.Z;
328 return *this;
329 }
330
331 /*!*
332 * Vectors subtraction operator overloading.
333 *
334 * \param Scalar - scalar value to add to all vetcors components
335 * \return vector with added coordinates.
336 */
337 const vec3 operator-(float Scalar) const
338 {
339 return vec3(X - Scalar,
340 Y - Scalar,
341 Z - Scalar);
342 }
343
344 /*!*
345 * Vectors subtraction with assigments operator overlaoding.
346 *
347 * \param Other - vector to add.
348 * \return self reference
349 */
350 const vec3 &operator-=(float Scalar)
351 {
352 X -= Scalar;
353 Y -= Scalar;
354 Z -= Scalar;
355 return *this;
356 }
357
358 /*!*
359 * Vectors multiplying operator overloading.
360 *
361 * \param Other - vector to multiply.
362 * \return vector with multiplied coordinates.
363 */
364 const vec3 operator*(const vec3 &Other) const
365 {
366 return vec3(X * Other.X, Y * Other.Y, Z * Other.Z);
367 }
368
369 /*!*
370 * Vectors multiplying with assigments operator overlaoding.
371 *
372 * \param Other - vector to multiply.
373 * \return self reference.
374 */
375 const vec3 &operator*=(const vec3 &Other)
376 {
377 X *= Other.X;
378 Y *= Other.Y;
379 Z *= Other.Z;
380 return *this;
381 }
382
383 /*!*
384 * Vectors multiplying operator overloading.
385 *
386 * \param Scalar - scalar value to add to all vetcors components
387 * \return vector with added coordinates.
388 */
389 const vec3 operator*(float Scalar) const
390 {
391 return vec3(X * Scalar,
392 Y * Scalar,
393 Z * Scalar);
394 }
395
396 /*!*
397 * Vectors multiplying with assigments operator overlaoding.
398 *
399 * \param Other - vector to add.
400 * \return self reference
401 */
402 const vec3 &operator*=(float Scalar)
403 {
404 X *= Scalar;
405 Y *= Scalar;
406 Z *= Scalar;
407 return *this;
408 }
409
410 /*!*
411 * Vectors dividing operator overloading.
412 *
413 * \param Other - vector to devide.
414 * \return vector with devided coordinates.
415 */
416 const vec3 operator/(const vec3 &Other) const
417 {
418 return vec3(X / Other.X, Y / Other.Y, Z / Other.Z);
419 }
420
421 /*!*
422 * Vectors dividing with assigments operator overlaoding.
423 *
424 * \param Other - vector to devide.
425 * \return self reference.
426 */
427 const vec3 &operator/=(const vec3 &Other)
428 {
429 X /= Other.X;
430 Y /= Other.Y;
431 Z /= Other.Z;
432 return *this;
433 }
434
435 /*!*
436 * Vectors dividing operator overloading.
437 *
438 * \param Scalar - scalar value to add to all vetcors components
439 * \return vector with added coordinates.
440 */
441 const vec3 operator/(float Scalar) const
442 {
443 return vec3(X / Scalar,
444 Y / Scalar,
445 Z / Scalar);
446 }
447
448 /*!*
449 * Vectors dividing with assigments operator overlaoding.
450 *
451 * \param Other - vector to add.
452 * \return self reference
453 */
454 const vec3 &operator/=(float Scalar)
455 {
456 X /= Scalar;
457 Y /= Scalar;
458 Z /= Scalar;
459 return *this;
460 }
461
462 /*!*
463 * Getting pointer to first component of vector operator.
464 * Need to pass vector to shader.
465 *
466 * \return pointer to first component of vector.
467 */
468 operator T *()
469 {
470 return &X;
471 }
472
473 /*!*
474 * Getting coordinate operator overloading.
475 *
476 * \param Index - coordinate index.
477 * \return vector cartesian coordinate.
478 */
479 T &operator [](int Index)
480 {
481 switch (Index)
482 {
483 case 0: return X;
484 case 1: return Y;
485 default:
486 case 2: return Z;
487 }
488 }
489
490 /*!*
491 * Getting coordinate operator overloading.
492 *
493 * \param Index - coordinate index.
494 * \return vector cartesian coordinate.
495 */
496 T operator [](int Index) const
497 {
498 switch (Index)
499 {
500 case 0: return X;
501 case 1: return Y;
502 default:
503 case 2: return Z;
504 }
505 }
506 };
507}
T SetX(T X)
Definition: vec3.h:37
vec3 Normalized() const
Definition: vec3.h:190
const vec3 operator/(float Scalar) const
Definition: vec3.h:441
vec3()=default
const vec3 & operator*=(const vec3 &Other)
Definition: vec3.h:375
T Distacnce(const vec3 &Other) const
Definition: vec3.h:179
vec3 & Normalize()
Definition: vec3.h:201
const vec3 operator-(float Scalar) const
Definition: vec3.h:337
vec3 & operator=(const vec3 &Other)
Definition: vec3.h:105
T Dot(const vec3 &Other) const
Definition: vec3.h:213
const vec3 & operator+=(const vec3 &Other)
Definition: vec3.h:271
vec3(T A)
Definition: vec3.h:59
T SetY(T Y)
Definition: vec3.h:39
T & operator[](int Index)
Definition: vec3.h:479
static vec3 Max(const vec3 &A, const vec3 &B)
Definition: vec3.h:148
const vec3 operator*(const vec3 &Other) const
Definition: vec3.h:364
const vec3 operator-(const vec3 &Other) const
Definition: vec3.h:312
T Length2() const
Definition: vec3.h:157
static vec3 Rnd(T Min=0, T Max=1)
Definition: vec3.h:132
const vec3 & operator-=(const vec3 &Other)
Definition: vec3.h:323
const vec3 operator*(float Scalar) const
Definition: vec3.h:389
T SetZ(T Z)
Definition: vec3.h:41
T GetX() const
Definition: vec3.h:43
T Length() const
Definition: vec3.h:168
T GetZ() const
Definition: vec3.h:47
const vec3 operator+(float Scalar) const
Definition: vec3.h:285
const vec3 operator+(const vec3 &Other) const
Definition: vec3.h:260
const vec3 operator-() const
Definition: vec3.h:249
vec3(const vec3 &Other)
Definition: vec3.h:89
bool operator==(const vec3 &Other) const
Definition: vec3.h:238
vec3(T X, vec2< T > V)
Definition: vec3.h:82
vec3(vec2< T > V, T Z)
Definition: vec3.h:74
const vec3 & operator+=(float Scalar)
Definition: vec3.h:298
const vec3 & operator/=(float Scalar)
Definition: vec3.h:454
vec3 Cross(const vec3 &Other) const
Definition: vec3.h:224
const vec3 & operator-=(float Scalar)
Definition: vec3.h:350
vec3(T X, T Y, T Z)
Definition: vec3.h:66
const vec3 operator/(const vec3 &Other) const
Definition: vec3.h:416
const vec3 & operator*=(float Scalar)
Definition: vec3.h:402
const vec3 & operator/=(const vec3 &Other)
Definition: vec3.h:427
static vec3 Min(const vec3 &A, const vec3 &B)
Definition: vec3.h:140
static vec3 Zero()
Definition: vec3.h:123
T GetY() const
Definition: vec3.h:45
T Max(T Num1, T Num2)
Definition: math_common.h:61
T Min(T Num1, T Num2)
Definition: math_common.h:49