mirror of
https://github.com/jcreek/CosmicClash.git
synced 2026-09-11 00:14:00 +00:00
feat: add post-processing pass and video settings menu
Enable glow/bloom, color adjustments, and MSAA+FXAA across all three arenas so emissive ship/station accents actually bleed light and edges read cleanly. Expose the player-facing knobs (anti-aliasing mode, glow intensity, brightness) through a new Settings screen off the main menu, persisted via a VideoSettings autoload that scales each arena's own tuned Environment values on load rather than overwriting them.
This commit is contained in:
@@ -8,6 +8,9 @@ extends Node3D
|
||||
|
||||
func _ready():
|
||||
add_to_group("arena")
|
||||
var world_env := get_node_or_null("WorldEnvironment") as WorldEnvironment
|
||||
if world_env and world_env.environment:
|
||||
VideoSettings.apply_to_environment(world_env.environment)
|
||||
|
||||
|
||||
func get_ball_spawn() -> Transform3D:
|
||||
|
||||
@@ -129,6 +129,10 @@ func _on_match_pressed() -> void:
|
||||
get_tree().change_scene_to_file("res://scenes/match.tscn")
|
||||
|
||||
|
||||
func _on_settings_pressed() -> void:
|
||||
get_tree().change_scene_to_file("res://scenes/settings.tscn")
|
||||
|
||||
|
||||
func _on_spectate_pressed() -> void:
|
||||
GameSettings.spectate_bot_a_path = _selected_path(bot_a_dropdown)
|
||||
GameSettings.spectate_bot_b_path = _selected_path(bot_b_dropdown)
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
extends Control
|
||||
|
||||
# Settings screen: a small set of player-facing video knobs on top of
|
||||
# VideoSettings (the autoload holding + persisting them). Anti-aliasing
|
||||
# applies immediately since it's a Viewport-wide setting; glow/brightness
|
||||
# apply the next time an arena loads (see arena.gd), since they scale each
|
||||
# arena's own tuned Environment values rather than something viewport-wide.
|
||||
|
||||
const MAIN_MENU_SCENE_PATH := "res://scenes/main_menu.tscn"
|
||||
|
||||
const AA_OPTIONS := [
|
||||
{"name": "Off", "mode": VideoSettings.AAMode.OFF},
|
||||
{"name": "FXAA", "mode": VideoSettings.AAMode.FXAA},
|
||||
{"name": "MSAA 4x", "mode": VideoSettings.AAMode.MSAA},
|
||||
{"name": "MSAA 4x + FXAA", "mode": VideoSettings.AAMode.MSAA_FXAA},
|
||||
]
|
||||
|
||||
@onready var aa_dropdown: OptionButton = %AADropdown
|
||||
@onready var glow_slider: HSlider = %GlowSlider
|
||||
@onready var glow_value_label: Label = %GlowValueLabel
|
||||
@onready var brightness_slider: HSlider = %BrightnessSlider
|
||||
@onready var brightness_value_label: Label = %BrightnessValueLabel
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
aa_dropdown.clear()
|
||||
var selected := 0
|
||||
for i in AA_OPTIONS.size():
|
||||
aa_dropdown.add_item(AA_OPTIONS[i]["name"])
|
||||
if AA_OPTIONS[i]["mode"] == VideoSettings.aa_mode:
|
||||
selected = i
|
||||
aa_dropdown.select(selected)
|
||||
|
||||
glow_slider.value = VideoSettings.glow_scale
|
||||
brightness_slider.value = VideoSettings.brightness
|
||||
_update_glow_label()
|
||||
_update_brightness_label()
|
||||
|
||||
|
||||
func _update_glow_label() -> void:
|
||||
glow_value_label.text = "%d%%" % roundi(glow_slider.value * 100.0)
|
||||
|
||||
|
||||
func _update_brightness_label() -> void:
|
||||
brightness_value_label.text = "%d%%" % roundi(brightness_slider.value * 100.0)
|
||||
|
||||
|
||||
func _on_aa_dropdown_item_selected(index: int) -> void:
|
||||
VideoSettings.aa_mode = AA_OPTIONS[index]["mode"]
|
||||
VideoSettings.apply_aa()
|
||||
|
||||
|
||||
func _on_glow_slider_value_changed(value: float) -> void:
|
||||
VideoSettings.glow_scale = value
|
||||
_update_glow_label()
|
||||
|
||||
|
||||
func _on_brightness_slider_value_changed(value: float) -> void:
|
||||
VideoSettings.brightness = value
|
||||
_update_brightness_label()
|
||||
|
||||
|
||||
func _on_back_pressed() -> void:
|
||||
VideoSettings.save()
|
||||
get_tree().change_scene_to_file(MAIN_MENU_SCENE_PATH)
|
||||
|
||||
|
||||
func _unhandled_input(event: InputEvent) -> void:
|
||||
if event.is_action_pressed("ui_cancel"):
|
||||
_on_back_pressed()
|
||||
@@ -0,0 +1,65 @@
|
||||
extends Node
|
||||
|
||||
# Autoload: persisted player-facing video preferences (AA, glow, brightness).
|
||||
# AA is a Viewport-wide setting applied immediately via apply_aa(). Glow and
|
||||
# brightness instead scale each arena's own tuned Environment values (see
|
||||
# arena.gd's _ready(), which calls apply_to_environment() once per arena
|
||||
# load) rather than overwriting them outright, so the per-arena bloom tuning
|
||||
# in arena_01/02/03.tscn survives underneath the user's preference.
|
||||
|
||||
enum AAMode { OFF, FXAA, MSAA, MSAA_FXAA }
|
||||
|
||||
const SETTINGS_PATH := "user://settings.cfg"
|
||||
|
||||
var aa_mode: AAMode = AAMode.MSAA_FXAA
|
||||
var glow_scale: float = 1.0
|
||||
var brightness: float = 1.0
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
_load()
|
||||
apply_aa()
|
||||
|
||||
|
||||
func _load() -> void:
|
||||
var cfg := ConfigFile.new()
|
||||
if cfg.load(SETTINGS_PATH) != OK:
|
||||
return
|
||||
aa_mode = cfg.get_value("video", "aa_mode", aa_mode) as AAMode
|
||||
glow_scale = cfg.get_value("video", "glow_scale", glow_scale)
|
||||
brightness = cfg.get_value("video", "brightness", brightness)
|
||||
|
||||
|
||||
func save() -> void:
|
||||
var cfg := ConfigFile.new()
|
||||
cfg.set_value("video", "aa_mode", aa_mode)
|
||||
cfg.set_value("video", "glow_scale", glow_scale)
|
||||
cfg.set_value("video", "brightness", brightness)
|
||||
cfg.save(SETTINGS_PATH)
|
||||
|
||||
|
||||
func apply_aa() -> void:
|
||||
var viewport := get_tree().root
|
||||
match aa_mode:
|
||||
AAMode.OFF:
|
||||
viewport.msaa_3d = Viewport.MSAA_DISABLED
|
||||
viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
|
||||
AAMode.FXAA:
|
||||
viewport.msaa_3d = Viewport.MSAA_DISABLED
|
||||
viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA
|
||||
AAMode.MSAA:
|
||||
viewport.msaa_3d = Viewport.MSAA_4X
|
||||
viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_DISABLED
|
||||
AAMode.MSAA_FXAA:
|
||||
viewport.msaa_3d = Viewport.MSAA_4X
|
||||
viewport.screen_space_aa = Viewport.SCREEN_SPACE_AA_FXAA
|
||||
|
||||
|
||||
# Called once by each arena's _ready() to fold the user's glow/brightness
|
||||
# preference into that arena's own baked Environment tuning.
|
||||
func apply_to_environment(env: Environment) -> void:
|
||||
if env == null:
|
||||
return
|
||||
env.glow_enabled = glow_scale > 0.0
|
||||
env.glow_intensity *= glow_scale
|
||||
env.adjustment_brightness *= brightness
|
||||
Reference in New Issue
Block a user