Made scissor rect/viewport Recti instead of Rectui

Also greatly optimized Renderer::Get[ScissorRect|Viewport]


Former-commit-id: 87945543144216715520a4c3ab30629636995afd
This commit is contained in:
Lynix 2013-08-26 13:37:33 +02:00
parent 7d9eac7660
commit f679f323c2
10 changed files with 258 additions and 115 deletions

View File

@ -31,7 +31,7 @@ class NAZARA_API NzAbstractViewer
virtual const NzMatrix4f& GetProjectionMatrix() const = 0;
virtual const NzRenderTarget* GetTarget() const = 0;
virtual const NzMatrix4f& GetViewMatrix() const = 0;
virtual const NzRectui& GetViewport() const = 0;
virtual const NzRecti& GetViewport() const = 0;
virtual float GetZFar() const = 0;
virtual float GetZNear() const = 0;
};

View File

@ -36,7 +36,7 @@ class NAZARA_API NzCamera : public NzAbstractViewer, public NzNode, NzRenderTarg
const NzRenderTarget* GetTarget() const;
const NzRectf& GetTargetRegion() const;
const NzMatrix4f& GetViewMatrix() const;
const NzRectui& GetViewport() const;
const NzRecti& GetViewport() const;
float GetZFar() const;
float GetZNear() const;
@ -44,7 +44,7 @@ class NAZARA_API NzCamera : public NzAbstractViewer, public NzNode, NzRenderTarg
void SetTarget(const NzRenderTarget* renderTarget);
void SetTarget(const NzRenderTarget& renderTarget);
void SetTargetRegion(const NzRectf& region);
void SetViewport(const NzRectui& viewport);
void SetViewport(const NzRecti& viewport);
void SetZFar(float zFar);
void SetZNear(float zNear);
@ -64,7 +64,7 @@ class NAZARA_API NzCamera : public NzAbstractViewer, public NzNode, NzRenderTarg
mutable NzMatrix4f m_projectionMatrix;
mutable NzMatrix4f m_viewMatrix;
NzRectf m_targetRegion;
mutable NzRectui m_viewport;
mutable NzRecti m_viewport;
const NzRenderTarget* m_target;
mutable bool m_frustumUpdated;
mutable bool m_projectionMatrixUpdated;

View File

@ -35,14 +35,14 @@ class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget
const NzRenderTarget* GetTarget() const;
const NzRectf& GetTargetRegion() const;
const NzMatrix4f& GetViewMatrix() const;
const NzRectui& GetViewport() const;
const NzRecti& GetViewport() const;
float GetZFar() const;
float GetZNear() const;
void SetTarget(const NzRenderTarget* renderTarget);
void SetTarget(const NzRenderTarget& renderTarget);
void SetTargetRegion(const NzRectf& region);
void SetViewport(const NzRectui& viewport);
void SetViewport(const NzRecti& viewport);
void SetZFar(float zFar);
void SetZNear(float zNear);
@ -62,7 +62,7 @@ class NAZARA_API NzView : public NzAbstractViewer, public NzNode, NzRenderTarget
mutable NzMatrix4f m_projectionMatrix;
mutable NzMatrix4f m_viewMatrix;
NzRectf m_targetRegion;
mutable NzRectui m_viewport;
mutable NzRecti m_viewport;
const NzRenderTarget* m_target;
mutable bool m_frustumUpdated;
mutable bool m_projectionMatrixUpdated;

View File

