Changeset View
Changeset View
Standalone View
Standalone View
source/renderer/OverlayRenderer.cpp
/* Copyright (C) 2019 Wildfire Games. | /* Copyright (C) 2020 Wildfire Games. | ||||
* This file is part of 0 A.D. | * This file is part of 0 A.D. | ||||
* | * | ||||
* 0 A.D. is free software: you can redistribute it and/or modify | * 0 A.D. is free software: you can redistribute it and/or modify | ||||
* it under the terms of the GNU General Public License as published by | * it under the terms of the GNU General Public License as published by | ||||
* the Free Software Foundation, either version 2 of the License, or | * the Free Software Foundation, either version 2 of the License, or | ||||
* (at your option) any later version. | * (at your option) any later version. | ||||
* | * | ||||
* 0 A.D. is distributed in the hope that it will be useful, | * 0 A.D. is distributed in the hope that it will be useful, | ||||
▲ Show 20 Lines • Show All 410 Lines • ▼ Show 20 Lines | #endif | ||||
pglActiveTextureARB(GL_TEXTURE0); | pglActiveTextureARB(GL_TEXTURE0); | ||||
glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
glEnable(GL_BLEND); | glEnable(GL_BLEND); | ||||
glDepthMask(0); | glDepthMask(0); | ||||
const char* shaderName; | const char* shaderName; | ||||
if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) | if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) | ||||
{ | |||||
if (g_RenderingOptions.GetPreferGLSL()) | |||||
shaderName = "glsl/overlayline"; | |||||
else | |||||
shaderName = "arb/overlayline"; | shaderName = "arb/overlayline"; | ||||
} | |||||
else | else | ||||
shaderName = "fixed:overlayline"; | shaderName = "fixed:overlayline"; | ||||
CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); | CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); | ||||
CShaderManager& shaderManager = g_Renderer.GetShaderManager(); | CShaderManager& shaderManager = g_Renderer.GetShaderManager(); | ||||
CShaderProgramPtr shaderTexLineNormal(shaderManager.LoadProgram(shaderName, m->defsOverlayLineNormal)); | CShaderProgramPtr shaderTexLineNormal(shaderManager.LoadProgram(shaderName, m->defsOverlayLineNormal)); | ||||
CShaderProgramPtr shaderTexLineAlwaysVisible(shaderManager.LoadProgram(shaderName, m->defsOverlayLineAlwaysVisible)); | CShaderProgramPtr shaderTexLineAlwaysVisible(shaderManager.LoadProgram(shaderName, m->defsOverlayLineAlwaysVisible)); | ||||
▲ Show 20 Lines • Show All 58 Lines • ▼ Show 20 Lines | |||||
{ | { | ||||
#if CONFIG2_GLES | #if CONFIG2_GLES | ||||
#warning TODO: implement OverlayRenderer::RenderQuadOverlays for GLES | #warning TODO: implement OverlayRenderer::RenderQuadOverlays for GLES | ||||
return; | return; | ||||
#endif | #endif | ||||
if (m->quadBatchMap.empty()) | if (m->quadBatchMap.empty()) | ||||
return; | return; | ||||
ogl_WarnIfError(); | |||||
pglActiveTextureARB(GL_TEXTURE0); | |||||
glEnable(GL_TEXTURE_2D); | |||||
glEnable(GL_BLEND); | |||||
glDepthMask(0); | |||||
const char* shaderName; | const char* shaderName; | ||||
if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) | if (g_RenderingOptions.GetRenderPath() == RenderPath::SHADER) | ||||
{ | |||||
if (g_RenderingOptions.GetPreferGLSL()) | |||||
shaderName = "glsl/overlayline"; | |||||
else | |||||
shaderName = "arb/overlayline"; | shaderName = "arb/overlayline"; | ||||
} | |||||
else | else | ||||
shaderName = "fixed:overlayline"; | shaderName = "fixed:overlayline"; | ||||
CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); | |||||
CShaderManager& shaderManager = g_Renderer.GetShaderManager(); | CShaderManager& shaderManager = g_Renderer.GetShaderManager(); | ||||
CShaderProgramPtr shader(shaderManager.LoadProgram(shaderName, m->defsQuadOverlay)); | CShaderProgramPtr shader(shaderManager.LoadProgram(shaderName, m->defsQuadOverlay)); | ||||
// ---------------------------------------------------------------------------------------- | if (!shader) | ||||
return; | |||||
pglActiveTextureARB(GL_TEXTURE0); | |||||
glEnable(GL_TEXTURE_2D); | |||||
glEnable(GL_BLEND); | |||||
glDepthMask(0); | |||||
CLOSTexture& los = g_Renderer.GetScene().GetLOSTexture(); | |||||
if (shader) | |||||
{ | |||||
shader->Bind(); | shader->Bind(); | ||||
shader->BindTexture(str_losTex, los.GetTexture()); | shader->BindTexture(str_losTex, los.GetTexture()); | ||||
shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); | shader->Uniform(str_losTransform, los.GetTextureMatrix()[0], los.GetTextureMatrix()[12], 0.f, 0.f); | ||||
// Base offsets (in bytes) of the two backing stores relative to their owner VBO | // Base offsets (in bytes) of the two backing stores relative to their owner VBO | ||||
u8* indexBase = m->quadIndices.Bind(); | u8* indexBase = m->quadIndices.Bind(); | ||||
u8* vertexBase = m->quadVertices.Bind(); | u8* vertexBase = m->quadVertices.Bind(); | ||||
GLsizei indexStride = m->quadIndices.GetStride(); | GLsizei indexStride = m->quadIndices.GetStride(); | ||||
GLsizei vertexStride = m->quadVertices.GetStride(); | GLsizei vertexStride = m->quadVertices.GetStride(); | ||||
for (OverlayRendererInternals::QuadBatchMap::iterator it = m->quadBatchMap.begin(); it != m->quadBatchMap.end(); ++it) | for (OverlayRendererInternals::QuadBatchMap::iterator it = m->quadBatchMap.begin(); it != m->quadBatchMap.end(); ++it) | ||||
{ | { | ||||
QuadBatchData& batchRenderData = it->second; | QuadBatchData& batchRenderData = it->second; | ||||
const size_t batchNumQuads = batchRenderData.m_NumRenderQuads; | const size_t batchNumQuads = batchRenderData.m_NumRenderQuads; | ||||
// Careful; some drivers don't like drawing calls with 0 stuff to draw. | // Careful; some drivers don't like drawing calls with 0 stuff to draw. | ||||
if (batchNumQuads == 0) | if (batchNumQuads == 0) | ||||
continue; | continue; | ||||
const QuadBatchKey& maskPair = it->first; | const QuadBatchKey& maskPair = it->first; | ||||
shader->BindTexture(str_baseTex, maskPair.m_Texture->GetHandle()); | shader->BindTexture(str_baseTex, maskPair.m_Texture->GetHandle()); | ||||
shader->BindTexture(str_maskTex, maskPair.m_TextureMask->GetHandle()); | shader->BindTexture(str_maskTex, maskPair.m_TextureMask->GetHandle()); | ||||
int streamflags = shader->GetStreamFlags(); | int streamflags = shader->GetStreamFlags(); | ||||
if (streamflags & STREAM_POS) | if (streamflags & STREAM_POS) | ||||
shader->VertexPointer(m->quadAttributePos.elems, m->quadAttributePos.type, vertexStride, vertexBase + m->quadAttributePos.offset); | shader->VertexPointer(m->quadAttributePos.elems, m->quadAttributePos.type, vertexStride, vertexBase + m->quadAttributePos.offset); | ||||
if (streamflags & STREAM_UV0) | if (streamflags & STREAM_UV0) | ||||
shader->TexCoordPointer(GL_TEXTURE0, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); | shader->TexCoordPointer(GL_TEXTURE0, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); | ||||
if (streamflags & STREAM_UV1) | if (streamflags & STREAM_UV1) | ||||
shader->TexCoordPointer(GL_TEXTURE1, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); | shader->TexCoordPointer(GL_TEXTURE1, m->quadAttributeUV.elems, m->quadAttributeUV.type, vertexStride, vertexBase + m->quadAttributeUV.offset); | ||||
if (streamflags & STREAM_COLOR) | if (streamflags & STREAM_COLOR) | ||||
shader->ColorPointer(m->quadAttributeColor.elems, m->quadAttributeColor.type, vertexStride, vertexBase + m->quadAttributeColor.offset); | shader->ColorPointer(m->quadAttributeColor.elems, m->quadAttributeColor.type, vertexStride, vertexBase + m->quadAttributeColor.offset); | ||||
shader->AssertPointersBound(); | shader->AssertPointersBound(); | ||||
glDrawElements(GL_TRIANGLES, (GLsizei)(batchNumQuads * 6), GL_UNSIGNED_SHORT, indexBase + indexStride * batchRenderData.m_IndicesBase); | glDrawElements(GL_TRIANGLES, (GLsizei)(batchNumQuads * 6), GL_UNSIGNED_SHORT, indexBase + indexStride * batchRenderData.m_IndicesBase); | ||||
g_Renderer.GetStats().m_DrawCalls++; | g_Renderer.GetStats().m_DrawCalls++; | ||||
g_Renderer.GetStats().m_OverlayTris += batchNumQuads*2; | g_Renderer.GetStats().m_OverlayTris += batchNumQuads*2; | ||||
} | } | ||||
shader->Unbind(); | shader->Unbind(); | ||||
} | |||||
// ---------------------------------------------------------------------------------------- | |||||
// TODO: the shader should probably be responsible for unbinding its textures | // TODO: the shader should probably be responsible for unbinding its textures | ||||
g_Renderer.BindTexture(1, 0); | g_Renderer.BindTexture(1, 0); | ||||
g_Renderer.BindTexture(0, 0); | g_Renderer.BindTexture(0, 0); | ||||
CVertexBuffer::Unbind(); | CVertexBuffer::Unbind(); | ||||
glDepthMask(1); | glDepthMask(1); | ||||
▲ Show 20 Lines • Show All 200 Lines • Show Last 20 Lines |
Wildfire Games · Phabricator