1
0
forked from 0ad/0ad

Splits water surface and shore drawing functions and fixes their switch.

Differential Revision: https://code.wildfiregames.com/D4436
This was SVN commit r26215.
This commit is contained in:
Vladislav Belov 2022-01-14 17:34:58 +00:00
parent 9aedcade7f
commit 1d9a8b2b0b
4 changed files with 65 additions and 61 deletions

View File

@ -65,12 +65,7 @@ const ssize_t BlendOffsets[9][2] = {
};
CPatchRData::CPatchRData(CPatch* patch, CSimulation2* simulation) :
m_Patch(patch), m_VBSides(),
m_VBBase(), m_VBBaseIndices(),
m_VBBlends(), m_VBBlendIndices(),
m_VBWater(), m_VBWaterIndices(),
m_VBWaterShore(), m_VBWaterIndicesShore(),
m_Simulation(simulation)
m_Patch(patch), m_Simulation(simulation)
{
ENSURE(patch);
Build();
@ -1375,63 +1370,54 @@ void CPatchRData::BuildWater()
}
}
void CPatchRData::RenderWater(CShaderProgramPtr& shader, bool onlyShore, bool fixedPipeline)
void CPatchRData::RenderWaterSurface(CShaderProgramPtr& shader)
{
ASSERT(m_UpdateFlags==0);
ASSERT(m_UpdateFlags == 0);
if (!m_VBWater && !m_VBWaterShore)
if (!m_VBWater)
return;
#if !CONFIG2_GLES
if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif
SWaterVertex* base = reinterpret_cast<SWaterVertex*>(m_VBWater->m_Owner->Bind());
if (m_VBWater && !onlyShore)
{
SWaterVertex *base=(SWaterVertex *)m_VBWater->m_Owner->Bind();
// Setup data pointers.
const GLsizei stride = sizeof(SWaterVertex);
shader->VertexPointer(3, GL_FLOAT, stride, &base[m_VBWater->m_Index].m_Position);
shader->VertexAttribPointer(str_a_waterInfo, 2, GL_FLOAT, false, stride, &base[m_VBWater->m_Index].m_WaterData);
// setup data pointers
GLsizei stride = sizeof(SWaterVertex);
shader->VertexPointer(3, GL_FLOAT, stride, &base[m_VBWater->m_Index].m_Position);
if (!fixedPipeline)
shader->VertexAttribPointer(str_a_waterInfo, 2, GL_FLOAT, false, stride, &base[m_VBWater->m_Index].m_WaterData);
shader->AssertPointersBound();
shader->AssertPointersBound();
u8* indexBase = m_VBWaterIndices->m_Owner->Bind();
glDrawElements(
GL_TRIANGLES, static_cast<GLsizei>(m_VBWaterIndices->m_Count),
GL_UNSIGNED_SHORT, indexBase + sizeof(u16)*(m_VBWaterIndices->m_Index));
u8* indexBase = m_VBWaterIndices->m_Owner->Bind();
glDrawElements(GL_TRIANGLES, (GLsizei) m_VBWaterIndices->m_Count,
GL_UNSIGNED_SHORT, indexBase + sizeof(u16)*(m_VBWaterIndices->m_Index));
g_Renderer.m_Stats.m_DrawCalls++;
g_Renderer.m_Stats.m_WaterTris += m_VBWaterIndices->m_Count / 3;
}
if (m_VBWaterShore && g_VideoMode.GetBackend() != CVideoMode::Backend::GL_ARB &&
g_Renderer.GetSceneRenderer().GetWaterManager().m_WaterEffects &&
g_Renderer.GetSceneRenderer().GetWaterManager().m_WaterFancyEffects)
{
SWaterVertex *base=(SWaterVertex *)m_VBWaterShore->m_Owner->Bind();
GLsizei stride = sizeof(SWaterVertex);
shader->VertexPointer(3, GL_FLOAT, stride, &base[m_VBWaterShore->m_Index].m_Position);
if (!fixedPipeline)
shader->VertexAttribPointer(str_a_waterInfo, 2, GL_FLOAT, false, stride, &base[m_VBWaterShore->m_Index].m_WaterData);
shader->AssertPointersBound();
u8* indexBase = m_VBWaterIndicesShore->m_Owner->Bind();
glDrawElements(GL_TRIANGLES, (GLsizei) m_VBWaterIndicesShore->m_Count,
GL_UNSIGNED_SHORT, indexBase + sizeof(u16)*(m_VBWaterIndicesShore->m_Index));
g_Renderer.m_Stats.m_DrawCalls++;
g_Renderer.m_Stats.m_WaterTris += m_VBWaterIndicesShore->m_Count / 3;
}
g_Renderer.m_Stats.m_DrawCalls++;
g_Renderer.m_Stats.m_WaterTris += m_VBWaterIndices->m_Count / 3;
CVertexBuffer::Unbind();
}
void CPatchRData::RenderWaterShore(CShaderProgramPtr& shader)
{
ASSERT(m_UpdateFlags == 0);
if (!m_VBWaterShore)
return;
SWaterVertex* base = reinterpret_cast<SWaterVertex*>(m_VBWaterShore->m_Owner->Bind());
const GLsizei stride = sizeof(SWaterVertex);
shader->VertexPointer(3, GL_FLOAT, stride, &base[m_VBWaterShore->m_Index].m_Position);
shader->VertexAttribPointer(str_a_waterInfo, 2, GL_FLOAT, false, stride, &base[m_VBWaterShore->m_Index].m_WaterData);
shader->AssertPointersBound();
u8* indexBase = m_VBWaterIndicesShore->m_Owner->Bind();
glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(m_VBWaterIndicesShore->m_Count),
GL_UNSIGNED_SHORT, indexBase + sizeof(u16)*(m_VBWaterIndicesShore->m_Index));
g_Renderer.m_Stats.m_DrawCalls++;
g_Renderer.m_Stats.m_WaterTris += m_VBWaterIndicesShore->m_Count / 3;
CVertexBuffer::Unbind();
#if !CONFIG2_GLES
if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
}

