Added RenderTarget listeners
Moved Camera matrices assignation to RenderTechnique Former-commit-id: c8a4ff4b35d40702f047fdfd3fdbc4e4fbbbb1a9
This commit is contained in:
@@ -10,9 +10,11 @@
|
||||
|
||||
NzCamera::NzCamera() :
|
||||
m_viewport(0.f, 0.f, 1.f, 1.f),
|
||||
m_target(nullptr),
|
||||
m_frustumUpdated(false),
|
||||
m_projectionMatrixUpdated(false),
|
||||
m_viewMatrixUpdated(false),
|
||||
m_viewportUpdated(false),
|
||||
m_aspectRatio(0.f),
|
||||
m_fov(70.f),
|
||||
m_zFar(100.f),
|
||||
@@ -20,50 +22,27 @@ m_zNear(1.f)
|
||||
{
|
||||
}
|
||||
|
||||
NzCamera::~NzCamera() = default;
|
||||
NzCamera::~NzCamera()
|
||||
{
|
||||
if (m_target)
|
||||
m_target->RemoveListener(this);
|
||||
}
|
||||
|
||||
void NzCamera::Activate()
|
||||
{
|
||||
#ifdef NAZARA_GRAPHICS_SAFE
|
||||
if (!m_target)
|
||||
{
|
||||
NazaraError("No render target !");
|
||||
NazaraError("Camera has no render target");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!m_viewportUpdated)
|
||||
UpdateViewport();
|
||||
|
||||
NzRenderer::SetTarget(m_target);
|
||||
|
||||
unsigned int width = m_target->GetWidth();
|
||||
unsigned int height = std::max(m_target->GetHeight(), 1U);
|
||||
|
||||
float vWidth = width * m_viewport.width;
|
||||
float vHeight = height * m_viewport.height;
|
||||
|
||||
NzRectui viewport;
|
||||
viewport.x = width * m_viewport.x;
|
||||
viewport.y = height * m_viewport.x;
|
||||
viewport.width = vWidth;
|
||||
viewport.height = height * m_viewport.height;
|
||||
NzRenderer::SetViewport(viewport);
|
||||
|
||||
float aspectRatio = vWidth/vHeight;
|
||||
|
||||
if (!NzNumberEquals(m_aspectRatio, aspectRatio))
|
||||
{
|
||||
m_aspectRatio = aspectRatio;
|
||||
m_frustumUpdated = false;
|
||||
m_projectionMatrixUpdated = false;
|
||||
}
|
||||
|
||||
if (!m_projectionMatrixUpdated)
|
||||
UpdateProjectionMatrix();
|
||||
|
||||
if (!m_viewMatrixUpdated)
|
||||
UpdateViewMatrix();
|
||||
|
||||
NzRenderer::SetMatrix(nzMatrixType_Projection, m_projectionMatrix);
|
||||
NzRenderer::SetMatrix(nzMatrixType_View, m_viewMatrix);
|
||||
NzRenderer::SetViewport(m_viewport);
|
||||
|
||||
if (m_scene)
|
||||
m_scene->SetActiveCamera(this);
|
||||
@@ -130,6 +109,11 @@ const NzRenderTarget* NzCamera::GetTarget() const
|
||||
return m_target;
|
||||
}
|
||||
|
||||
const NzRectf& NzCamera::GetTargetRegion() const
|
||||
{
|
||||
return m_targetRegion;
|
||||
}
|
||||
|
||||
const NzMatrix4f& NzCamera::GetViewMatrix() const
|
||||
{
|
||||
if (!m_viewMatrixUpdated)
|
||||
@@ -138,8 +122,19 @@ const NzMatrix4f& NzCamera::GetViewMatrix() const
|
||||
return m_viewMatrix;
|
||||
}
|
||||
|
||||
const NzRectf& NzCamera::GetViewport() const
|
||||
const NzRectui& NzCamera::GetViewport() const
|
||||
{
|
||||
#if NAZARA_GRAPHICS_SAFE
|
||||
if (!m_target)
|
||||
{
|
||||
NazaraError("Camera has no render target");
|
||||
return m_viewport;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!m_viewportUpdated)
|
||||
UpdateViewport();
|
||||
|
||||
return m_viewport;
|
||||
}
|
||||
|
||||
@@ -158,12 +153,18 @@ void NzCamera::SetFOV(float fov)
|
||||
m_fov = fov;
|
||||
|
||||
m_frustumUpdated = false;
|
||||
m_projectionMatrixUpdated= false;
|
||||
m_projectionMatrixUpdated = false;
|
||||
}
|
||||
|
||||
void NzCamera::SetTarget(const NzRenderTarget* renderTarget)
|
||||
{
|
||||
NazaraError(NzString::Pointer(m_target));
|
||||
if (m_target)
|
||||
m_target->RemoveListener(this);
|
||||
|
||||
m_target = renderTarget;
|
||||
if (m_target)
|
||||
m_target->AddListener(this);
|
||||
}
|
||||
|
||||
void NzCamera::SetTarget(const NzRenderTarget& renderTarget)
|
||||
@@ -171,9 +172,27 @@ void NzCamera::SetTarget(const NzRenderTarget& renderTarget)
|
||||
SetTarget(&renderTarget);
|
||||
}
|
||||
|
||||
void NzCamera::SetViewport(const NzRectf& viewport)
|
||||
void NzCamera::SetTargetRegion(const NzRectf& region)
|
||||
{
|
||||
m_viewport = viewport;
|
||||
m_targetRegion = region;
|
||||
m_viewportUpdated = false;
|
||||
}
|
||||
|
||||
void NzCamera::SetViewport(const NzRectui& viewport)
|
||||
{
|
||||
#if NAZARA_GRAPHICS_SAFE
|
||||
if (!m_target)
|
||||
{
|
||||
NazaraError("Camera has no render target");
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// On calcule la région nécessaire pour produire ce viewport avec la taille actuelle de la cible
|
||||
float invWidth = 1.f/m_target->GetWidth();
|
||||
float invHeight = 1.f/m_target->GetHeight();
|
||||
|
||||
SetTargetRegion(NzRectf(invWidth * viewport.x, invHeight * viewport.y, invWidth * viewport.width, invHeight * viewport.height));
|
||||
}
|
||||
|
||||
void NzCamera::SetZFar(float zFar)
|
||||
@@ -196,17 +215,40 @@ void NzCamera::AddToRenderQueue(NzAbstractRenderQueue* renderQueue) const
|
||||
{
|
||||
NazaraUnused(renderQueue);
|
||||
|
||||
NazaraInternalError("SceneNode::AddToRenderQueue() called on SceneRoot");
|
||||
NazaraInternalError("SceneNode::AddToRenderQueue() called on Camera");
|
||||
}
|
||||
|
||||
void NzCamera::Invalidate()
|
||||
{
|
||||
NzSceneNode::Invalidate();
|
||||
|
||||
// Le frustum et la view matrix dépendent des paramètres du node, invalidons-les
|
||||
m_frustumUpdated = false;
|
||||
m_viewMatrixUpdated = false;
|
||||
}
|
||||
|
||||
void NzCamera::OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
if (renderTarget == m_target)
|
||||
m_target = nullptr;
|
||||
else
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
|
||||
}
|
||||
|
||||
bool NzCamera::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata)
|
||||
{
|
||||
NazaraUnused(userdata);
|
||||
|
||||
if (renderTarget == m_target)
|
||||
m_viewportUpdated = false;
|
||||
else
|
||||
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
void NzCamera::Register()
|
||||
{
|
||||
}
|
||||
@@ -242,6 +284,29 @@ void NzCamera::UpdateViewMatrix() const
|
||||
m_viewMatrixUpdated = true;
|
||||
}
|
||||
|
||||
void NzCamera::UpdateViewport() const
|
||||
{
|
||||
unsigned int width = m_target->GetWidth();
|
||||
unsigned int height = std::max(m_target->GetHeight(), 1U);
|
||||
|
||||
float vWidth = width * m_viewport.width;
|
||||
float vHeight = height * m_viewport.height;
|
||||
float aspectRatio = vWidth/vHeight;
|
||||
|
||||
if (!NzNumberEquals(m_aspectRatio, aspectRatio, 0.001f))
|
||||
{
|
||||
m_aspectRatio = aspectRatio;
|
||||
m_frustumUpdated = false;
|
||||
m_projectionMatrixUpdated = false;
|
||||
}
|
||||
|
||||
m_viewport.x = width * m_targetRegion.x;
|
||||
m_viewport.y = height * m_targetRegion.y;
|
||||
m_viewport.width = vWidth;
|
||||
m_viewport.height = vHeight;
|
||||
m_viewportUpdated = true;
|
||||
}
|
||||
|
||||
bool NzCamera::VisibilityTest(const NzFrustumf& frustum)
|
||||
{
|
||||
NazaraUnused(frustum);
|
||||
|
||||
Reference in New Issue
Block a user