aboutsummaryrefslogtreecommitdiff
path: root/game/src/GameSession/TerrainMap.gdshader
diff options
context:
space:
mode:
author Hop311 <hop3114@gmail.com>2023-03-30 23:50:50 +0200
committer Spartan322 <Megacake1234@gmail.com>2023-04-14 17:16:02 +0200
commitc0d76b78d3762e6eec3ed1c62618be84c5b7559b (patch)
treeacfcbeedd5a47136acdf883e791a297200b7d1b8 /game/src/GameSession/TerrainMap.gdshader
parent1f04a7827ae377372cb491ff0257a47d0d4c2967 (diff)
Add terrain map
With Directional movement using WASD With Directional movement using arrow keys With Click-Drag movement using middle mouse button With Province identifiers With Province shape loading With Province rendering With Province selection With Province overview panel With Color lookup texture
Diffstat (limited to 'game/src/GameSession/TerrainMap.gdshader')
-rw-r--r--game/src/GameSession/TerrainMap.gdshader48
1 files changed, 48 insertions, 0 deletions
diff --git a/game/src/GameSession/TerrainMap.gdshader b/game/src/GameSession/TerrainMap.gdshader
new file mode 100644
index 0000000..a6774fd
--- /dev/null
+++ b/game/src/GameSession/TerrainMap.gdshader
@@ -0,0 +1,48 @@
+shader_type spatial;
+
+render_mode unshaded;
+
+// Cosmetic terrain texture
+uniform sampler2D terrain_tex: source_color, repeat_enable, filter_linear;
+// Province index texture
+uniform sampler2D province_index_tex : repeat_enable, filter_nearest;
+// Province colour texture
+uniform sampler2D province_colour_tex: source_color, repeat_enable, filter_nearest;
+// Position of the mouse over the map mesh in UV coords
+uniform vec2 hover_pos;
+// Position in UV coords of a pixel belonging to the currently selected province
+uniform vec2 selected_pos;
+
+uvec2 vec2_to_uvec2(vec2 v) {
+ return uvec2(v * 255.0);
+}
+
+uint uvec2_to_uint(uvec2 v) {
+ return (v.y << 8u) | v.x;
+}
+
+uvec2 read_uvec2(sampler2D tex, vec2 uv) {
+ return vec2_to_uvec2(texture(tex, uv).rg);
+}
+
+uint read_uint16(sampler2D tex, vec2 uv) {
+ return uvec2_to_uint(read_uvec2(tex, uv));
+}
+
+void fragment() {
+ uvec2 prov_idx_split = read_uvec2(province_index_tex, UV);
+
+ uint prov_index = uvec2_to_uint(prov_idx_split);
+ uint hover_index = read_uint16(province_index_tex, hover_pos);
+ uint selected_index = read_uint16(province_index_tex, selected_pos);
+
+ // Boost prov_colour's contribution if it matches hover_colour or selected_colour
+ float mix_val = float(prov_index == hover_index) * 0.3 + float(prov_index == selected_index) * 0.5;
+ // Don't mix if the province index is 0
+ mix_val *= float(prov_index != 0u);
+
+ vec3 terrain_colour = texture(terrain_tex, UV).rgb;
+ vec3 province_colour = texelFetch(province_colour_tex, ivec2(prov_idx_split), 0).rgb;
+
+ ALBEDO = mix(terrain_colour, province_colour, mix_val);
+}