Start dynamic sky

This commit is contained in:
2026-02-03 11:26:48 +01:00
parent dd1ba0fa9a
commit 5843e8a07a
49 changed files with 4448 additions and 0 deletions

View File

@@ -0,0 +1,65 @@
@tool
class_name CloudLayerConfig
extends Resource
enum LayerType {
LOW,
MID,
HIGH,
WISPS
}
@export var layer_type: LayerType = LayerType.MID
@export var enabled: bool = true
@export_group("Texture")
@export var texture: Texture2D
@export var texture_scale: Vector2 = Vector2(1.0, 1.0)
@export var tiling: Vector2 = Vector2(4.0, 4.0)
@export_group("Appearance")
@export var opacity: float = 0.8
@export var color_tint: Color = Color.WHITE
@export var shadow_color: Color = Color(0.6, 0.6, 0.7)
@export_group("Motion")
@export var flow_direction: Vector2 = Vector2(1.0, 0.0)
@export var flow_speed: float = 0.02
@export var parallax_depth: float = 1.0
@export_group("Lighting")
@export var receive_light: bool = true
@export var light_influence: float = 1.0
@export var rim_glow_intensity: float = 0.3
func get_layer_height() -> float:
match layer_type:
LayerType.LOW:
return 0.2
LayerType.MID:
return 0.5
LayerType.HIGH:
return 0.8
LayerType.WISPS:
return 0.9
return 0.5
func duplicate_config() -> CloudLayerConfig:
var copy := CloudLayerConfig.new()
copy.layer_type = layer_type
copy.enabled = enabled
copy.texture = texture
copy.texture_scale = texture_scale
copy.tiling = tiling
copy.opacity = opacity
copy.color_tint = color_tint
copy.shadow_color = shadow_color
copy.flow_direction = flow_direction
copy.flow_speed = flow_speed
copy.parallax_depth = parallax_depth
copy.receive_light = receive_light
copy.light_influence = light_influence
copy.rim_glow_intensity = rim_glow_intensity
return copy

View File

@@ -0,0 +1 @@
uid://beu0xhk0rvpky

View File

@@ -0,0 +1,55 @@
@tool
class_name PostProcessProfile
extends Resource
@export_group("Sky Gradient")
@export var gradient_enabled: bool = true
@export var gradient_intensity: float = 1.0
@export var gradient_curve: Curve
@export_group("Fog Shaping")
@export var fog_enabled: bool = true
@export var height_fog_enabled: bool = true
@export var height_fog_start: float = 0.0
@export var height_fog_end: float = 100.0
@export var height_fog_curve: float = 1.0
@export var distance_fog_enabled: bool = true
@export var distance_fog_start: float = 50.0
@export var distance_fog_end: float = 500.0
@export_group("Sun Glow")
@export var sun_glow_enabled: bool = true
@export var sun_glow_intensity: float = 0.5
@export var sun_glow_size: float = 0.2
@export var sun_glow_falloff: float = 2.0
@export var sun_glow_color: Color = Color(1.0, 0.95, 0.8)
@export_group("Dawn/Dusk Enhancement")
@export var dawn_dusk_enabled: bool = true
@export var dawn_dusk_intensity: float = 0.5
@export var dawn_dusk_color: Color = Color(1.0, 0.6, 0.4)
@export var dawn_dusk_blend_range: float = 0.15
func lerp_to(other: PostProcessProfile, weight: float) -> PostProcessProfile:
var result := PostProcessProfile.new()
result.gradient_enabled = gradient_enabled if weight < 0.5 else other.gradient_enabled
result.gradient_intensity = lerpf(gradient_intensity, other.gradient_intensity, weight)
result.fog_enabled = fog_enabled if weight < 0.5 else other.fog_enabled
result.height_fog_enabled = height_fog_enabled if weight < 0.5 else other.height_fog_enabled
result.height_fog_start = lerpf(height_fog_start, other.height_fog_start, weight)
result.height_fog_end = lerpf(height_fog_end, other.height_fog_end, weight)
result.height_fog_curve = lerpf(height_fog_curve, other.height_fog_curve, weight)
result.distance_fog_enabled = distance_fog_enabled if weight < 0.5 else other.distance_fog_enabled
result.distance_fog_start = lerpf(distance_fog_start, other.distance_fog_start, weight)
result.distance_fog_end = lerpf(distance_fog_end, other.distance_fog_end, weight)
result.sun_glow_enabled = sun_glow_enabled if weight < 0.5 else other.sun_glow_enabled
result.sun_glow_intensity = lerpf(sun_glow_intensity, other.sun_glow_intensity, weight)
result.sun_glow_size = lerpf(sun_glow_size, other.sun_glow_size, weight)
result.sun_glow_falloff = lerpf(sun_glow_falloff, other.sun_glow_falloff, weight)
result.sun_glow_color = sun_glow_color.lerp(other.sun_glow_color, weight)
result.dawn_dusk_enabled = dawn_dusk_enabled if weight < 0.5 else other.dawn_dusk_enabled
result.dawn_dusk_intensity = lerpf(dawn_dusk_intensity, other.dawn_dusk_intensity, weight)
result.dawn_dusk_color = dawn_dusk_color.lerp(other.dawn_dusk_color, weight)
result.dawn_dusk_blend_range = lerpf(dawn_dusk_blend_range, other.dawn_dusk_blend_range, weight)
return result

