diff --git a/core/daynight/environment_management.tscn b/core/daynight/environment_management.tscn index 611ed07..a803a59 100644 --- a/core/daynight/environment_management.tscn +++ b/core/daynight/environment_management.tscn @@ -216,7 +216,7 @@ shader_parameter/fade_end = 800.000035625 shader_parameter/height_fade_start = 10.0 shader_parameter/height_fade_end = 50.0 -[node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain", "fog_overlay", "environment_dust", "blur", "environment_shadows")] +[node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain", "environment_dust", "blur", "environment_shadows")] script = ExtResource("1_wecen") environment_config = SubResource("Resource_r4tfj") particles_wind = NodePath("Particles_Wind") @@ -224,7 +224,6 @@ particles_snow = NodePath("Particles_Snow") particles_fireflies = NodePath("Particles_Fireflies") particles_rain = NodePath("Particles_Rain") godray = ExtResource("5_411rw") -fog_overlay = NodePath("") environment_dust = NodePath("EnvironmentDust") blur = NodePath("Blur") environment_shadows = NodePath("EnvironmentCloudsShadows") @@ -287,3 +286,5 @@ mouse_filter = 2 extra_cull_margin = 16384.0 mesh = SubResource("QuadMesh_sxgg7") surface_material_override/0 = SubResource("ShaderMaterial_oqt1s") + +[node name="AudioStreamPlayer3D" type="AudioStreamPlayer3D" parent="." unique_id=902982869] diff --git a/core/daynight/environment_manager.gd b/core/daynight/environment_manager.gd index bce5b70..e62c53d 100644 --- a/core/daynight/environment_manager.gd +++ b/core/daynight/environment_manager.gd @@ -12,14 +12,17 @@ extends Node3D @export var particles_fireflies: GPUParticles3D @export var particles_rain: GPUParticles3D @export var godray: PackedScene -@export var fog_overlay: ColorRect @export var environment_dust: ColorRect @export var blur: ColorRect @export var environment_shadows: MeshInstance3D +@export_group("Sound") +@export var thunder_sounds: Array[AudioStream] + #environment nodes @onready var sun: DirectionalLight3D = $"../DirectionalLight3D" @onready var environment: WorldEnvironment = $"../WorldEnvironment" +@onready var audio_player: AudioStreamPlayer3D = $AudioStreamPlayer3D var day_night_controller: DayNightController var weather_controller: WeatherController @@ -49,14 +52,15 @@ func _ready() -> void: particles_fireflies, particles_rain, godray, - fog_overlay, environment_dust, blur, environment_shadows, sun, environment, environment_config, - camera + camera, + audio_player, + thunder_sounds ) weather_controller.name = "WeatherController" add_child(weather_controller) diff --git a/core/daynight/sound/thunder_1.mp3 b/core/daynight/sound/thunder_1.mp3 new file mode 100644 index 0000000..27cbadc Binary files /dev/null and b/core/daynight/sound/thunder_1.mp3 differ diff --git a/core/daynight/sound/thunder_1.mp3.import b/core/daynight/sound/thunder_1.mp3.import new file mode 100644 index 0000000..811a111 --- /dev/null +++ b/core/daynight/sound/thunder_1.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://bfn6kxtpb8b7a" +path="res://.godot/imported/thunder_1.mp3-5dfac75637d4484715fa2c52227bbb39.mp3str" + +[deps] + +source_file="res://core/daynight/sound/thunder_1.mp3" +dest_files=["res://.godot/imported/thunder_1.mp3-5dfac75637d4484715fa2c52227bbb39.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/core/daynight/sound/thunder_2.mp3 b/core/daynight/sound/thunder_2.mp3 new file mode 100644 index 0000000..c1ca088 Binary files /dev/null and b/core/daynight/sound/thunder_2.mp3 differ diff --git a/core/daynight/sound/thunder_2.mp3.import b/core/daynight/sound/thunder_2.mp3.import new file mode 100644 index 0000000..f074953 --- /dev/null +++ b/core/daynight/sound/thunder_2.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://br2ye0dto487h" +path="res://.godot/imported/thunder_2.mp3-e0bc5cdbb7a7380e5c0e7af073c47559.mp3str" + +[deps] + +source_file="res://core/daynight/sound/thunder_2.mp3" +dest_files=["res://.godot/imported/thunder_2.mp3-e0bc5cdbb7a7380e5c0e7af073c47559.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/core/daynight/sound/thunder_3.mp3 b/core/daynight/sound/thunder_3.mp3 new file mode 100644 index 0000000..025365a Binary files /dev/null and b/core/daynight/sound/thunder_3.mp3 differ diff --git a/core/daynight/sound/thunder_3.mp3.import b/core/daynight/sound/thunder_3.mp3.import new file mode 100644 index 0000000..ce66191 --- /dev/null +++ b/core/daynight/sound/thunder_3.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://dvabvoqyya0g5" +path="res://.godot/imported/thunder_3.mp3-2057b93f6a6b1db545b448579512d302.mp3str" + +[deps] + +source_file="res://core/daynight/sound/thunder_3.mp3" +dest_files=["res://.godot/imported/thunder_3.mp3-2057b93f6a6b1db545b448579512d302.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/core/daynight/sound/thunder_4.mp3 b/core/daynight/sound/thunder_4.mp3 new file mode 100644 index 0000000..1592e2e Binary files /dev/null and b/core/daynight/sound/thunder_4.mp3 differ diff --git a/core/daynight/sound/thunder_4.mp3.import b/core/daynight/sound/thunder_4.mp3.import new file mode 100644 index 0000000..7f0747c --- /dev/null +++ b/core/daynight/sound/thunder_4.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://creenugno7hm" +path="res://.godot/imported/thunder_4.mp3-ab350a8d3ed7b106a20bdb2005be826d.mp3str" + +[deps] + +source_file="res://core/daynight/sound/thunder_4.mp3" +dest_files=["res://.godot/imported/thunder_4.mp3-ab350a8d3ed7b106a20bdb2005be826d.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/core/daynight/sound/thunder_5.mp3 b/core/daynight/sound/thunder_5.mp3 new file mode 100644 index 0000000..1eda3d7 Binary files /dev/null and b/core/daynight/sound/thunder_5.mp3 differ diff --git a/core/daynight/sound/thunder_5.mp3.import b/core/daynight/sound/thunder_5.mp3.import new file mode 100644 index 0000000..8896764 --- /dev/null +++ b/core/daynight/sound/thunder_5.mp3.import @@ -0,0 +1,19 @@ +[remap] + +importer="mp3" +type="AudioStreamMP3" +uid="uid://bm6dq4jwsbxf6" +path="res://.godot/imported/thunder_5.mp3-bac65d0a703be3ab04d2144b8eef2bce.mp3str" + +[deps] + +source_file="res://core/daynight/sound/thunder_5.mp3" +dest_files=["res://.godot/imported/thunder_5.mp3-bac65d0a703be3ab04d2144b8eef2bce.mp3str"] + +[params] + +loop=false +loop_offset=0 +bpm=0 +beat_count=0 +bar_beats=4 diff --git a/core/daynight/weather_controller.gd b/core/daynight/weather_controller.gd index ddb4bdf..bb8124a 100644 --- a/core/daynight/weather_controller.gd +++ b/core/daynight/weather_controller.gd @@ -1,12 +1,14 @@ class_name WeatherController extends Node +var audio_player: AudioStreamPlayer3D +var thunder_sounds: Array[AudioStream] + var particles_wind: GPUParticles3D var particles_snow: GPUParticles3D var particles_fireflies: GPUParticles3D var particles_rain: GPUParticles3D var godray: PackedScene -var fog_overlay: ColorRect var environment_dust: ColorRect var blur: ColorRect var environment_shadows: MeshInstance3D @@ -41,22 +43,23 @@ var thereare_fireflies: bool = false func _init(wind: GPUParticles3D, snow: GPUParticles3D, fireflies: GPUParticles3D, rain: GPUParticles3D, ray: PackedScene, - fogov: ColorRect, dust: ColorRect, blurr: ColorRect, envshadows: MeshInstance3D, + dust: ColorRect, blurr: ColorRect, envshadows: MeshInstance3D, thesun: DirectionalLight3D, theenvironment: WorldEnvironment, environmentconfig: EnvironmentConfig, - thecamera: Camera3D = null) -> void: + thecamera: Camera3D, audiostreamplayer: AudioStreamPlayer3D, thundersounds: Array[AudioStream]) -> void: particles_wind = wind particles_snow = snow particles_fireflies = fireflies particles_rain = rain godray = ray sun = thesun - fog_overlay = fogov environment_dust = dust blur = blurr environment_shadows = envshadows environment = theenvironment environment_config = environmentconfig camera = thecamera + thunder_sounds = thundersounds + audio_player = audiostreamplayer set_rain() @@ -101,7 +104,8 @@ func _process(delta: float) -> void: var base_rotation_sun: Vector3 if is_raining: - rain_intensity = move_toward(rain_intensity, 1.0, delta * 0.5) + var target_rain = environment_config.storm_rain_intensity_multiplier if is_storm else 1.0 + rain_intensity = move_toward(rain_intensity, target_rain, delta * 0.5) if is_storm: timer_next_lightning -= delta if timer_next_lightning <= 0.0: @@ -139,11 +143,15 @@ func _process(delta: float) -> void: base_grad_intensity = lerp(environment_config.grad_intensity_afternoon, environment_config.grad_intensity_night, t) base_rotation_sun = environment_config.sun_rotation_afternoon.lerp(environment_config.sun_rotation_night, t) - var final_tint = base_tint.lerp(base_tint * environment_config.rain_mode_color, rain_intensity) - var final_sky_top = base_sky_top.lerp(base_sky_top * environment_config.rain_mode_color, rain_intensity) - var final_sky_horizon = base_sky_horizon.lerp(base_sky_horizon * environment_config.rain_mode_color, rain_intensity) - var final_fog_color = base_fog_color.lerp(base_fog_color * environment_config.rain_mode_color, rain_intensity) - var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, rain_intensity) + var weather_color = environment_config.rain_mode_color + if is_storm: + var storm_blend = clamp((rain_intensity - 1.0) / (environment_config.storm_rain_intensity_multiplier - 1.0), 0.0, 1.0) + weather_color = weather_color.lerp(environment_config.storm_mode_color, storm_blend) + var final_tint = base_tint.lerp(base_tint * weather_color, clamp(rain_intensity, 0.0, 1.0)) + var final_sky_top = base_sky_top.lerp(base_sky_top * weather_color, clamp(rain_intensity, 0.0, 1.0)) + var final_sky_horizon = base_sky_horizon.lerp(base_sky_horizon * weather_color, clamp(rain_intensity, 0.0, 1.0)) + var final_fog_color = base_fog_color.lerp(base_fog_color * weather_color, clamp(rain_intensity, 0.0, 1.0)) + var final_fog_density = lerp(base_fog_density, base_fog_density * 4.0, clamp(rain_intensity, 0.0, 1.0)) final_tint = final_tint.lerp(final_tint * environment_config.snow_mode_color, actual_snow_amount) final_sky_top = final_sky_top.lerp(final_sky_top * environment_config.snow_mode_color, actual_snow_amount) @@ -151,8 +159,8 @@ func _process(delta: float) -> void: final_fog_color = final_fog_color.lerp(final_fog_color * environment_config.snow_mode_color, actual_snow_amount) #Shader parameters for global trunk_shader - var final_grad_top = base_grad_top.lerp(base_grad_top * environment_config.rain_mode_color, rain_intensity) - var final_grad_bot = base_grad_bot.lerp(base_grad_bot * environment_config.rain_mode_color, rain_intensity) + var final_grad_top = base_grad_top.lerp(base_grad_top * weather_color, clamp(rain_intensity, 0.0, 1.0)) + var final_grad_bot = base_grad_bot.lerp(base_grad_bot * weather_color, clamp(rain_intensity, 0.0, 1.0)) RenderingServer.global_shader_parameter_set("global_gradient_color_top", final_grad_top) RenderingServer.global_shader_parameter_set("global_gradient_color_bot", final_grad_bot) @@ -226,7 +234,7 @@ func _follow_camera() -> void: if particles_snow: particles_snow.global_position = Vector3(cam_pos.x, particles_snow.position.y, cam_pos.z) if particles_wind: - particles_wind.global_position = Vector3(cam_pos.x, particles_wind.position.y, cam_pos.z) + particles_wind.global_position = Vector3(cam_pos.x, cam_pos.y, cam_pos.z) if particles_fireflies: particles_fireflies.global_position = Vector3(cam_pos.x, particles_fireflies.position.y, cam_pos.z) @@ -254,10 +262,8 @@ func set_fireflies(): func toggle_wind(value: bool): is_windy = value - var is_night = day_time >= 2.5 - if particles_wind: - particles_wind.emitting = (not is_storm and not is_night and is_windy) + particles_wind.emitting = is_windy #disable wind and set default values and materials func set_wind(): @@ -385,9 +391,22 @@ func start_lightning(): tween_sprite.tween_interval(0.2) tween_sprite.tween_property(lightning_sprite, "modulate:a", 0.0, 0.4) + #Thunder sound; separated routine to do not stop the loop + _play_thunder_delayed(randf_range(0.5, 2.5)) + if lightning_number > 1: await get_tree().create_timer(randf_range(0.05, 0.15)).timeout +func _play_thunder_delayed(delay: float): + await get_tree().create_timer(delay).timeout + + if thunder_sounds.is_empty() or not audio_player: + return + #choose a random track + audio_player.stream = thunder_sounds[randi() % thunder_sounds.size()] + audio_player.pitch_scale = randf_range(0.9, 1.1) + audio_player.play() + #endregion #region Rain diff --git a/core/environment_config.gd b/core/environment_config.gd index f380067..e26949f 100644 --- a/core/environment_config.gd +++ b/core/environment_config.gd @@ -1,51 +1,60 @@ class_name EnvironmentConfig extends Resource -#Time duration in seconds for a day @export_group("Day") -@export var day_duration: float = 120.0 +@export var day_duration: float = 120.0 #Duration of a full day cycle in seconds +#Ambient light color tinting for each time of day @export_group("Directional Lights and Environment") -@export var morning_color: Color = Color(1.0, 0.9, 0.8, 1.0) -@export var afternoon_color: Color = Color(1.0, 0.6, 0.2, 1.0) -@export var night_color: Color = Color(0.1, 0.1, 0.3, 1.0) +@export var morning_color: Color = Color(1.0, 0.9, 0.8, 1.0) #Tint for morning +@export var afternoon_color: Color = Color(1.0, 0.6, 0.2, 1.0) #Tint for afternoon (sunset) +@export var night_color: Color = Color(0.1, 0.1, 0.3, 1.0) #Tint for night +#Sun directional light rotation for each time of day @export_group("Sun Rotation") @export var sun_rotation_morning: Vector3 = Vector3(-15.0, 45.0, 0.0) @export var sun_rotation_afternoon: Vector3 = Vector3(-75.0, 10.0, 0.0) @export var sun_rotation_night: Vector3 = Vector3(-35.0, -120.0, 0.0) +#Sun light energy during night (multiplied onto base energy) @export var night_light_energy: float = 0.3 +#Camera tonemap exposure for each time of day @export_group("General Exposition") @export var exposure_morning: float = 1.0 @export var exposure_afternoon: float = 0.95 @export var exposure_night: float = 0.4 +#Sky top color for each time of day @export_group("Sky Colors - Top") @export var sky_top_morning: Color = Color(0.35, 0.65, 0.9, 1.0) @export var sky_top_afternoon: Color = Color(0.7, 0.45, 0.2, 1.0) @export var sky_top_night: Color = Color(0.05, 0.05, 0.15, 1.0) +#Sky horizon color for each time of day @export_group("Sky Color - Horizon") @export var sky_horizon_morning: Color = Color(0.75, 0.85, 0.95, 1.0) @export var sky_horizon_afternoon: Color = Color(0.95, 0.65, 0.35, 1.0) @export var sky_horizon_night: Color = Color(0.15, 0.1, 0.25, 1.0) +#Top gradient color used by the trunk shader @export_subgroup("Gradient - Top") @export var grad_top_morning: Color = Color(0.8, 0.4, 0.2, 1.0) @export var grad_top_afternoon: Color = Color(0.2, 0.3, 0.5, 1.0) @export var grad_top_night: Color = Color(0.05, 0.05, 0.1, 1.0) +#Bottom gradient color used by the trunk shader @export_subgroup("Gradient - Bottom") @export var grad_bot_morning: Color = Color(0.5, 0.2, 0.1, 1.0) @export var grad_bot_afternoon: Color = Color(0.1, 0.15, 0.25, 1.0) @export var grad_bot_night: Color = Color(0.01, 0.01, 0.05, 1.0) +#Gradient blend intensity for the trunk shader @export_subgroup("Gradient Intensity") @export var grad_intensity_morning: float = 0.5 @export var grad_intensity_afternoon: float = 0.3 @export var grad_intensity_night: float = 0.8 +#Volumetric fog color and density for each time of day @export_group("Fog") @export var fog_color_morning: Color = Color(0.75, 0.85, 0.95, 1.0) @export var fog_color_afternoon: Color = Color(0.95, 0.65, 0.35, 1.0) @@ -54,71 +63,85 @@ extends Resource @export var fog_density_afternoon: float = 0.002 @export var fog_density_night: float = 0.015 +#Glow (bloom) intensity for each time of day @export_group("Glow") @export var glow_morning: float = 1.2 @export var glow_afternoon: float = 0.8 @export var glow_night: float = 2.0 +#Post-process effect toggles (initial values) @export_group("Post Process") -@export var enable_fog_overlay: bool = false -@export var enable_dust: bool = true -@export var enable_blur: bool = true -@export var enable_environment_shadows: bool = true +@export var enable_dust: bool = true #Floating dust particles overlay +@export var enable_blur: bool = true #Screen blur effect +@export var enable_environment_shadows: bool = true #Cloud shadow projection on terrain +#Shader materials used by weather and sky systems @export_group("Environment Materials") -@export var material_fog: ShaderMaterial -@export var material_drops: StandardMaterial3D -@export var material_clouds: ShaderMaterial +@export var material_fog: ShaderMaterial #Fog overlay shader material +@export var material_drops: StandardMaterial3D #Rain drops material (albedo tinted by sky) +@export var material_clouds: ShaderMaterial #Cloud layer shader material +#Rain weather settings @export_group("Rain") -@export var rain_mode_color: Color = Color(0.5, 0.6, 0.7, 1.0) -@export var rain_fade_time: float = 5.0 -@export var puddle_form_time: float = 15.0 -@export var puddle_dry_time: float = 20.0 +@export var rain_mode_color: Color = Color(0.5, 0.6, 0.7, 1.0) #Sky/light darkening color during rain +@export var rain_fade_time: float = 5.0 #Seconds for rain particles to fade in/out +@export var puddle_form_time: float = 15.0 #Seconds for puddles to fully form +@export var puddle_dry_time: float = 20.0 #Seconds for puddles to fully dry after rain stops +#Storm settings (applied on top of rain when storm is active) +@export_group("Storm") +@export var storm_rain_intensity_multiplier: float = 1.5 #Rain intensity target during storm (1.0 = normal rain) +@export var storm_mode_color: Color = Color(0.476, 0.531, 0.639, 1.0) #Additional sky darkening color during storm + +#Lightning and thunder configuration @export_group("Lightning and Thunders") -@export var lightning_min_time: float = 5.0 -@export var lightning_max_time: float = 15.0 -@export var lightning_color: Color = Color(1.0, 1.0, 0.8, 1.0) -@export var lightning_min: int = 1 -@export var lightning_max: int = 3 -@export var lightning_scale_min: float = 1.0 -@export var lightning_scale_max: float = 3.0 -@export var lightning_texture: String = "res://core/daynight/lighting_albedo.png" -@export var weather_event_interval: float = 8.0 +@export var lightning_min_time: float = 5.0 #Minimum seconds between lightning strikes +@export var lightning_max_time: float = 15.0 #Maximum seconds between lightning strikes +@export var lightning_color: Color = Color(1.0, 1.0, 0.8, 1.0) #Lightning sprite tint color +@export var lightning_min: int = 1 #Minimum number of lightning bolts per strike event +@export var lightning_max: int = 3 #Maximum number of lightning bolts per strike event +@export var lightning_scale_min: float = 1.0 #Minimum random scale of lightning sprite +@export var lightning_scale_max: float = 3.0 #Maximum random scale of lightning sprite +@export var lightning_texture: String = "res://core/daynight/lighting_albedo.png" # Lightning bolt texture path +@export var weather_event_interval: float = 8.0 #Base interval between weather events +#thunder sound is configured on daynight node +#God rays spawned after rain or at morning @export_group("God Rays") -@export var godray_max_rain: int = 8 -@export var godray_spawn_radius: float = 15.0 -@export var godray_spawn_offset: Vector3 = Vector3(15.0, 5.0, -15.0) -@export var godray_rotation_degrees: Vector3 = Vector3(-45.0, 45.0, -30.0) -@export var godray_spawn_height: float = 5.0 -@export var godray_scale: Vector3 = Vector3(2.0, 6.0, 2.0) +@export var godray_max_rain: int = 8 #Max number of god rays spawned after rain stops +@export var godray_spawn_radius: float = 15.0 #Horizontal spawn radius around the camera +@export var godray_spawn_offset: Vector3 = Vector3(15.0, 5.0, -15.0) #Position offset from camera +@export var godray_rotation_degrees: Vector3 = Vector3(-45.0, 45.0, -30.0) #Rotation of the god ray mesh +@export var godray_spawn_height: float = 5.0 #Y world position where god rays spawn +@export var godray_scale: Vector3 = Vector3(2.0, 6.0, 2.0) #Scale of the god ray mesh +#Snow settings @export_group("Snow") -@export var snow_amount: float = 0.0 -@export var snow_transaction_time: float = 10.0 -@export var snow_fade_time: float = 5.0 -@export var snow_threshold: float = 0.4 -@export var snow_accumulation_speed: float = 0.02 #0.1 -> accumulation time 10secs; 0.05 -> accumulation time 20secs; realistic; 0.2 -> accumulation time 5secs; -@export var snow_melt_speed: float = 0.05 -@export var snow_color: Color = Color(0.9, 0.95, 1.0) -@export var snow_mode_color: Color = Color(0.7, 0.75, 0.8, 1.0) +@export var snow_amount: float = 0.0 #Initial snow coverage amount (0.0 = none, 1.0 = full) +@export var snow_transaction_time: float = 10.0 #Seconds for snow shader to fully transition in/out +@export var snow_fade_time: float = 5.0 #Seconds for snow particles to fade in/out +@export var snow_threshold: float = 0.4 #Normal Y threshold for snow accumulation on surfaces +@export var snow_accumulation_speed: float = 0.02 #Accumulation speed: 0.1 -> 10s, 0.05 -> 20s, 0.02 -> 50s, 0.2 -> 5s +@export var snow_melt_speed: float = 0.05 #Speed at which accumulated snow melts away +@export var snow_color: Color = Color(0.9, 0.95, 1.0) #Albedo color of snow on surfaces +@export var snow_mode_color: Color = Color(0.556, 0.62, 0.683, 1.0) #Sky/light darkening color during snow +#Wind settings @export_group("Wind") -@export var wind_amount: int = 100 -@export var wind_spawn_ray: float = 25.0 -@export var wind_spawn_height: float = 5.0 -@export var wind_direction: Vector2 = Vector2(0.5, 0.4) -@export var wind_speed: float = 0.2 -@export var wind_scale: float = 0.025 -@export var wind_strength: float = 0.6 -@export var cloud_scale: float = 0.5 -@export var cloud_speed: float = 0.05 -@export_range(0.01, 1.0) var cloud_scale_envshadows_rate: float = 0.01 -@export_range(0.01, 1.0) var cloud_speed_envshadows_rate: float = 0.5 +@export var wind_amount: int = 100 #Number of wind particles +@export var wind_spawn_ray: float = 25.0 #Horizontal spawn radius (emission box XZ extents) +@export var wind_spawn_height: float = 8.0 #Vertical spawn range (emission box Y extent) +@export var wind_direction: Vector2 = Vector2(0.5, 0.4) #Global wind direction (XZ) +@export var wind_speed: float = 0.2 #Global wind animation speed +@export var wind_scale: float = 0.025 #Global wind noise scale +@export var wind_strength: float = 0.6 #Global wind displacement strength +@export var cloud_scale: float = 0.5 #Cloud noise scale in sky shader +@export var cloud_speed: float = 0.05 #Cloud movement speed in sky shader +@export_range(0.01, 1.0) var cloud_scale_envshadows_rate: float = 0.01 #Cloud scale multiplier for environment shadows +@export_range(0.01, 1.0) var cloud_speed_envshadows_rate: float = 0.5 #Cloud speed multiplier for environment shadows +#Firefly settings (visible only at night) @export_group("Fireflies") -@export var fireflies_amount: int = 60 -@export var fireflies_spawn_ray: float = 20.0 -@export var fireflies_spawn_height: float = 3.0 +@export var fireflies_amount: int = 60 #Number of firefly particles +@export var fireflies_spawn_ray: float = 20.0 #Horizontal spawn radius +@export var fireflies_spawn_height: float = 3.0 #Vertical spawn range diff --git a/docs/museums/daynight/museum_daynight.tscn b/docs/museums/daynight/museum_daynight.tscn index ce5223d..0b2814e 100644 --- a/docs/museums/daynight/museum_daynight.tscn +++ b/docs/museums/daynight/museum_daynight.tscn @@ -1,9 +1,14 @@ [gd_scene format=3 uid="uid://bjkhawylawqof"] [ext_resource type="PackedScene" uid="uid://cmuvmmp7xam4o" path="res://core/daynight/environment_management.tscn" id="1_daynt"] +[ext_resource type="AudioStream" uid="uid://bfn6kxtpb8b7a" path="res://core/daynight/sound/thunder_1.mp3" id="2_l6e82"] +[ext_resource type="AudioStream" uid="uid://br2ye0dto487h" path="res://core/daynight/sound/thunder_2.mp3" id="3_28c1g"] [ext_resource type="Shader" uid="uid://bneoex8xpmcm8" path="res://core/daynight/sky.gdshader" id="3_jiovi"] [ext_resource type="Texture2D" uid="uid://dest0qa7vaid0" path="res://core/daynight/stars_albedo.png" id="4_abyor"] +[ext_resource type="AudioStream" uid="uid://dvabvoqyya0g5" path="res://core/daynight/sound/thunder_3.mp3" id="4_d5ghv"] +[ext_resource type="AudioStream" uid="uid://creenugno7hm" path="res://core/daynight/sound/thunder_4.mp3" id="5_g8vyu"] [ext_resource type="Script" uid="uid://brcimd12tx3dm" path="res://core/daynight/edge_detection_compositor.gd" id="5_jgh18"] +[ext_resource type="AudioStream" uid="uid://bm6dq4jwsbxf6" path="res://core/daynight/sound/thunder_5.mp3" id="6_iu8wf"] [ext_resource type="Script" uid="uid://cx2tlvxhvatj5" path="res://docs/museums/daynight/control.gd" id="6_q52t1"] [ext_resource type="Script" uid="uid://ccdd52apoh4ir" path="res://docs/museums/daynight/camera_3d.gd" id="7_p2t1d"] [ext_resource type="PackedScene" uid="uid://jj15telqu3rp" path="res://docs/museums/daynight/scenes/grass_test/grass_test.tscn" id="7_pd1r3"] @@ -94,6 +99,7 @@ size = Vector3(200, 0.08, 200) [node name="DayNight" parent="." unique_id=1578787116 node_paths=PackedStringArray("camera") instance=ExtResource("1_daynt")] camera = NodePath("../Camera3D") +thunder_sounds = Array[AudioStream]([ExtResource("2_l6e82"), ExtResource("3_28c1g"), ExtResource("4_d5ghv"), ExtResource("5_g8vyu"), ExtResource("6_iu8wf")]) [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=6398994] environment = SubResource("Environment_icuhg") diff --git a/docs/museums/daynight/museum_daynight.tscn887526058.tmp b/docs/museums/daynight/museum_daynight.tscn887526058.tmp new file mode 100644 index 0000000..0b2814e --- /dev/null +++ b/docs/museums/daynight/museum_daynight.tscn887526058.tmp @@ -0,0 +1,294 @@ +[gd_scene format=3 uid="uid://bjkhawylawqof"] + +[ext_resource type="PackedScene" uid="uid://cmuvmmp7xam4o" path="res://core/daynight/environment_management.tscn" id="1_daynt"] +[ext_resource type="AudioStream" uid="uid://bfn6kxtpb8b7a" path="res://core/daynight/sound/thunder_1.mp3" id="2_l6e82"] +[ext_resource type="AudioStream" uid="uid://br2ye0dto487h" path="res://core/daynight/sound/thunder_2.mp3" id="3_28c1g"] +[ext_resource type="Shader" uid="uid://bneoex8xpmcm8" path="res://core/daynight/sky.gdshader" id="3_jiovi"] +[ext_resource type="Texture2D" uid="uid://dest0qa7vaid0" path="res://core/daynight/stars_albedo.png" id="4_abyor"] +[ext_resource type="AudioStream" uid="uid://dvabvoqyya0g5" path="res://core/daynight/sound/thunder_3.mp3" id="4_d5ghv"] +[ext_resource type="AudioStream" uid="uid://creenugno7hm" path="res://core/daynight/sound/thunder_4.mp3" id="5_g8vyu"] +[ext_resource type="Script" uid="uid://brcimd12tx3dm" path="res://core/daynight/edge_detection_compositor.gd" id="5_jgh18"] +[ext_resource type="AudioStream" uid="uid://bm6dq4jwsbxf6" path="res://core/daynight/sound/thunder_5.mp3" id="6_iu8wf"] +[ext_resource type="Script" uid="uid://cx2tlvxhvatj5" path="res://docs/museums/daynight/control.gd" id="6_q52t1"] +[ext_resource type="Script" uid="uid://ccdd52apoh4ir" path="res://docs/museums/daynight/camera_3d.gd" id="7_p2t1d"] +[ext_resource type="PackedScene" uid="uid://jj15telqu3rp" path="res://docs/museums/daynight/scenes/grass_test/grass_test.tscn" id="7_pd1r3"] +[ext_resource type="PackedScene" uid="uid://bonjxfjcdnntt" path="res://docs/museums/daynight/scenes/grain_test/grain_test.tscn" id="7_w3se4"] +[ext_resource type="PackedScene" uid="uid://cahsl77384kf1" path="res://docs/museums/daynight/scenes/chunk_c_f_1/house_muraglione.tscn" id="9_pd1r3"] + +[sub_resource type="FastNoiseLite" id="FastNoiseLite_jiovi"] +fractal_lacunarity = 1.915 +fractal_gain = 0.53 +fractal_weighted_strength = 0.35 + +[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_abyor"] +noise = SubResource("FastNoiseLite_jiovi") +seamless = true + +[sub_resource type="ShaderMaterial" id="ShaderMaterial_abyor"] +shader = ExtResource("3_jiovi") +shader_parameter/sky_top_color = Color(0.36438444, 0.6417803, 0.8712311, 1) +shader_parameter/sky_horizon_color = Color(0.75821966, 0.8417803, 0.92534095, 1) +shader_parameter/night_intensity = 0.0 +shader_parameter/cloud_noise = SubResource("NoiseTexture2D_abyor") +shader_parameter/sun_color = Color(1, 0.88767046, 0.775341, 1) +shader_parameter/cloud_center_color = Color(1, 1, 1, 1) +shader_parameter/cloud_edge_color = Color(0.8, 0.85, 0.9, 1) +shader_parameter/cloud_direction = Vector2(0.5, 0.2) +shader_parameter/cloud_speed = 0.1 +shader_parameter/cloud_scale = 0.5 +shader_parameter/cloud_threshold = 0.5 +shader_parameter/cloud_edge_thickness = 0.406000019285 +shader_parameter/cloud_edge_softness = 0.0 +shader_parameter/star_density = 1500.0 +shader_parameter/star_rarity = 2500.0 +shader_parameter/star_scale_variation = 0.5 +shader_parameter/shooting_star_texture = ExtResource("4_abyor") +shader_parameter/shooting_star_color = Color(0.38431373, 0.61960787, 0.23137255, 1) +shader_parameter/shooting_star_density = 1.0 +shader_parameter/shooting_star_speed = 1.0 +shader_parameter/shooting_star_scale = 5.0 +shader_parameter/shooting_star_lifetime = 0.5 +shader_parameter/shooting_star_travel_dist = 15.0 + +[sub_resource type="Sky" id="Sky_50i22"] +sky_material = SubResource("ShaderMaterial_abyor") + +[sub_resource type="Environment" id="Environment_icuhg"] +background_mode = 2 +sky = SubResource("Sky_50i22") +ambient_light_color = Color(1, 0.88767046, 0.775341, 1) +tonemap_exposure = 0.9979451 +ssao_enabled = true +ssao_radius = 0.5 +ssao_intensity = 14.0 +ssao_detail = 0.0 +ssil_enabled = true +glow_enabled = true +glow_levels/4 = 1.0 +glow_intensity = 1.1835606 +glow_strength = 0.65 +glow_bloom = 1.0 +fog_enabled = true +fog_mode = 1 +fog_light_color = Color(0.75821966, 0.8417803, 0.92534095, 1) +fog_density = 0.004876705 +fog_sky_affect = 0.0 + +[sub_resource type="CompositorEffect" id="CompositorEffect_q52t1"] +resource_local_to_scene = false +resource_name = "" +enabled = true +effect_callback_type = 1 +access_resolved_color = false +access_resolved_depth = false +needs_motion_vectors = false +needs_normal_roughness = false +script = ExtResource("5_jgh18") +metadata/_custom_type_script = "uid://brcimd12tx3dm" + +[sub_resource type="Compositor" id="Compositor_jbfcc"] +compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_q52t1")]) + +[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_p2t1d"] +albedo_color = Color(0.135, 0.45, 0.18224995, 1) + +[sub_resource type="BoxMesh" id="BoxMesh_p2t1d"] +size = Vector3(200, 0.08, 200) + +[node name="Museum" type="Node3D" unique_id=1411616506] + +[node name="DayNight" parent="." unique_id=1578787116 node_paths=PackedStringArray("camera") instance=ExtResource("1_daynt")] +camera = NodePath("../Camera3D") +thunder_sounds = Array[AudioStream]([ExtResource("2_l6e82"), ExtResource("3_28c1g"), ExtResource("4_d5ghv"), ExtResource("5_g8vyu"), ExtResource("6_iu8wf")]) + +[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=6398994] +environment = SubResource("Environment_icuhg") +compositor = SubResource("Compositor_jbfcc") + +[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=565189502] +transform = Transform3D(0.7246343, -0.20683524, 0.65736127, 0, 0.95389545, 0.30013812, -0.6891333, -0.21749045, 0.6912255, 0, 0, 0) +light_color = Color(1, 0.88767046, 0.775341, 1) +light_indirect_energy = 0.0 +light_volumetric_fog_energy = 0.0 +shadow_enabled = true +shadow_bias = 0.2 +shadow_normal_bias = 0.0 +shadow_opacity = 0.97 +shadow_blur = 0.4 +directional_shadow_mode = 0 +directional_shadow_fade_start = 0.9 + +[node name="Camera3D" type="Camera3D" parent="." unique_id=1893906598] +transform = Transform3D(1, 0, 0, 0, 0.99452555, -0.10449375, 0, 0.10449375, 0.99452555, 0.48949432, 25.39013, 0) +script = ExtResource("7_p2t1d") + +[node name="Terrain" type="MeshInstance3D" parent="." unique_id=1335123628] +material_override = SubResource("StandardMaterial3D_p2t1d") +mesh = SubResource("BoxMesh_p2t1d") + +[node name="Control" type="Control" parent="." unique_id=1032167802] +layout_mode = 3 +anchors_preset = 0 +offset_right = 40.0 +offset_bottom = 40.0 +script = ExtResource("6_q52t1") + +[node name="Snow" type="CheckButton" parent="Control" unique_id=1267493556] +layout_mode = 0 +offset_left = 21.0 +offset_top = 13.0 +offset_right = 109.0 +offset_bottom = 44.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Snow" + +[node name="Rain" type="CheckButton" parent="Control" unique_id=1387886007] +layout_mode = 0 +offset_left = 21.0 +offset_top = 41.0 +offset_right = 109.0 +offset_bottom = 72.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Rain" + +[node name="Wind" type="CheckButton" parent="Control" unique_id=1160113828] +layout_mode = 0 +offset_left = 21.0 +offset_top = 91.0 +offset_right = 109.0 +offset_bottom = 122.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Wind" + +[node name="Fireflies" type="CheckButton" parent="Control" unique_id=1177089839] +layout_mode = 0 +offset_left = 21.0 +offset_top = 115.0 +offset_right = 130.0 +offset_bottom = 146.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Fireflies" + +[node name="Storm" type="CheckButton" parent="Control" unique_id=936960924] +layout_mode = 0 +offset_left = 21.0 +offset_top = 66.0 +offset_right = 117.0 +offset_bottom = 97.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Storm" + +[node name="DayTimeLabel" type="Label" parent="Control" unique_id=1673596218] +layout_mode = 0 +offset_left = 26.0 +offset_top = 150.0 +offset_right = 135.0 +offset_bottom = 173.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +text = "Day Time" + +[node name="DayTimeSlider" type="HSlider" parent="Control" unique_id=530788076] +layout_mode = 0 +offset_left = 26.0 +offset_top = 174.0 +offset_right = 205.0 +offset_bottom = 190.0 +max_value = 1.0 +step = 0.01 + +[node name="Dust" type="CheckButton" parent="Control" unique_id=2023312048] +layout_mode = 0 +offset_left = 21.0 +offset_top = 250.0 +offset_right = 150.0 +offset_bottom = 281.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Dust" + +[node name="Blur" type="CheckButton" parent="Control" unique_id=1758807681] +layout_mode = 0 +offset_left = 21.0 +offset_top = 278.0 +offset_right = 150.0 +offset_bottom = 309.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Blur" + +[node name="Pause" type="CheckButton" parent="Control" unique_id=156986934] +layout_mode = 0 +offset_left = 21.0 +offset_top = 189.0 +offset_right = 158.0 +offset_bottom = 220.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +text = "Pause Time" + +[node name="Shadows" type="CheckButton" parent="Control" unique_id=1751516495] +layout_mode = 0 +offset_left = 21.0 +offset_top = 302.0 +offset_right = 150.0 +offset_bottom = 333.0 +theme_override_colors/font_color = Color(0, 0, 0, 1) +theme_override_colors/font_focus_color = Color(0, 0, 0, 1) +theme_override_colors/font_pressed_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_color = Color(0, 0, 0, 1) +theme_override_colors/font_hover_pressed_color = Color(0, 0, 0, 1) +button_pressed = true +text = "Shadows" + +[node name="Scene" type="Node" parent="." unique_id=701973010] + +[node name="Grass" parent="Scene" unique_id=838519336 instance=ExtResource("7_pd1r3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, -14) + +[node name="Grain" parent="Scene" unique_id=1171350762 instance=ExtResource("7_w3se4")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0) + +[node name="House_Muraglione" parent="Scene" unique_id=1060427946 instance=ExtResource("9_pd1r3")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.41167784, 0) + +[connection signal="toggled" from="Control/Snow" to="Control" method="_on_snow_toggled"] +[connection signal="toggled" from="Control/Rain" to="Control" method="_on_rain_toggled"] +[connection signal="toggled" from="Control/Wind" to="Control" method="_on_wind_toggled"] +[connection signal="toggled" from="Control/Fireflies" to="Control" method="_on_fireflies_toggled"] +[connection signal="toggled" from="Control/Storm" to="Control" method="_on_storm_toggled"] +[connection signal="value_changed" from="Control/DayTimeSlider" to="Control" method="_on_day_time_slider_value_changed"] +[connection signal="toggled" from="Control/Dust" to="Control" method="_on_dust_toggled"] +[connection signal="toggled" from="Control/Blur" to="Control" method="_on_blur_toggled"] +[connection signal="toggled" from="Control/Pause" to="Control" method="_on_pause_toggled"] +[connection signal="toggled" from="Control/Shadows" to="Control" method="_on_shadows_toggled"] diff --git a/docs/museums/daynight/scenes/grass_test/grass_test.tscn b/docs/museums/daynight/scenes/grass_test/grass_test.tscn index deb8e02..e1ee6d3 100644 --- a/docs/museums/daynight/scenes/grass_test/grass_test.tscn +++ b/docs/museums/daynight/scenes/grass_test/grass_test.tscn @@ -27,7 +27,7 @@ instance_count = 40 mesh = SubResource("QuadMesh_rpt6v") buffer = PackedFloat32Array(-1.001, 0, 0, -2.8797488, 0, 1.001, -5.966425e-08, -0.7477443, 0, -5.966425e-08, -1.001, -4.2194977, -1.001, 0, 0, -1.7037079, 0, 1.001, -5.966425e-08, -0.7477442, 0, -5.966425e-08, -1.001, -3.2446604, -1.001, 0, 0, 1.2830465, 0, 1.001, -5.966425e-08, -0.7477443, 0, -5.966425e-08, -1.001, -4.557446, -1.001, 0, 0, -5.028355, 0, 1.001, -5.966425e-08, -0.74774426, 0, -5.966425e-08, -1.001, -3.6429324, -1.001, 0, 0, -6.371053, 0, 1.001, -5.966425e-08, -0.7477439, 0, -5.966425e-08, -1.001, 4.1175256, 0, 0, -1.001, -1.5100684, 4.5406587e-08, 1.001, 0, -0.7477439, 1.001, -4.5406587e-08, 0, 4.42225, -1.001, 0, 0, -5.2487645, 0, 1.001, -5.966425e-08, -0.7477441, 0, -5.966425e-08, -1.001, -0.013931215, 0, 0, -1.001, 6.235317, 4.5406587e-08, 1.001, 0, -0.74774384, 1.001, -4.5406587e-08, 0, 6.248699, 0, 0, -1.001, 1.3825206, 4.5406587e-08, 1.001, 0, -0.7477441, 1.001, -4.5406587e-08, 0, 1.1873395, 0, 0, -1.001, 2.780786, 4.5406587e-08, 1.001, 0, -0.747744, 1.001, -4.5406587e-08, 0, 1.1765423, -1.001, 0, 0, 1.0532601, 0, 1.001, -5.966425e-08, -0.74774444, 0, -5.966425e-08, -1.001, -6.5395527, -1.001, 0, 0, -4.3666453, 0, 1.001, -5.966425e-08, -0.747744, 0, -5.966425e-08, -1.001, 1.6017916, -1.001, 0, 0, -1.3377903, 0, 1.001, -5.966425e-08, -0.7477441, 0, -5.966425e-08, -1.001, -0.6376221, 0, 0, -1.001, 5.4567842, 4.5406587e-08, 1.001, 0, -0.7477441, 1.001, -4.5406587e-08, 0, 0.5279622, 0, 0, -1.001, -1.2204466, 4.5406587e-08, 1.001, 0, -0.74774396, 1.001, -4.5406587e-08, 0, 1.4669147, -1.001, 0, 0, -5.0291324, 0, 1.001, -5.966425e-08, -0.74774426, 0, -5.966425e-08, -1.001, -3.9644425, 0, 0, -1.001, 4.144575, 4.5406587e-08, 1.001, 0, -0.7477443, 1.001, -4.5406587e-08, 0, -3.9907537, -1.001, 0, 0, -0.18894172, 0, 1.001, -5.966425e-08, -0.7477443, 0, -5.966425e-08, -1.001, -5.562557, 0, 0, -1.001, 3.410009, 4.5406587e-08, 1.001, 0, -0.74774396, 1.001, -4.5406587e-08, 0, 1.8935597, 0, 0, -1.001, -2.7810845, 4.5406587e-08, 1.001, 0, -0.7477439, 1.001, -4.5406587e-08, 0, 3.808044, -1.001, 0, 0, 0.284374, 0, 1.001, -5.966425e-08, -0.7477441, 0, -5.966425e-08, -1.001, -0.58144546, -1.001, 0, 0, -3.1262631, 0, 1.001, -5.966425e-08, -0.7477442, 0, -5.966425e-08, -1.001, -2.8066845, 0, 0, -1.001, 5.7749968, 4.5406587e-08, 1.001, 0, -0.7477441, 1.001, -4.5406587e-08, 0, 0.935482, -1.001, 0, 0, -5.218869, 0, 1.001, -5.966425e-08, -0.74774426, 0, -5.966425e-08, -1.001, -4.2917852, 0, 0, -1.001, 6.1626782, 4.5406587e-08, 1.001, 0, -0.7477441, 1.001, -4.5406587e-08, 0, 0.21193457, -1.001, 0, 0, 3.9669042, 0, 1.001, -5.966425e-08, -0.7477443, 0, -5.966425e-08, -1.001, -5.853158, 0, 0, -1.001, 2.2436643, 4.5406587e-08, 1.001, 0, -0.74774396, 1.001, -4.5406587e-08, 0, 3.1271167, 0, 0, -1.001, 2.4900956, 4.5406587e-08, 1.001, 0, -0.7477439, 1.001, -4.5406587e-08, 0, 3.9106765, 0, 0, -1.001, 5.5539966, 4.5406587e-08, 1.001, 0, -0.74774384, 1.001, -4.5406587e-08, 0, 6.162884, 0, 0, -1.001, -1.6500849, 4.5406587e-08, 1.001, 0, -0.74774384, 1.001, -4.5406587e-08, 0, 5.425037, 0, 0, -1.001, 1.2913516, 4.5406587e-08, 1.001, 0, -0.7477438, 1.001, -4.5406587e-08, 0, 5.9583297, 0, 0, -1.001, 3.403863, 4.5406587e-08, 1.001, 0, -0.7477441, 1.001, -4.5406587e-08, 0, -1.3604579, 0, 0, -1.001, 2.5133843, 4.5406587e-08, 1.001, 0, -0.7477441, 1.001, -4.5406587e-08, 0, -1.2172651, 0, 0, -1.001, -1.865159, 4.5406587e-08, 1.001, 0, -0.74774396, 1.001, -4.5406587e-08, 0, 2.02114, -1.001, 0, 0, -2.1462004, 0, 1.001, -5.966425e-08, -0.747744, 0, -5.966425e-08, -1.001, 1.2531993, 0, 0, -1.001, 6.005666, 4.5406587e-08, 1.001, 0, -0.747744, 1.001, -4.5406587e-08, 0, 1.2401769, 0, 0, -1.001, 2.402935, 4.5406587e-08, 1.001, 0, -0.7477439, 1.001, -4.5406587e-08, 0, 2.778954, -1.001, 0, 0, -6.482737, 0, 1.001, -5.966425e-08, -0.74774384, 0, -5.966425e-08, -1.001, 5.1091228, -1.001, 0, 0, 0.6619804, 0, 1.001, -5.966425e-08, -0.74774414, 0, -5.966425e-08, -1.001, -1.2692692, -1.001, 0, 0, 3.7678468, 0, 1.001, -5.966425e-08, -0.74774426, 0, -5.966425e-08, -1.001, -4.5863547) -[node name="Grass" unique_id=838519336 groups=["weather_materials", "wind_materials"] instance=ExtResource("1_1rhib")] +[node name="Grass" unique_id=838519336 groups=["wind_materials"] instance=ExtResource("1_1rhib")] [node name="Leaf" parent="." index="0" unique_id=770569390] visible = false