diff --git a/examples/GraphicsTest/main.cpp b/examples/GraphicsTest/main.cpp index 92839c297..6543edb53 100644 --- a/examples/GraphicsTest/main.cpp +++ b/examples/GraphicsTest/main.cpp @@ -94,7 +94,7 @@ int main() modelInstance2->UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right())); Nz::ForwardFramePipeline framePipeline; - framePipeline.RegisterViewer(&camera); + framePipeline.RegisterViewer(&camera, 0); framePipeline.RegisterInstancedDrawable(modelInstance, &model, 0xFFFFFFFF); framePipeline.RegisterInstancedDrawable(modelInstance2, &model, 0xFFFFFFFF); diff --git a/examples/PhysicsDemo/main.cpp b/examples/PhysicsDemo/main.cpp index 6f5136ddb..774cd595b 100644 --- a/examples/PhysicsDemo/main.cpp +++ b/examples/PhysicsDemo/main.cpp @@ -165,6 +165,7 @@ int main() { registry.emplace(viewer2D); auto& cameraComponent = registry.emplace(viewer2D, window.GetRenderTarget(), Nz::ProjectionType::Orthographic); + cameraComponent.UpdateRenderOrder(1); cameraComponent.UpdateRenderMask(2); } diff --git a/include/Nazara/Graphics/Camera.hpp b/include/Nazara/Graphics/Camera.hpp index db27ee2ac..b1be0e46a 100644 --- a/include/Nazara/Graphics/Camera.hpp +++ b/include/Nazara/Graphics/Camera.hpp @@ -31,6 +31,7 @@ namespace Nz const Color& GetClearColor() const override; inline DegreeAnglef GetFOV() const; UInt32 GetRenderMask() const override; + inline Int32 GetRenderOrder() const; const RenderTarget& GetRenderTarget() override; inline const Vector2f& GetSize() const; inline const Rectf& GetTargetRegion() const; @@ -44,6 +45,7 @@ namespace Nz inline void UpdateFOV(DegreeAnglef fov); inline void UpdateProjectionType(ProjectionType projectionType); inline void UpdateRenderMask(UInt32 renderMask); + inline void UpdateRenderOrder(Int32 renderOrder); inline void UpdateSize(const Vector2f& size); void UpdateTarget(const RenderTarget* framebuffer); inline void UpdateTargetRegion(const Rectf& targetRegion); @@ -65,6 +67,7 @@ namespace Nz const RenderTarget* m_renderTarget; Color m_clearColor; DegreeAnglef m_fov; + Int32 m_renderOrder; ProjectionType m_projectionType; Rectf m_targetRegion; Recti m_viewport; diff --git a/include/Nazara/Graphics/Camera.inl b/include/Nazara/Graphics/Camera.inl index 212c83384..244579843 100644 --- a/include/Nazara/Graphics/Camera.inl +++ b/include/Nazara/Graphics/Camera.inl @@ -16,6 +16,7 @@ namespace Nz m_targetRegion(0.f, 0.f, 1.f, 1.f), m_viewport(0, 0, 0, 0), m_renderMask(0xFFFFFFFF), + m_renderOrder(0), m_size(-1.f, -1.f), m_zFar((projectionType == ProjectionType::Perspective) ? 1000.f : 1.f), m_zNear((projectionType == ProjectionType::Perspective) ? 1.f : -1.f) @@ -31,6 +32,7 @@ namespace Nz m_targetRegion(camera.m_targetRegion), m_viewport(camera.m_viewport), m_renderMask(camera.m_renderMask), + m_renderOrder(camera.m_renderOrder), m_size(camera.m_size), m_aspectRatio(camera.m_aspectRatio), m_zFar(camera.m_zFar), @@ -47,6 +49,7 @@ namespace Nz m_targetRegion(camera.m_targetRegion), m_viewport(camera.m_viewport), m_renderMask(camera.m_renderMask), + m_renderOrder(camera.m_renderOrder), m_size(camera.m_size), m_aspectRatio(camera.m_aspectRatio), m_zFar(camera.m_zFar), @@ -65,6 +68,11 @@ namespace Nz return m_fov; } + inline Int32 Camera::GetRenderOrder() const + { + return m_renderOrder; + } + inline const Vector2f& Camera::GetSize() const { return m_size; @@ -155,6 +163,13 @@ namespace Nz // TODO: Signal RenderTechnique to regenerate commandbuffers } + inline void Camera::UpdateRenderOrder(Int32 renderOrder) + { + m_renderOrder = renderOrder; + + // TODO: Signal RenderTechnique to regenerate commandbuffers + } + inline void Camera::UpdateTargetRegion(const Rectf& targetRegion) { m_targetRegion = targetRegion; diff --git a/include/Nazara/Graphics/ForwardFramePipeline.hpp b/include/Nazara/Graphics/ForwardFramePipeline.hpp index cfa628df6..dcb612c14 100644 --- a/include/Nazara/Graphics/ForwardFramePipeline.hpp +++ b/include/Nazara/Graphics/ForwardFramePipeline.hpp @@ -40,7 +40,7 @@ namespace Nz void InvalidateWorldInstance(WorldInstance* worldInstance) override; void RegisterInstancedDrawable(WorldInstancePtr worldInstance, const InstancedRenderable* instancedRenderable, UInt32 renderMask) override; - void RegisterViewer(AbstractViewer* viewerInstance) override; + void RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) override; void Render(RenderFrame& renderFrame) override; @@ -86,6 +86,7 @@ namespace Nz std::vector> depthPrepassRenderElements; std::vector> forwardRenderElements; std::vector> elementRendererData; + Int32 renderOrder = 0; RenderQueueRegistry depthPrepassRegistry; RenderQueueRegistry forwardRegistry; RenderQueue depthPrepassRenderQueue; diff --git a/include/Nazara/Graphics/FramePipeline.hpp b/include/Nazara/Graphics/FramePipeline.hpp index 4cb230390..64934e31f 100644 --- a/include/Nazara/Graphics/FramePipeline.hpp +++ b/include/Nazara/Graphics/FramePipeline.hpp @@ -29,7 +29,7 @@ namespace Nz virtual void InvalidateWorldInstance(WorldInstance* worldInstance) = 0; virtual void RegisterInstancedDrawable(WorldInstancePtr worldInstance, const InstancedRenderable* instancedRenderable, UInt32 renderMask) = 0; - virtual void RegisterViewer(AbstractViewer* viewerInstance) = 0; + virtual void RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) = 0; virtual void Render(RenderFrame& renderFrame) = 0; diff --git a/src/Nazara/Graphics/ForwardFramePipeline.cpp b/src/Nazara/Graphics/ForwardFramePipeline.cpp index 0abfff828..bc0fb0ba8 100644 --- a/src/Nazara/Graphics/ForwardFramePipeline.cpp +++ b/src/Nazara/Graphics/ForwardFramePipeline.cpp @@ -125,9 +125,11 @@ namespace Nz } } - void ForwardFramePipeline::RegisterViewer(AbstractViewer* viewerInstance) + void ForwardFramePipeline::RegisterViewer(AbstractViewer* viewerInstance, Int32 renderOrder) { - m_viewers.emplace(viewerInstance, ViewerData{}); + auto& viewerData = m_viewers.emplace(viewerInstance, ViewerData{}).first->second; + viewerData.renderOrder = renderOrder; + m_invalidatedViewerInstances.insert(viewerInstance); m_rebuildFrameGraph = true; } @@ -366,7 +368,12 @@ namespace Nz Recti renderRegion(0, 0, frameSize.x, frameSize.y); const RenderTarget& renderTarget = *renderTargetPtr; - const auto& viewers = viewerDataVec; + auto& viewers = viewerDataVec; + + std::sort(viewers.begin(), viewers.end(), [](const ViewerData* lhs, const ViewerData* rhs) + { + return lhs->renderOrder < rhs->renderOrder; + }); renderFrame.Execute([&](CommandBufferBuilder& builder) {