// 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_BOX_HPP #define NAZARA_MATH_BOX_HPP #include #include #include #include #include #include namespace Nz { struct SerializationContext; template class Box { public: Box() = default; Box(T Width, T Height, T Depth); Box(T X, T Y, T Z, T Width, T Height, T Depth); Box(const Rect& rect); explicit Box(const Vector3& lengths); explicit Box(const Vector3& pos, const Vector3& lengths); template explicit Box(const Box& box); Box(const Box&) = default; Box(Box&&) noexcept = default; ~Box() = default; bool ApproxEquals(const Box& box, T maxDifference = 0) const; bool Contains(T X, T Y, T Z) const; bool Contains(const Box& box) const; bool Contains(const Vector3& point) const; Box& ExtendTo(T X, T Y, T Z); Box& ExtendTo(const Box& box); Box& ExtendTo(const Vector3& point); Sphere GetBoundingSphere() const; Vector3 GetCenter() const; Vector3 GetCorner(BoxCorner corner) const; Vector3 GetLengths() const; Vector3 GetMaximum() const; Vector3 GetMinimum() const; Vector3 GetNegativeVertex(const Vector3& normal) const; Vector3 GetPosition() const; Vector3 GetPositiveVertex(const Vector3& normal) const; T GetRadius() const; Sphere GetSquaredBoundingSphere() const; T GetSquaredRadius() const; bool Intersect(const Box& box, Box* intersection = nullptr) const; bool IsNull() const; bool IsValid() const; Box& Scale(T scalar); Box& Scale(const Vector3& vec); std::string ToString() const; Box& Transform(const Matrix4& matrix, bool applyTranslation = true); Box& Translate(const Vector3& translation); T& operator[](std::size_t i); const T& operator[](std::size_t i) const; Box& operator=(const Box&) = default; Box& operator=(Box&&) noexcept = default; bool operator==(const Box& box) const; bool operator!=(const Box& box) const; static Box FromExtends(const Vector3& vec1, const Vector3& vec2); static Box Lerp(const Box& from, const Box& to, T interpolation); static Box Invalid(); static Box Zero(); T x, y, z, width, height, depth; }; using Boxd = Box; using Boxf = Box; using Boxi = Box; using Boxui = Box; using Boxi32 = Box; using Boxui32 = Box; template bool Serialize(SerializationContext& context, const Box& box, TypeTag>); template bool Unserialize(SerializationContext& context, Box* box, TypeTag>); template std::ostream& operator<<(std::ostream& out, const Nz::Box& box); } #include #endif // NAZARA_MATH_BOX_HPP