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:
parent
9aedcade7f
commit
1d9a8b2b0b
@ -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
|
||||
}
|
||||
|
@ -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; }
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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.
|
||||
|
Loading…
Reference in New Issue
Block a user