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()));
Nz::ForwardFramePipeline framePipeline;
framePipeline.RegisterViewer(&camera);
framePipeline.RegisterViewer(&camera, 0);
framePipeline.RegisterInstancedDrawable(modelInstance, &model, 0xFFFFFFFF);
framePipeline.RegisterInstancedDrawable(modelInstance2, &model, 0xFFFFFFFF);

View File

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

View File

@ -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;

View File

@ -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;

View File

@ -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<std::unique_ptr<RenderElement>> depthPrepassRenderElements;
std::vector<std::unique_ptr<RenderElement>> forwardRenderElements;
std::vector<std::unique_ptr<ElementRendererData>> elementRendererData;
Int32 renderOrder = 0;
RenderQueueRegistry depthPrepassRegistry;
RenderQueueRegistry forwardRegistry;
RenderQueue<RenderElement*> depthPrepassRenderQueue;

View File

@ -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;

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_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)
{