diff --git a/binaries/data/mods/public/shaders/arb/minimap.vp b/binaries/data/mods/public/shaders/arb/minimap.vp
index 25cf42bda4..abe9194768 100644
--- a/binaries/data/mods/public/shaders/arb/minimap.vp
+++ b/binaries/data/mods/public/shaders/arb/minimap.vp
@@ -1,31 +1,28 @@
!!ARBvp1.0
-PARAM transform[4] = { program.local[0..3] };
-PARAM textureTransform[4] = { program.local[4..7] };
+PARAM transform = program.local[0];
+PARAM translation = program.local[1];
+PARAM textureTransform = program.local[2];
OUTPUT v_tex = result.texcoord[0];
TEMP position;
-MOV position, vertex.position;
-#if MINIMAP_POINT
- MOV position.z, 0.0;
-#endif
+MUL position, transform, vertex.position.xyxy;
+ADD position.x, position.x, position.y;
+ADD position.y, position.z, position.w;
+ADD position, position, translation.xyxy;
+MOV position.z, 0.0;
MOV position.w, 1.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;
+MOV result.position, position;
#if MINIMAP_BASE || MINIMAP_LOS
TEMP tex;
- MOV tex, vertex.texcoord;
-#endif
-
-#if MINIMAP_BASE || MINIMAP_LOS
- DP4 v_tex.x, textureTransform[0], tex;
- DP4 v_tex.y, textureTransform[1], tex;
- DP4 v_tex.z, textureTransform[2], tex;
- DP4 v_tex.w, textureTransform[3], tex;
+ MUL tex, textureTransform, vertex.texcoord.xyxy;
+ ADD tex.x, tex.x, tex.y;
+ ADD tex.y, tex.z, tex.w;
+ ADD tex, tex, translation.zwzw;
+ MOV tex.z, 0.0;
+ MOV tex.w, 1.0;
+ MOV v_tex, tex;
#endif
#if MINIMAP_POINT
diff --git a/binaries/data/mods/public/shaders/arb/minimap.xml b/binaries/data/mods/public/shaders/arb/minimap.xml
index 032b2a031f..a76541acd0 100644
--- a/binaries/data/mods/public/shaders/arb/minimap.xml
+++ b/binaries/data/mods/public/shaders/arb/minimap.xml
@@ -5,8 +5,9 @@
-
-
+
+
+
diff --git a/binaries/data/mods/public/shaders/glsl/minimap.vs b/binaries/data/mods/public/shaders/glsl/minimap.vs
index cd57a23338..6fdcef6672 100644
--- a/binaries/data/mods/public/shaders/glsl/minimap.vs
+++ b/binaries/data/mods/public/shaders/glsl/minimap.vs
@@ -1,18 +1,19 @@
#version 110
-uniform mat4 transform;
-uniform mat4 textureTransform;
+uniform vec4 transform;
+uniform vec4 translation;
+uniform vec4 textureTransform;
#if MINIMAP_POINT && USE_GPU_INSTANCING
uniform float width;
#endif
+attribute vec2 a_vertex;
+
#if MINIMAP_BASE || MINIMAP_LOS
-attribute vec3 a_vertex;
attribute vec2 a_uv0;
#endif
#if MINIMAP_POINT
-attribute vec2 a_vertex;
attribute vec3 a_color;
#if USE_GPU_INSTANCING
attribute vec2 a_uv1;
@@ -30,16 +31,18 @@ varying vec3 color;
void main()
{
#if MINIMAP_BASE || MINIMAP_LOS
- gl_Position = transform * vec4(a_vertex, 1.0);
- v_tex = (textureTransform * vec4(a_uv0, 0.0, 1.0)).xy;
+ vec2 position = a_vertex;
+ v_tex = mat2(textureTransform.xy, textureTransform.zw) * a_uv0 + translation.zw;
#endif
#if MINIMAP_POINT
#if USE_GPU_INSTANCING
- gl_Position = transform * vec4(a_vertex * width + a_uv1, 0.0, 1.0);
+ vec2 position = a_vertex * width + a_uv1;
#else
- gl_Position = transform * vec4(a_vertex, 0.0, 1.0);
+ vec2 position = a_vertex;
#endif
color = a_color;
#endif // MINIMAP_POINT
+
+ gl_Position = vec4(mat2(transform.xy, transform.zw) * position + translation.xy, 0.0, 1.0);
}
diff --git a/source/graphics/MiniMapTexture.cpp b/source/graphics/MiniMapTexture.cpp
index 17fcd3c2e1..3bddaf3759 100644
--- a/source/graphics/MiniMapTexture.cpp
+++ b/source/graphics/MiniMapTexture.cpp
@@ -95,18 +95,18 @@ void DrawTexture(
};
const float quadVertices[] =
{
- -1.0f, -1.0f, 0.0f,
- 1.0f, -1.0f, 0.0f,
- 1.0f, 1.0f, 0.0f,
+ -1.0f, -1.0f,
+ 1.0f, -1.0f,
+ 1.0f, 1.0f,
- 1.0f, 1.0f, 0.0f,
- -1.0f, 1.0f, 0.0f,
- -1.0f, -1.0f, 0.0f
+ 1.0f, 1.0f,
+ -1.0f, 1.0f,
+ -1.0f, -1.0f,
};
deviceCommandContext->SetVertexAttributeFormat(
Renderer::Backend::VertexAttributeStream::POSITION,
- Renderer::Backend::Format::R32G32B32_SFLOAT, 0, sizeof(float) * 3,
+ Renderer::Backend::Format::R32G32_SFLOAT, 0, sizeof(float) * 2,
Renderer::Backend::VertexAttributeRate::PER_VERTEX, 0);
deviceCommandContext->SetVertexAttributeFormat(
Renderer::Backend::VertexAttributeStream::UV0,
@@ -486,10 +486,16 @@ void CMiniMapTexture::RenderFinalTexture(
CMatrix3D terrainTransform;
terrainTransform.SetIdentity();
terrainTransform.Scale(texCoordMax, texCoordMax, 1.0f);
+
deviceCommandContext->SetUniform(
- shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray());
+ shader->GetBindingSlot(str_transform),
+ baseTransform._11, baseTransform._21, baseTransform._12, baseTransform._22);
deviceCommandContext->SetUniform(
- shader->GetBindingSlot(str_textureTransform), terrainTransform.AsFloatArray());
+ shader->GetBindingSlot(str_textureTransform),
+ terrainTransform._11, terrainTransform._21, terrainTransform._12, terrainTransform._22);
+ deviceCommandContext->SetUniform(
+ shader->GetBindingSlot(str_translation),
+ baseTransform._14, baseTransform._24, terrainTransform._14, terrainTransform._24);
if (m_TerrainTexture)
DrawTexture(deviceCommandContext);
@@ -513,10 +519,15 @@ void CMiniMapTexture::RenderFinalTexture(
deviceCommandContext->SetTexture(
shader->GetBindingSlot(str_baseTex), territoryTexture.GetTexture());
deviceCommandContext->SetUniform(
- shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray());
+ shader->GetBindingSlot(str_transform),
+ baseTransform._11, baseTransform._21, baseTransform._12, baseTransform._22);
+ const CMatrix3D& territoryTransform = territoryTexture.GetMinimapTextureMatrix();
deviceCommandContext->SetUniform(
shader->GetBindingSlot(str_textureTransform),
- territoryTexture.GetMinimapTextureMatrix().AsFloatArray());
+ territoryTransform._11, territoryTransform._21, territoryTransform._12, territoryTransform._22);
+ deviceCommandContext->SetUniform(
+ shader->GetBindingSlot(str_translation),
+ baseTransform._14, baseTransform._24, territoryTransform._14, territoryTransform._24);
DrawTexture(deviceCommandContext);
deviceCommandContext->EndPass();
@@ -530,10 +541,15 @@ void CMiniMapTexture::RenderFinalTexture(
deviceCommandContext->SetTexture(
shader->GetBindingSlot(str_baseTex), losTexture.GetTexture());
deviceCommandContext->SetUniform(
- shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray());
+ shader->GetBindingSlot(str_transform),
+ baseTransform._11, baseTransform._21, baseTransform._12, baseTransform._22);
+ const CMatrix3D& losTransform = losTexture.GetMinimapTextureMatrix();
deviceCommandContext->SetUniform(
shader->GetBindingSlot(str_textureTransform),
- losTexture.GetMinimapTextureMatrix().AsFloatArray());
+ losTransform._11, losTransform._21, losTransform._12, losTransform._22);
+ deviceCommandContext->SetUniform(
+ shader->GetBindingSlot(str_translation),
+ baseTransform._14, baseTransform._24, losTransform._14, losTransform._24);
DrawTexture(deviceCommandContext);
@@ -723,8 +739,6 @@ void CMiniMapTexture::RenderFinalTexture(
tech->GetGraphicsPipelineStateDesc());
deviceCommandContext->BeginPass();
shader = tech->GetShader();
- deviceCommandContext->SetUniform(
- shader->GetBindingSlot(str_transform), baseTransform.AsFloatArray());
CMatrix3D unitMatrix;
unitMatrix.SetIdentity();
@@ -734,7 +748,11 @@ void CMiniMapTexture::RenderFinalTexture(
// Offset the coordinates to [-1, 1].
unitMatrix.Translate(CVector3D(-1.0f, -1.0f, 0.0f));
deviceCommandContext->SetUniform(
- shader->GetBindingSlot(str_transform), unitMatrix.AsFloatArray());
+ shader->GetBindingSlot(str_transform),
+ unitMatrix._11, unitMatrix._21, unitMatrix._12, unitMatrix._22);
+ deviceCommandContext->SetUniform(
+ shader->GetBindingSlot(str_translation),
+ unitMatrix._14, unitMatrix._24, 0.0f, 0.0f);
Renderer::Backend::IDeviceCommandContext::Rect scissorRect;
scissorRect.x = scissorRect.y = 1;