132 lines
3.3 KiB
GDScript
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)
|