#ifndef __SCOP_VEC2__ #define __SCOP_VEC2__ #include #include #include #include #include namespace Scop { template class Vec3; template class Vec4; template struct Vec2 { T x; T y; constexpr Vec2() = default; constexpr Vec2(T X, T Y); constexpr explicit Vec2(T scale); template constexpr explicit Vec2(const Vec2& vec); constexpr Vec2(const Vec2&) = default; constexpr Vec2(Vec2&&) = default; constexpr explicit Vec2(const Vec3& vec); constexpr explicit Vec2(const Vec4& vec); T AbsDotProduct(const Vec2& vec) const; constexpr bool ApproxEqual(const Vec2& vec, T max_difference = std::numeric_limits::epsilon()) const; template U Distance(const Vec2& vec) const; constexpr T DotProduct(const Vec2& vec) const; template T GetLength() const; Vec2 GetNormal(T* length = nullptr) const; constexpr T GetSquaredLength() const; constexpr Vec2& Maximize(const Vec2& vec); constexpr Vec2& Minimize(const Vec2& vec); Vec2& Normalize(T* length = nullptr); constexpr T SquaredDistance(const Vec2& vec) const; std::string ToString() const; constexpr T& operator[](std::size_t i); constexpr T operator[](std::size_t i) const; constexpr const Vec2& operator+() const; constexpr Vec2 operator-() const; constexpr Vec2 operator+(const Vec2& vec) const; constexpr Vec2 operator-(const Vec2& vec) const; constexpr Vec2 operator*(const Vec2& vec) const; constexpr Vec2 operator*(T scale) const; constexpr Vec2 operator/(const Vec2& vec) const; constexpr Vec2 operator/(T scale) const; constexpr Vec2 operator%(const Vec2& vec) const; constexpr Vec2 operator%(T mod) const; constexpr Vec2& operator=(const Vec2&) = default; constexpr Vec2& operator=(Vec2&&) = default; constexpr Vec2& operator+=(const Vec2& vec); constexpr Vec2& operator-=(const Vec2& vec); constexpr Vec2& operator*=(const Vec2& vec); constexpr Vec2& operator*=(T scale); constexpr Vec2& operator/=(const Vec2& vec); constexpr Vec2& operator/=(T scale); constexpr Vec2& operator%=(const Vec2& vec); constexpr Vec2& operator%=(T mod); constexpr bool operator==(const Vec2& vec) const; constexpr bool operator!=(const Vec2& vec) const; constexpr bool operator<(const Vec2& vec) const; constexpr bool operator<=(const Vec2& vec) const; constexpr bool operator>(const Vec2& vec) const; constexpr bool operator>=(const Vec2& vec) const; static constexpr Vec2 Apply(T(*func)(T), const Vec2& vec); static constexpr bool ApproxEqual(const Vec2& lhs, const Vec2& rhs, T max_difference = std::numeric_limits::epsilon()); template static U Distance(const Vec2& vec1, const Vec2& vec2); static constexpr T DotProduct(const Vec2& vec1, const Vec2& vec2); static constexpr Vec2 Lerp(const Vec2& from, const Vec2& to, T interpolation); static Vec2 Normalize(const Vec2& vec); static constexpr Vec2 Unit(); static constexpr Vec2 UnitX(); static constexpr Vec2 UnitY(); static constexpr Vec2 Zero(); ~Vec2() = default; }; using Vec2d = Vec2; using Vec2f = Vec2; using Vec2i = Vec2; using Vec2ui = Vec2; using Vec2i32 = Vec2; using Vec2i64 = Vec2; using Vec2ui32 = Vec2; using Vec2ui64 = Vec2; template std::ostream& operator<<(std::ostream& out, const Vec2& vec); template constexpr Vec2 operator*(T scale, const Vec2& vec); template constexpr Vec2 operator/(T scale, const Vec2& vec); template constexpr Vec2 operator%(T mod, const Vec2& vec); } #include #endif