@ -13,9 +13,10 @@
#include <GL3/glcorearb.h>
#include <Nazara/Prerequesites.hpp>
#include <Nazara/Core/String.hpp>
#include <Nazara/Utility/Enums.hpp>
#include <Nazara/Math/Rect.hpp>
#include <Nazara/Renderer/Enums.hpp>
#include <Nazara/Renderer/RenderStates.hpp>
#include <Nazara/Utility/Enums.hpp>
// Inclusion des extensions
#include <GL3/glext.h>
@ -47,6 +48,8 @@ enum nzOpenGLExtension
};
class NzContext;
class NzRenderTarget;
using NzOpenGLFunc = void (*)();
class NAZARA_API NzOpenGL
@ -75,9 +78,11 @@ class NAZARA_API NzOpenGL
static void BindBuffer(nzBufferType type, GLuint id);
static void BindProgram(GLuint id);
static void BindScissorBox(const NzRecti& scissorBox);
static void BindTexture(nzImageType type, GLuint id);
static void BindTexture(unsigned int textureUnit, nzImageType type, GLuint id);
static void BindTextureUnit(unsigned int textureUnit);
static void BindViewport(const NzRecti& viewport);
static void DeleteBuffer(nzBufferType type, GLuint id);
static void DeleteProgram(GLuint id);
@ -85,12 +90,16 @@ class NAZARA_API NzOpenGL
static GLuint GetCurrentBuffer(nzBufferType type);
static GLuint GetCurrentProgram();
static const NzRenderTarget* GetCurrentTarget();
static NzRecti GetCurrentScissorBox();
static GLuint GetCurrentTexture();
static GLuint GetCurrentTexture(unsigned int textureUnit);
static unsigned int GetCurrentTextureUnit();
static NzRecti GetCurrentViewport();
static NzOpenGLFunc GetEntry(const NzString& entryPoint);
static unsigned int GetGLSLVersion();
static NzString GetRendererName();
static unsigned int GetTextureUnit();
static NzString GetVendorName();
static unsigned int GetVersion();
@ -101,10 +110,13 @@ class NAZARA_API NzOpenGL
static bool IsSupported(const NzString& string);
static void SetBuffer(nzBufferType type, GLuint id);
static void SetScissorBox(const NzRecti& scissorBox);
static void SetProgram(GLuint id);
static void SetTarget(const NzRenderTarget* renderTarget);
static void SetTexture(GLuint id);
static void SetTexture(unsigned int textureUnit, GLuint id);
static void SetTextureUnit(unsigned int textureUnit);
static void SetViewport(const NzRecti& viewport);
static bool TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType target);

View File

@ -56,10 +56,10 @@ class NAZARA_API NzRenderer
static unsigned int GetMaxVertexAttribs();
static float GetPointSize();
static const NzRenderStates& GetRenderStates();
static NzRectui GetScissorRect();
static NzRecti GetScissorRect();
static const NzShaderProgram* GetShaderProgram();
static const NzRenderTarget* GetTarget();
static NzRectui GetViewport();
static NzRecti GetViewport();
static bool HasCapability(nzRendererCap capability);
@ -81,7 +81,7 @@ class NAZARA_API NzRenderer
static void SetMatrix(nzMatrixType type, const NzMatrix4f& matrix);
static void SetPointSize(float size);
static void SetRenderStates(const NzRenderStates& states);
static void SetScissorRect(const NzRectui& viewport);
static void SetScissorRect(const NzRecti& rect);
static void SetShaderProgram(const NzShaderProgram* shader);
static void SetStencilCompareFunction(nzRendererComparison compareFunc);
static void SetStencilFailOperation(nzStencilOperation failOperation);
@ -93,7 +93,7 @@ class NAZARA_API NzRenderer
static void SetTexture(nzUInt8 unit, const NzTexture* texture);
static void SetTextureSampler(nzUInt8 textureUnit, const NzTextureSampler& sampler);
static void SetVertexBuffer(const NzVertexBuffer* vertexBuffer);
static void SetViewport(const NzRectui& viewport);
static void SetViewport(const NzRecti& viewport);
static void Uninitialize();

View File

@ -106,7 +106,7 @@ const NzMatrix4f& NzCamera::GetViewMatrix() const
return m_viewMatrix;
}
const NzRectui& NzCamera::GetViewport() const
const NzRecti& NzCamera::GetViewport() const
{
#if NAZARA_GRAPHICS_SAFE
if (!m_target)
@ -164,7 +164,7 @@ void NzCamera::SetTargetRegion(const NzRectf& region)
m_viewportUpdated = false;
}
void NzCamera::SetViewport(const NzRectui& viewport)
void NzCamera::SetViewport(const NzRecti& viewport)
{
#if NAZARA_GRAPHICS_SAFE
if (!m_target)
@ -250,11 +250,14 @@ bool NzCamera::OnRenderTargetSizeChange(const NzRenderTarget* renderTarget, void
m_frustumUpdated = false;
m_projectionMatrixUpdated = false;
m_viewportUpdated = false;
return true;
}
else
{
NazaraInternalError("Not listening to " + NzString::Pointer(renderTarget));
return true;
return false;
}
}
void NzCamera::UpdateFrustum() const

