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
}