diff options
Diffstat (limited to 'game/src')
-rw-r--r-- | game/src/Autoload/Events.gd | 2 | ||||
-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.gd | 40 | ||||
-rw-r--r-- | game/src/Autoload/Resolution.gd | 2 | ||||
-rw-r--r-- | game/src/GameSession/GameSession.tscn | 1 | ||||
-rw-r--r-- | game/src/GameSession/MapControlPanel.gd | 3 | ||||
-rw-r--r-- | game/src/GameSession/MapControlPanel.tscn | 28 | ||||
-rw-r--r-- | game/src/GameSession/MapView.gd | 48 | ||||
-rw-r--r-- | game/src/GameSession/MapView.tscn | 1 | ||||
-rw-r--r-- | game/src/GameSession/Minimap.gd | 7 | ||||
-rw-r--r-- | game/src/GameSession/Minimap.gdshader | 7 | ||||
-rw-r--r-- | game/src/GameSession/ProvinceIndexSampler.gdshaderinc | 18 | ||||
-rw-r--r-- | game/src/GameSession/TerrainMap.gdshader | 32 |
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; |