frame-of-mind/src/logic-scenes/main menu/video_settings.gd

246 lines
7.4 KiB
GDScript3
Raw Normal View History

2024-09-27 20:02:28 +00:00
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):
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
if has_changed:
%ExitButton.text = "discard"
else:
%ExitButton.text = "close"
2024-09-27 20:02:28 +00:00
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)
for key in parsed.keys():
set(key, parsed[key])
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()
has_changed = false
2024-09-27 20:02:28 +00:00
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