// 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_FRUSTUM_HPP #define NAZARA_MATH_FRUSTUM_HPP #include #include #include #include #include #include #include #include #include #include #include namespace Nz { struct SerializationContext; template class Frustum { public: constexpr Frustum() = default; constexpr explicit Frustum(const EnumArray>& planes); template constexpr explicit Frustum(const Frustum& frustum); constexpr Frustum(const Frustum&) = default; constexpr Frustum(Frustum&&) = default; ~Frustum() = default; constexpr bool ApproxEqual(const Frustum& frustum, T maxDifference = std::numeric_limits::epsilon()) const; constexpr Vector3 ComputeCorner(BoxCorner corner) const; constexpr EnumArray> ComputeCorners() const; constexpr bool Contains(const BoundingVolume& volume) const; constexpr bool Contains(const Box& box) const; constexpr bool Contains(const OrientedBox& orientedBox) const; constexpr bool Contains(const Sphere& sphere) const; constexpr bool Contains(const Vector3& point) const; constexpr bool Contains(const Vector3* points, std::size_t pointCount) const; constexpr Box GetAABB() const; constexpr const Plane& GetPlane(FrustumPlane plane) const; constexpr const EnumArray>& GetPlanes() const; constexpr IntersectionSide Intersect(const BoundingVolume& volume) const; constexpr IntersectionSide Intersect(const Box& box) const; constexpr IntersectionSide Intersect(const OrientedBox& orientedBox) const; constexpr IntersectionSide Intersect(const Sphere& sphere) const; constexpr IntersectionSide Intersect(const Vector3* points, std::size_t pointCount) const; constexpr Frustum Reduce(T nearFactor, T farFactor) const; template constexpr void Split(std::initializer_list splitFactors, F&& callback) const; template constexpr void Split(const T* splitFactors, std::size_t factorCount, F&& callback) const; std::string ToString() const; constexpr Frustum& operator=(const Frustum&) = default; constexpr Frustum& operator=(Frustum&&) = default; constexpr bool operator==(const Frustum& angles) const; constexpr bool operator!=(const Frustum& angles) const; static constexpr bool ApproxEqual(const Frustum& lhs, const Frustum& rhs, T maxDifference = std::numeric_limits::epsilon()); static Frustum Build(RadianAngle angle, T ratio, T zNear, T zFar, const Vector3& eye, const Vector3& target, const Vector3& up = Vector3::Up()); static Frustum Extract(const Matrix4& viewProjMatrix); template friend bool Serialize(SerializationContext& context, const Frustum& frustum, TypeTag>); template friend bool Unserialize(SerializationContext& context, Frustum* frustum, TypeTag>); private: EnumArray> m_planes; }; using Frustumd = Frustum; using Frustumf = Frustum; template std::ostream& operator<<(std::ostream& out, const Nz::Frustum& frustum); } #include #endif // NAZARA_MATH_FRUSTUM_HPP