// Copyright (C) 2023 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Math module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_MATH_RECT_HPP #define NAZARA_MATH_RECT_HPP #include #include #include namespace Nz { struct SerializationContext; template class Rect { public: Rect() = default; Rect(T Width, T Height); Rect(T X, T Y, T Width, T Height); explicit Rect(const Vector2& lengths); explicit Rect(const Vector2& pos, const Vector2& lengths); template explicit Rect(const Rect& rect); Rect(const Rect&) = default; Rect(Rect&&) noexcept = default; ~Rect() = default; bool ApproxEquals(const Rect& rect, T maxDifference = 0) const; bool Contains(T X, T Y) const; bool Contains(const Rect& rect) const; bool Contains(const Vector2& point) const; Rect& ExtendTo(T X, T Y); Rect& ExtendTo(const Rect& rect); Rect& ExtendTo(const Vector2& point); Vector2 GetCenter() const; Vector2 GetCorner(RectCorner corner) const; Vector2 GetLengths() const; Vector2 GetMaximum() const; Vector2 GetMinimum() const; Vector2 GetNegativeVertex(const Vector2& normal) const; Vector2 GetPosition() const; Vector2 GetPositiveVertex(const Vector2& normal) const; bool Intersect(const Rect& rect, Rect* intersection = nullptr) const; bool IsNull() const; bool IsValid() const; Rect& MakeZero(); Rect& Scale(T scalar); Rect& Scale(const Vector2& vec); std::string ToString() const; Rect& Translate(const Vector2& translation); T& operator[](std::size_t i); const T& operator[](std::size_t i) const; Rect& operator=(const Rect&) = default; Rect& operator=(Rect&&) noexcept = default; bool operator==(const Rect& rect) const; bool operator!=(const Rect& rect) const; static Rect FromExtends(const Vector2& vec1, const Vector2& vec2); static Rect Lerp(const Rect& from, const Rect& to, T interpolation); static Rect Invalid(); static 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