View File

@ -1,4 +1,4 @@
/* Copyright (C) 2021 Wildfire Games.
/* Copyright (C) 2022 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
@ -47,7 +47,8 @@ public:
void RenderOutline();
void RenderPriorities(CTextRenderer& textRenderer);
void RenderWater(CShaderProgramPtr& shader, bool onlyShore = false, bool fixedPipeline = false);
void RenderWaterSurface(CShaderProgramPtr& shader);
void RenderWaterShore(CShaderProgramPtr& shader);
CPatch* GetPatch() { return m_Patch; }

View File

@ -404,6 +404,11 @@ bool TerrainRenderer::RenderFancyWater(const CShaderDefines& context, int cullGr
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
#if !CONFIG2_GLES
if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
#endif
m->fancyWaterTech->BeginPass();
CShaderProgramPtr fancyWaterShader = m->fancyWaterTech->GetShader();
@ -488,10 +493,16 @@ bool TerrainRenderer::RenderFancyWater(const CShaderDefines& context, int cullGr
for (size_t i = 0; i < visiblePatches.size(); ++i)
{
CPatchRData* data = visiblePatches[i];
data->RenderWater(fancyWaterShader);
data->RenderWaterSurface(fancyWaterShader);
data->RenderWaterShore(fancyWaterShader);
}
m->fancyWaterTech->EndPass();
#if !CONFIG2_GLES
if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
glDepthFunc(GL_LEQUAL);
glDisable(GL_BLEND);
@ -512,6 +523,9 @@ void TerrainRenderer::RenderSimpleWater(int cullGroup)
glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LEQUAL);
if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME)
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
const double time = waterManager.m_WaterTexTimer;
CShaderTechniquePtr waterSimpleTech =
@ -530,7 +544,7 @@ void TerrainRenderer::RenderSimpleWater(int cullGroup)
for (size_t i = 0; i < visiblePatches.size(); ++i)
{
CPatchRData* data = visiblePatches[i];
data->RenderWater(waterSimpleShader, false, true);
data->RenderWaterSurface(waterSimpleShader);
}
g_Renderer.BindTexture(1, 0);
@ -538,6 +552,9 @@ void TerrainRenderer::RenderSimpleWater(int cullGroup)
glActiveTextureARB(GL_TEXTURE0_ARB);
waterSimpleTech->EndPass();
if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME)
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
#endif
}
@ -576,7 +593,7 @@ void TerrainRenderer::RenderWaterFoamOccluders(int cullGroup)
dummyShader->Uniform(str_transform, sceneRenderer.GetViewCamera().GetViewProjection());
dummyShader->Uniform(str_color, 0.0f, 0.0f, 0.0f, 0.0f);
for (CPatchRData* data : m->visiblePatches[cullGroup])
data->RenderWater(dummyShader, true, true);
data->RenderWaterShore(dummyShader);
dummyTech->EndPass();
glEnable(GL_CULL_FACE);

View File

@ -77,7 +77,7 @@ public:
bool m_RenderWater;
// If disabled, force the use of the fixed function for rendering.
// If disabled, force the use of the simple water shader for rendering.
bool m_WaterEffects;
// Those variables register the current quality level. If there is a change, I have to recompile the shader.
// Use real depth or use the fake precomputed one.