aboutsummaryrefslogtreecommitdiff
path: root/game/src/GameSession
diff options
context:
space:
mode:
author Hop311 <hop3114@gmail.com>2023-04-28 20:08:58 +0200
committer Hop311 <hop3114@gmail.com>2023-04-28 20:08:58 +0200
commit5022ec800b096e9a85d6ef07ca4b652abb8625ee (patch)
tree899b97479f6a1aabbfe352747bea162ce5720193 /game/src/GameSession
parent2455806f52f0133e5bd5e4997589c5ce4fe99b2c (diff)
Terrain channel for provinces + generated minimap
Diffstat (limited to 'game/src/GameSession')
-rw-r--r--game/src/GameSession/GameSession.tscn1
-rw-r--r--game/src/GameSession/MapControlPanel.gd3
-rw-r--r--game/src/GameSession/MapControlPanel.tscn28
-rw-r--r--game/src/GameSession/MapView.gd53
-rw-r--r--game/src/GameSession/MapView.tscn1
-rw-r--r--game/src/GameSession/Minimap.gd7
-rw-r--r--game/src/GameSession/Minimap.gdshader7
-rw-r--r--game/src/GameSession/ProvinceIndexSampler.gdshaderinc18
-rw-r--r--game/src/GameSession/TerrainMap.gdshader34
9 files changed, 61 insertions, 91 deletions
diff --git a/game/src/GameSession/GameSession.tscn b/game/src/GameSession/GameSession.tscn
index b993acf..98b43dd 100644
--- a/game/src/GameSession/GameSession.tscn
+++ b/game/src/GameSession/GameSession.tscn
@@ -69,7 +69,6 @@ grow_horizontal = 0
[connection signal="province_selected" from="MapView" to="ProvinceOverviewPanel" method="_on_province_selected"]
[connection signal="options_button_pressed" from="GameSessionMenu" to="OptionsMenu" method="show"]
[connection signal="game_session_menu_button_pressed" from="MapControlPanel" to="." method="_on_game_session_menu_button_pressed"]
-[connection signal="mapmode_changed" from="MapControlPanel" to="MapView" method="_update_colour_texture"]
[connection signal="minimap_clicked" from="MapControlPanel" to="MapView" method="_on_minimap_clicked"]
[connection signal="mouse_entered" from="MapControlPanel" to="MapView" method="_on_mouse_exited_viewport"]
[connection signal="mouse_exited" from="MapControlPanel" to="MapView" method="_on_mouse_entered_viewport"]
diff --git a/game/src/GameSession/MapControlPanel.gd b/game/src/GameSession/MapControlPanel.gd
index 73d7e06..508f692 100644
--- a/game/src/GameSession/MapControlPanel.gd
+++ b/game/src/GameSession/MapControlPanel.gd
@@ -1,7 +1,6 @@
extends PanelContainer
signal game_session_menu_button_pressed
-signal mapmode_changed
signal map_view_camera_changed(near_left : Vector2, far_left : Vector2, far_right : Vector2, near_right : Vector2)
signal minimap_clicked(pos_clicked : Vector2)
signal zoom_in_button_pressed
@@ -40,7 +39,7 @@ func _on_game_session_menu_button_pressed() -> void:
# * UIFUN-129, UIFUN-133
func _mapmode_pressed(button : BaseButton) -> void:
GameSingleton.set_mapmode(button.tooltip_text)
- mapmode_changed.emit()
+ GameSingleton.update_colour_image()
func _on_map_view_camera_changed(near_left : Vector2, far_left : Vector2, far_right : Vector2, near_right : Vector2) -> void:
map_view_camera_changed.emit(near_left, far_left, far_right, near_right)
diff --git a/game/src/GameSession/MapControlPanel.tscn b/game/src/GameSession/MapControlPanel.tscn
index 18b1c3f..ae4c3dc 100644
--- a/game/src/GameSession/MapControlPanel.tscn
+++ b/game/src/GameSession/MapControlPanel.tscn
@@ -1,9 +1,12 @@
[gd_scene load_steps=7 format=3 uid="uid://g524p8lr574w"]
[ext_resource type="Script" path="res://src/GameSession/MapControlPanel.gd" id="1_ign64"]
-[ext_resource type="Texture2D" uid="uid://c0sm1jfu4kyv3" path="res://art/ui/minimap.png" id="2_r613r"]
+[ext_resource type="Shader" path="res://src/GameSession/Minimap.gdshader" id="2_rinsg"]
[ext_resource type="Script" path="res://src/GameSession/Minimap.gd" id="3_s4dml"]
-[ext_resource type="Texture2D" uid="uid://vr1hq2stk8ny" path="res://art/ui/minimap_frame.png" id="4_f1exl"]
+
+[sub_resource type="ShaderMaterial" id="ShaderMaterial_bhuqb"]
+shader = ExtResource("2_rinsg")
+shader_parameter/province_shape_subdivisions = null
[sub_resource type="InputEventAction" id="InputEventAction_5nck3"]
action = &"ui_cancel"
@@ -41,28 +44,21 @@ columns = 11
[node name="Minimap" type="PanelContainer" parent="MapPanelMargin/MapPanelList/MapDisplayList"]
editor_description = "UI-549"
layout_mode = 2
+size_flags_horizontal = 4
+size_flags_vertical = 4
mouse_filter = 1
-[node name="MinimapTexture" type="TextureRect" parent="MapPanelMargin/MapPanelList/MapDisplayList/Minimap"]
+[node name="MinimapTexture" type="ColorRect" parent="MapPanelMargin/MapPanelList/MapDisplayList/Minimap"]
editor_description = "UI-751, FS-338"
+material = SubResource("ShaderMaterial_bhuqb")
layout_mode = 2
-texture = ExtResource("2_r613r")
+color = Color(0.921569, 0.835294, 0.701961, 1)
-[node name="ViewportQuad" type="Control" parent="MapPanelMargin/MapPanelList/MapDisplayList/Minimap"]
+[node name="ViewportQuad" type="Control" parent="MapPanelMargin/MapPanelList/MapDisplayList/Minimap" node_paths=PackedStringArray("_minimap_texture")]
layout_mode = 2
mouse_filter = 2
script = ExtResource("3_s4dml")
-
-[node name="Frame" type="NinePatchRect" parent="MapPanelMargin/MapPanelList/MapDisplayList/Minimap"]
-layout_mode = 2
-texture = ExtResource("4_f1exl")
-draw_center = false
-patch_margin_left = 10
-patch_margin_top = 10
-patch_margin_right = 10
-patch_margin_bottom = 10
-axis_stretch_horizontal = 1
-axis_stretch_vertical = 1
+_minimap_texture = NodePath("../MinimapTexture")
[node name="AuxiliaryPanel" type="VBoxContainer" parent="MapPanelMargin/MapPanelList"]
editor_description = "UI-761"
diff --git a/game/src/GameSession/MapView.gd b/game/src/GameSession/MapView.gd
index 1b04097..340083f 100644
--- a/game/src/GameSession/MapView.gd
+++ b/game/src/GameSession/MapView.gd
@@ -12,13 +12,6 @@ const _action_zoom_out : StringName = &"map_zoom_out"
const _action_drag : StringName = &"map_drag"
const _action_click : StringName = &"map_click"
-const _shader_param_province_index : StringName = &"province_index_tex"
-const _shader_param_province_index_subdivisions : StringName = &"province_index_subdivisions"
-const _shader_param_province_colour : StringName = &"province_colour_tex"
-const _shader_param_hover_index : StringName = &"hover_index"
-const _shader_param_selected_index : StringName = &"selected_index"
-const _shader_param_terrain_tile_factor : StringName = &"terrain_tile_factor"
-
@export var _camera : Camera3D
@export var _cardinal_move_speed : float = 1.0
@@ -41,9 +34,6 @@ var _mouse_over_viewport : bool = true
@export var _map_mesh_instance : MeshInstance3D
var _map_mesh : MapMesh
var _map_shader_material : ShaderMaterial
-var _map_image_size : Vector2
-var _map_province_colour_image : Image
-var _map_province_colour_texture : ImageTexture
var _map_mesh_corner : Vector2
var _map_mesh_dims : Vector2
@@ -69,46 +59,19 @@ func _ready():
# Shader Material
var map_material := _map_mesh_instance.get_active_material(0)
- if map_material == null:
- push_error("Map mesh is missing material!")
- return
- if not map_material is ShaderMaterial:
- push_error("Invalid map mesh material class: ", map_material.get_class())
+ if Events.ShaderManager.set_up_shader(map_material, true) != OK:
+ push_error("Failed to set up map shader")
return
_map_shader_material = map_material
- # Province index textures
- var map_province_index_images := GameSingleton.get_province_index_images()
- if map_province_index_images == null or map_province_index_images.is_empty():
- push_error("Failed to get province index image!")
- return
- var province_index_texture := Texture2DArray.new()
- if province_index_texture.create_from_images(map_province_index_images) != OK:
- push_error("Failed to generate province index texture array!")
- return
- _map_shader_material.set_shader_parameter(_shader_param_province_index, province_index_texture)
- var subdivisions := GameSingleton.get_province_index_image_subdivisions()
- if subdivisions.x < 1 or subdivisions.y < 1:
- push_error("Invalid province index image subdivision: ", subdivisions.x, "x", subdivisions.y)
- _map_shader_material.set_shader_parameter(_shader_param_province_index_subdivisions, Vector2(subdivisions))
-
- # Province colour texture
- _map_province_colour_image = GameSingleton.get_province_colour_image()
- if _map_province_colour_image == null:
- push_error("Failed to get province colour image!")
- return
- _map_province_colour_texture = ImageTexture.create_from_image(_map_province_colour_image)
- _map_shader_material.set_shader_parameter(_shader_param_province_colour, _map_province_colour_texture)
-
if not _map_mesh_instance.mesh is MapMesh:
push_error("Invalid map mesh class: ", _map_mesh_instance.mesh.get_class(), "(expected MapMesh)")
return
_map_mesh = _map_mesh_instance.mesh
# Set map mesh size and get bounds
- _map_image_size = Vector2(Vector2i(GameSingleton.get_width(), GameSingleton.get_height()))
- _map_mesh.aspect_ratio = _map_image_size.x / _map_image_size.y
- _map_shader_material.set_shader_parameter(_shader_param_terrain_tile_factor, _map_image_size.y / 64.0)
+ _map_mesh.aspect_ratio = GameSingleton.get_aspect_ratio()
+ _map_shader_material.set_shader_parameter(Events.ShaderManager.param_terrain_tile_factor, float(GameSingleton.get_height()) / 64.0)
var map_mesh_aabb := _map_mesh.get_core_aabb() * _map_mesh_instance.transform
_map_mesh_corner = Vector2(
min(map_mesh_aabb.position.x, map_mesh_aabb.end.x),
@@ -126,10 +89,6 @@ func _notification(what : int):
NOTIFICATION_WM_MOUSE_EXIT: # Mouse out of window
_on_mouse_exited_viewport()
-func _update_colour_texture() -> void:
- GameSingleton.update_colour_image()
- _map_province_colour_texture.update(_map_province_colour_image)
-
func _world_to_map_coords(pos : Vector3) -> Vector2:
return (Vector2(pos.x, pos.z) - _map_mesh_corner) / _map_mesh_dims
@@ -159,7 +118,7 @@ func _unhandled_input(event : InputEvent):
# Check if the mouse is outside of bounds
if _map_mesh.is_valid_uv_coord(_mouse_pos_map):
var selected_index := GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map)
- _map_shader_material.set_shader_parameter(_shader_param_selected_index, selected_index)
+ _map_shader_material.set_shader_parameter(Events.ShaderManager.param_selected_index, selected_index)
province_selected.emit(selected_index)
else:
print("Clicked outside the map!")
@@ -256,7 +215,7 @@ func _update_mouse_map_position() -> void:
_mouse_pos_map = _viewport_to_map_coords(_mouse_pos_viewport)
var hover_index := GameSingleton.get_province_index_from_uv_coords(_mouse_pos_map)
if _mouse_over_viewport:
- _map_shader_material.set_shader_parameter(_shader_param_hover_index, hover_index)
+ _map_shader_material.set_shader_parameter(Events.ShaderManager.param_hover_index, hover_index)
func _on_mouse_entered_viewport():
_mouse_over_viewport = true
diff --git a/game/src/GameSession/MapView.tscn b/game/src/GameSession/MapView.tscn
index c8934c5..efbad4e 100644
--- a/game/src/GameSession/MapView.tscn
+++ b/game/src/GameSession/MapView.tscn
@@ -7,6 +7,7 @@
[sub_resource type="ShaderMaterial" id="ShaderMaterial_tayeg"]
render_priority = 0
shader = ExtResource("1_upocn")
+shader_parameter/province_index_subdivisions = null
shader_parameter/hover_index = null
shader_parameter/selected_index = null
shader_parameter/terrain_tile_factor = null
diff --git a/game/src/GameSession/Minimap.gd b/game/src/GameSession/Minimap.gd
index 25c7cac..05c662b 100644
--- a/game/src/GameSession/Minimap.gd
+++ b/game/src/GameSession/Minimap.gd
@@ -4,8 +4,15 @@ signal minimap_clicked(pos_clicked : Vector2)
const _action_click : StringName = &"map_click"
+@export var _minimap_texture : Control
+
var _viewport_points : PackedVector2Array
+func _ready():
+ _minimap_texture.custom_minimum_size = Vector2(GameSingleton.get_aspect_ratio(), 1.0) * 150
+ if Events.ShaderManager.set_up_shader(_minimap_texture.get_material(), false) != OK:
+ push_error("Failed to set up minimap shader")
+
# REQUIREMENTS
# * SS-80
# * UI-752
diff --git a/game/src/GameSession/Minimap.gdshader b/game/src/GameSession/Minimap.gdshader
new file mode 100644
index 0000000..9afd470
--- /dev/null
+++ b/game/src/GameSession/Minimap.gdshader
@@ -0,0 +1,7 @@
+shader_type canvas_item;
+
+#include "ProvinceIndexSampler.gdshaderinc"
+
+void fragment() {
+ COLOR.rgb = mix(COLOR.rgb, vec3(0.5), float(read_uvec3(UV).b != 0u));
+}
diff --git a/game/src/GameSession/ProvinceIndexSampler.gdshaderinc b/game/src/GameSession/ProvinceIndexSampler.gdshaderinc
new file mode 100644
index 0000000..65f73d8
--- /dev/null
+++ b/game/src/GameSession/ProvinceIndexSampler.gdshaderinc
@@ -0,0 +1,18 @@
+
+// Province shape texture
+uniform sampler2DArray province_shape_tex : repeat_enable, filter_nearest;
+// Province shape subdivisions
+uniform vec2 province_shape_subdivisions;
+
+uvec3 vec3_to_uvec3(vec3 v) {
+ return uvec3(v * 255.0);
+}
+uvec3 read_uvec3(vec2 uv) {
+ uv *= province_shape_subdivisions;
+ vec2 subdivision_coords = mod(floor(uv), province_shape_subdivisions);
+ float idx = subdivision_coords.x + subdivision_coords.y * province_shape_subdivisions.x;
+ return vec3_to_uvec3(texture(province_shape_tex, vec3(uv, idx)).rgb);
+}
+uint uvec2_to_uint(uvec2 v) {
+ return (v.y << 8u) | v.x;
+}
diff --git a/game/src/GameSession/TerrainMap.gdshader b/game/src/GameSession/TerrainMap.gdshader
index f80d6bd..05928f3 100644
--- a/game/src/GameSession/TerrainMap.gdshader
+++ b/game/src/GameSession/TerrainMap.gdshader
@@ -2,42 +2,26 @@ shader_type spatial;
render_mode unshaded;
-// Cosmetic farmlands terrain texture
-uniform sampler2D farmlands_tex: source_color, repeat_enable, filter_linear;
-// Province index texture
-uniform sampler2DArray province_index_tex : source_color, repeat_enable, filter_nearest;
-// Province index subdivisions
-uniform vec2 province_index_subdivisions;
+#include "ProvinceIndexSampler.gdshaderinc"
+
// Province colour texture
uniform sampler2D province_colour_tex: source_color, repeat_enable, filter_nearest;
// Index of the mouse over the map mesh
uniform uint hover_index;
// Index of the currently selected province
uniform uint selected_index;
+// Cosmetic farmlands terrain texture
+uniform sampler2D farmlands_tex: source_color, repeat_enable, filter_linear;
// The number of times the terrain textures should tile vertically
uniform float terrain_tile_factor;
-uvec2 vec2_to_uvec2(vec2 v) {
- return uvec2(v * 255.0);
-}
-uvec2 read_uvec2(vec2 uv) {
- uv *= province_index_subdivisions;
- vec2 subdivision_coords = mod(floor(uv), province_index_subdivisions);
- float idx = subdivision_coords.x + subdivision_coords.y * province_index_subdivisions.x;
- return vec2_to_uvec2(texture(province_index_tex, vec3(uv, idx)).rg);
-}
-uint uvec2_to_uint(uvec2 v) {
- return (v.y << 8u) | v.x;
-}
-
const vec3 water_colour = vec3(0, 0, 1);
vec3 get_terrain_colour(vec2 uv, vec2 corner, vec2 half_pixel_size, vec2 terrain_uv) {
- uvec2 index_split = read_uvec2(fma(corner, half_pixel_size, uv));
- uint index = uvec2_to_uint(index_split);
- vec4 province_data = texelFetch(province_colour_tex, ivec2(index_split), 0);
- vec3 province_colour = province_data.rgb;
- float is_land = province_data.a;
+ uvec3 province_data = read_uvec3(fma(corner, half_pixel_size, uv));
+ uint index = uvec2_to_uint(province_data.rg);
+ float is_land = float(province_data.b != 0u);
+ vec3 province_colour = texelFetch(province_colour_tex, ivec2(province_data.rg), 0).rgb;
vec3 farmlands_colour = texture(farmlands_tex, terrain_uv).rgb;
vec3 terrain_colour = mix(water_colour, farmlands_colour, is_land);
float mix_val = 0.4 + float(index == hover_index) * 0.2 + float(index == selected_index) * 0.2;
@@ -46,7 +30,7 @@ vec3 get_terrain_colour(vec2 uv, vec2 corner, vec2 half_pixel_size, vec2 terrain
}
vec3 mix_terrain_colour(vec2 uv) {
- vec2 map_size = vec2(textureSize(province_index_tex, 0).xy);
+ vec2 map_size = vec2(textureSize(province_shape_tex, 0).xy);
vec2 pixel_offset = fract(fma(uv, map_size, vec2(0.5)));
vec2 half_pixel_size = 0.49 / map_size;