View File

@@ -0,0 +1 @@
uid://ctrw2ycud36yd

View File

@@ -0,0 +1,104 @@
@tool
class_name SkyConfig
extends Resource
@export_group("Sun Settings")
@export var sun_color: Color = Color(1.0, 0.95, 0.8)
@export var sun_intensity: float = 1.0
@export var sun_size: float = 0.05
@export_group("Moon Settings")
@export var moon_color: Color = Color(0.8, 0.85, 1.0)
@export var moon_intensity: float = 0.3
@export var moon_size: float = 0.03
@export_group("Ambient Settings")
@export var ambient_color: Color = Color(0.4, 0.5, 0.6)
@export var ambient_intensity: float = 0.5
@export_group("Fog Settings")
@export var fog_color: Color = Color(0.7, 0.8, 0.9)
@export var fog_density: float = 0.01
@export var fog_height: float = 0.0
@export var fog_height_density: float = 0.1
@export_group("Sky Gradient")
@export var sky_top_color: Color = Color(0.2, 0.4, 0.8)
@export var sky_horizon_color: Color = Color(0.6, 0.7, 0.9)
@export var sky_bottom_color: Color = Color(0.4, 0.5, 0.6)
@export var horizon_blend: float = 0.5
@export_group("Stars")
@export var stars_visibility: float = 0.0
@export var stars_tint: Color = Color.WHITE
@export_group("Cloud Defaults")
@export var cloud_coverage: float = 0.3
@export var cloud_opacity: float = 0.8
@export var cloud_color: Color = Color.WHITE
@export var cloud_shadow_color: Color = Color(0.6, 0.6, 0.7)
@export_group("Post Process")
@export var sun_glow_intensity: float = 0.5
@export var sun_glow_size: float = 0.2
@export var gradient_intensity: float = 1.0
func lerp_to(other: SkyConfig, weight: float) -> SkyConfig:
var result := SkyConfig.new()
result.sun_color = sun_color.lerp(other.sun_color, weight)
result.sun_intensity = lerpf(sun_intensity, other.sun_intensity, weight)
result.sun_size = lerpf(sun_size, other.sun_size, weight)
result.moon_color = moon_color.lerp(other.moon_color, weight)
result.moon_intensity = lerpf(moon_intensity, other.moon_intensity, weight)
result.moon_size = lerpf(moon_size, other.moon_size, weight)
result.ambient_color = ambient_color.lerp(other.ambient_color, weight)
result.ambient_intensity = lerpf(ambient_intensity, other.ambient_intensity, weight)
result.fog_color = fog_color.lerp(other.fog_color, weight)
result.fog_density = lerpf(fog_density, other.fog_density, weight)
result.fog_height = lerpf(fog_height, other.fog_height, weight)
result.fog_height_density = lerpf(fog_height_density, other.fog_height_density, weight)
result.sky_top_color = sky_top_color.lerp(other.sky_top_color, weight)
result.sky_horizon_color = sky_horizon_color.lerp(other.sky_horizon_color, weight)
result.sky_bottom_color = sky_bottom_color.lerp(other.sky_bottom_color, weight)
result.horizon_blend = lerpf(horizon_blend, other.horizon_blend, weight)
result.stars_visibility = lerpf(stars_visibility, other.stars_visibility, weight)
result.stars_tint = stars_tint.lerp(other.stars_tint, weight)
result.cloud_coverage = lerpf(cloud_coverage, other.cloud_coverage, weight)
result.cloud_opacity = lerpf(cloud_opacity, other.cloud_opacity, weight)
result.cloud_color = cloud_color.lerp(other.cloud_color, weight)
result.cloud_shadow_color = cloud_shadow_color.lerp(other.cloud_shadow_color, weight)
result.sun_glow_intensity = lerpf(sun_glow_intensity, other.sun_glow_intensity, weight)
result.sun_glow_size = lerpf(sun_glow_size, other.sun_glow_size, weight)
result.gradient_intensity = lerpf(gradient_intensity, other.gradient_intensity, weight)
return result
func duplicate_config() -> SkyConfig:
var copy := SkyConfig.new()
copy.sun_color = sun_color
copy.sun_intensity = sun_intensity
copy.sun_size = sun_size
copy.moon_color = moon_color
copy.moon_intensity = moon_intensity
copy.moon_size = moon_size
copy.ambient_color = ambient_color
copy.ambient_intensity = ambient_intensity
copy.fog_color = fog_color
copy.fog_density = fog_density
copy.fog_height = fog_height
copy.fog_height_density = fog_height_density
copy.sky_top_color = sky_top_color
copy.sky_horizon_color = sky_horizon_color
copy.sky_bottom_color = sky_bottom_color
copy.horizon_blend = horizon_blend
copy.stars_visibility = stars_visibility
copy.stars_tint = stars_tint
copy.cloud_coverage = cloud_coverage
copy.cloud_opacity = cloud_opacity
copy.cloud_color = cloud_color
copy.cloud_shadow_color = cloud_shadow_color
copy.sun_glow_intensity = sun_glow_intensity
copy.sun_glow_size = sun_glow_size
copy.gradient_intensity = gradient_intensity
return copy

