Index: ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.fp =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.fp +++ ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.fp @@ -0,0 +1,7 @@ +!!ARBfp1.0 + +ATTRIB v_tex = fragment.texcoord[0]; + +TEX result.color, v_tex, texture[0], 2D; + +END Index: ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.vp =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.vp +++ ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.vp @@ -0,0 +1,19 @@ +!!ARBvp1.0 + +PARAM transform[4] = { program.local[0..3] }; +PARAM textureTransform[4] = { program.local[4..7] }; + +ATTRIB position = vertex.position; +ATTRIB uv = vertex.texcoord[0]; + +DP4 result.position.x, transform[0], position; +DP4 result.position.y, transform[1], position; +DP4 result.position.z, transform[2], position; +DP4 result.position.w, transform[3], position; + +OUTPUT v_tex = result.texcoord[0]; + +DP4 v_tex.x, textureTransform[0], uv; +DP4 v_tex.y, textureTransform[1], uv; + +END Index: ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.xml =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.xml +++ ps/trunk/binaries/data/mods/public/shaders/arb/debug_overlay.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + Index: ps/trunk/binaries/data/mods/public/shaders/effects/debug_overlay.xml =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/effects/debug_overlay.xml +++ ps/trunk/binaries/data/mods/public/shaders/effects/debug_overlay.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + Index: ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.fs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.fs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.fs @@ -0,0 +1,11 @@ +#version 110 + +uniform sampler2D baseTex; + +varying vec2 v_tex; + +void main() +{ + vec4 base = texture2D(baseTex, v_tex); + gl_FragColor = base; +} Index: ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.vs =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.vs +++ ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.vs @@ -0,0 +1,15 @@ +#version 110 + +uniform mat4 transform; +uniform mat4 textureTransform; + +attribute vec3 a_vertex; +attribute vec3 a_uv0; + +varying vec2 v_tex; + +void main() +{ + v_tex = (textureTransform * vec4(a_uv0, 1.0)).xy; + gl_Position = transform * vec4(a_vertex, 1.0); +} Index: ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.xml =================================================================== --- ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.xml +++ ps/trunk/binaries/data/mods/public/shaders/glsl/debug_overlay.xml @@ -0,0 +1,13 @@ + + + + + + + + + + + + + Index: ps/trunk/source/ps/CStrInternStatic.h =================================================================== --- ps/trunk/source/ps/CStrInternStatic.h +++ ps/trunk/source/ps/CStrInternStatic.h @@ -87,6 +87,7 @@ X(color) X(colorAdd) X(colorMul) +X(debug_overlay) X(delta) X(depthTex) X(foamTex) Index: ps/trunk/source/renderer/TerrainOverlay.cpp =================================================================== --- ps/trunk/source/renderer/TerrainOverlay.cpp +++ ps/trunk/source/renderer/TerrainOverlay.cpp @@ -309,7 +309,7 @@ matrix._23 = m_TexelsPerTile / (m_TextureH * TERRAIN_TILE_SIZE); matrix._44 = 1; - g_Renderer.GetTerrainRenderer().RenderTerrainOverlayTexture(cullGroup, matrix); + g_Renderer.GetTerrainRenderer().RenderTerrainOverlayTexture(cullGroup, matrix, m_Texture); } SColor4ub TerrainTextureOverlay::GetColor(size_t idx, u8 alpha) const Index: ps/trunk/source/renderer/TerrainRenderer.h =================================================================== --- ps/trunk/source/renderer/TerrainRenderer.h +++ ps/trunk/source/renderer/TerrainRenderer.h @@ -145,7 +145,7 @@ * by the given texture matrix. * Intended for use by TerrainTextureOverlay. */ - void RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix); + void RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, GLuint texture); private: TerrainRendererInternals* m; Index: ps/trunk/source/renderer/TerrainRenderer.cpp =================================================================== --- ps/trunk/source/renderer/TerrainRenderer.cpp +++ ps/trunk/source/renderer/TerrainRenderer.cpp @@ -397,72 +397,66 @@ #endif } -void TerrainRenderer::RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix) +void TerrainRenderer::RenderTerrainOverlayTexture(int cullGroup, CMatrix3D& textureMatrix, GLuint texture) { #if CONFIG2_GLES #warning TODO: implement TerrainRenderer::RenderTerrainOverlayTexture for GLES UNUSED2(cullGroup); UNUSED2(textureMatrix); + UNUSED2(texture); #else ENSURE(m->phase == Phase_Render); std::vector& visiblePatches = m->visiblePatches[cullGroup]; - glEnableClientState(GL_VERTEX_ARRAY); - glEnableClientState(GL_TEXTURE_COORD_ARRAY); - - pglActiveTextureARB(GL_TEXTURE0); glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glDepthMask(0); glDisable(GL_DEPTH_TEST); - glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); - - glMatrixMode(GL_TEXTURE); - glLoadMatrixf(&textureMatrix._11); - glMatrixMode(GL_MODELVIEW); + CShaderTechniquePtr debugOverlayTech = + g_Renderer.GetShaderManager().LoadEffect(str_debug_overlay); + debugOverlayTech->BeginPass(); + CShaderProgramPtr debugOverlayShader = debugOverlayTech->GetShader(); + + debugOverlayShader->Bind(); + debugOverlayShader->BindTexture(str_baseTex, texture); + debugOverlayShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); + debugOverlayShader->Uniform(str_textureTransform, textureMatrix); + CPatchRData::RenderStreams(visiblePatches, debugOverlayShader, STREAM_POS | STREAM_POSTOUV0); - CShaderProgramPtr dummyShader = GetDummyShader(); - dummyShader->Bind(); - dummyShader->Uniform(str_transform, g_Renderer.GetViewCamera().GetViewProjection()); - dummyShader->Uniform(str_color, CColor(0.0f, 0.0f, 0.0f, 1.0f)); - CPatchRData::RenderStreams(visiblePatches, dummyShader, STREAM_POS | STREAM_POSTOUV0); - dummyShader->Unbind(); + glEnable(GL_DEPTH_TEST); // To make the overlay visible over water, render an additional map-sized - // water-height patch + // water-height patch. CBoundingBoxAligned waterBounds; - for (size_t i = 0; i < visiblePatches.size(); ++i) - { - CPatchRData* data = visiblePatches[i]; + for (CPatchRData* data : visiblePatches) waterBounds += data->GetWaterBounds(); - } if (!waterBounds.IsEmpty()) { - float h = g_Renderer.GetWaterManager()->m_WaterHeight + 0.05f; // add a delta to avoid z-fighting - float waterPos[] = { - waterBounds[0].X, h, waterBounds[0].Z, - waterBounds[1].X, h, waterBounds[0].Z, - waterBounds[0].X, h, waterBounds[1].Z, - waterBounds[1].X, h, waterBounds[1].Z + // Add a delta to avoid z-fighting. + const float height = g_Renderer.GetWaterManager()->m_WaterHeight + 0.05f; + const float waterPos[] = { + waterBounds[0].X, height, waterBounds[0].Z, + waterBounds[1].X, height, waterBounds[0].Z, + waterBounds[0].X, height, waterBounds[1].Z, + waterBounds[1].X, height, waterBounds[1].Z }; - glVertexPointer(3, GL_FLOAT, 3*sizeof(float), waterPos); - glTexCoordPointer(3, GL_FLOAT, 3*sizeof(float), waterPos); + + const GLsizei stride = sizeof(float) * 3; + debugOverlayShader->VertexPointer(3, GL_FLOAT, stride, waterPos); + debugOverlayShader->TexCoordPointer(GL_TEXTURE0, 3, GL_FLOAT, stride, waterPos); + debugOverlayShader->AssertPointersBound(); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); } - glMatrixMode(GL_TEXTURE); - glLoadIdentity(); - glMatrixMode(GL_MODELVIEW); + debugOverlayShader->Unbind(); + debugOverlayTech->EndPass(); glDepthMask(1); - glEnable(GL_DEPTH_TEST); glDisable(GL_BLEND); - glDisableClientState(GL_COLOR_ARRAY); - glDisableClientState(GL_VERTEX_ARRAY); - glDisableClientState(GL_TEXTURE_COORD_ARRAY); #endif }