Graphics/Camera: Add render order property

This commit is contained in:
Jérôme Leclercq 2021-11-28 20:15:22 +01:00
parent d0aad3ee1e
commit 0c3bcf6c86
7 changed files with 33 additions and 6 deletions

View File

@ -94,7 +94,7 @@ int main()
modelInstance2->UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right())); modelInstance2->UpdateWorldMatrix(Nz::Matrix4f::Translate(Nz::Vector3f::Forward() * 2 + Nz::Vector3f::Right()));
Nz::ForwardFramePipeline framePipeline; Nz::ForwardFramePipeline framePipeline;
framePipeline.RegisterViewer(&camera); framePipeline.RegisterViewer(&camera, 0);
framePipeline.RegisterInstancedDrawable(modelInstance, &model, 0xFFFFFFFF); framePipeline.RegisterInstancedDrawable(modelInstance, &model, 0xFFFFFFFF);
framePipeline.RegisterInstancedDrawable(modelInstance2, &model, 0xFFFFFFFF); framePipeline.RegisterInstancedDrawable(modelInstance2, &model, 0xFFFFFFFF);

View File

@ -165,6 +165,7 @@ int main()
{ {
registry.emplace<Nz::NodeComponent>(viewer2D); registry.emplace<Nz::NodeComponent>(viewer2D);
auto& cameraComponent = registry.emplace<Nz::CameraComponent>(viewer2D, window.GetRenderTarget(), Nz::ProjectionType::Orthographic); auto& cameraComponent = registry.emplace<Nz::CameraComponent>(viewer2D, window.GetRenderTarget(), Nz::ProjectionType::Orthographic);
cameraComponent.UpdateRenderOrder(1);
cameraComponent.UpdateRenderMask(2); cameraComponent.UpdateRenderMask(2);
} }

View File

@ -31,6 +31,7 @@ namespace Nz
const Color& GetClearColor() const override; const Color& GetClearColor() const override;
inline DegreeAnglef GetFOV() const; inline DegreeAnglef GetFOV() const;
UInt32 GetRenderMask() const override; UInt32 GetRenderMask() const override;
inline Int32 GetRenderOrder() const;
const RenderTarget& GetRenderTarget() override; const RenderTarget& GetRenderTarget() override;
inline const Vector2f& GetSize() const; inline const Vector2f& GetSize() const;
inline const Rectf& GetTargetRegion() const; inline const Rectf& GetTargetRegion() const;
@ -44,6 +45,7 @@ namespace Nz
inline void UpdateFOV(DegreeAnglef fov); inline void UpdateFOV(DegreeAnglef fov);
inline void UpdateProjectionType(ProjectionType projectionType); inline void UpdateProjectionType(ProjectionType projectionType);
inline void UpdateRenderMask(UInt32 renderMask); inline void UpdateRenderMask(UInt32 renderMask);
inline void UpdateRenderOrder(Int32 renderOrder);
inline void UpdateSize(const Vector2f& size); inline void UpdateSize(const Vector2f& size);
void UpdateTarget(const RenderTarget* framebuffer); void UpdateTarget(const RenderTarget* framebuffer);
inline void UpdateTargetRegion(const Rectf& targetRegion); inline void UpdateTargetRegion(const Rectf& targetRegion);
@ -65,6 +67,7 @@ namespace Nz
const RenderTarget* m_renderTarget; const RenderTarget* m_renderTarget;
Color m_clearColor; Color m_clearColor;
DegreeAnglef m_fov; DegreeAnglef m_fov;
Int32 m_renderOrder;
ProjectionType m_projectionType; ProjectionType m_projectionType;
Rectf m_targetRegion; Rectf m_targetRegion;
Recti m_viewport; Recti m_viewport;

View File

