diff --git a/SDK/include/NDK/Components/CameraComponent.hpp b/SDK/include/NDK/Components/CameraComponent.hpp index 587c869ac..d0e1e91a6 100644 --- a/SDK/include/NDK/Components/CameraComponent.hpp +++ b/SDK/include/NDK/Components/CameraComponent.hpp @@ -10,6 +10,7 @@ #include #include #include +#include #include #include #include @@ -18,12 +19,14 @@ namespace Ndk { class Entity; - class NDK_API CameraComponent : public Component, NzNode::Listener, NzRenderTarget::Listener + class NDK_API CameraComponent : public Component, public NzAbstractViewer, NzNode::Listener, NzRenderTarget::Listener { public: CameraComponent(); ~CameraComponent(); + void ApplyView() const override; + void EnsureFrustumUpdate() const; void EnsureProjectionMatrixUpdate() const; void EnsureViewMatrixUpdate() const; diff --git a/SDK/src/NDK/Components/CameraComponent.cpp b/SDK/src/NDK/Components/CameraComponent.cpp index 4bda6b306..fe0cf28e2 100644 --- a/SDK/src/NDK/Components/CameraComponent.cpp +++ b/SDK/src/NDK/Components/CameraComponent.cpp @@ -3,11 +3,40 @@ // For conditions of distribution and use, see copyright notice in Prerequesites.hpp #include +#include #include #include namespace Ndk { + void CameraComponent::ApplyView() const + { + NazaraAssert(m_target, "CameraComponent has no target"); + + EnsureProjectionMatrixUpdate(); + EnsureViewMatrixUpdate(); + EnsureViewportUpdate(); + + NzRenderer::SetMatrix(nzMatrixType_Projection, m_projectionMatrix); + NzRenderer::SetMatrix(nzMatrixType_View, m_viewMatrix); + NzRenderer::SetTarget(m_target); + NzRenderer::SetViewport(m_viewport); + } + + NzVector3f CameraComponent::GetEyePosition() const + { + NazaraAssert(m_entity && m_entity->HasComponent(), "CameraComponent requires NodeComponent"); + + return m_entity->GetComponent().GetPosition(); + } + + NzVector3f CameraComponent::GetForward() const + { + NazaraAssert(m_entity && m_entity->HasComponent(), "CameraComponent requires NodeComponent"); + + return m_entity->GetComponent().GetForward(); + } + void CameraComponent::SetLayer(unsigned int layer) { m_layer = layer; diff --git a/SDK/src/NDK/Systems/RenderSystem.cpp b/SDK/src/NDK/Systems/RenderSystem.cpp index e114499e7..632d053d2 100644 --- a/SDK/src/NDK/Systems/RenderSystem.cpp +++ b/SDK/src/NDK/Systems/RenderSystem.cpp @@ -5,6 +5,7 @@ #include #include #include +#include namespace Ndk { @@ -14,6 +15,13 @@ namespace Ndk void RenderSystem::Update(float elapsedTime) { + for (const Ndk::EntityHandle& camera : m_cameras) + { + CameraComponent& camComponent = camera->GetComponent(); + NodeComponent& cameraNode = camera->GetComponent(); + + camComponent.ApplyView(); + } } void RenderSystem::OnEntityRemoved(Entity* entity) @@ -24,7 +32,7 @@ namespace Ndk void RenderSystem::OnEntityValidation(Entity* entity, bool justAdded) { - if (entity->HasComponent()) + if (entity->HasComponent() && entity->HasComponent()) { m_cameras.Insert(entity); std::sort(m_cameras.begin(), m_cameras.end(), [](const EntityHandle& handle1, const EntityHandle& handle2) @@ -35,7 +43,7 @@ namespace Ndk else m_cameras.Remove(entity); - if (entity->HasComponent()) + if (entity->HasComponent() && entity->HasComponent()) m_drawables.Insert(entity); else m_drawables.Remove(entity);