View File

@@ -0,0 +1 @@
uid://c3iniqgu2l0ek

View File

@@ -0,0 +1,164 @@
@tool
class_name SkyPreset
extends Resource
enum PresetType {
CLEAR_DAY,
SUNSET,
NIGHT,
OVERCAST,
STORM,
DAWN,
CUSTOM
}
@export var preset_name: String = "Custom"
@export var preset_type: PresetType = PresetType.CUSTOM
@export var config: SkyConfig
@export var skybox_texture: Texture2D
@export var cloud_layer_configs: Array[CloudLayerConfig]
@export var post_process_profile: PostProcessProfile
static func create_clear_day() -> SkyPreset:
var preset := SkyPreset.new()
preset.preset_name = "Clear Day"
preset.preset_type = PresetType.CLEAR_DAY
preset.config = SkyConfig.new()
preset.config.sun_color = Color(1.0, 0.95, 0.85)
preset.config.sun_intensity = 1.2
preset.config.moon_intensity = 0.0
preset.config.ambient_color = Color(0.5, 0.6, 0.8)
preset.config.ambient_intensity = 0.6
preset.config.fog_color = Color(0.7, 0.8, 0.95)
preset.config.fog_density = 0.005
preset.config.sky_top_color = Color(0.2, 0.4, 0.85)
preset.config.sky_horizon_color = Color(0.6, 0.75, 0.95)
preset.config.sky_bottom_color = Color(0.5, 0.6, 0.7)
preset.config.stars_visibility = 0.0
preset.config.cloud_coverage = 0.2
preset.config.cloud_opacity = 0.7
preset.config.sun_glow_intensity = 0.3
return preset
static func create_sunset() -> SkyPreset:
var preset := SkyPreset.new()
preset.preset_name = "Sunset"
preset.preset_type = PresetType.SUNSET
preset.config = SkyConfig.new()
preset.config.sun_color = Color(1.0, 0.5, 0.2)
preset.config.sun_intensity = 0.8
preset.config.moon_intensity = 0.0
preset.config.ambient_color = Color(0.8, 0.5, 0.4)
preset.config.ambient_intensity = 0.4
preset.config.fog_color = Color(0.9, 0.6, 0.4)
preset.config.fog_density = 0.015
preset.config.sky_top_color = Color(0.3, 0.2, 0.5)
preset.config.sky_horizon_color = Color(1.0, 0.5, 0.3)
preset.config.sky_bottom_color = Color(0.9, 0.4, 0.2)
preset.config.stars_visibility = 0.1
preset.config.cloud_coverage = 0.3
preset.config.cloud_opacity = 0.9
preset.config.cloud_color = Color(1.0, 0.7, 0.5)
preset.config.cloud_shadow_color = Color(0.4, 0.2, 0.3)
preset.config.sun_glow_intensity = 0.8
preset.config.sun_glow_size = 0.4
return preset
static func create_night() -> SkyPreset:
var preset := SkyPreset.new()
preset.preset_name = "Night"
preset.preset_type = PresetType.NIGHT
preset.config = SkyConfig.new()
preset.config.sun_intensity = 0.0
preset.config.moon_color = Color(0.7, 0.8, 1.0)
preset.config.moon_intensity = 0.4
preset.config.ambient_color = Color(0.1, 0.15, 0.25)
preset.config.ambient_intensity = 0.2
preset.config.fog_color = Color(0.1, 0.12, 0.2)
preset.config.fog_density = 0.02
preset.config.sky_top_color = Color(0.02, 0.03, 0.08)
preset.config.sky_horizon_color = Color(0.1, 0.12, 0.2)
preset.config.sky_bottom_color = Color(0.05, 0.06, 0.1)
preset.config.stars_visibility = 1.0
preset.config.cloud_coverage = 0.15
preset.config.cloud_opacity = 0.5
preset.config.cloud_color = Color(0.2, 0.22, 0.3)
preset.config.cloud_shadow_color = Color(0.05, 0.05, 0.1)
preset.config.sun_glow_intensity = 0.0
return preset
static func create_overcast() -> SkyPreset:
var preset := SkyPreset.new()
preset.preset_name = "Overcast"
preset.preset_type = PresetType.OVERCAST
preset.config = SkyConfig.new()
preset.config.sun_color = Color(0.9, 0.9, 0.85)
preset.config.sun_intensity = 0.4
preset.config.moon_intensity = 0.0
preset.config.ambient_color = Color(0.5, 0.5, 0.55)
preset.config.ambient_intensity = 0.7
preset.config.fog_color = Color(0.6, 0.62, 0.65)
preset.config.fog_density = 0.03
preset.config.sky_top_color = Color(0.45, 0.48, 0.55)
preset.config.sky_horizon_color = Color(0.6, 0.62, 0.65)
preset.config.sky_bottom_color = Color(0.5, 0.52, 0.55)
preset.config.stars_visibility = 0.0
preset.config.cloud_coverage = 0.9
preset.config.cloud_opacity = 1.0
preset.config.cloud_color = Color(0.7, 0.72, 0.75)
preset.config.cloud_shadow_color = Color(0.4, 0.42, 0.45)
preset.config.sun_glow_intensity = 0.1
return preset
static func create_storm() -> SkyPreset:
var preset := SkyPreset.new()
preset.preset_name = "Storm"
preset.preset_type = PresetType.STORM
preset.config = SkyConfig.new()
preset.config.sun_color = Color(0.7, 0.7, 0.75)
preset.config.sun_intensity = 0.2
preset.config.moon_intensity = 0.0
preset.config.ambient_color = Color(0.35, 0.38, 0.45)
preset.config.ambient_intensity = 0.5
preset.config.fog_color = Color(0.4, 0.42, 0.5)
preset.config.fog_density = 0.05
preset.config.sky_top_color = Color(0.25, 0.28, 0.35)
preset.config.sky_horizon_color = Color(0.4, 0.42, 0.48)
preset.config.sky_bottom_color = Color(0.35, 0.38, 0.42)
preset.config.stars_visibility = 0.0
preset.config.cloud_coverage = 1.0
preset.config.cloud_opacity = 1.0
preset.config.cloud_color = Color(0.4, 0.42, 0.5)
preset.config.cloud_shadow_color = Color(0.2, 0.22, 0.28)
preset.config.sun_glow_intensity = 0.0
return preset
static func create_dawn() -> SkyPreset:
var preset := SkyPreset.new()
preset.preset_name = "Dawn"
preset.preset_type = PresetType.DAWN
preset.config = SkyConfig.new()
preset.config.sun_color = Color(1.0, 0.7, 0.5)
preset.config.sun_intensity = 0.5
preset.config.moon_intensity = 0.1
preset.config.ambient_color = Color(0.4, 0.35, 0.45)
preset.config.ambient_intensity = 0.35
preset.config.fog_color = Color(0.6, 0.5, 0.55)
preset.config.fog_density = 0.025
preset.config.sky_top_color = Color(0.15, 0.2, 0.45)
preset.config.sky_horizon_color = Color(0.9, 0.6, 0.5)
preset.config.sky_bottom_color = Color(0.7, 0.45, 0.4)
preset.config.stars_visibility = 0.3
preset.config.cloud_coverage = 0.25
preset.config.cloud_opacity = 0.8
preset.config.cloud_color = Color(0.95, 0.7, 0.6)
preset.config.cloud_shadow_color = Color(0.3, 0.25, 0.35)
preset.config.sun_glow_intensity = 0.6
preset.config.sun_glow_size = 0.35
return preset

