diff options
author | Hop311 <hop3114@gmail.com> | 2023-03-30 23:50:50 +0200 |
---|---|---|
committer | Spartan322 <Megacake1234@gmail.com> | 2023-04-14 17:16:02 +0200 |
commit | c0d76b78d3762e6eec3ed1c62618be84c5b7559b (patch) | |
tree | acfcbeedd5a47136acdf883e791a297200b7d1b8 /game/src/GameSession/TerrainMap.gdshader | |
parent | 1f04a7827ae377372cb491ff0257a47d0d4c2967 (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.gdshader | 48 |
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); +} |