2024-10-01 23:32:59 +00:00
|
|
|
extends VBoxContainer
|
2024-09-27 20:02:28 +00:00
|
|
|
|
|
|
|
|
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
|
2024-09-27 22:34:54 +00:00
|
|
|
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()
|
2024-09-27 22:34:54 +00:00
|
|
|
|
|
|
|
|
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
|