aboutsummaryrefslogtreecommitdiff
path: root/game/src
diff options
context:
space:
mode:
Diffstat (limited to 'game/src')
-rw-r--r--game/src/Autoload/Events.gd2
-rw-r--r--game/src/Autoload/Events/GameDebug.gd (renamed from game/src/Autoload/GameDebug.gd)5
-rw-r--r--game/src/Autoload/Events/ShaderManager.gd40
-rw-r--r--game/src/Autoload/Resolution.gd2
-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.gd48
-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.gdshader32
13 files changed, 107 insertions, 87 deletions
diff --git a/game/src/Autoload/Events.gd b/game/src/Autoload/Events.gd
index 7540d3e..f94d338 100644
--- a/game/src/Autoload/Events.gd
+++ b/game/src/Autoload/Events.gd
@@ -1,7 +1,9 @@
extends Node
+var GameDebug = preload("Events/GameDebug.gd").new()
var Options = preload("Events/Options.gd").new()
var Localisation = preload("Events/Localisation.gd").new()
+var ShaderManager = preload("Events/ShaderManager.gd").new()
const _province_identifier_file : String = "res://common/map/provinces.json"
const _water_province_file : String = "res://common/map/water.json"
diff --git a/game/src/Autoload/GameDebug.gd b/game/src/Autoload/Events/GameDebug.gd
index 6f10bf5..4e8931f 100644
--- a/game/src/Autoload/GameDebug.gd
+++ b/game/src/Autoload/Events/GameDebug.gd
@@ -1,8 +1,8 @@
-extends Node
+extends RefCounted
# REQUIREMENTS:
# * SS-56
-func _ready():
+func _init():
for engine_args in OS.get_cmdline_args():
match(engine_args):
"--game-debug":
@@ -15,6 +15,7 @@ func _ready():
func set_debug_mode(value : bool) -> void:
ProjectSettings.set_setting("openvic2/debug/enabled", value)
+ print("Set debug mode to: ", value)
func is_debug_mode() -> bool:
return ProjectSettings.get_setting("openvic2/debug/enabled", false)
diff --git a/game/src/Autoload/Events/ShaderManager.gd b/game/src/Autoload/Events/ShaderManager.gd
new file mode 100644
index 0000000..96ed5b4
--- /dev/null
+++ b/game/src/Autoload/Events/ShaderManager.gd
@@ -0,0 +1,40 @@
+extends RefCounted
+
+const param_province_shape : StringName = &"province_shape_tex"
+const param_province_shape_subdivisions : StringName = &"province_shape_subdivisions"
+const param_province_colour : StringName = &"province_colour_tex"
+const param_hover_index : StringName = &"hover_index"
+const param_selected_index : StringName = &"selected_index"
+const param_terrain_tile_factor : StringName = &"terrain_tile_factor"
+
+func set_up_shader(material : Material, add_colour_texture : bool) -> Error:
+ # Shader Material
+ if material == null:
+ push_error("material is null!")
+ return FAILED
+ if not material is ShaderMaterial:
+ push_error("Invalid map mesh material class: ", material.get_class())
+ return FAILED
+ var shader_material : ShaderMaterial = material
+
+ # Province shape texture
+ var province_shape_texture := GameSingleton.get_province_shape_texture()
+ if province_shape_texture == null:
+ push_error("Failed to get province shape texture!")
+ return FAILED
+ shader_material.set_shader_parameter(param_province_shape, province_shape_texture)
+ var subdivisions := GameSingleton.get_province_shape_image_subdivisions()
+ if subdivisions.x < 1 or subdivisions.y < 1:
+ push_error("Invalid province shape image subdivision: ", subdivisions.x, "x", subdivisions.y)
+ return FAILED
+ shader_material.set_shader_parameter(param_province_shape_subdivisions, Vector2(subdivisions))
+
+ if add_colour_texture:
+ # Province colour texture
+ var map_province_colour_texture := GameSingleton.get_province_colour_texture()
+ if map_province_colour_texture == null:
+ push_error("Failed to get province colour image!")
+ return FAILED
+ shader_material.set_shader_parameter(param_province_colour, map_province_colour_texture)
+
+ return OK
diff --git a/game/src/Autoload/Resolution.gd b/game/src/Autoload/Resolution.gd
index e1e788b..35ecbb3 100644
--- a/game/src/Autoload/Resolution.gd
+++ b/game/src/Autoload/Resolution.gd
@@ -62,7 +62,7 @@ func get_resolution_display_name(resolution_value : Vector2i) -> StringName:
func get_resolution_value_from_string(resolution_string : String) -> Vector2i:
if not resolution_string.is_empty():
for resolution in _resolutions.values():
- if resolution_string == resolution.get(name) or resolution_string == resolution.display_name:
+ if resolution_string == resolution.name or resolution_string == resolution.display_name:
return resolution.value
var result := _regex.search(resolution_string)
if result: return Vector2i(result.get_string(1).to_int(), result.get_string(2).to_int())
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 e74ea59..340083f 100644
--- a/game/src/GameSession/MapView.gd
+++ b/game/src/GameSession/MapView.gd
@@ -12,12 +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_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
@@ -40,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
@@ -68,42 +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)
-
- # 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),
@@ -121,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
@@ -154,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!")
@@ -251,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 305a34b..05928f3 100644
--- a/game/src/GameSession/TerrainMap.gdshader
+++ b/game/src/GameSession/TerrainMap.gdshader
@@ -2,40 +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;
+#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) {
- float width_divisions = float(textureSize(province_index_tex, 0).z);
- uv.x *= width_divisions;
- float idx = mod(floor(uv.x), width_divisions);
- 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;
@@ -44,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;