mirror of
https://gitea.wildfiregames.com/0ad/0ad.git
synced 2026-09-21 20:06:40 +00:00
Fixes terrain overlays by removing fixed pipeline dependency.
Tested By: Freagarach, wraitii Differential Revision: https://code.wildfiregames.com/D3074 This was SVN commit r24154.
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
!!ARBfp1.0
|
||||
|
||||
ATTRIB v_tex = fragment.texcoord[0];
|
||||
|
||||
TEX result.color, v_tex, texture[0], 2D;
|
||||
|
||||
END
|
||||
@@ -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
|
||||
@@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<program type="arb">
|
||||
|
||||
<vertex file="arb/debug_overlay.vp">
|
||||
<uniform name="transform" loc="0" type="mat4"/>
|
||||
<uniform name="textureTransform" loc="4" type="mat4"/>
|
||||
<stream name="pos"/>
|
||||
<stream name="uv0"/>
|
||||
</vertex>
|
||||
|
||||
<fragment file="arb/debug_overlay.fp">
|
||||
<uniform name="baseTex" loc="0" type="sampler2D"/>
|
||||
</fragment>
|
||||
|
||||
</program>
|
||||
@@ -0,0 +1,14 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<effect>
|
||||
|
||||
<technique>
|
||||
<require shaders="arb"/>
|
||||
<pass shader="arb/debug_overlay"/>
|
||||
</technique>
|
||||
|
||||
<technique>
|
||||
<require shaders="glsl"/>
|
||||
<pass shader="glsl/debug_overlay"/>
|
||||
</technique>
|
||||
|
||||
</effect>
|
||||
@@ -0,0 +1,11 @@
|
||||
#version 110
|
||||
|
||||
uniform sampler2D baseTex;
|
||||
|
||||
varying vec2 v_tex;
|
||||
|
||||
void main()
|
||||
{
|
||||
vec4 base = texture2D(baseTex, v_tex);
|
||||
gl_FragColor = base;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<program type="glsl">
|
||||
|
||||
<vertex file="glsl/debug_overlay.vs">
|
||||
<stream name="pos"/>
|
||||
<stream name="uv0"/>
|
||||
<attrib name="a_vertex" semantics="gl_Vertex"/>
|
||||
<attrib name="a_uv0" semantics="gl_MultiTexCoord0"/>
|
||||
</vertex>
|
||||
|
||||
<fragment file="glsl/debug_overlay.fs"/>
|
||||
|
||||
</program>
|
||||
@@ -87,6 +87,7 @@ X(cameraPos)
|
||||
X(color)
|
||||
X(colorAdd)
|
||||
X(colorMul)
|
||||
X(debug_overlay)
|
||||
X(delta)
|
||||
X(depthTex)
|
||||
X(foamTex)
|
||||
|
||||
@@ -309,7 +309,7 @@ void TerrainTextureOverlay::RenderAfterWater(int cullGroup)
|
||||
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
|
||||
|
||||
@@ -397,72 +397,66 @@ void TerrainRenderer::RenderTerrainFixed(int cullGroup)
|
||||
#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<CPatchRData*>& 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);
|
||||
CShaderTechniquePtr debugOverlayTech =
|
||||
g_Renderer.GetShaderManager().LoadEffect(str_debug_overlay);
|
||||
debugOverlayTech->BeginPass();
|
||||
CShaderProgramPtr debugOverlayShader = debugOverlayTech->GetShader();
|
||||
|
||||
glMatrixMode(GL_TEXTURE);
|
||||
glLoadMatrixf(&textureMatrix._11);
|
||||
glMatrixMode(GL_MODELVIEW);
|
||||
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
|
||||
}
|
||||
|
||||
|
||||
@@ -145,7 +145,7 @@ public:
|
||||
* 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;
|
||||
|
||||
Reference in New Issue
Block a user