Made use of RenderState
Former-commit-id: 500aba0d0dd60e7371dea6c219d6a5ccfdcbadf8
This commit is contained in:
@@ -114,6 +114,15 @@ namespace
|
||||
return shader.release();
|
||||
}
|
||||
|
||||
NzRenderStates BuildRenderStates()
|
||||
{
|
||||
NzRenderStates states;
|
||||
states.parameters[nzRendererParameter_FaceCulling] = true;
|
||||
states.faceCulling = nzFaceCulling_Front;
|
||||
|
||||
return states;
|
||||
}
|
||||
|
||||
NzVertexBuffer* BuildVertexBuffer()
|
||||
{
|
||||
std::unique_ptr<NzVertexDeclaration> declaration(new NzVertexDeclaration);
|
||||
@@ -158,6 +167,7 @@ namespace
|
||||
static NzIndexBuffer* s_indexBuffer = nullptr;
|
||||
static NzShader* s_shader = nullptr;
|
||||
static NzVertexBuffer* s_vertexBuffer = nullptr;
|
||||
static unsigned int s_skyboxLocation;
|
||||
}
|
||||
|
||||
NzSkyboxBackground::NzSkyboxBackground()
|
||||
@@ -166,21 +176,18 @@ NzSkyboxBackground::NzSkyboxBackground()
|
||||
s_indexBuffer = BuildIndexBuffer();
|
||||
|
||||
if (!s_shader)
|
||||
{
|
||||
s_shader = BuildShader();
|
||||
s_skyboxLocation = s_shader->GetUniformLocation("Skybox");
|
||||
}
|
||||
|
||||
if (!s_vertexBuffer)
|
||||
s_vertexBuffer = BuildVertexBuffer();
|
||||
|
||||
m_indexBuffer = s_indexBuffer;
|
||||
m_indexBuffer->AddResourceReference();
|
||||
|
||||
m_shader = s_shader;
|
||||
m_shader->AddResourceReference();
|
||||
|
||||
m_sampler.SetWrapMode(nzSamplerWrap_Clamp); // Nécessaire pour ne pas voir les côtés
|
||||
|
||||
m_vertexBuffer = s_vertexBuffer;
|
||||
m_vertexBuffer->AddResourceReference();
|
||||
}
|
||||
|
||||
NzSkyboxBackground::NzSkyboxBackground(NzTexture* cubemapTexture) :
|
||||
@@ -191,37 +198,33 @@ NzSkyboxBackground()
|
||||
|
||||
NzSkyboxBackground::~NzSkyboxBackground()
|
||||
{
|
||||
if (m_indexBuffer->RemoveResourceReference())
|
||||
if (m_indexBuffer.Reset())
|
||||
s_indexBuffer = nullptr;
|
||||
|
||||
if (m_shader->RemoveResourceReference())
|
||||
if (m_shader.Reset())
|
||||
s_shader = nullptr;
|
||||
|
||||
if (m_vertexBuffer->RemoveResourceReference())
|
||||
if (m_vertexBuffer.Reset())
|
||||
s_vertexBuffer = nullptr;
|
||||
}
|
||||
|
||||
void NzSkyboxBackground::Draw(const NzScene* scene) const
|
||||
{
|
||||
nzUInt8 textureUnit;
|
||||
m_shader->SendTexture(m_shader->GetUniformLocation("Skybox"), m_texture, &textureUnit);
|
||||
static NzRenderStates states(BuildRenderStates());
|
||||
|
||||
m_shader->SendInteger(s_skyboxLocation, 0);
|
||||
|
||||
const NzMatrix4f& viewMatrix = NzRenderer::GetMatrix(nzMatrixType_View);
|
||||
NzMatrix4f skyboxMatrix(viewMatrix);
|
||||
skyboxMatrix.SetTranslation(NzVector3f::Zero());
|
||||
|
||||
NzRenderer::Enable(nzRendererParameter_Blend, false);
|
||||
NzRenderer::Enable(nzRendererParameter_DepthBuffer, false);
|
||||
NzRenderer::Enable(nzRendererParameter_FaceCulling, true);
|
||||
|
||||
NzRenderer::SetDepthFunc(nzRendererComparison_Less);
|
||||
NzRenderer::SetFaceCulling(nzFaceCulling_Front);
|
||||
NzRenderer::SetFaceFilling(nzFaceFilling_Fill);
|
||||
NzRenderer::SetIndexBuffer(m_indexBuffer);
|
||||
NzRenderer::SetMatrix(nzMatrixType_View, skyboxMatrix);
|
||||
NzRenderer::SetMatrix(nzMatrixType_World, NzMatrix4f::Scale(NzVector3f(scene->GetActiveCamera()->GetZNear())));
|
||||
NzRenderer::SetRenderStates(states);
|
||||
NzRenderer::SetShader(m_shader);
|
||||
NzRenderer::SetTextureSampler(textureUnit, m_sampler);
|
||||
NzRenderer::SetTexture(0, m_texture);
|
||||
NzRenderer::SetTextureSampler(0, m_sampler);
|
||||
NzRenderer::SetVertexBuffer(m_vertexBuffer);
|
||||
|
||||
NzRenderer::DrawIndexedPrimitives(nzPrimitiveMode_TriangleList, 0, 36);
|
||||
|
||||
Reference in New Issue
Block a user