| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | #pragma once
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*
 | 
					
						
							|  |  |  | MIT License | 
					
						
							|  |  |  | Copyright (c) 2024 - 2025 René Amthor (tobid7) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Permission is hereby granted, free of charge, to any person obtaining a copy | 
					
						
							|  |  |  | of this software and associated documentation files (the "Software"), to deal | 
					
						
							|  |  |  | in the Software without restriction, including without limitation the rights | 
					
						
							|  |  |  | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | 
					
						
							|  |  |  | copies of the Software, and to permit persons to whom the Software is | 
					
						
							|  |  |  | furnished to do so, subject to the following conditions: | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | The above copyright notice and this permission notice shall be included in all | 
					
						
							|  |  |  | copies or substantial portions of the Software. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | 
					
						
							|  |  |  | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | 
					
						
							|  |  |  | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | 
					
						
							|  |  |  | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | 
					
						
							|  |  |  | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | 
					
						
							|  |  |  | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | 
					
						
							|  |  |  | SOFTWARE. | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  | // This file is generated by lazyvec 2.0.0
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | #include <pd/core/common.hpp>
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  | // Extended includes (rename if you use other filenames/paths)
 | 
					
						
							|  |  |  | #include <pd/core/vec2.hpp>
 | 
					
						
							|  |  |  | #include <pd/core/vec3.hpp>
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace PD { | 
					
						
							|  |  |  | template <typename T> | 
					
						
							|  |  |  | class vec4 { | 
					
						
							|  |  |  |  public: | 
					
						
							|  |  |  |   T x; | 
					
						
							|  |  |  |   T y; | 
					
						
							|  |  |  |   T z; | 
					
						
							|  |  |  |   T w; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   // Constructors
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constexpr vec4() : x(0), y(0), z(0), w(0) {} | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr vec4(T1 v) { | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |     x = (T)v; | 
					
						
							|  |  |  |     y = (T)v; | 
					
						
							|  |  |  |     z = (T)v; | 
					
						
							|  |  |  |     w = (T)v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr vec4(const vec4<T1>& v) { | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |     x = (T)v.x; | 
					
						
							|  |  |  |     y = (T)v.y; | 
					
						
							|  |  |  |     z = (T)v.z; | 
					
						
							|  |  |  |     w = (T)v.w; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr explicit vec4(T x, T y, T z, T w) : x(x), y(y), z(z), w(w) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Extended Constructors
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   constexpr explicit vec4(const vec2<T1>& xy, const vec2<T1>& zw) { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       x = (T)xy.x; | 
					
						
							|  |  |  |       y = (T)xy.y; | 
					
						
							|  |  |  |       z = (T)zw.x; | 
					
						
							|  |  |  |       w = (T)zw.y; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr explicit vec4(const vec3<T1>& xyz, T1 w) { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       x = (T)xyz.x; | 
					
						
							|  |  |  |       y = (T)xyz.y; | 
					
						
							|  |  |  |       z = (T)xyz.z; | 
					
						
							|  |  |  |       this->w = (T)w; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   // Operations
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator+=(T1 v) { | 
					
						
							|  |  |  |     x += (T)v; | 
					
						
							|  |  |  |     y += (T)v; | 
					
						
							|  |  |  |     z += (T)v; | 
					
						
							|  |  |  |     w += (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator+=(const vec4<T1>& v) { | 
					
						
							|  |  |  |     x += (T)v.x; | 
					
						
							|  |  |  |     y += (T)v.y; | 
					
						
							|  |  |  |     z += (T)v.z; | 
					
						
							|  |  |  |     w += (T)v.w; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator+(T1 v) const { | 
					
						
							|  |  |  |     return vec4<T>(x + (T)v, y + (T)v, z + (T)v, w + (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator+(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return vec4<T>(x + (T)v.x, y + (T)v.y, z + (T)v.z, w + (T)v.w); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator-=(T1 v) { | 
					
						
							|  |  |  |     x -= (T)v; | 
					
						
							|  |  |  |     y -= (T)v; | 
					
						
							|  |  |  |     z -= (T)v; | 
					
						
							|  |  |  |     w -= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator-=(const vec4<T1>& v) { | 
					
						
							|  |  |  |     x -= (T)v.x; | 
					
						
							|  |  |  |     y -= (T)v.y; | 
					
						
							|  |  |  |     z -= (T)v.z; | 
					
						
							|  |  |  |     w -= (T)v.w; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator-(T1 v) const { | 
					
						
							|  |  |  |     return vec4<T>(x - (T)v, y - (T)v, z - (T)v, w - (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator-(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return vec4<T>(x - (T)v.x, y - (T)v.y, z - (T)v.z, w - (T)v.w); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator*=(T1 v) { | 
					
						
							|  |  |  |     x *= (T)v; | 
					
						
							|  |  |  |     y *= (T)v; | 
					
						
							|  |  |  |     z *= (T)v; | 
					
						
							|  |  |  |     w *= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator*=(const vec4<T1>& v) { | 
					
						
							|  |  |  |     x *= (T)v.x; | 
					
						
							|  |  |  |     y *= (T)v.y; | 
					
						
							|  |  |  |     z *= (T)v.z; | 
					
						
							|  |  |  |     w *= (T)v.w; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator*(T1 v) const { | 
					
						
							|  |  |  |     return vec4<T>(x * (T)v, y * (T)v, z * (T)v, w * (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator*(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return vec4<T>(x * (T)v.x, y * (T)v.y, z * (T)v.z, w * (T)v.w); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator/=(T1 v) { | 
					
						
							|  |  |  |     x /= (T)v; | 
					
						
							|  |  |  |     y /= (T)v; | 
					
						
							|  |  |  |     z /= (T)v; | 
					
						
							|  |  |  |     w /= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T>& operator/=(const vec4<T1>& v) { | 
					
						
							|  |  |  |     x /= (T)v.x; | 
					
						
							|  |  |  |     y /= (T)v.y; | 
					
						
							|  |  |  |     z /= (T)v.z; | 
					
						
							|  |  |  |     w /= (T)v.w; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator/(T1 v) const { | 
					
						
							|  |  |  |     return vec4<T>(x / (T)v, y / (T)v, z / (T)v, w / (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec4<T> operator/(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return vec4<T>(x / (T)v.x, y / (T)v.y, z / (T)v.z, w / (T)v.w); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   // Generic Operations
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   vec4 operator-() const { return vec4(-x, -y, -z, -w); } | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   bool operator==(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return x == (T)v.x && y == (T)v.y && z == (T)v.z && w == (T)v.w; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   bool operator!=(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return !(*this == v); | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // Functions
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   double Len() const { return std::sqrt(SqLen()); } | 
					
						
							|  |  |  |   double SqLen() const { return x * x + y * y + z * z + w * w; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   template <typename T1> | 
					
						
							|  |  |  |   double Distance(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return (*this - v).Len(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   vec4<T> Normalize() const { | 
					
						
							|  |  |  |     double l = Len(); | 
					
						
							|  |  |  |     if (l == 0) { | 
					
						
							|  |  |  |       return *this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return *this / (T)l; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   T Dot(const vec4<T1>& v) const { | 
					
						
							|  |  |  |     return x * (T)v.x + y * (T)v.y + z * (T)v.z + w * (T)v.w; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Swap Functions
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   void SwapXY() { | 
					
						
							|  |  |  |     T t = x; | 
					
						
							|  |  |  |     x = y; | 
					
						
							|  |  |  |     y = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   void SwapXZ() { | 
					
						
							|  |  |  |     T t = x; | 
					
						
							|  |  |  |     x = z; | 
					
						
							|  |  |  |     z = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   void SwapXW() { | 
					
						
							|  |  |  |     T t = x; | 
					
						
							|  |  |  |     x = w; | 
					
						
							|  |  |  |     w = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   void SwapYZ() { | 
					
						
							|  |  |  |     T t = y; | 
					
						
							|  |  |  |     y = z; | 
					
						
							|  |  |  |     z = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   void SwapYW() { | 
					
						
							|  |  |  |     T t = y; | 
					
						
							|  |  |  |     y = w; | 
					
						
							|  |  |  |     w = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   void SwapZW() { | 
					
						
							|  |  |  |     T t = z; | 
					
						
							|  |  |  |     z = w; | 
					
						
							|  |  |  |     w = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | using fvec4 = vec4<float>; | 
					
						
							|  |  |  | using ivec4 = vec4<int>; | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  | using dvec4 = vec4<double>; | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | }  // namespace PD
 |