| 
									
										
										
										
											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>
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | namespace PD { | 
					
						
							|  |  |  | template <typename T> | 
					
						
							|  |  |  | class vec3 { | 
					
						
							|  |  |  |  public: | 
					
						
							|  |  |  |   T x; | 
					
						
							|  |  |  |   T y; | 
					
						
							|  |  |  |   T z; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   // Constructors
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constexpr vec3() : x(0), y(0), z(0) {} | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr vec3(T1 v) { | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |     x = (T)v; | 
					
						
							|  |  |  |     y = (T)v; | 
					
						
							|  |  |  |     z = (T)v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr vec3(const vec3<T1>& v) { | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |     x = (T)v.x; | 
					
						
							|  |  |  |     y = (T)v.y; | 
					
						
							|  |  |  |     z = (T)v.z; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr explicit vec3(T x, T y, T z) : x(x), y(y), z(z) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Extended Constructors
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   constexpr explicit vec3(const vec2<T1>& xy, T1 z) { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |       x = (T)xy.x; | 
					
						
							|  |  |  |       y = (T)xy.y; | 
					
						
							|  |  |  |       this->z = (T)z; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Operations
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator+=(T1 v) { | 
					
						
							|  |  |  |     x += (T)v; | 
					
						
							|  |  |  |     y += (T)v; | 
					
						
							|  |  |  |     z += (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator+=(const vec3<T1>& v) { | 
					
						
							|  |  |  |     x += (T)v.x; | 
					
						
							|  |  |  |     y += (T)v.y; | 
					
						
							|  |  |  |     z += (T)v.z; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator+(T1 v) const { | 
					
						
							|  |  |  |     return vec3<T>(x + (T)v, y + (T)v, z + (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator+(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return vec3<T>(x + (T)v.x, y + (T)v.y, z + (T)v.z); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator-=(T1 v) { | 
					
						
							|  |  |  |     x -= (T)v; | 
					
						
							|  |  |  |     y -= (T)v; | 
					
						
							|  |  |  |     z -= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator-=(const vec3<T1>& v) { | 
					
						
							|  |  |  |     x -= (T)v.x; | 
					
						
							|  |  |  |     y -= (T)v.y; | 
					
						
							|  |  |  |     z -= (T)v.z; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator-(T1 v) const { | 
					
						
							|  |  |  |     return vec3<T>(x - (T)v, y - (T)v, z - (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator-(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return vec3<T>(x - (T)v.x, y - (T)v.y, z - (T)v.z); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator*=(T1 v) { | 
					
						
							|  |  |  |     x *= (T)v; | 
					
						
							|  |  |  |     y *= (T)v; | 
					
						
							|  |  |  |     z *= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator*=(const vec3<T1>& v) { | 
					
						
							|  |  |  |     x *= (T)v.x; | 
					
						
							|  |  |  |     y *= (T)v.y; | 
					
						
							|  |  |  |     z *= (T)v.z; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator*(T1 v) const { | 
					
						
							|  |  |  |     return vec3<T>(x * (T)v, y * (T)v, z * (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator*(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return vec3<T>(x * (T)v.x, y * (T)v.y, z * (T)v.z); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator/=(T1 v) { | 
					
						
							|  |  |  |     x /= (T)v; | 
					
						
							|  |  |  |     y /= (T)v; | 
					
						
							|  |  |  |     z /= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T>& operator/=(const vec3<T1>& v) { | 
					
						
							|  |  |  |     x /= (T)v.x; | 
					
						
							|  |  |  |     y /= (T)v.y; | 
					
						
							|  |  |  |     z /= (T)v.z; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator/(T1 v) const { | 
					
						
							|  |  |  |     return vec3<T>(x / (T)v, y / (T)v, z / (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> operator/(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return vec3<T>(x / (T)v.x, y / (T)v.y, z / (T)v.z); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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
										 |  |  |   vec3 operator-() const { return vec3(-x, -y, -z); } | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   bool operator==(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return x == (T)v.x && y == (T)v.y && z == (T)v.z; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   bool operator!=(const vec3<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; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   template <typename T1> | 
					
						
							|  |  |  |   double Distance(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return (*this - v).Len(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   vec3<T> Normalize() const { | 
					
						
							|  |  |  |     double l = Len(); | 
					
						
							|  |  |  |     if (l == 0) { | 
					
						
							|  |  |  |       return *this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return *this / (T)l; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   T Dot(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return x * (T)v.x + y * (T)v.y + z * (T)v.z; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec3<T> Cross(const vec3<T1>& v) const { | 
					
						
							|  |  |  |     return vec3<T>(y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // 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 SwapYZ() { | 
					
						
							|  |  |  |     T t = y; | 
					
						
							|  |  |  |     y = z; | 
					
						
							|  |  |  |     z = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | using fvec3 = vec3<float>; | 
					
						
							|  |  |  | using ivec3 = vec3<int>; | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  | using dvec3 = vec3<double>; | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | }  // namespace PD
 |