View File

@@ -0,0 +1 @@
uid://c48eq2y4ikok8

View File

@@ -0,0 +1,158 @@
@tool
class_name WeatherProfile
extends Resource
enum WeatherState {
CLEAR,
CLOUDY,
OVERCAST,
RAIN,
STORM,
SNOW
}
@export var weather_state: WeatherState = WeatherState.CLEAR
@export var display_name: String = "Clear"
@export_group("Clouds")
@export var cloud_density: float = 0.2
@export var cloud_opacity: float = 0.7
@export var cloud_coverage: float = 0.3
@export var cloud_color: Color = Color.WHITE
@export var cloud_shadow_color: Color = Color(0.6, 0.6, 0.7)
@export_group("Wind")
@export var wind_speed: float = 1.0
@export var wind_direction: Vector2 = Vector2(1.0, 0.0)
@export var wind_turbulence: float = 0.1
@export_group("Ambient Adjustments")
@export var ambient_color_multiplier: Color = Color.WHITE
@export var ambient_intensity_multiplier: float = 1.0
@export_group("Fog Adjustments")
@export var fog_color_multiplier: Color = Color.WHITE
@export var fog_density_multiplier: float = 1.0
@export_group("VFX")
@export var rain_intensity: float = 0.0
@export var snow_intensity: float = 0.0
@export var lightning_enabled: bool = false
@export var lightning_frequency: float = 0.1
@export_group("Transition")
@export var default_transition_duration: float = 5.0
static func create_clear() -> WeatherProfile:
var profile := WeatherProfile.new()
profile.weather_state = WeatherState.CLEAR
profile.display_name = "Clear"
profile.cloud_density = 0.1
profile.cloud_opacity = 0.6
profile.cloud_coverage = 0.2
profile.wind_speed = 0.5
return profile
static func create_cloudy() -> WeatherProfile:
var profile := WeatherProfile.new()
profile.weather_state = WeatherState.CLOUDY
profile.display_name = "Cloudy"
profile.cloud_density = 0.5
profile.cloud_opacity = 0.8
profile.cloud_coverage = 0.5
profile.wind_speed = 1.0
profile.ambient_intensity_multiplier = 0.9
return profile
static func create_overcast() -> WeatherProfile:
var profile := WeatherProfile.new()
profile.weather_state = WeatherState.OVERCAST
profile.display_name = "Overcast"
profile.cloud_density = 0.9
profile.cloud_opacity = 1.0
profile.cloud_coverage = 0.9
profile.cloud_color = Color(0.7, 0.72, 0.75)
profile.wind_speed = 1.5
profile.ambient_intensity_multiplier = 0.7
profile.fog_density_multiplier = 1.5
return profile
static func create_rain() -> WeatherProfile:
var profile := WeatherProfile.new()
profile.weather_state = WeatherState.RAIN
profile.display_name = "Rain"
profile.cloud_density = 0.85
profile.cloud_opacity = 0.95
profile.cloud_coverage = 0.85
profile.cloud_color = Color(0.55, 0.58, 0.65)
profile.wind_speed = 2.0
profile.ambient_intensity_multiplier = 0.6
profile.fog_density_multiplier = 2.0
profile.rain_intensity = 0.7
profile.default_transition_duration = 8.0
return profile
static func create_storm() -> WeatherProfile:
var profile := WeatherProfile.new()
profile.weather_state = WeatherState.STORM
profile.display_name = "Storm"
profile.cloud_density = 1.0
profile.cloud_opacity = 1.0
profile.cloud_coverage = 1.0
profile.cloud_color = Color(0.4, 0.42, 0.5)
profile.cloud_shadow_color = Color(0.2, 0.22, 0.28)
profile.wind_speed = 4.0
profile.wind_turbulence = 0.4
profile.ambient_intensity_multiplier = 0.4
profile.fog_density_multiplier = 3.0
profile.rain_intensity = 1.0
profile.lightning_enabled = true
profile.lightning_frequency = 0.15
profile.default_transition_duration = 10.0
return profile
static func create_snow() -> WeatherProfile:
var profile := WeatherProfile.new()
profile.weather_state = WeatherState.SNOW
profile.display_name = "Snow"
profile.cloud_density = 0.8
profile.cloud_opacity = 0.9
profile.cloud_coverage = 0.8
profile.cloud_color = Color(0.85, 0.87, 0.92)
profile.wind_speed = 1.0
profile.ambient_color_multiplier = Color(0.9, 0.92, 1.0)
profile.ambient_intensity_multiplier = 0.75
profile.fog_color_multiplier = Color(0.95, 0.97, 1.0)
profile.fog_density_multiplier = 1.8
profile.snow_intensity = 0.8
profile.default_transition_duration = 12.0
return profile
func lerp_to(other: WeatherProfile, weight: float) -> WeatherProfile:
var result := WeatherProfile.new()
result.weather_state = weather_state if weight < 0.5 else other.weather_state
result.display_name = display_name if weight < 0.5 else other.display_name
result.cloud_density = lerpf(cloud_density, other.cloud_density, weight)
result.cloud_opacity = lerpf(cloud_opacity, other.cloud_opacity, weight)
result.cloud_coverage = lerpf(cloud_coverage, other.cloud_coverage, weight)
result.cloud_color = cloud_color.lerp(other.cloud_color, weight)
result.cloud_shadow_color = cloud_shadow_color.lerp(other.cloud_shadow_color, weight)
result.wind_speed = lerpf(wind_speed, other.wind_speed, weight)
result.wind_direction = wind_direction.lerp(other.wind_direction, weight).normalized()
result.wind_turbulence = lerpf(wind_turbulence, other.wind_turbulence, weight)
result.ambient_color_multiplier = ambient_color_multiplier.lerp(other.ambient_color_multiplier, weight)
result.ambient_intensity_multiplier = lerpf(ambient_intensity_multiplier, other.ambient_intensity_multiplier, weight)
result.fog_color_multiplier = fog_color_multiplier.lerp(other.fog_color_multiplier, weight)
result.fog_density_multiplier = lerpf(fog_density_multiplier, other.fog_density_multiplier, weight)
result.rain_intensity = lerpf(rain_intensity, other.rain_intensity, weight)
result.snow_intensity = lerpf(snow_intensity, other.snow_intensity, weight)
result.lightning_enabled = lightning_enabled or other.lightning_enabled
result.lightning_frequency = lerpf(lightning_frequency, other.lightning_frequency, weight)
return result

View File

@@ -0,0 +1 @@
uid://d2srir3wsi045