@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)