| 
									
										
										
										
											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>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace PD { | 
					
						
							|  |  |  | template <typename T> | 
					
						
							|  |  |  | class vec2 { | 
					
						
							|  |  |  |  public: | 
					
						
							|  |  |  |   T x; | 
					
						
							|  |  |  |   T y; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   // Constructors
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   constexpr vec2() : x(0), y(0) {} | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr vec2(T1 v) { | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |     x = (T)v; | 
					
						
							|  |  |  |     y = (T)v; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr vec2(const vec2<T1>& v) { | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |     x = (T)v.x; | 
					
						
							|  |  |  |     y = (T)v.y; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   constexpr explicit vec2(T x, T y) : x(x), y(y) {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Operations
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator+=(T1 v) { | 
					
						
							|  |  |  |     x += (T)v; | 
					
						
							|  |  |  |     y += (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator+=(const vec2<T1>& v) { | 
					
						
							|  |  |  |     x += (T)v.x; | 
					
						
							|  |  |  |     y += (T)v.y; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator+(T1 v) const { | 
					
						
							|  |  |  |     return vec2<T>(x + (T)v, y + (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator+(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return vec2<T>(x + (T)v.x, y + (T)v.y); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator-=(T1 v) { | 
					
						
							|  |  |  |     x -= (T)v; | 
					
						
							|  |  |  |     y -= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator-=(const vec2<T1>& v) { | 
					
						
							|  |  |  |     x -= (T)v.x; | 
					
						
							|  |  |  |     y -= (T)v.y; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator-(T1 v) const { | 
					
						
							|  |  |  |     return vec2<T>(x - (T)v, y - (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator-(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return vec2<T>(x - (T)v.x, y - (T)v.y); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator*=(T1 v) { | 
					
						
							|  |  |  |     x *= (T)v; | 
					
						
							|  |  |  |     y *= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator*=(const vec2<T1>& v) { | 
					
						
							|  |  |  |     x *= (T)v.x; | 
					
						
							|  |  |  |     y *= (T)v.y; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator*(T1 v) const { | 
					
						
							|  |  |  |     return vec2<T>(x * (T)v, y * (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator*(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return vec2<T>(x * (T)v.x, y * (T)v.y); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator/=(T1 v) { | 
					
						
							|  |  |  |     x /= (T)v; | 
					
						
							|  |  |  |     y /= (T)v; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T>& operator/=(const vec2<T1>& v) { | 
					
						
							|  |  |  |     x /= (T)v.x; | 
					
						
							|  |  |  |     y /= (T)v.y; | 
					
						
							|  |  |  |     return *this; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator/(T1 v) const { | 
					
						
							|  |  |  |     return vec2<T>(x / (T)v, y / (T)v); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   vec2<T> operator/(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return vec2<T>(x / (T)v.x, y / (T)v.y); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   // Generic Operations
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   vec2 operator-() const { return vec2(-x, -y); } | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   template <typename T1> | 
					
						
							|  |  |  |   bool operator==(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return x == (T)v.x && y == (T)v.y; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   bool operator!=(const vec2<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; } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  |   template <typename T1> | 
					
						
							|  |  |  |   double Distance(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return (*this - v).Len(); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   vec2<T> Normalize() const { | 
					
						
							|  |  |  |     double l = Len(); | 
					
						
							|  |  |  |     if (l == 0) { | 
					
						
							|  |  |  |       return *this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     return *this / (T)l; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   template <typename T1> | 
					
						
							|  |  |  |   T Dot(const vec2<T1>& v) const { | 
					
						
							|  |  |  |     return x * (T)v.x + y * (T)v.y; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Swap Functions
 | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  |   void SwapXY() { | 
					
						
							|  |  |  |     T t = x; | 
					
						
							|  |  |  |     x = y; | 
					
						
							|  |  |  |     y = t; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | using fvec2 = vec2<float>; | 
					
						
							|  |  |  | using ivec2 = vec2<int>; | 
					
						
							| 
									
										
										
										
											2025-07-23 23:21:34 +02:00
										 |  |  | using dvec2 = vec2<double>; | 
					
						
							| 
									
										
										
										
											2025-06-22 21:05:09 +02:00
										 |  |  | }  // namespace PD
 |