View File

@ -99,7 +99,7 @@ const NzMatrix4f& NzView::GetViewMatrix() const
return m_viewMatrix;
}
const NzRectui& NzView::GetViewport() const
const NzRecti& NzView::GetViewport() const
{
#if NAZARA_GRAPHICS_SAFE
if (!m_target)
@ -149,7 +149,7 @@ void NzView::SetTargetRegion(const NzRectf& region)
m_viewportUpdated = false;
}
void NzView::SetViewport(const NzRectui& viewport)
void NzView::SetViewport(const NzRecti& viewport)
{
#if NAZARA_GRAPHICS_SAFE
if (!m_target)

View File

@ -7,6 +7,7 @@
#include <Nazara/Core/Log.hpp>
#include <Nazara/Math/Basic.hpp>
#include <Nazara/Renderer/Context.hpp>
#include <Nazara/Renderer/RenderTarget.hpp>
#include <cstring>
#include <set>
#include <sstream>
@ -66,7 +67,12 @@ namespace
GLuint buffersBinding[nzBufferType_Max+1] = {0};
GLuint currentProgram = 0;
GLuint texturesBinding[32] = {0}; // 32 est pour l'instant la plus haute limite (GL_TEXTURE31)
NzRecti currentScissorBox = NzRecti(0,0,0,0);
NzRecti currentViewport = NzRecti(0,0,0,0);
NzRenderStates renderStates; // Toujours synchronisé avec OpenGL
const NzRenderTarget* currentTarget = nullptr;
bool scissorBoxUpdated = true;
bool viewportUpdated = true;
unsigned int textureUnit = 0;
};
@ -313,6 +319,45 @@ void NzOpenGL::BindProgram(GLuint id)
}
}
void NzOpenGL::BindScissorBox(const NzRecti& scissorBox)
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return;
}
#endif
#if NAZARA_RENDERER_SAFE
if (scissorBox.width < 0)
{
NazaraError("Scissor box width must be positive");
return;
}
if (scissorBox.height < 0)
{
NazaraError("Scissor box height must be positive");
return;
}
#endif
if (s_contextStates->currentScissorBox != scissorBox)
{
if (s_contextStates->currentTarget)
{
unsigned int height = s_contextStates->currentTarget->GetHeight();
glScissor(scissorBox.x, height - scissorBox.height - scissorBox.y, scissorBox.width, scissorBox.height);
s_contextStates->scissorBoxUpdated = true;
}
else
s_contextStates->scissorBoxUpdated = false; // Sinon on attend d'avoir un target
s_contextStates->currentScissorBox = scissorBox;
}
}
void NzOpenGL::BindTexture(nzImageType type, GLuint id)
{
#ifdef NAZARA_DEBUG
@ -351,6 +396,14 @@ void NzOpenGL::BindTexture(unsigned int textureUnit, nzImageType type, GLuint id
void NzOpenGL::BindTextureUnit(unsigned int textureUnit)
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return;
}
#endif
if (s_contextStates->textureUnit != textureUnit)
{
glActiveTexture(GL_TEXTURE0 + textureUnit);
@ -358,6 +411,45 @@ void NzOpenGL::BindTextureUnit(unsigned int textureUnit)
}
}
void NzOpenGL::BindViewport(const NzRecti& viewport)
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return;
}
#endif
#if NAZARA_RENDERER_SAFE
if (viewport.width < 0)
{
NazaraError("Viewport width must be positive");
return;
}
if (viewport.height < 0)
{
NazaraError("Viewport height must be positive");
return;
}
#endif
if (s_contextStates->currentViewport != viewport)
{
if (s_contextStates->currentTarget)
{
unsigned int height = s_contextStates->currentTarget->GetHeight();
glViewport(viewport.x, height - viewport.height - viewport.y, viewport.width, viewport.height);
s_contextStates->viewportUpdated = true;
}
else
s_contextStates->viewportUpdated = false; // Sinon on attend d'avoir un target
s_contextStates->currentViewport = viewport;
}
}
void NzOpenGL::DeleteBuffer(nzBufferType type, GLuint id)
{
#ifdef NAZARA_DEBUG
@ -433,6 +525,32 @@ GLuint NzOpenGL::GetCurrentProgram()
return s_contextStates->currentProgram;
}
NzRecti NzOpenGL::GetCurrentScissorBox()
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return NzRecti();
}
#endif
return s_contextStates->currentScissorBox;
}
const NzRenderTarget* NzOpenGL::GetCurrentTarget()
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return nullptr;
}
#endif
return s_contextStates->currentTarget;
}
GLuint NzOpenGL::GetCurrentTexture()
{
#ifdef NAZARA_DEBUG
@ -459,6 +577,32 @@ GLuint NzOpenGL::GetCurrentTexture(unsigned int textureUnit)
return s_contextStates->texturesBinding[textureUnit];
}
unsigned int NzOpenGL::GetCurrentTextureUnit()
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return 0;
}
#endif
return s_contextStates->textureUnit;
}
NzRecti NzOpenGL::GetCurrentViewport()
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return NzRecti();
}
#endif
return s_contextStates->currentViewport;
}
NzOpenGLFunc NzOpenGL::GetEntry(const NzString& entryPoint)
{
return LoadEntry(entryPoint.GetConstBuffer(), false);
@ -474,19 +618,6 @@ NzString NzOpenGL::GetRendererName()
return s_rendererName;
}
unsigned int NzOpenGL::GetTextureUnit()
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return 0;
}
#endif
return s_contextStates->textureUnit;
}
NzString NzOpenGL::GetVendorName()
{
return s_vendorName;
@ -1094,6 +1225,19 @@ void NzOpenGL::SetBuffer(nzBufferType type, GLuint id)
s_contextStates->buffersBinding[type] = id;
}
void NzOpenGL::SetScissorBox(const NzRecti& scissorBox)
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return;
}
#endif
s_contextStates->currentScissorBox = scissorBox;
}
void NzOpenGL::SetProgram(GLuint id)
{
#ifdef NAZARA_DEBUG
@ -1107,6 +1251,41 @@ void NzOpenGL::SetProgram(GLuint id)
s_contextStates->currentProgram = id;
}
void NzOpenGL::SetTarget(const NzRenderTarget* renderTarget)
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return;
}
#endif
s_contextStates->currentTarget = renderTarget;
if (renderTarget)
{
if (!s_contextStates->scissorBoxUpdated)
{
const NzRecti& scissorBox = s_contextStates->currentViewport;
unsigned int height = s_contextStates->currentTarget->GetHeight();
glScissor(scissorBox.x, height - scissorBox.height - scissorBox.y, scissorBox.width, scissorBox.height);
s_contextStates->scissorBoxUpdated = true;
}
if (!s_contextStates->viewportUpdated)
{
const NzRecti& viewport = s_contextStates->currentViewport;
unsigned int height = s_contextStates->currentTarget->GetHeight();
glViewport(viewport.x, height - viewport.height - viewport.y, viewport.width, viewport.height);
s_contextStates->viewportUpdated = true;
}
}
}
void NzOpenGL::SetTexture(GLuint id)
{
#ifdef NAZARA_DEBUG
@ -1146,6 +1325,19 @@ void NzOpenGL::SetTextureUnit(unsigned int textureUnit)
s_contextStates->textureUnit = textureUnit;
}
void NzOpenGL::SetViewport(const NzRecti& viewport)
{
#ifdef NAZARA_DEBUG
if (!s_contextStates)
{
NazaraError("No context activated");
return;
}
#endif
s_contextStates->currentViewport = viewport;
}
bool NzOpenGL::TranslateFormat(nzPixelFormat pixelFormat, Format* format, FormatType type)
{
switch (pixelFormat)

View File

@ -289,11 +289,18 @@ bool NzRenderWindow::OnWindowCreated()
return false;
}
EnableVerticalSync(false);
if (!SetActive(true)) // Les fenêtres s'activent à la création
NazaraWarning("Failed to activate window");
EnableVerticalSync(false);
NzVector2ui size = GetSize();
// Le scissorBox/viewport (à la création) est de la taille de la fenêtre
// https://www.opengl.org/sdk/docs/man/xhtml/glGet.xml
NzOpenGL::SetScissorBox(NzRecti(0, 0, size.x, size.y));
NzOpenGL::SetViewport(NzRecti(0, 0, size.x, size.y));
NotifyParametersChange();
NotifySizeChange();

