// Copyright (C) 2024 Jérôme "SirLynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Math module" // For conditions of distribution and use, see copyright notice in Export.hpp #pragma once #ifndef NAZARA_MATH_RECT_HPP #define NAZARA_MATH_RECT_HPP #include #include #include #include namespace Nz { struct SerializationContext; template class Rect { public: constexpr Rect() = default; constexpr Rect(T Width, T Height); constexpr Rect(T X, T Y, T Width, T Height); constexpr explicit Rect(const Vector2& lengths); constexpr explicit Rect(const Vector2& pos, const Vector2& lengths); template constexpr explicit Rect(const Rect& rect); constexpr Rect(const Rect&) = default; constexpr Rect(Rect&&) noexcept = default; ~Rect() = default; constexpr bool ApproxEqual(const Rect& rect, T maxDifference = std::numeric_limits::epsilon()) const; constexpr bool Contains(T X, T Y) const; constexpr bool Contains(const Rect& rect) const; constexpr bool Contains(const Vector2& point) const; constexpr Rect& ExtendTo(T X, T Y); constexpr Rect& ExtendTo(const Rect& rect); constexpr Rect& ExtendTo(const Vector2& point); constexpr Vector2 GetCenter() const; constexpr Vector2 GetCorner(RectCorner corner) const; constexpr EnumArray> GetCorners() const; constexpr Vector2 GetLengths() const; constexpr Vector2 GetMaximum() const; constexpr Vector2 GetMinimum() const; constexpr Vector2 GetNegativeVertex(const Vector2& normal) const; constexpr Vector2 GetPosition() const; constexpr Vector2 GetPositiveVertex(const Vector2& normal) const; constexpr bool Intersect(const Rect& rect, Rect* intersection = nullptr) const; constexpr bool IsNull() const; constexpr bool IsValid() const; constexpr Rect& Scale(T scalar); constexpr Rect& Scale(const Vector2& vec); constexpr Rect& ScaleAroundCenter(T scalar); constexpr Rect& ScaleAroundCenter(const Vector2& vec); std::string ToString() const; constexpr Rect& Translate(const Vector2& translation); constexpr T& operator[](std::size_t i); constexpr const T& operator[](std::size_t i) const; constexpr Rect& operator=(const Rect&) = default; constexpr Rect& operator=(Rect&&) noexcept = default; constexpr bool operator==(const Rect& rect) const; constexpr bool operator!=(const Rect& rect) const; static constexpr bool ApproxEqual(const Rect& lhs, const Rect& rhs, T maxDifference = std::numeric_limits::epsilon()); static constexpr Rect FromExtends(const Vector2& vec1, const Vector2& vec2); static constexpr Rect Lerp(const Rect& from, const Rect& to, T interpolation); static constexpr Rect Invalid(); static constexpr Rect Zero(); T x, y, width, height; }; using Rectd = Rect; using Rectf = Rect; using Recti = Rect; using Rectui = Rect; using Recti32 = Rect; using Recti64 = Rect; using Rectui32 = Rect; using Rectui64 = Rect; template bool Serialize(SerializationContext& context, const Rect& rect, TypeTag>); template bool Unserialize(SerializationContext& context, Rect* rect, TypeTag>); template std::ostream& operator<<(std::ostream& out, const Nz::Rect& rect); } #include #endif // NAZARA_MATH_RECT_HPP