diff --git a/ChangeLog.md b/ChangeLog.md index 92a2f313a..d12b740ab 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -132,6 +132,7 @@ Nazara Engine: - Added movement with Ctrl in TextAreaWidget - Added Unicode Data downloader/parser - Integrated Unicode Data +- Added CullingList::FillWithAllEntries method Nazara Development Kit: - Added ImageWidget (#139) @@ -186,6 +187,7 @@ Nazara Development Kit: - Fixed GraphicsComponent copy constructor not copying scissor rect - Force parent parameter to be present in widgets constructor - Added the possibility to write only specific characters with a predicate in TextAreaWidget +- It is now possible to disable object culling in the RenderSystem # 0.4: diff --git a/SDK/include/NDK/Systems/RenderSystem.hpp b/SDK/include/NDK/Systems/RenderSystem.hpp index 1cfa1eabf..3b9d3f239 100644 --- a/SDK/include/NDK/Systems/RenderSystem.hpp +++ b/SDK/include/NDK/Systems/RenderSystem.hpp @@ -25,12 +25,13 @@ namespace Ndk { public: RenderSystem(); - inline RenderSystem(const RenderSystem& renderSystem); ~RenderSystem() = default; template T& ChangeRenderTechnique(); inline Nz::AbstractRenderTechnique& ChangeRenderTechnique(std::unique_ptr&& renderTechnique); + inline void EnableCulling(bool enable); + inline const Nz::BackgroundRef& GetDefaultBackground() const; inline const Nz::Matrix4f& GetCoordinateSystemMatrix() const; inline Nz::Vector3f GetGlobalForward() const; @@ -38,6 +39,8 @@ namespace Ndk inline Nz::Vector3f GetGlobalUp() const; inline Nz::AbstractRenderTechnique& GetRenderTechnique() const; + inline bool IsCullingEnabled() const; + inline void SetDefaultBackground(Nz::BackgroundRef background); inline void SetGlobalForward(const Nz::Vector3f& direction); inline void SetGlobalRight(const Nz::Vector3f& direction); @@ -72,6 +75,7 @@ namespace Ndk Nz::RenderTexture m_shadowRT; bool m_coordinateSystemInvalidated; bool m_forceRenderQueueInvalidation; + bool m_isCullingEnabled; }; } diff --git a/SDK/include/NDK/Systems/RenderSystem.inl b/SDK/include/NDK/Systems/RenderSystem.inl index 7018ceef2..335026f17 100644 --- a/SDK/include/NDK/Systems/RenderSystem.inl +++ b/SDK/include/NDK/Systems/RenderSystem.inl @@ -2,6 +2,8 @@ // This file is part of the "Nazara Development Kit" // For conditions of distribution and use, see copyright notice in Prerequisites.hpp +#include + namespace Ndk { /*! @@ -26,7 +28,24 @@ namespace Ndk inline Nz::AbstractRenderTechnique& RenderSystem::ChangeRenderTechnique(std::unique_ptr&& renderTechnique) { m_renderTechnique = std::move(renderTechnique); - return *m_renderTechnique.get(); + return *m_renderTechnique; + } + + /*! + * \brief Enables/disables object culling + * + * Object culling is an algorithm used by the render system to detect invisible objects (which will not appear on screen) before they are rendered. + * This includes Frustum Culling and potentially Occlusion Culling. + * + * Disabling this is not recommended, as the system will draw every object in the world which could induce a performance loss. + * + * \param enable Whether to enable or disable culling + * + * \see IsCullingEnabled + */ + inline void RenderSystem::EnableCulling(bool enable) + { + m_isCullingEnabled = enable; } /*! @@ -89,6 +108,17 @@ namespace Ndk return *m_renderTechnique.get(); } + /*! + * \brief Query if culling is enabled (enabled by default) + * \return True if culling is enabled, false otherwise + * + * \see EnableCulling + */ + inline bool RenderSystem::IsCullingEnabled() const + { + return m_isCullingEnabled; + } + /*! * \brief Sets the background used for rendering * diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index 01ae6b2ac..57da4e78a 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -34,7 +34,8 @@ namespace Ndk RenderSystem::RenderSystem() : m_coordinateSystemMatrix(Nz::Matrix4f::Identity()), m_coordinateSystemInvalidated(true), - m_forceRenderQueueInvalidation(false) + m_forceRenderQueueInvalidation(false), + m_isCullingEnabled(true) { ChangeRenderTechnique(); SetDefaultBackground(Nz::ColorBackground::New()); @@ -203,7 +204,11 @@ namespace Ndk bool forceInvalidation = false; - std::size_t visibilityHash = m_drawableCulling.Cull(camComponent.GetFrustum(), &forceInvalidation); + std::size_t visibilityHash; + if (m_isCullingEnabled) + visibilityHash = m_drawableCulling.Cull(camComponent.GetFrustum(), &forceInvalidation); + else + visibilityHash = m_drawableCulling.FillWithAllEntries(); // Always regenerate renderqueue if particle groups are present for now (FIXME) if (!m_lights.empty() || !m_particleGroups.empty()) diff --git a/include/Nazara/Graphics/CullingList.hpp b/include/Nazara/Graphics/CullingList.hpp index af48f2542..df8be7d48 100644 --- a/include/Nazara/Graphics/CullingList.hpp +++ b/include/Nazara/Graphics/CullingList.hpp @@ -41,6 +41,8 @@ namespace Nz std::size_t Cull(const Frustumf& frustum, bool* forceInvalidation = nullptr); + std::size_t FillWithAllEntries(); + NoTestEntry RegisterNoTest(const T* renderable); SphereEntry RegisterSphereTest(const T* renderable); VolumeEntry RegisterVolumeTest(const T* renderable); diff --git a/include/Nazara/Graphics/CullingList.inl b/include/Nazara/Graphics/CullingList.inl index 5580efd8b..55aa8e35c 100644 --- a/include/Nazara/Graphics/CullingList.inl +++ b/include/Nazara/Graphics/CullingList.inl @@ -70,6 +70,33 @@ namespace Nz return visibleHash; } + template + std::size_t CullingList::FillWithAllEntries() + { + m_results.clear(); + + std::size_t visibleHash = 0U; + for (NoTestVisibilityEntry& entry : m_noTestList) + { + m_results.push_back(entry.renderable); + Nz::HashCombine(visibleHash, entry.renderable); + } + + for (SphereVisibilityEntry& entry : m_sphereTestList) + { + m_results.push_back(entry.renderable); + Nz::HashCombine(visibleHash, entry.renderable); + } + + for (VolumeVisibilityEntry& entry : m_volumeTestList) + { + m_results.push_back(entry.renderable); + Nz::HashCombine(visibleHash, entry.renderable); + } + + return visibleHash; + } + template auto CullingList::RegisterNoTest(const T* renderable) -> NoTestEntry {