Index: ps/trunk/source/renderer/PatchRData.h =================================================================== --- ps/trunk/source/renderer/PatchRData.h +++ ps/trunk/source/renderer/PatchRData.h @@ -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 @@ 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; } Index: ps/trunk/source/renderer/PatchRData.cpp =================================================================== --- ps/trunk/source/renderer/PatchRData.cpp +++ ps/trunk/source/renderer/PatchRData.cpp @@ -65,12 +65,7 @@ }; 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::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 - - if (m_VBWater && !onlyShore) - { - SWaterVertex *base=(SWaterVertex *)m_VBWater->m_Owner->Bind(); - - // 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); + SWaterVertex* base = reinterpret_cast(m_VBWater->m_Owner->Bind()); - shader->AssertPointersBound(); + // 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); + + shader->AssertPointersBound(); + + u8* indexBase = m_VBWaterIndices->m_Owner->Bind(); + glDrawElements( + GL_TRIANGLES, static_cast(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; - g_Renderer.m_Stats.m_DrawCalls++; - g_Renderer.m_Stats.m_WaterTris += m_VBWaterIndices->m_Count / 3; - } + CVertexBuffer::Unbind(); +} - 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(); +void CPatchRData::RenderWaterShore(CShaderProgramPtr& shader) +{ + ASSERT(m_UpdateFlags == 0); - 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); + if (!m_VBWaterShore) + return; - shader->AssertPointersBound(); + SWaterVertex* base = reinterpret_cast(m_VBWaterShore->m_Owner->Bind()); - 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)); + 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); - g_Renderer.m_Stats.m_DrawCalls++; - g_Renderer.m_Stats.m_WaterTris += m_VBWaterIndicesShore->m_Count / 3; - } + shader->AssertPointersBound(); - CVertexBuffer::Unbind(); + u8* indexBase = m_VBWaterIndicesShore->m_Owner->Bind(); + glDrawElements(GL_TRIANGLES, static_cast(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; -#if !CONFIG2_GLES - if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME) - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); -#endif + CVertexBuffer::Unbind(); } Index: ps/trunk/source/renderer/TerrainRenderer.cpp =================================================================== --- ps/trunk/source/renderer/TerrainRenderer.cpp +++ ps/trunk/source/renderer/TerrainRenderer.cpp @@ -404,6 +404,11 @@ 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 @@ 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 @@ 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 @@ 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 @@ glActiveTextureARB(GL_TEXTURE0_ARB); waterSimpleTech->EndPass(); + + if (g_Renderer.GetSceneRenderer().GetWaterRenderMode() == WIREFRAME) + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); #endif } @@ -576,7 +593,7 @@ 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); Index: ps/trunk/source/renderer/WaterManager.h =================================================================== --- ps/trunk/source/renderer/WaterManager.h +++ ps/trunk/source/renderer/WaterManager.h @@ -77,7 +77,7 @@ 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.