Fixed some Renderer bugs

Former-commit-id: 5a9a4be7282c4b43c47056064d344d41c42cbaba
This commit is contained in:
Lynix 2013-06-09 11:31:00 +02:00
parent 8897531618
commit 7080719287
1 changed files with 48 additions and 51 deletions

View File

@ -980,7 +980,7 @@ void NzRenderer::SetFaceFilling(nzFaceFilling fillingMode)
void NzRenderer::SetIndexBuffer(const NzIndexBuffer* indexBuffer)
{
#if NAZARA_RENDERER_SAFE
if (indexBuffer && !indexBuffer->IsHardware() && !indexBuffer->IsSequential())
if (indexBuffer && !indexBuffer->IsSequential() && !indexBuffer->IsHardware())
{
NazaraError("Buffer must be hardware");
return;
@ -1424,57 +1424,54 @@ void NzRenderer::EnableInstancing(bool instancing)
bool NzRenderer::EnsureStateUpdate()
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
{
NazaraError("No active context");
return false;
}
#endif
#if NAZARA_RENDERER_SAFE
if (!s_shader)
{
NazaraError("No shader");
return false;
}
#endif
NzAbstractShader* shaderImpl = s_shader->m_impl;
shaderImpl->Bind();
// Si le shader a été changé depuis la dernière fois
if (s_updateFlags & Update_Shader)
{
// Récupération des indices des variables uniformes (-1 si la variable n'existe pas)
s_matrixLocation[nzMatrixType_Projection] = shaderImpl->GetUniformLocation(nzShaderUniform_ProjMatrix);
s_matrixLocation[nzMatrixType_View] = shaderImpl->GetUniformLocation(nzShaderUniform_ViewMatrix);
s_matrixLocation[nzMatrixType_World] = shaderImpl->GetUniformLocation(nzShaderUniform_WorldMatrix);
s_matrixLocation[nzMatrixCombination_ViewProj] = shaderImpl->GetUniformLocation(nzShaderUniform_ViewProjMatrix);
s_matrixLocation[nzMatrixCombination_WorldView] = shaderImpl->GetUniformLocation(nzShaderUniform_WorldViewMatrix);
s_matrixLocation[nzMatrixCombination_WorldViewProj] = shaderImpl->GetUniformLocation(nzShaderUniform_WorldViewProjMatrix);
s_updateFlags |= Update_Matrices;
for (unsigned int i = 0; i < totalMatrixCount; ++i)
{
///TODO: Voir le FIXME au niveau de l'envoi des matrices
/*if (s_matrixLocation[i] != -1)
s_matrixUpdated[i] = false;
else*/
s_matrixUpdated[i] = false;
}
s_updateFlags &= ~Update_Shader;
}
shaderImpl->BindTextures();
if (s_updateFlags != Update_None)
{
#ifdef NAZARA_DEBUG
if (NzContext::GetCurrent() == nullptr)
{
NazaraError("No active context");
return false;
}
#endif
NzAbstractShader* shaderImpl;
if (s_updateFlags & Update_Shader)
{
#if NAZARA_RENDERER_SAFE
if (!s_shader)
{
NazaraError("No shader");
return false;
}
#endif
// Il est plus rapide d'opérer sur l'implémentation du shader directement
shaderImpl = s_shader->m_impl;
shaderImpl->Bind();
shaderImpl->BindTextures();
// Récupération des indices des variables uniformes (-1 si la variable n'existe pas)
s_matrixLocation[nzMatrixType_Projection] = shaderImpl->GetUniformLocation(nzShaderUniform_ProjMatrix);
s_matrixLocation[nzMatrixType_View] = shaderImpl->GetUniformLocation(nzShaderUniform_ViewMatrix);
s_matrixLocation[nzMatrixType_World] = shaderImpl->GetUniformLocation(nzShaderUniform_WorldMatrix);
s_matrixLocation[nzMatrixCombination_ViewProj] = shaderImpl->GetUniformLocation(nzShaderUniform_ViewProjMatrix);
s_matrixLocation[nzMatrixCombination_WorldView] = shaderImpl->GetUniformLocation(nzShaderUniform_WorldViewMatrix);
s_matrixLocation[nzMatrixCombination_WorldViewProj] = shaderImpl->GetUniformLocation(nzShaderUniform_WorldViewProjMatrix);
s_updateFlags |= Update_Matrices;
for (unsigned int i = 0; i < totalMatrixCount; ++i)
{
///TODO: Voir le FIXME au niveau de l'envoi des matrices
/*if (s_matrixLocation[i] != -1)
s_matrixUpdated[i] = false;
else*/
s_matrixUpdated[i] = false;
}
s_updateFlags &= ~Update_Shader;
}
else
shaderImpl = s_shader->m_impl;
if (s_updateFlags & Update_Textures)
{
if (s_useSamplerObjects)
@ -1670,7 +1667,7 @@ bool NzRenderer::EnsureStateUpdate()
glDisableVertexAttribArray(NzOpenGL::AttributeIndex[nzElementUsage_TexCoord]+i);
}
if (s_indexBuffer)
if (s_indexBuffer && !s_indexBuffer->IsSequential())
{
NzHardwareBuffer* indexBufferImpl = static_cast<NzHardwareBuffer*>(s_indexBuffer->GetBuffer()->GetImpl());
indexBufferImpl->Bind();