Graphics: Add RenderSystem and frame pipeline
This commit is contained in:
48
include/Nazara/Graphics/Components/CameraComponent.hpp
Normal file
48
include/Nazara/Graphics/Components/CameraComponent.hpp
Normal file
@@ -0,0 +1,48 @@
|
||||
// Copyright (C) 2021 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Graphics module"
|
||||
// For conditions of distribution and use, see copyright notice in Config.hpp
|
||||
|
||||
#pragma once
|
||||
|
||||
#ifndef NAZARA_CAMERACOMPONENT_HPP
|
||||
#define NAZARA_CAMERACOMPONENT_HPP
|
||||
|
||||
#include <Nazara/Prerequisites.hpp>
|
||||
#include <Nazara/Graphics/AbstractViewer.hpp>
|
||||
#include <Nazara/Graphics/Enums.hpp>
|
||||
#include <Nazara/Graphics/ViewerInstance.hpp>
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
class NAZARA_GRAPHICS_API CameraComponent : public AbstractViewer
|
||||
{
|
||||
public:
|
||||
inline CameraComponent(const RenderTarget* renderTarget, ProjectionType projectionType = ProjectionType::Perspective);
|
||||
CameraComponent(const CameraComponent&) = default;
|
||||
CameraComponent(CameraComponent&&) = default;
|
||||
~CameraComponent() = default;
|
||||
|
||||
const RenderTarget& GetRenderTarget() override;
|
||||
ViewerInstance& GetViewerInstance() override;
|
||||
const ViewerInstance& GetViewerInstance() const override;
|
||||
|
||||
inline void UpdateTarget(const RenderTarget* framebuffer);
|
||||
inline void UpdateProjectionType(ProjectionType projectionType);
|
||||
|
||||
CameraComponent& operator=(const CameraComponent&) = default;
|
||||
CameraComponent& operator=(CameraComponent&&) = default;
|
||||
|
||||
private:
|
||||
inline void UpdateProjectionMatrix();
|
||||
|
||||
const RenderTarget* m_renderTarget;
|
||||
ProjectionType m_projectionType;
|
||||
ViewerInstance m_viewerInstance;
|
||||
};
|
||||
}
|
||||
|
||||
#include <Nazara/Graphics/Components/CameraComponent.inl>
|
||||
|
||||
#endif
|
||||
42
include/Nazara/Graphics/Components/CameraComponent.inl
Normal file
42
include/Nazara/Graphics/Components/CameraComponent.inl
Normal file
@@ -0,0 +1,42 @@
|
||||
// Copyright (C) 2021 Jérôme Leclercq
|
||||
// This file is part of the "Nazara Engine - Utility module"
|
||||
// For conditions of distribution and use, see copyright notice in Prerequisites.hpp
|
||||
|
||||
#include <Nazara/Graphics/Components/CameraComponent.hpp>
|
||||
#include <Nazara/Graphics/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline CameraComponent::CameraComponent(const RenderTarget* renderTarget, ProjectionType projectionType) :
|
||||
m_projectionType(projectionType),
|
||||
m_renderTarget(renderTarget)
|
||||
{
|
||||
UpdateProjectionMatrix();
|
||||
}
|
||||
|
||||
inline void CameraComponent::UpdateTarget(const RenderTarget* renderTarget)
|
||||
{
|
||||
m_renderTarget = renderTarget;
|
||||
}
|
||||
|
||||
inline void CameraComponent::UpdateProjectionType(ProjectionType projectionType)
|
||||
{
|
||||
m_projectionType = projectionType;
|
||||
UpdateProjectionMatrix();
|
||||
}
|
||||
|
||||
inline void CameraComponent::UpdateProjectionMatrix()
|
||||
{
|
||||
//FIXME
|
||||
switch (m_projectionType)
|
||||
{
|
||||
case ProjectionType::Orthographic:
|
||||
m_viewerInstance.UpdateProjectionMatrix(Nz::Matrix4f::Ortho(0.f, 1920.f, 0.f, 1080.f));
|
||||
break;
|
||||
|
||||
case ProjectionType::Perspective:
|
||||
m_viewerInstance.UpdateProjectionMatrix(Nz::Matrix4f::Perspective(Nz::DegreeAnglef(70.f), 16.f / 9.f, 1.f, 1000.f));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -19,7 +19,7 @@ namespace Nz
|
||||
class NAZARA_GRAPHICS_API GraphicsComponent
|
||||
{
|
||||
public:
|
||||
GraphicsComponent() = default;
|
||||
GraphicsComponent();
|
||||
GraphicsComponent(const GraphicsComponent&) = default;
|
||||
GraphicsComponent(GraphicsComponent&&) = default;
|
||||
~GraphicsComponent() = default;
|
||||
@@ -34,9 +34,12 @@ namespace Nz
|
||||
GraphicsComponent& operator=(const GraphicsComponent&) = default;
|
||||
GraphicsComponent& operator=(GraphicsComponent&&) = default;
|
||||
|
||||
NazaraSignal(OnRenderableAttached, GraphicsComponent* /*graphicsComponent*/, const std::shared_ptr<InstancedRenderable>& /*renderable*/);
|
||||
NazaraSignal(OnRenderableDetach, GraphicsComponent* /*graphicsComponent*/, const std::shared_ptr<InstancedRenderable>& /*renderable*/);
|
||||
|
||||
private:
|
||||
std::vector<std::shared_ptr<InstancedRenderable>> m_renderables;
|
||||
WorldInstance m_worldInstance;
|
||||
std::unique_ptr<WorldInstance> m_worldInstance;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -2,22 +2,32 @@
|
||||
// This file is part of the "Nazara Engine - Utility module"
|
||||
// For conditions of distribution and use, see copyright notice in Prerequisites.hpp
|
||||
|
||||
#include <Nazara/Utility/Components/NodeComponent.hpp>
|
||||
#include <Nazara/Utility/Debug.hpp>
|
||||
#include "GraphicsComponent.hpp"
|
||||
#include <Nazara/Graphics/Components/GraphicsComponent.hpp>
|
||||
#include <Nazara/Graphics/Debug.hpp>
|
||||
|
||||
namespace Nz
|
||||
{
|
||||
inline GraphicsComponent::GraphicsComponent()
|
||||
{
|
||||
m_worldInstance = std::make_unique<WorldInstance>(); //< FIXME
|
||||
}
|
||||
|
||||
inline void GraphicsComponent::AttachRenderable(std::shared_ptr<InstancedRenderable> renderable)
|
||||
{
|
||||
m_renderables.push_back(std::move(renderable));
|
||||
|
||||
OnRenderableAttached(this, m_renderables.back());
|
||||
}
|
||||
|
||||
inline void GraphicsComponent::DetachRenderable(const std::shared_ptr<InstancedRenderable>& renderable)
|
||||
{
|
||||
auto it = std::find(m_renderables.begin(), m_renderables.end(), renderable);
|
||||
if (it != m_renderables.end())
|
||||
{
|
||||
OnRenderableDetach(this, renderable);
|
||||
|
||||
m_renderables.erase(it);
|
||||
}
|
||||
}
|
||||
|
||||
inline const std::vector<std::shared_ptr<InstancedRenderable>>& GraphicsComponent::GetRenderables() const
|
||||
@@ -27,11 +37,11 @@ namespace Nz
|
||||
|
||||
inline WorldInstance& GraphicsComponent::GetWorldInstance()
|
||||
{
|
||||
return m_worldInstance;
|
||||
return *m_worldInstance;
|
||||
}
|
||||
|
||||
inline const WorldInstance& GraphicsComponent::GetWorldInstance() const
|
||||
{
|
||||
return m_worldInstance;
|
||||
return *m_worldInstance;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user