@ -16,6 +16,7 @@ namespace Nz
m_targetRegion(0.f, 0.f, 1.f, 1.f), m_targetRegion(0.f, 0.f, 1.f, 1.f),
m_viewport(0, 0, 0, 0), m_viewport(0, 0, 0, 0),
m_renderMask(0xFFFFFFFF), m_renderMask(0xFFFFFFFF),
m_renderOrder(0),
m_size(-1.f, -1.f), m_size(-1.f, -1.f),
m_zFar((projectionType == ProjectionType::Perspective) ? 1000.f : 1.f), m_zFar((projectionType == ProjectionType::Perspective) ? 1000.f : 1.f),
m_zNear((projectionType == ProjectionType::Perspective) ? 1.f : -1.f) m_zNear((projectionType == ProjectionType::Perspective) ? 1.f : -1.f)
@ -31,6 +32,7 @@ namespace Nz
m_targetRegion(camera.m_targetRegion), m_targetRegion(camera.m_targetRegion),
m_viewport(camera.m_viewport), m_viewport(camera.m_viewport),
m_renderMask(camera.m_renderMask), m_renderMask(camera.m_renderMask),
m_renderOrder(camera.m_renderOrder),
m_size(camera.m_size), m_size(camera.m_size),
m_aspectRatio(camera.m_aspectRatio), m_aspectRatio(camera.m_aspectRatio),
m_zFar(camera.m_zFar), m_zFar(camera.m_zFar),
@ -47,6 +49,7 @@ namespace Nz
m_targetRegion(camera.m_targetRegion), m_targetRegion(camera.m_targetRegion),
m_viewport(camera.m_viewport), m_viewport(camera.m_viewport),
m_renderMask(camera.m_renderMask), m_renderMask(camera.m_renderMask),
m_renderOrder(camera.m_renderOrder),
m_size(camera.m_size), m_size(camera.m_size),
m_aspectRatio(camera.m_aspectRatio), m_aspectRatio(camera.m_aspectRatio),
m_zFar(camera.m_zFar), m_zFar(camera.m_zFar),
@ -65,6 +68,11 @@ namespace Nz
return m_fov; return m_fov;
} }
inline Int32 Camera::GetRenderOrder() const
{
return m_renderOrder;
}
inline const Vector2f& Camera::GetSize() const inline const Vector2f& Camera::GetSize() const
{ {
return m_size; return m_size;
@ -155,6 +163,13 @@ namespace Nz
// TODO: Signal RenderTechnique to regenerate commandbuffers // 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) inline void Camera::UpdateTargetRegion(const Rectf& targetRegion)
{ {
m_targetRegion = targetRegion; m_targetRegion = targetRegion;

View File

@ -40,7 +40,7 @@ namespace Nz
void InvalidateWorldInstance(WorldInstance* worldInstance) override; void InvalidateWorldInstance(WorldInstance* worldInstance) override;
void RegisterInstancedDrawable(WorldInstancePtr worldInstance, const InstancedRenderable* instancedRenderable, UInt32 renderMask) 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; void Render(RenderFrame& renderFrame) override;
@ -86,6 +86,7 @@ namespace Nz
std::vector<std::unique_ptr<RenderElement>> depthPrepassRenderElements; std::vector<std::unique_ptr<RenderElement>> depthPrepassRenderElements;
std::vector<std::unique_ptr<RenderElement>> forwardRenderElements; std::vector<std::unique_ptr<RenderElement>> forwardRenderElements;
std::vector<std::unique_ptr<ElementRendererData>> elementRendererData; std::vector<std::unique_ptr<ElementRendererData>> elementRendererData;
Int32 renderOrder = 0;
RenderQueueRegistry depthPrepassRegistry; RenderQueueRegistry depthPrepassRegistry;
RenderQueueRegistry forwardRegistry; RenderQueueRegistry forwardRegistry;
RenderQueue<RenderElement*> depthPrepassRenderQueue; RenderQueue<RenderElement*> depthPrepassRenderQueue;

View File

@ -29,7 +29,7 @@ namespace Nz
virtual void InvalidateWorldInstance(WorldInstance* worldInstance) = 0; virtual void InvalidateWorldInstance(WorldInstance* worldInstance) = 0;
virtual void RegisterInstancedDrawable(WorldInstancePtr worldInstance, const InstancedRenderable* instancedRenderable, UInt32 renderMask) = 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; virtual void Render(RenderFrame& renderFrame) = 0;

View File

@ -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_invalidatedViewerInstances.insert(viewerInstance);
m_rebuildFrameGraph = true; m_rebuildFrameGraph = true;
} }
@ -366,7 +368,12 @@ namespace Nz
Recti renderRegion(0, 0, frameSize.x, frameSize.y); Recti renderRegion(0, 0, frameSize.x, frameSize.y);
const RenderTarget& renderTarget = *renderTargetPtr; 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) renderFrame.Execute([&](CommandBufferBuilder& builder)
{ {