| 
						
						
							
								
							
						
						
					 | 
					@ -24,13 +24,12 @@ public: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					        static_assert(sizeof...(args) == N, "Argument count must match vector size."); | 
					 | 
					 | 
					        static_assert(sizeof...(args) == N, "Argument count must match vector size."); | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    explicit VecBase(const Derived &v) { | 
					 | 
					 | 
					    explicit VecBase(const VecBase &v) { | 
				
			
			
				
				
			
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					        data = v.data; | 
					 | 
					 | 
					        data = v.data; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    VecBase& operator=(const VecBase &v) { | 
					 | 
					 | 
					    VecBase &operator=(VecBase v) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        if (this == &v) return *this; | 
					 | 
					 | 
					        *this = std::move(v); | 
				
			
			
				
				
			
		
	
		
		
			
				
					 | 
					 | 
					        data = v.data; | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					        return *this; | 
					 | 
					 | 
					        return *this; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
							
								
							
						
						
					 | 
					@ -106,53 +105,61 @@ public: | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					// Vec<2> 特化
 | 
					 | 
					 | 
					// Vec<2> 特化
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					class Vec2 : public VecBase<Vec2, 2> { | 
					 | 
					 | 
					class Vec2 : public VecBase<Vec2, 2> { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					public: | 
					 | 
					 | 
					public: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    union { | 
					 | 
					 | 
					    Vec2() : VecBase() {} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        struct { | 
					 | 
					 | 
					    Vec2(real x, real y) : VecBase(x, y) {} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            real &x, &y; | 
					 | 
					 | 
					    Vec2(const Vec2& v) : VecBase(v.x(), v.y()) {} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }; | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        struct { | 
					 | 
					 | 
					    Vec2 &operator=(const Vec2& v) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            real &u, &v; | 
					 | 
					 | 
					        data = v.data; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }; | 
					 | 
					 | 
					        return *this; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        struct { | 
					 | 
					 | 
					    } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            real &a, &b; | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }; | 
					 | 
					 | 
					    real& x() { return data[0]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    }; | 
					 | 
					 | 
					    real& y() { return data[1]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec2(real xVal, real yVal) : VecBase<Vec2, 2>(xVal, yVal), x(data[0]), y(data[1]) {} | 
					 | 
					 | 
					    const real& x() const { return data[0]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    const real& y() const { return data[1]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec2() : VecBase<Vec2, 2>(), x(data[0]), y(data[1]) {} | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    real& u() { return data[0]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec2(const Vec2 &v) : VecBase<Vec2, 2>(v), x(data[0]), y(data[1]) {} | 
					 | 
					 | 
					    real& v() { return data[1]; } | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    const real& u() const { return data[0]; } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    const real& v() const { return data[1]; } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					// specialize template class Vec<3>;
 | 
					 | 
					 | 
					 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					class Vec3 : public VecBase<Vec3, 3> { | 
					 | 
					 | 
					class Vec3 : public VecBase<Vec3, 3> { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					public: | 
					 | 
					 | 
					public: | 
				
			
			
		
	
		
		
			
				
					
					 | 
					 | 
					    union { | 
					 | 
					 | 
					    Vec3() : VecBase() {} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        struct { | 
					 | 
					 | 
					    Vec3(real x, real y, real z) : VecBase(x, y, z) {} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            real &x, &y, &z; | 
					 | 
					 | 
					    Vec3(const Vec3& v) : VecBase(v.x(), v.y(), v.z()) {} | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }; | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        struct { | 
					 | 
					 | 
					    Vec3 &operator=(const Vec3& v) { | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            real &u, &v, &w; | 
					 | 
					 | 
					        data = v.data; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }; | 
					 | 
					 | 
					        return *this; | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        struct { | 
					 | 
					 | 
					    } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					            real &a, &b, &c; | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        }; | 
					 | 
					 | 
					    real& x() { return data[0]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    }; | 
					 | 
					 | 
					    real& y() { return data[1]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    real& z() { return data[2]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec3() : VecBase<Vec3, 3>(), x(data[0]), y(data[1]), z(data[2]) {} | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    real x() const { return data[0]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec3(real xVal, real yVal, real zVal) : VecBase<Vec3, 3>(xVal, yVal, zVal), x(data[0]), y(data[1]), z(data[2]) {} | 
					 | 
					 | 
					    real y() const { return data[1]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    real z() const { return data[2]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec3(const Vec3 &vec) : VecBase<Vec3, 3>(vec), x(data[0]), y(data[1]), z(data[2]) {} | 
					 | 
					 | 
					
 | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					
 | 
					 | 
					 | 
					    real& u() { return data[0]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					    Vec3 cross(const Vec3 &v) const { | 
					 | 
					 | 
					    real& v() { return data[1]; } | 
				
			
			
				
				
			
		
	
		
		
			
				
					
					 | 
					 | 
					        return {y * v.z - z * v.y, z * v.x - x * v.z, x * v.y - y * v.x}; | 
					 | 
					 | 
					    real& w() { return data[2]; } | 
				
			
			
				
				
			
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    real u() const { return data[0]; } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    real v() const { return data[1]; } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    real w() const { return data[2]; } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					    Vec3 cross(const Vec3& v) const { | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					 | 
					 | 
					 | 
					        return {y() * v.z() - z() * v.y(), z() * v.x() - x() * v.z(), x() * v.y() - y() * v.x()}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					    } | 
					 | 
					 | 
					    } | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					}; | 
					 | 
					 | 
					}; | 
				
			
			
		
	
		
		
			
				
					 | 
					 | 
					
 | 
					 | 
					 | 
					
 | 
				
			
			
		
	
	
		
		
			
				
					| 
						
							
								
							
						
						
						
					 | 
					
  |