(View) Added Map[Pixel|World]To[World|Pixel] method
Former-commit-id: 39295c71d040d472117cb30c266169476f563e9d
This commit is contained in:
parent
6648fbe577
commit
e873d40ccc
|
|
@ -35,15 +35,20 @@ class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget
|
||||||
NzVector3f GetGlobalForward() const;
|
NzVector3f GetGlobalForward() const;
|
||||||
NzVector3f GetGlobalRight() const;
|
NzVector3f GetGlobalRight() const;
|
||||||
NzVector3f GetGlobalUp() const;
|
NzVector3f GetGlobalUp() const;
|
||||||
|
const NzMatrix4f& GetInvViewProjMatrix() const;
|
||||||
const NzMatrix4f& GetProjectionMatrix() const;
|
const NzMatrix4f& GetProjectionMatrix() const;
|
||||||
const NzVector2f& GetSize() const;
|
const NzVector2f& GetSize() const;
|
||||||
const NzRenderTarget* GetTarget() const;
|
const NzRenderTarget* GetTarget() const;
|
||||||
const NzRectf& GetTargetRegion() const;
|
const NzRectf& GetTargetRegion() const;
|
||||||
const NzMatrix4f& GetViewMatrix() const;
|
const NzMatrix4f& GetViewMatrix() const;
|
||||||
|
const NzMatrix4f& GetViewProjMatrix() const;
|
||||||
const NzRecti& GetViewport() const;
|
const NzRecti& GetViewport() const;
|
||||||
float GetZFar() const;
|
float GetZFar() const;
|
||||||
float GetZNear() const;
|
float GetZNear() const;
|
||||||
|
|
||||||
|
NzVector2i MapWorldToPixel(const NzVector2f& coords);
|
||||||
|
NzVector2f MapPixelToWorld(const NzVector2i& pixel);
|
||||||
|
|
||||||
void SetSize(const NzVector2f& size);
|
void SetSize(const NzVector2f& size);
|
||||||
void SetSize(float width, float height);
|
void SetSize(float width, float height);
|
||||||
void SetTarget(const NzRenderTarget* renderTarget);
|
void SetTarget(const NzRenderTarget* renderTarget);
|
||||||
|
|
@ -61,20 +66,26 @@ class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget
|
||||||
bool OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata) override;
|
bool OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void* userdata) override;
|
||||||
|
|
||||||
void UpdateFrustum() const;
|
void UpdateFrustum() const;
|
||||||
|
void UpdateInvViewProjMatrix() const;
|
||||||
void UpdateProjectionMatrix() const;
|
void UpdateProjectionMatrix() const;
|
||||||
void UpdateViewMatrix() const;
|
void UpdateViewMatrix() const;
|
||||||
|
void UpdateViewProjMatrix() const;
|
||||||
void UpdateViewport() const;
|
void UpdateViewport() const;
|
||||||
|
|
||||||
mutable NzFrustumf m_frustum;
|
mutable NzFrustumf m_frustum;
|
||||||
|
mutable NzMatrix4f m_invViewProjMatrix;
|
||||||
mutable NzMatrix4f m_projectionMatrix;
|
mutable NzMatrix4f m_projectionMatrix;
|
||||||
mutable NzMatrix4f m_viewMatrix;
|
mutable NzMatrix4f m_viewMatrix;
|
||||||
|
mutable NzMatrix4f m_viewProjMatrix;
|
||||||
NzRectf m_targetRegion;
|
NzRectf m_targetRegion;
|
||||||
mutable NzRecti m_viewport;
|
mutable NzRecti m_viewport;
|
||||||
NzVector2f m_size;
|
NzVector2f m_size;
|
||||||
const NzRenderTarget* m_target;
|
const NzRenderTarget* m_target;
|
||||||
mutable bool m_frustumUpdated;
|
mutable bool m_frustumUpdated;
|
||||||
|
mutable bool m_invViewProjMatrixUpdated;
|
||||||
mutable bool m_projectionMatrixUpdated;
|
mutable bool m_projectionMatrixUpdated;
|
||||||
mutable bool m_viewMatrixUpdated;
|
mutable bool m_viewMatrixUpdated;
|
||||||
|
mutable bool m_viewProjMatrixUpdated;
|
||||||
mutable bool m_viewportUpdated;
|
mutable bool m_viewportUpdated;
|
||||||
float m_zFar;
|
float m_zFar;
|
||||||
float m_zNear;
|
float m_zNear;
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,10 @@ m_targetRegion(0.f, 0.f, 1.f, 1.f),
|
||||||
m_size(0.f),
|
m_size(0.f),
|
||||||
m_target(nullptr),
|
m_target(nullptr),
|
||||||
m_frustumUpdated(false),
|
m_frustumUpdated(false),
|
||||||
|
m_invViewProjMatrixUpdated(false),
|
||||||
m_projectionMatrixUpdated(false),
|
m_projectionMatrixUpdated(false),
|
||||||
m_viewMatrixUpdated(false),
|
m_viewMatrixUpdated(false),
|
||||||
|
m_viewProjMatrixUpdated(false),
|
||||||
m_viewportUpdated(false),
|
m_viewportUpdated(false),
|
||||||
m_zFar(1.f),
|
m_zFar(1.f),
|
||||||
m_zNear(-1.f)
|
m_zNear(-1.f)
|
||||||
|
|
@ -95,6 +97,14 @@ NzVector3f NzView::GetGlobalUp() const
|
||||||
return -NzVector3f::UnitY();
|
return -NzVector3f::UnitY();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NzMatrix4f& NzView::GetInvViewProjMatrix() const
|
||||||
|
{
|
||||||
|
if (!m_invViewProjMatrixUpdated)
|
||||||
|
UpdateInvViewProjMatrix();
|
||||||
|
|
||||||
|
return m_invViewProjMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
const NzMatrix4f& NzView::GetProjectionMatrix() const
|
const NzMatrix4f& NzView::GetProjectionMatrix() const
|
||||||
{
|
{
|
||||||
if (!m_projectionMatrixUpdated)
|
if (!m_projectionMatrixUpdated)
|
||||||
|
|
@ -121,6 +131,14 @@ const NzMatrix4f& NzView::GetViewMatrix() const
|
||||||
return m_viewMatrix;
|
return m_viewMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NzMatrix4f& NzView::GetViewProjMatrix() const
|
||||||
|
{
|
||||||
|
if (!m_viewProjMatrixUpdated)
|
||||||
|
UpdateViewProjMatrix();
|
||||||
|
|
||||||
|
return m_viewProjMatrix;
|
||||||
|
}
|
||||||
|
|
||||||
const NzRecti& NzView::GetViewport() const
|
const NzRecti& NzView::GetViewport() const
|
||||||
{
|
{
|
||||||
#if NAZARA_GRAPHICS_SAFE
|
#if NAZARA_GRAPHICS_SAFE
|
||||||
|
|
@ -147,6 +165,44 @@ float NzView::GetZNear() const
|
||||||
return m_zNear;
|
return m_zNear;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
NzVector2i NzView::MapWorldToPixel(const NzVector2f& coords)
|
||||||
|
{
|
||||||
|
if (!m_viewProjMatrixUpdated)
|
||||||
|
UpdateViewProjMatrix();
|
||||||
|
|
||||||
|
if (!m_viewportUpdated)
|
||||||
|
UpdateViewport();
|
||||||
|
|
||||||
|
// Conversion du viewport en flottant
|
||||||
|
NzRectf viewport(m_viewport);
|
||||||
|
|
||||||
|
NzVector2f normalized = m_viewProjMatrix.Transform(coords);
|
||||||
|
|
||||||
|
NzVector2i pixel;
|
||||||
|
pixel.x = static_cast<int>(( normalized.x + 1.f) * viewport.width / 2.f + viewport.x);
|
||||||
|
pixel.y = static_cast<int>((-normalized.y + 1.f) * viewport.width / 2.f + viewport.y);
|
||||||
|
|
||||||
|
return pixel;
|
||||||
|
}
|
||||||
|
|
||||||
|
NzVector2f NzView::MapPixelToWorld(const NzVector2i& pixel)
|
||||||
|
{
|
||||||
|
if (!m_invViewProjMatrixUpdated)
|
||||||
|
UpdateInvViewProjMatrix();
|
||||||
|
|
||||||
|
if (!m_viewportUpdated)
|
||||||
|
UpdateViewport();
|
||||||
|
|
||||||
|
// Conversion du viewport en flottant
|
||||||
|
NzRectf viewport(m_viewport);
|
||||||
|
|
||||||
|
NzVector2f normalized;
|
||||||
|
normalized.x = -1.f + 2.f * (pixel.x - viewport.x) / viewport.width;
|
||||||
|
normalized.y = 1.f - 2.f * (pixel.y - viewport.y) / viewport.height;
|
||||||
|
|
||||||
|
return m_invViewProjMatrix.Transform(normalized);
|
||||||
|
}
|
||||||
|
|
||||||
void NzView::SetSize(const NzVector2f& size)
|
void NzView::SetSize(const NzVector2f& size)
|
||||||
{
|
{
|
||||||
SetSize(size.x, size.y);
|
SetSize(size.x, size.y);
|
||||||
|
|
@ -178,7 +234,9 @@ void NzView::SetTargetRegion(const NzRectf& region)
|
||||||
m_targetRegion = region;
|
m_targetRegion = region;
|
||||||
|
|
||||||
m_frustumUpdated = false;
|
m_frustumUpdated = false;
|
||||||
|
m_invViewProjMatrixUpdated = false;
|
||||||
m_projectionMatrixUpdated = false;
|
m_projectionMatrixUpdated = false;
|
||||||
|
m_viewProjMatrixUpdated = false;
|
||||||
m_viewportUpdated = false;
|
m_viewportUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -204,7 +262,9 @@ void NzView::SetZFar(float zFar)
|
||||||
m_zFar = zFar;
|
m_zFar = zFar;
|
||||||
|
|
||||||
m_frustumUpdated = false;
|
m_frustumUpdated = false;
|
||||||
|
m_invViewProjMatrixUpdated = false;
|
||||||
m_projectionMatrixUpdated = false;
|
m_projectionMatrixUpdated = false;
|
||||||
|
m_viewProjMatrixUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzView::SetZNear(float zNear)
|
void NzView::SetZNear(float zNear)
|
||||||
|
|
@ -212,7 +272,9 @@ void NzView::SetZNear(float zNear)
|
||||||
m_zNear = zNear;
|
m_zNear = zNear;
|
||||||
|
|
||||||
m_frustumUpdated = false;
|
m_frustumUpdated = false;
|
||||||
|
m_invViewProjMatrixUpdated = false;
|
||||||
m_projectionMatrixUpdated = false;
|
m_projectionMatrixUpdated = false;
|
||||||
|
m_viewProjMatrixUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzView::ApplyView() const
|
void NzView::ApplyView() const
|
||||||
|
|
@ -246,7 +308,9 @@ void NzView::InvalidateNode()
|
||||||
|
|
||||||
// Le frustum et la view matrix dépendent des paramètres du node, invalidons-les
|
// Le frustum et la view matrix dépendent des paramètres du node, invalidons-les
|
||||||
m_frustumUpdated = false;
|
m_frustumUpdated = false;
|
||||||
|
m_invViewProjMatrixUpdated = false;
|
||||||
m_viewMatrixUpdated = false;
|
m_viewMatrixUpdated = false;
|
||||||
|
m_viewProjMatrixUpdated = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void NzView::OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata)
|
void NzView::OnRenderTargetReleased(const NzRenderTarget* renderTarget, void* userdata)
|
||||||
|
|
@ -287,6 +351,15 @@ void NzView::UpdateFrustum() const
|
||||||
m_frustumUpdated = true;
|
m_frustumUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzView::UpdateInvViewProjMatrix() const
|
||||||
|
{
|
||||||
|
if (!m_viewProjMatrixUpdated)
|
||||||
|
UpdateViewProjMatrix();
|
||||||
|
|
||||||
|
m_viewProjMatrix.GetInverseAffine(&m_invViewProjMatrix);
|
||||||
|
m_invViewProjMatrixUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
void NzView::UpdateProjectionMatrix() const
|
void NzView::UpdateProjectionMatrix() const
|
||||||
{
|
{
|
||||||
if (m_size.x <= 0.f || m_size.y <= 0.f) // Si la taille est nulle, on prendra la taille du viewport
|
if (m_size.x <= 0.f || m_size.y <= 0.f) // Si la taille est nulle, on prendra la taille du viewport
|
||||||
|
|
@ -311,6 +384,19 @@ void NzView::UpdateViewMatrix() const
|
||||||
m_viewMatrixUpdated = true;
|
m_viewMatrixUpdated = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void NzView::UpdateViewProjMatrix() const
|
||||||
|
{
|
||||||
|
if (!m_projectionMatrixUpdated)
|
||||||
|
UpdateProjectionMatrix();
|
||||||
|
|
||||||
|
if (!m_viewMatrixUpdated)
|
||||||
|
UpdateViewMatrix();
|
||||||
|
|
||||||
|
// La matrice de projection orthogonale est affine
|
||||||
|
m_viewProjMatrix = NzMatrix4f::ConcatenateAffine(m_viewMatrix, m_projectionMatrix);
|
||||||
|
m_viewProjMatrixUpdated = true;
|
||||||
|
}
|
||||||
|
|
||||||
void NzView::UpdateViewport() const
|
void NzView::UpdateViewport() const
|
||||||
{
|
{
|
||||||
unsigned int width = m_target->GetWidth();
|
unsigned int width = m_target->GetWidth();
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue