diff --git a/src/base-environments/youth_room/outside.tscn b/src/base-environments/youth_room/outside.tscn index 8c34e31..eaa2c43 100644 --- a/src/base-environments/youth_room/outside.tscn +++ b/src/base-environments/youth_room/outside.tscn @@ -1,7 +1,20 @@ -[gd_scene load_steps=6 format=3 uid="uid://bwc2wp7tckm7t"] +[gd_scene load_steps=7 format=3 uid="uid://bwc2wp7tckm7t"] [ext_resource type="PackedScene" uid="uid://c2uf5vwe2rdbd" path="res://base-environments/youth_room/import/cheeky-city.glb" id="1_yckvd"] +[sub_resource type="GDScript" id="GDScript_bfd5g"] +script/source = "@tool +extends Node3D + +@export var light_energy:float = 0: + set(value): + light_energy = value + if is_inside_tree(): + light.light_energy = light_energy + +@onready var light := $DirectionalLight3D +" + [sub_resource type="ProceduralSkyMaterial" id="ProceduralSkyMaterial_6f36u"] sky_top_color = Color(0.101961, 0.0666667, 0.054902, 1) sky_horizon_color = Color(0.0627451, 0.054902, 0.0823529, 1) @@ -25,6 +38,7 @@ glow_strength = 0.7 glow_bloom = 0.5 glow_blend_mode = 1 glow_hdr_threshold = 0.0 +glow_hdr_scale = 0.0 fog_light_color = Color(0.258824, 0.184314, 0.101961, 1) fog_density = 0.03 fog_aerial_perspective = 0.94 @@ -42,6 +56,8 @@ dof_blur_far_distance = 0.01 dof_blur_far_transition = 20.0 [node name="outside" type="Node3D"] +script = SubResource("GDScript_bfd5g") +light_energy = 10.0 [node name="cheeky-city" parent="." instance=ExtResource("1_yckvd")] transform = Transform3D(20, 0, 0, 0, 20, 0, 0, 0, 20, 0, 0, 0) @@ -54,6 +70,22 @@ light_size = 0.279 omni_range = 16.0 omni_attenuation = 0.112656 +[node name="OmniLight3D8" type="OmniLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -11.2251, -0.256757, 4.38324) +light_color = Color(0.8, 0.603922, 0.392157, 1) +light_energy = 0.2 +light_size = 0.279 +omni_range = 16.0 +omni_attenuation = 0.112656 + +[node name="OmniLight3D7" type="OmniLight3D" parent="."] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.654726, -3.32103, 7.06207) +light_color = Color(0.570621, 0.67174, 0.659698, 1) +light_energy = 0.2 +light_size = 0.279 +omni_range = 16.0 +omni_attenuation = 0.112656 + [node name="OmniLight3D2" type="OmniLight3D" parent="."] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 40.5472, -0.232839, -32.886) light_color = Color(0.67451, 0.619608, 0.517647, 1) @@ -97,7 +129,7 @@ environment = SubResource("Environment_fld35") camera_attributes = SubResource("CameraAttributesPractical_ulrlw") [node name="DirectionalLight3D" type="DirectionalLight3D" parent="."] -transform = Transform3D(0.65453, -0.526846, 0.54224, 0, 0.717215, 0.696852, -0.756036, -0.456111, 0.469438, 0, 0, 0) +transform = Transform3D(-0.653881, 0.379921, 0.654294, 0.745388, 0.471786, 0.470972, -0.129755, 0.795662, -0.591681, 0, 0, 0) light_color = Color(0.92549, 0.94902, 0.980392, 1) light_energy = 0.0 light_angular_distance = 20.0 diff --git a/src/base-environments/youth_room/youth_room.tscn b/src/base-environments/youth_room/youth_room.tscn index 8d5d3d5..1bf53b6 100644 --- a/src/base-environments/youth_room/youth_room.tscn +++ b/src/base-environments/youth_room/youth_room.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=127 format=4 uid="uid://b3b0gyvklqn50"] +[gd_scene load_steps=131 format=4 uid="uid://b3b0gyvklqn50"] [ext_resource type="Script" path="res://base-environments/youth_room/room_handle.gd" id="1_aitp0"] [ext_resource type="PackedScene" uid="uid://c0i4ydmxtxfho" path="res://base-environments/youth_room/import/youth_room.glb" id="1_jf3oi"] @@ -1805,6 +1805,211 @@ radius = 0.469631 [sub_resource type="ViewportTexture" id="ViewportTexture_hdmps"] viewport_path = NodePath("logic/Mind Board/UiWrapper/UiSprite/SubViewport") +[sub_resource type="Animation" id="Animation_xum02"] +length = 0.001 +tracks/0/type = "value" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("visuals/DirectionalLight3D:visible") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("visuals/DirectionalLight3D:light_energy") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [20.0] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("visuals/OmniLight3D:visible") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 1, +"values": [false] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("visuals/OmniLight3D:light_energy") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [3.0] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("visuals/OmniLight3D:position") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(3.73188, 2.33544, 4.04756)] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("visuals/DirectionalLight3D:rotation") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [Vector3(-0.170518, -0.366744, -0.433319)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("WorldEnvironment/window_glass/SubViewport/outside:light_energy") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0), +"transitions": PackedFloat32Array(1), +"update": 0, +"values": [0.0] +} + +[sub_resource type="Animation" id="Animation_3ms6b"] +resource_name = "lighting_and_thunder" +length = 20.0 +tracks/0/type = "audio" +tracks/0/imported = false +tracks/0/enabled = true +tracks/0/path = NodePath("sfx/thunder") +tracks/0/interp = 1 +tracks/0/loop_wrap = true +tracks/0/keys = { +"clips": [{ +"end_offset": 0.0, +"start_offset": 0.0, +"stream": ExtResource("3_wcypa") +}], +"times": PackedFloat32Array(0.3) +} +tracks/0/use_blend = true +tracks/1/type = "value" +tracks/1/imported = false +tracks/1/enabled = true +tracks/1/path = NodePath("visuals/DirectionalLight3D:visible") +tracks/1/interp = 1 +tracks/1/loop_wrap = true +tracks/1/keys = { +"times": PackedFloat32Array(0.0333338, 0.2, 0.3, 0.8, 2.2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 1, +"values": [false, true, false, true, false] +} +tracks/2/type = "value" +tracks/2/imported = false +tracks/2/enabled = true +tracks/2/path = NodePath("visuals/DirectionalLight3D:light_energy") +tracks/2/interp = 1 +tracks/2/loop_wrap = true +tracks/2/keys = { +"times": PackedFloat32Array(0, 0.333333, 0.666667, 1.93333), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 0, +"values": [20.0, 20.0, 4.0, 0.0] +} +tracks/3/type = "value" +tracks/3/imported = false +tracks/3/enabled = true +tracks/3/path = NodePath("visuals/OmniLight3D:visible") +tracks/3/interp = 1 +tracks/3/loop_wrap = true +tracks/3/keys = { +"times": PackedFloat32Array(0.166667, 0.2, 0.233333, 0.4), +"transitions": PackedFloat32Array(1, 1, 1, 1), +"update": 1, +"values": [false, true, false, true] +} +tracks/4/type = "value" +tracks/4/imported = false +tracks/4/enabled = true +tracks/4/path = NodePath("visuals/OmniLight3D:light_energy") +tracks/4/interp = 1 +tracks/4/loop_wrap = true +tracks/4/keys = { +"times": PackedFloat32Array(0.2, 0.466667, 1.76667), +"transitions": PackedFloat32Array(1, 1, 1), +"update": 0, +"values": [1.0, 3.0, 0.0] +} +tracks/5/type = "value" +tracks/5/imported = false +tracks/5/enabled = true +tracks/5/path = NodePath("visuals/OmniLight3D:position") +tracks/5/interp = 1 +tracks/5/loop_wrap = true +tracks/5/keys = { +"times": PackedFloat32Array(0.2, 0.3, 0.366667, 0.633333, 2.7), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [Vector3(1.94233, 1.40877, -0.723383), Vector3(1.94233, 1.40877, -0.723383), Vector3(2.26083, 2.78047, 4.02356), Vector3(3.73188, 2.33544, 4.04756), Vector3(-1.28952, 2.33544, 4.04756)] +} +tracks/6/type = "value" +tracks/6/imported = false +tracks/6/enabled = true +tracks/6/path = NodePath("visuals/DirectionalLight3D:rotation") +tracks/6/interp = 1 +tracks/6/loop_wrap = true +tracks/6/keys = { +"times": PackedFloat32Array(0.133333, 2.1), +"transitions": PackedFloat32Array(1, 1), +"update": 0, +"values": [Vector3(-0.170518, -0.366744, -0.433319), Vector3(-0.170518, 0.137901, -0.433319)] +} +tracks/7/type = "value" +tracks/7/imported = false +tracks/7/enabled = true +tracks/7/path = NodePath("WorldEnvironment/window_glass/SubViewport/outside:light_energy") +tracks/7/interp = 1 +tracks/7/loop_wrap = true +tracks/7/keys = { +"times": PackedFloat32Array(0, 0.2, 0.333333, 0.4, 2), +"transitions": PackedFloat32Array(1, 1, 1, 1, 1), +"update": 0, +"values": [0.0, 20.0, 0.0, 5.0, 0.0] +} + +[sub_resource type="AnimationLibrary" id="AnimationLibrary_vwrt1"] +_data = { +"RESET": SubResource("Animation_xum02"), +"lighting_and_thunder": SubResource("Animation_3ms6b") +} + +[sub_resource type="GDScript" id="GDScript_j63gy"] +script/source = "extends AnimationPlayer + +func _process(delta: float) -> void: + if Input.is_action_just_pressed(\"ui_focus_next\"): + stop() + play(\"lighting_and_thunder\") +" + [sub_resource type="GDScript" id="GDScript_35dmj"] script/source = "extends SpotLight3D @@ -2019,11 +2224,13 @@ ssao_radius = 1.24 ssao_intensity = 3.09 ssao_power = 1.91184 ssao_detail = 3.0 -ssil_intensity = 0.72 -ssil_normal_rejection = 0.56 +ssil_enabled = true +ssil_radius = 2.0 +ssil_intensity = 0.5 +ssil_normal_rejection = 0.8 sdfgi_enabled = true sdfgi_use_occlusion = true -sdfgi_cascades = 3 +sdfgi_read_sky_light = false sdfgi_min_cell_size = 0.0664062 glow_enabled = true glow_levels/2 = 0.3 @@ -2054,6 +2261,7 @@ auto_exposure_min_sensitivity = 100.0 script/source = "extends WorldEnvironment func _ready(): + State.environment_settings_changed.connect(_on_environment_settings_update) focus_env() func focus_env(): @@ -2072,6 +2280,10 @@ func play_scene(_id: int, _repeat): func _on_picker_cards_picked(_cards): focus_env() + +func _on_environment_settings_update(): + environment.ssil_enabled = State.ssil_enable + environment.sdfgi_enabled = State.sdfgi_enable " [sub_resource type="ArrayMesh" id="ArrayMesh_laf32"] @@ -3060,10 +3272,16 @@ item_name = "Mind Board" transform = Transform3D(-4.37114e-08, -1, 0, 1, -4.37114e-08, 0, 0, 0, 1, 0, 0, 0) shape = SubResource("CapsuleShape3D_72g2i") +[node name="AnimationPlayer" type="AnimationPlayer" parent="."] +libraries = { +"": SubResource("AnimationLibrary_vwrt1") +} +script = SubResource("GDScript_j63gy") + [node name="sfx" type="Node3D" parent="."] [node name="rain on window" type="AudioStreamPlayer3D" parent="sfx"] -transform = Transform3D(-0.410985, -0.460061, 0.787042, -0.904759, 0.311726, -0.290238, -0.111814, -0.831367, -0.544359, 3.06375, 1.7366, -0.351724) +transform = Transform3D(-0.410985, -0.460061, 0.787042, -0.904759, 0.311726, -0.290238, -0.111814, -0.831367, -0.544359, 3.06375, 1.7366, -0.735096) stream = ExtResource("2_3haaq") attenuation_model = 1 volume_db = -15.367 @@ -3075,7 +3293,7 @@ emission_angle_filter_attenuation_db = -19.6 [node name="thunder" type="AudioStreamPlayer3D" parent="sfx"] transform = Transform3D(-0.410985, -0.460061, 0.787042, -0.904759, 0.311726, -0.290238, -0.111814, -0.831367, -0.544359, -0.248397, 4.34956, 8.85405) -stream = ExtResource("3_wcypa") +panning_strength = 0.3 bus = &"sfx" [node name="distant_rain" type="AudioStreamPlayer3D" parent="sfx"] @@ -3087,6 +3305,56 @@ bus = &"outside-rain" [node name="visuals" type="Node3D" parent="."] +[node name="CSGCombiner3D" type="CSGCombiner3D" parent="visuals"] +cast_shadow = 3 +calculate_tangents = false + +[node name="CSGBox3D" type="CSGBox3D" parent="visuals/CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.34613, 1.23087, 2.97923) +size = Vector3(5.26758, 2.69583, 0.137207) + +[node name="CSGBox3D2" type="CSGBox3D" parent="visuals/CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.441227, 2.48778, 0.766643) +size = Vector3(3.47876, 0.182022, 4.56238) + +[node name="CSGBox3D6" type="CSGBox3D" parent="visuals/CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.21313, 1.23861, 0.766643) +size = Vector3(0.170044, 2.68037, 4.56238) + +[node name="CSGBox3D4" type="CSGBox3D" parent="visuals/CSGCombiner3D"] +transform = Transform3D(0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 0, 0, 1, 3.1589, 1.73312, 0.766643) +size = Vector3(2.57013, 0.182022, 4.56238) + +[node name="CSGBox3D5" type="CSGBox3D" parent="visuals/CSGCombiner3D"] +transform = Transform3D(0.707107, 0.707107, 0, -0.707107, 0.707107, 0, 0, 0, 1, 3.09781, 1.7764, -0.332882) +operation = 2 +size = Vector3(1.25306, 0.312046, 0.893661) + +[node name="CSGBox3D3" type="CSGBox3D" parent="visuals/CSGCombiner3D"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.977913, 1.52551, 2.97298) +operation = 2 +calculate_tangents = false +flip_faces = true +size = Vector3(1.74371, 1.18614, 0.271545) + +[node name="OmniLight3D" type="OmniLight3D" parent="visuals"] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.73188, 2.33544, 4.04756) +visible = false +light_energy = 3.0 +light_size = 2.0 +light_specular = 0.2 +shadow_enabled = true + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="visuals"] +transform = Transform3D(0.821674, 0.447187, -0.353377, -0.413796, 0.894414, 0.169693, 0.39195, 0.00679388, 0.919961, 0.866179, 2.88055, 4.51936) +visible = false +light_color = Color(0.81982, 0.935491, 0.980381, 1) +light_energy = 20.0 +light_angular_distance = 2.0 +shadow_enabled = true +directional_shadow_mode = 1 +sky_mode = 1 + [node name="lights" type="Node3D" parent="visuals"] [node name="desk_light" type="SpotLight3D" parent="visuals/lights"] @@ -3111,7 +3379,6 @@ light_specular = 0.0 shadow_enabled = true shadow_bias = 0.01 shadow_normal_bias = 5.78 -shadow_blur = 0.5 omni_attenuation = 1.51572 [node name="shade_light" type="OmniLight3D" parent="visuals/lights/desk_light"] @@ -3167,14 +3434,16 @@ box_projection = true enable_shadows = true cull_mask = 1 mesh_lod_threshold = 0.0 +ambient_mode = 0 [node name="door_probe" type="ReflectionProbe" parent="visuals/lighting aids"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.587879, 1.71708, -0.403385) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.587879, 1.51607, -0.403385) max_distance = 5.0 size = Vector3(3.31181, 3.24101, 2.95173) origin_offset = Vector3(0, -0.625, 0) box_projection = true enable_shadows = true +ambient_mode = 0 [node name="lower_bunkbed_probe" type="ReflectionProbe" parent="visuals/lighting aids"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.58996, 0.192757, -0.633191) @@ -3183,20 +3452,26 @@ size = Vector3(2.58293, 1.36611, 3.1946) origin_offset = Vector3(-0.718262, 0, 0.460938) box_projection = true enable_shadows = true +ambient_mode = 0 [node name="upper_bunkbed_probe" type="ReflectionProbe" parent="visuals/lighting aids"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 3.14632, 1.55788, -0.232231) +intensity = 0.5 max_distance = 5.0 size = Vector3(1.81269, 1.61006, 2.62172) +origin_offset = Vector3(-0.133301, 0.105469, -0.11377) box_projection = true -interior = true enable_shadows = true +ambient_mode = 0 [node name="desk_probe" type="ReflectionProbe" parent="visuals/lighting aids"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.539355, 1.28256, 1.24151) max_distance = 5.0 size = Vector3(1.22007, 1.24704, 2) origin_offset = Vector3(0, -0.438, 0) +box_projection = true +enable_shadows = true +ambient_mode = 0 [node name="vfx" type="Node3D" parent="visuals"] @@ -3256,6 +3531,7 @@ script = SubResource("GDScript_rfgs6") [node name="outside" parent="WorldEnvironment/window_glass/SubViewport" instance=ExtResource("32_2vgep")] transform = Transform3D(-1, 0, -1.50996e-07, 0, 1, 0, 1.50996e-07, 0, -1, 0.906618, 1.33684, 2.65628) +light_energy = 0.0 [node name="SceneUI" type="Control" parent="."] visible = false @@ -3313,8 +3589,6 @@ light_array = Array[Vector3]([Vector3(-0.545, 0.915, 1.035), Vector3(-0.47, 0.85 [connection signal="body_exited" from="logic/Bed and Ladders/reset_failover" to="logic/PlayerController" method="_on_bed_exit"] [connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending_button" method="hide"] [connection signal="pressed" from="logic/UI/ending_button" to="logic/UI/ending" method="show"] -[connection signal="cards_picked" from="logic/UI/picker" to="logic/UI/board" method="populate_board"] -[connection signal="cards_picked" from="logic/UI/picker" to="WorldEnvironment" method="_on_picker_cards_picked"] [connection signal="board_completed" from="logic/UI/board" to="logic/UI/ending_button" method="show"] [connection signal="skip" from="logic/ScenePlayer/childhood/PanelContainer/skip_control" to="logic/ScenePlayer" method="on_childhood_done"] [connection signal="skip" from="logic/ScenePlayer/childhood/PanelContainer/skip_control" to="logic/ScenePlayer" method="play" binds= ["RESET"]] diff --git a/src/logic-scenes/main menu/video_settings.gd b/src/logic-scenes/main menu/video_settings.gd new file mode 100644 index 0000000..bee0a33 --- /dev/null +++ b/src/logic-scenes/main menu/video_settings.gd @@ -0,0 +1,247 @@ +extends TabBar + +signal changed + +var has_stage:bool = false: + set(stage): + has_stage = stage + visible = has_stage + preset_selected = preset_selected + +@export_file(".json") var settings_path = "user://video_settings.json" + +@export_enum("None", "Performance", "Balanced", "Quality") var preset_selected:int = 2: + set(value): + preset_selected = value + if has_stage: + match preset_selected: + 1: %PerformancePreset.grab_focus() + 2: %BalancedPreset.grab_focus() + 3: %QualityPreset.grab_focus() + _: %FullscreenMode.grab_focus() + +@export var window_mode: DisplayServer.WindowMode = DisplayServer.WindowMode.WINDOW_MODE_FULLSCREEN: + set(value): + window_mode = value + changed.emit() +@onready var fullscreen_selector: OptionButton = %FullscreenMode + +@export_range(0.5, 2) var render_scale: float = 1: + set(value): + render_scale = value + changed.emit() +@onready var scale_selector: SpinBox = %RenderScale + +@export var upscale_mode: RenderingServer.ViewportScaling3DMode = RenderingServer.ViewportScaling3DMode.VIEWPORT_SCALING_3D_MODE_BILINEAR : + set(value): + upscale_mode = value + changed.emit() +@onready var upscale_selector: OptionButton = %SuperResolution + +@export_range(30, 144) var max_fps: int = 60: + set(value): + max_fps = value + changed.emit() +@onready var fps_enabler: CheckBox = %EnableFps +var fps_enabled: bool: + set(value): + print("toggle") + fps_enabled = value + +@onready var fps_selector: SpinBox = %MaxFps +@onready var fps_placeholder:PanelContainer = %FPSPlaceholder + +@export_enum("low", "medium", "high", "ultra") var lighting_quality: int = 3: + set(value): + lighting_quality = value + changed.emit() +@onready var lightning_selector: OptionButton = %LightingQuality + +@export_enum("low", "medium", "high") var shadow_quality: int = 3: + set(value): + shadow_quality = value + changed.emit() +@onready var shadow_selector: OptionButton = %ShadowQuality + +@export_enum("no", "1x", "2x", "4x", "8x") var texture_filtering:int = 3: + set(value): + texture_filtering = value + changed.emit() +@onready var texture_selector: OptionButton = %TextureFiltering + +@export_enum("no", "1x", "2x", "4x") var msaa = 0: + set(value): + msaa = value + changed.emit() +@onready var msaa_selector: OptionButton = %AntiAlaising + +@export var vsync_mode: DisplayServer.VSyncMode = DisplayServer.VSyncMode.VSYNC_ENABLED: + set(value): + vsync_mode = value + changed.emit() +@onready var vsync_selector: OptionButton = %vSync + +var has_changed: bool = false: + set(value): + has_changed = value + preset_selected = 0 + +func _ready() -> void: + load_settings() + + propagate_settings() + + fullscreen_selector.item_selected.connect(func(value): window_mode = value) + scale_selector.value_changed.connect(func(value): render_scale = value) + upscale_selector.item_selected.connect(func(value): upscale_mode = value) + lightning_selector.item_selected.connect(func(value): lighting_quality = value) + shadow_selector.item_selected.connect(func(value): shadow_quality = value) + texture_selector.item_selected.connect(func(value): texture_filtering = value) + msaa_selector.item_selected.connect(func(value): msaa = value) + vsync_selector.item_selected.connect(func(value): vsync_mode = value) + + scale_selector.value_changed.connect(func(value): render_scale= value) + fps_selector.value_changed.connect(func(value): max_fps = value) + fps_enabler.toggled.connect(func(value): fps_enabled = value) + + changed.connect(func():has_changed = true) + + preset_selected = preset_selected + + %ConfirmExit.pressed.connect(_on_exit_confirmed) + %ConfirmSave.pressed.connect(_on_confirm_button_pressed) + %ConfirmAbort.pressed.connect($Popup.hide) + +func load_settings(): + + if FileAccess.file_exists(settings_path): + var file = FileAccess.open(settings_path, FileAccess.READ) + var raw_json = FileAccess.get_file_as_string(settings_path) + file.close() + var parsed: Dictionary = JSON.parse_string(raw_json) + + print(parsed) + + for key in parsed.keys(): + set(key, parsed[key]) + + for property in get_property_list(): + if parsed.has(property.name): + if typeof(parsed[property.name]) == property.type: + set(property.name, parsed[property.name]) + +func propagate_settings(): + fullscreen_selector.select(window_mode) + scale_selector.value = render_scale + upscale_selector.select(upscale_mode) + fps_enabler.button_pressed = fps_enabled + fps_selector.value = max_fps + lightning_selector.select(lighting_quality) + shadow_selector.select(shadow_quality) + texture_selector.select(texture_filtering) + msaa_selector.select(msaa) + vsync_selector.select(vsync_mode) + + +func save_settings(): + var out_dict = { + "window_mode": window_mode, + "render_scale": render_scale, + "upscale_mode": upscale_mode, + "max_fps": max_fps, + "lighting_quality": lighting_quality, + "shadow_quality": shadow_quality, + "texture_filtering": texture_filtering, + "msaa": msaa, + "vsync_mod": vsync_mode, + "preset_selected": preset_selected + } + + + var file = FileAccess.open(settings_path, FileAccess.WRITE) + file.store_string(JSON.stringify(out_dict)) + file.close() + +func _on_exit_confirmed() -> void: + State.leave_stage(self) + +func _on_exit_button_pressed() -> void: + if has_changed: + $Popup.show() + else: + State.leave_stage(self) + +func _on_confirm_button_pressed() -> void: + ProjectSettings.set_setting("display/window/size/mode", fullscreen_selector) + ProjectSettings.set_setting("rendering/scaling_3d/scale", render_scale) + ProjectSettings.set_setting("rendering/scaling_3d/mode", upscale_mode) + ProjectSettings.set_setting("application/run/max_fps", max_fps if fps_enabled else 0) + match lighting_quality: + 0: + State.ssil_enable = false + State.sdfgi_enable = false + ProjectSettings.set_setting("rendering/shading/overrides/force_lambert_over_burley", true) + 1: + State.ssil_enable = false + State.sdfgi_enable = true + ProjectSettings.set_setting("rendering/global_illumination/sdfgi/probe_ray_count", 8) + ProjectSettings.set_setting("rendering/shading/overrides/force_lambert_over_burley", true) + 2: + State.ssil_enable = false + State.sdfgi_enable = true + ProjectSettings.set_setting("rendering/global_illumination/sdfgi/probe_ray_count", 16) + ProjectSettings.set_setting("rendering/shading/overrides/force_lambert_over_burley", false) + 3: + State.ssil_enable = true + State.sdfgi_enable = true + ProjectSettings.set_setting("rendering/global_illumination/sdfgi/probe_ray_count", 32) + ProjectSettings.set_setting("rendering/shading/overrides/force_lambert_over_burley", false) + ProjectSettings.set_setting("rendering/lights_and_shadows/positional_shadow/soft_shadow_filter_quality", shadow_quality) + ProjectSettings.set_setting("rendering/lights_and_shadows/directional_shadow/soft_shadow_filter_quality", shadow_quality) + ProjectSettings.set_setting("rendering/textures/default_filters/anisotropic_filtering_level", texture_filtering) + ProjectSettings.set_setting("rendering/anti_aliasing/quality/msaa_3d", msaa) + ProjectSettings.set_setting("display/window/vsync/vsync_mode", vsync_mode) + + save_settings() + +func _on_performance_preset_pressed() -> void: + render_scale = 0.8 + max_fps = 60 + fps_enabled = true + lighting_quality = 0 + shadow_quality = 0 + texture_filtering = 1 + msaa = 0 + vsync_mode = 0 + + propagate_settings() + + preset_selected = 1 + +func _on_balanced_preset_pressed() -> void: + render_scale = 1 + max_fps = 60 + fps_enabled = true + lighting_quality = 2 + shadow_quality = 1 + texture_filtering = 3 + msaa = 1 + vsync_mode = 1 + + propagate_settings() + + preset_selected = 2 + +func _on_quality_preset_pressed() -> void: + render_scale = 1 + max_fps = 60 + fps_enabled = false + lighting_quality = 3 + shadow_quality = 2 + texture_filtering = 4 + msaa = 3 + vsync_mode = 1 + + propagate_settings() + + preset_selected = 3 diff --git a/src/logic-scenes/main menu/video_settings.tscn b/src/logic-scenes/main menu/video_settings.tscn new file mode 100644 index 0000000..e9ffba1 --- /dev/null +++ b/src/logic-scenes/main menu/video_settings.tscn @@ -0,0 +1,350 @@ +[gd_scene load_steps=3 format=3 uid="uid://gmxenhavh1lp"] + +[ext_resource type="Script" path="res://logic-scenes/main menu/video_settings.gd" id="1_sii8g"] + +[sub_resource type="GDScript" id="GDScript_24hb5"] +script/source = "@tool +extends SpinBox + +func reset(): + value = 1 + +var normal_stylebox:StyleBoxFlat = get_line_edit().get_theme_stylebox(\"normal\") +var focus_stylebox:StyleBoxFlat +var edit_stylebox:StyleBoxFlat +@export var hold_down_delay: float = 0.5 +@export var repeat_delay: float = 0.1 +@export_range(1, 100) var repeat_multiplier: int = 1 + +@export var pressed: bool = false: + set(value): + pressed = value + if pressed: + prefix = \"<\" + suffix = \">\" + get_line_edit().add_theme_stylebox_override(\"normal\", edit_stylebox) + else: + prefix = \" \" + suffix = \" \" + get_line_edit().add_theme_stylebox_override(\"normal\", focus_stylebox) + +func _ready() -> void: + edit_stylebox = normal_stylebox.duplicate(true) + edit_stylebox.bg_color = Color(\"#022635\") + + focus_stylebox = normal_stylebox.duplicate(true) + focus_stylebox.border_width_bottom = 2 + focus_stylebox.border_width_left = 2 + focus_stylebox.border_width_right = 2 + focus_stylebox.border_width_top = 2 + focus_stylebox.border_color = Color.WHITE + + focus_entered.connect(_on_focus_enter) + focus_exited.connect(_on_focus_exit) + +func _input(event: InputEvent) -> void: + if has_focus(): + if Input.is_action_just_pressed(\"ui_accept\"): + print(\"pressed!\") + print(pressed) + pressed = not pressed + print(pressed) + get_viewport().set_input_as_handled() + + if pressed: + + if Input.is_action_just_pressed(\"ui_up\") or Input.is_action_just_pressed(\"ui_right\"): + value += step + get_viewport().set_input_as_handled() + + await(get_tree().create_timer(hold_down_delay).timeout) + + while Input.is_action_pressed(\"ui_up\") or Input.is_action_pressed(\"ui_right\"): + value += step * repeat_multiplier + await(get_tree().create_timer(repeat_delay).timeout) + + elif Input.is_action_just_pressed(\"ui_down\") or Input.is_action_just_pressed(\"ui_left\"): + value -= step + get_viewport().set_input_as_handled() + else: + if Input.is_action_just_pressed(\"ui_up\"): + print(focus_neighbor_top) + +func _on_focus_enter(): + get_line_edit().add_theme_stylebox_override(\"normal\", focus_stylebox) + +func _on_focus_exit(): + get_line_edit().remove_theme_stylebox_override(\"normal\") +" + +[node name="Video Settings" type="TabBar"] +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 +script = ExtResource("1_sii8g") + +[node name="VBoxContainer" type="VBoxContainer" parent="."] +layout_mode = 1 +anchors_preset = 15 +anchor_right = 1.0 +anchor_bottom = 1.0 +grow_horizontal = 2 +grow_vertical = 2 + +[node name="Label" type="Label" parent="VBoxContainer"] +layout_mode = 2 +theme_type_variation = &"HeaderLarge" +text = "Video Settings" + +[node name="GridContainer" type="GridContainer" parent="VBoxContainer"] +layout_mode = 2 +columns = 2 + +[node name="General" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +theme_type_variation = &"HeaderMedium" +text = "General" + +[node name="HSeparator" type="HSeparator" parent="VBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Preset" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "apply preset" + +[node name="HBoxContainer2" type="HBoxContainer" parent="VBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="PerformancePreset" type="Button" parent="VBoxContainer/GridContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +text = "Performance" + +[node name="BalancedPreset" type="Button" parent="VBoxContainer/GridContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +text = "Balanced" + +[node name="QualityPreset" type="Button" parent="VBoxContainer/GridContainer/HBoxContainer2"] +unique_name_in_owner = true +layout_mode = 2 +text = "Quality" + +[node name="Label" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Fulscreen Mode" + +[node name="FullscreenMode" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 1 +item_count = 3 +popup/item_0/text = "Windowed" +popup/item_1/text = "Fullscreen" +popup/item_1/id = 1 +popup/item_2/text = "exclusive Fullscreen" +popup/item_2/id = 2 + +[node name="Scale_Label" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Rendering Scale" + +[node name="HBoxContainer" type="HBoxContainer" parent="VBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Button" type="Button" parent="VBoxContainer/GridContainer/HBoxContainer"] +layout_mode = 2 +text = "reset" + +[node name="RenderScale" type="SpinBox" parent="VBoxContainer/GridContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 2 +min_value = 0.25 +max_value = 2.0 +step = 0.05 +value = 1.0 +prefix = " " +suffix = " " +custom_arrow_step = 0.25 +select_all_on_focus = true +script = SubResource("GDScript_24hb5") + +[node name="Label3" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Super Resolution" + +[node name="SuperResolution" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 0 +item_count = 3 +popup/item_0/text = "disabled" +popup/item_1/text = "FSR 1.0" +popup/item_1/id = 1 +popup/item_2/text = "FSR 2.2" +popup/item_2/id = 2 + +[node name="EnableFps" type="CheckBox" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "limit FPS" + +[node name="MaxFps" type="SpinBox" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +focus_mode = 2 +min_value = 24.0 +max_value = 144.0 +value = 60.0 +prefix = " " +suffix = " " +script = SubResource("GDScript_24hb5") +repeat_multiplier = 5 + +[node name="Rendering" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +theme_type_variation = &"HeaderMedium" +text = "Rendering" + +[node name="HSeparator2" type="HSeparator" parent="VBoxContainer/GridContainer"] +layout_mode = 2 + +[node name="Label4" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Lighting Quality" + +[node name="LightingQuality" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 1 +item_count = 4 +popup/item_0/text = "minimum" +popup/item_1/text = "low SDGI" +popup/item_1/id = 1 +popup/item_2/text = "medium SDGI and SI" +popup/item_2/id = 2 +popup/item_3/text = "high SDGI and SI" +popup/item_3/id = 3 + +[node name="ShadowLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Shadow Quality" + +[node name="ShadowQuality" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 1 +item_count = 3 +popup/item_0/text = "performance" +popup/item_1/text = "balanced" +popup/item_1/id = 1 +popup/item_2/text = "quality" +popup/item_2/id = 2 + +[node name="FilterLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Texture Filtering" + +[node name="TextureFiltering" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 1 +item_count = 6 +popup/item_0/text = "disabled" +popup/item_1/text = "1x (very fast)" +popup/item_1/id = 1 +popup/item_2/text = "2x (fast)" +popup/item_2/id = 2 +popup/item_3/text = "4x (average)" +popup/item_3/id = 3 +popup/item_4/text = "8x (slow)" +popup/item_4/id = 4 +popup/item_5/text = "16x (slowest)" +popup/item_5/id = 5 + +[node name="AlaisingLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "Anti Aliasing" + +[node name="AntiAlaising" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 1 +item_count = 4 +popup/item_0/text = "disabled" +popup/item_1/text = "2x MSAA" +popup/item_1/id = 1 +popup/item_2/text = "4x MSAA" +popup/item_2/id = 2 +popup/item_3/text = "8x MSAA" +popup/item_3/id = 3 + +[node name="SyncLabel" type="Label" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "v-Sync" + +[node name="vSync" type="OptionButton" parent="VBoxContainer/GridContainer"] +unique_name_in_owner = true +layout_mode = 2 +selected = 1 +item_count = 4 +popup/item_0/text = "disabled" +popup/item_1/text = "enabled" +popup/item_1/id = 1 +popup/item_2/text = "adaptive" +popup/item_2/id = 2 +popup/item_3/text = "Letterbox" +popup/item_3/id = 3 + +[node name="ExitButton" type="Button" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "discard" + +[node name="ConfirmButton" type="Button" parent="VBoxContainer/GridContainer"] +layout_mode = 2 +text = "save and apply" + +[node name="Popup" type="Popup" parent="."] +scaling_3d_scale = 0.6 +initial_position = 2 +size = Vector2i(546, 123) + +[node name="VBoxContainer" type="VBoxContainer" parent="Popup"] +offset_left = 113.0 +offset_right = 153.0 +offset_bottom = 40.0 + +[node name="Label" type="Label" parent="Popup/VBoxContainer"] +layout_mode = 2 +text = "Settings have been modified. +Do you really want to leave without saving?" +horizontal_alignment = 1 + +[node name="HBoxContainer" type="HBoxContainer" parent="Popup/VBoxContainer"] +layout_mode = 2 +alignment = 1 + +[node name="ConfirmExit" type="Button" parent="Popup/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "leave" + +[node name="ConfirmSave" type="Button" parent="Popup/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "save" + +[node name="ConfirmAbort" type="Button" parent="Popup/VBoxContainer/HBoxContainer"] +unique_name_in_owner = true +layout_mode = 2 +text = "abort" + +[connection signal="pressed" from="VBoxContainer/GridContainer/HBoxContainer2/PerformancePreset" to="." method="_on_performance_preset_pressed"] +[connection signal="pressed" from="VBoxContainer/GridContainer/HBoxContainer2/BalancedPreset" to="." method="_on_balanced_preset_pressed"] +[connection signal="pressed" from="VBoxContainer/GridContainer/HBoxContainer2/QualityPreset" to="." method="_on_quality_preset_pressed"] +[connection signal="pressed" from="VBoxContainer/GridContainer/HBoxContainer/Button" to="VBoxContainer/GridContainer/HBoxContainer/RenderScale" method="reset"] +[connection signal="pressed" from="VBoxContainer/GridContainer/ExitButton" to="." method="_on_exit_button_pressed"] +[connection signal="pressed" from="VBoxContainer/GridContainer/ConfirmButton" to="." method="_on_confirm_button_pressed"] diff --git a/src/singletons/global_state.gd b/src/singletons/global_state.gd index 917c3d6..f30602a 100644 --- a/src/singletons/global_state.gd +++ b/src/singletons/global_state.gd @@ -13,9 +13,19 @@ var show_content_notes: bool = false # ContentNotes/.../Checkbox var provide_summaries: bool = false # ContentNotes/.../Checkbox2 var allow_skipping: bool = false +var ssil_enable:bool = false: + set(value): + ssil_enable = value + environment_settings_changed.emit() +var sdfgi_enable:bool = false: + set(value): + sdfgi_enable = value + environment_settings_changed.emit() + var stage_list:Array = [] var focus_locked: bool = false +signal environment_settings_changed signal theme_changed var current_main_theme:Theme = preload("res://logic-scenes/themes/easy-handwriting.theme"):