View File

@ -549,20 +549,9 @@ const NzRenderStates& NzRenderer::GetRenderStates()
return s_states;
}
NzRectui NzRenderer::GetScissorRect()
NzRecti NzRenderer::GetScissorRect()
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
{
NazaraError("No active context");
return NzRectui();
}
#endif
GLint params[4];
glGetIntegerv(GL_SCISSOR_BOX, &params[0]);
return NzRectui(params[0], params[1], params[2], params[3]);
return NzOpenGL::GetCurrentScissorBox();
}
const NzShaderProgram* NzRenderer::GetShaderProgram()
@ -575,20 +564,9 @@ const NzRenderTarget* NzRenderer::GetTarget()
return s_target;
}
NzRectui NzRenderer::GetViewport()
NzRecti NzRenderer::GetViewport()
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
{
NazaraError("No active context");
return NzRectui();
}
#endif
GLint params[4];
glGetIntegerv(GL_VIEWPORT, &params[0]);
return NzRectui(params[0], params[1], params[2], params[3]);
return NzOpenGL::GetCurrentViewport();
}
bool NzRenderer::HasCapability(nzRendererCap capability)
@ -985,34 +963,9 @@ void NzRenderer::SetRenderStates(const NzRenderStates& states)
s_states = states;
}
void NzRenderer::SetScissorRect(const NzRectui& rect)
void NzRenderer::SetScissorRect(const NzRecti& rect)
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
{
NazaraError("No active context");
return;
}
#endif
unsigned int height = s_target->GetHeight();
#if NAZARA_RENDERER_SAFE
if (!s_target)
{
NazaraError("Renderer has no target");
return;
}
unsigned int width = s_target->GetWidth();
if (rect.x+rect.width > width || rect.y+rect.height > height)
{
NazaraError("Rectangle dimensions are out of bounds");
return;
}
#endif
glScissor(rect.x, height-rect.height-rect.y, rect.width, rect.height);
NzOpenGL::BindScissorBox(rect);
}
void NzRenderer::SetShaderProgram(const NzShaderProgram* program)
@ -1129,6 +1082,8 @@ bool NzRenderer::SetTarget(const NzRenderTarget* target)
s_uniformTargetSizeUpdated = false;
}
NzOpenGL::SetTarget(s_target);
return true;
}
@ -1195,35 +1150,9 @@ void NzRenderer::SetVertexBuffer(const NzVertexBuffer* vertexBuffer)
}
}
void NzRenderer::SetViewport(const NzRectui& viewport)
void NzRenderer::SetViewport(const NzRecti& viewport)
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
{
NazaraError("No active context");
return;
}
#endif
unsigned int height = s_target->GetHeight();
#if NAZARA_RENDERER_SAFE
if (!s_target)
{
NazaraError("Renderer has no target");
return;
}
unsigned int width = s_target->GetWidth();
if (viewport.x+viewport.width > width || viewport.y+viewport.height > height)
{
NazaraError("Rectangle dimensions are out of bounds (" + NzString::Number(viewport.x+viewport.width) + ", " + NzString::Number(viewport.y+viewport.height) + " > "
+ NzString::Number(width) + ", " + NzString::Number(height) + ")");
return;
}
#endif
glViewport(viewport.x, height-viewport.height-viewport.y, viewport.width, viewport.height);
NzOpenGL::BindViewport(viewport);
}
void NzRenderer::Uninitialize()