// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Mathematics module" // For conditions of distribution and use, see copyright notice in Config.hpp #pragma once #ifndef NAZARA_RECT_HPP #define NAZARA_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); Rect(const T rect[4]); Rect(const Vector2& lengths); Rect(const Vector2& vec1, const Vector2& vec2); template explicit Rect(const Rect& rect); Rect(const Rect& rect) = default; ~Rect() = default; 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 IsValid() const; Rect& MakeZero(); Rect& Set(T Width, T Height); Rect& Set(T X, T Y, T Width, T Height); Rect& Set(const T rect[4]); Rect& Set(const Vector2& lengths); Rect& Set(const Vector2& vec1, const Vector2& vec2); template Rect& Set(const Rect& rect); String ToString() const; Rect& Translate(const Vector2& translation); T& operator[](std::size_t i); T operator[](std::size_t i) const; Rect operator*(T scalar) const; Rect operator*(const Vector2& vec) const; Rect operator/(T scalar) const; Rect operator/(const Vector2& vec) const; Rect& operator=(const Rect& other) = default; Rect& operator*=(T scalar); Rect& operator*=(const Vector2& vec); Rect& operator/=(T scalar); Rect& operator/=(const Vector2& vec); bool operator==(const Rect& rect) const; bool operator!=(const Rect& rect) const; static Rect Lerp(const Rect& from, const Rect& to, T interpolation); 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_RECT_HPP