Files
Trinittu/dynamic-sky/scripts/skybox_preset_library.gd
2026-02-03 11:26:48 +01:00

132 lines
3.3 KiB
GDScript

@tool
class_name SkyboxPresetLibrary
extends Node
signal preset_changed(preset: SkyPreset)
signal preset_applied(preset_name: String)
signal preset_reverted(preset_name: String)
@export var presets: Array[SkyPreset] = []
@export var current_preset_index: int = 0:
set(value):
current_preset_index = clampi(value, 0, maxi(0, presets.size() - 1))
if current_preset_index < presets.size():
_on_preset_selected(presets[current_preset_index])
var _base_preset: SkyPreset
var _runtime_overrides: SkyConfig
func _ready() -> void:
if presets.is_empty():
_initialize_default_presets()
if current_preset_index < presets.size():
_base_preset = presets[current_preset_index]
func _initialize_default_presets() -> void:
presets.clear()
presets.append(SkyPreset.create_clear_day())
presets.append(SkyPreset.create_sunset())
presets.append(SkyPreset.create_night())
presets.append(SkyPreset.create_overcast())
presets.append(SkyPreset.create_storm())
presets.append(SkyPreset.create_dawn())
func get_preset_names() -> PackedStringArray:
var names := PackedStringArray()
for preset in presets:
names.append(preset.preset_name)
return names
func get_current_preset() -> SkyPreset:
if current_preset_index < presets.size():
return presets[current_preset_index]
return null
func get_preset_by_name(preset_name: String) -> SkyPreset:
for preset in presets:
if preset.preset_name == preset_name:
return preset
return null
func get_preset_by_type(preset_type: SkyPreset.PresetType) -> SkyPreset:
for preset in presets:
if preset.preset_type == preset_type:
return preset
return null
func apply_preset(preset_name: String) -> bool:
var preset := get_preset_by_name(preset_name)
if preset == null:
push_warning("SkyboxPresetLibrary: Preset '%s' not found" % preset_name)
return false
for i in presets.size():
if presets[i] == preset:
current_preset_index = i
break
_base_preset = preset
_runtime_overrides = null
preset_applied.emit(preset_name)
preset_changed.emit(preset)
return true
func apply_preset_by_type(preset_type: SkyPreset.PresetType) -> bool:
var preset := get_preset_by_type(preset_type)
if preset == null:
push_warning("SkyboxPresetLibrary: Preset type '%s' not found" % SkyPreset.PresetType.keys()[preset_type])
return false
return apply_preset(preset.preset_name)
func revert_to_preset() -> void:
_runtime_overrides = null
if _base_preset:
preset_reverted.emit(_base_preset.preset_name)
preset_changed.emit(_base_preset)
func set_runtime_override(config: SkyConfig) -> void:
_runtime_overrides = config
func get_effective_config() -> SkyConfig:
if _runtime_overrides != null:
return _runtime_overrides
if _base_preset != null and _base_preset.config != null:
return _base_preset.config
return SkyConfig.new()
func has_runtime_overrides() -> bool:
return _runtime_overrides != null
func add_preset(preset: SkyPreset) -> void:
if preset not in presets:
presets.append(preset)
func remove_preset(preset_name: String) -> bool:
for i in presets.size():
if presets[i].preset_name == preset_name:
presets.remove_at(i)
if current_preset_index >= presets.size():
current_preset_index = maxi(0, presets.size() - 1)
return true
return false
func _on_preset_selected(preset: SkyPreset) -> void:
_base_preset = preset
_runtime_overrides = null
preset_changed.emit(preset)