add 'follow camera'

This commit is contained in:
2026-03-25 19:36:52 +01:00
parent ce6d9673ca
commit a07cfa19a4
7 changed files with 56 additions and 26 deletions

View File

@@ -32,7 +32,8 @@ func _process(delta: float) -> void:
func get_time_string() -> String: func get_time_string() -> String:
var total_minutes: int = int(current_time * 1440.0) # 1440 = 24*60 var total_minutes: int = int(current_time * 1440.0) # 1440 = 24*60
var hours: int = total_minutes / 60 @warning_ignore("integer_division")
var hours: int = int(total_minutes / 60)
var minutes: int = total_minutes % 60 var minutes: int = total_minutes % 60
return "%02d:%02d" % [hours, minutes] return "%02d:%02d" % [hours, minutes]

View File

@@ -62,7 +62,7 @@ func _render_callback(p_effect_callback_type: EffectCallbackType, p_render_data:
var x_groups : int = (size.x - 1.0) / 8.0 + 1.0 var x_groups : int = (size.x - 1.0) / 8.0 + 1.0
@warning_ignore("integer_division") @warning_ignore("integer_division")
var y_groups : int = (size.y - 1.0) / 8.0 + 1.0 var y_groups : int = (size.y - 1.0) / 8.0 + 1.0
var z_groups := 1.0 var z_groups := 1
# Loop through views just in case we're doing stereo rendering. No extra cost if this is mono. # Loop through views just in case we're doing stereo rendering. No extra cost if this is mono.
@@ -114,7 +114,6 @@ func _render_callback(p_effect_callback_type: EffectCallbackType, p_render_data:
var compute_list := rd.compute_list_begin() var compute_list := rd.compute_list_begin()
rd.compute_list_bind_compute_pipeline(compute_list, pipeline) rd.compute_list_bind_compute_pipeline(compute_list, pipeline)
rd.compute_list_bind_uniform_set(compute_list, uniform_set, 0) rd.compute_list_bind_uniform_set(compute_list, uniform_set, 0)
#rd.compute_list_set_push_constant(compute_list, push_constant.to_byte_array(), push_constant.size() * 4)
rd.compute_list_dispatch(compute_list, x_groups, y_groups, z_groups) rd.compute_list_dispatch(compute_list, x_groups, y_groups, z_groups)
rd.compute_list_end() rd.compute_list_end()
rd.free_rid(texture_sampler) rd.free_rid(texture_sampler)

View File

@@ -30,7 +30,7 @@ transparency = 2
alpha_scissor_threshold = 0.0 alpha_scissor_threshold = 0.0
alpha_antialiasing_mode = 0 alpha_antialiasing_mode = 0
disable_ambient_light = true disable_ambient_light = true
albedo_color = Color(0.1334653, 0.106680326, 0.15061459, 0.47993344) albedo_color = Color(0.44410604, 0.32877246, 0.26597014, 0.7541567)
billboard_mode = 3 billboard_mode = 3
particles_anim_h_frames = 1 particles_anim_h_frames = 1
particles_anim_v_frames = 1 particles_anim_v_frames = 1
@@ -45,8 +45,8 @@ shader_parameter/scroll_speed = Vector2(0.05, 0.01)
shader_parameter/texture_scale = Vector2(1, 1) shader_parameter/texture_scale = Vector2(1, 1)
shader_parameter/edge_softness_y = 0.2 shader_parameter/edge_softness_y = 0.2
shader_parameter/edge_softness_x = 0.1 shader_parameter/edge_softness_x = 0.1
shader_parameter/night_intensity = 0.0 shader_parameter/night_intensity = 0.7953524793650795
shader_parameter/sun_color = Color(1, 0.6716112, 0.3432224, 1) shader_parameter/sun_color = Color(0.2841828, 0.2023238, 0.27953526, 1)
[sub_resource type="Resource" id="Resource_r4tfj"] [sub_resource type="Resource" id="Resource_r4tfj"]
script = ExtResource("2_h6hjk") script = ExtResource("2_h6hjk")
@@ -185,7 +185,7 @@ shader_parameter/clear_center_radius = 0.39200001862
shader_parameter/edge_softness = 0.30900001397898 shader_parameter/edge_softness = 0.30900001397898
shader_parameter/max_opacity = 0.10000000475 shader_parameter/max_opacity = 0.10000000475
[node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain")] [node name="EnvironmentManager" type="Node3D" unique_id=1611939731 node_paths=PackedStringArray("particles_wind", "particles_snow", "particles_fireflies", "particles_rain", "fog_overlay")]
script = ExtResource("1_wecen") script = ExtResource("1_wecen")
environment_config = SubResource("Resource_r4tfj") environment_config = SubResource("Resource_r4tfj")
particles_wind = NodePath("Particles_Wind") particles_wind = NodePath("Particles_Wind")
@@ -193,6 +193,7 @@ particles_snow = NodePath("Particles_Snow")
particles_fireflies = NodePath("Particles_Fireflies") particles_fireflies = NodePath("Particles_Fireflies")
particles_rain = NodePath("Particles_Rain") particles_rain = NodePath("Particles_Rain")
godray = ExtResource("5_411rw") godray = ExtResource("5_411rw")
fog_overlay = NodePath("FogOverlay")
[node name="Particles_Fireflies" type="GPUParticles3D" parent="." unique_id=947538133] [node name="Particles_Fireflies" type="GPUParticles3D" parent="." unique_id=947538133]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 10, 0)

View File

@@ -4,6 +4,9 @@ extends Node3D
@export var environment_config: EnvironmentConfig @export var environment_config: EnvironmentConfig
@export_group("Camera")
@export var camera: Camera3D
@export_group("Particles") @export_group("Particles")
@export var particles_wind: GPUParticles3D @export var particles_wind: GPUParticles3D
@export var particles_snow: GPUParticles3D @export var particles_snow: GPUParticles3D
@@ -39,7 +42,8 @@ func _ready() -> void:
godray, godray,
sun, sun,
environment, environment,
environment_config environment_config,
camera
) )
weather_controller.name = "WeatherController" weather_controller.name = "WeatherController"
add_child(weather_controller) add_child(weather_controller)

View File

@@ -12,6 +12,7 @@ var fog_overlay: ColorRect
var sun: DirectionalLight3D var sun: DirectionalLight3D
var environment: WorldEnvironment var environment: WorldEnvironment
var environment_config: EnvironmentConfig var environment_config: EnvironmentConfig
var camera: Camera3D
var day_time: float = 0.0 var day_time: float = 0.0
@@ -36,7 +37,8 @@ var thereare_fireflies: bool = false
func _init(wind: GPUParticles3D, snow: GPUParticles3D, func _init(wind: GPUParticles3D, snow: GPUParticles3D,
fireflies: GPUParticles3D, rain: GPUParticles3D, ray: PackedScene, fireflies: GPUParticles3D, rain: GPUParticles3D, ray: PackedScene,
thesun: DirectionalLight3D, theenvironment: WorldEnvironment, environmentconfig: EnvironmentConfig) -> void: thesun: DirectionalLight3D, theenvironment: WorldEnvironment, environmentconfig: EnvironmentConfig,
thecamera: Camera3D = null) -> void:
particles_wind = wind particles_wind = wind
particles_snow = snow particles_snow = snow
particles_fireflies = fireflies particles_fireflies = fireflies
@@ -45,6 +47,7 @@ func _init(wind: GPUParticles3D, snow: GPUParticles3D,
sun = thesun sun = thesun
environment = theenvironment environment = theenvironment
environment_config = environmentconfig environment_config = environmentconfig
camera = thecamera
set_rain() set_rain()
@@ -64,7 +67,9 @@ func _ready() -> void:
UIEvents.toggle_fireflies.connect(toggle_fireflies) UIEvents.toggle_fireflies.connect(toggle_fireflies)
UIEvents.toggle_storm.connect(toggle_storm) UIEvents.toggle_storm.connect(toggle_storm)
func _process(delta: float) -> void: func _process(delta: float) -> void:
_follow_camera()
var base_tint: Color var base_tint: Color
var base_sky_top: Color var base_sky_top: Color
var base_sky_horizon: Color var base_sky_horizon: Color
@@ -187,6 +192,19 @@ func _process(delta: float) -> void:
environment_config.material_fog.set_shader_parameter("sun_color", final_tint) environment_config.material_fog.set_shader_parameter("sun_color", final_tint)
func _follow_camera() -> void:
if not camera or not is_instance_valid(camera):
return
var cam_pos: Vector3 = camera.global_position
if particles_rain:
particles_rain.global_position = Vector3(cam_pos.x, particles_rain.position.y, cam_pos.z)
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)
if particles_fireflies:
particles_fireflies.global_position = Vector3(cam_pos.x, particles_fireflies.position.y, cam_pos.z)
#region fireflies #region fireflies
func toggle_fireflies(value: bool): func toggle_fireflies(value: bool):
@@ -210,7 +228,6 @@ func set_fireflies():
func toggle_wind(value: bool): func toggle_wind(value: bool):
is_windy = value is_windy = value
var is_storm = is_raining and is_snowing
var is_night = day_time >= 2.5 var is_night = day_time >= 2.5
if particles_wind: if particles_wind:
@@ -359,8 +376,10 @@ func spawn_single_godray() -> void:
var random_x: float = randf_range(-environment_config.godray_spawn_radius, environment_config.godray_spawn_radius) var random_x: float = randf_range(-environment_config.godray_spawn_radius, environment_config.godray_spawn_radius)
var random_z: float = randf_range(-environment_config.godray_spawn_radius, environment_config.godray_spawn_radius) var random_z: float = randf_range(-environment_config.godray_spawn_radius, environment_config.godray_spawn_radius)
#TODO: FLAVIO: fix global position using the camera position if needed var center := Vector3.ZERO
ray.global_position = Vector3(random_x, environment_config.godray_spawn_height, random_z) if camera and is_instance_valid(camera):
center = camera.global_position
ray.global_position = Vector3(center.x + random_x, environment_config.godray_spawn_height, center.z + random_z)
ray.rotation_degrees = environment_config.godray_rotation_degrees ray.rotation_degrees = environment_config.godray_rotation_degrees
ray.scale = environment_config.godray_scale ray.scale = environment_config.godray_scale

View File

@@ -1,8 +1,13 @@
extends Node extends Node
#Weather signals #Weather signals
@warning_ignore("unused_signal")
signal toggle_rain(value: bool) signal toggle_rain(value: bool)
@warning_ignore("unused_signal")
signal toggle_snow(value: bool) signal toggle_snow(value: bool)
@warning_ignore("unused_signal")
signal toggle_wind(value: bool) signal toggle_wind(value: bool)
@warning_ignore("unused_signal")
signal toggle_fireflies(value: bool) signal toggle_fireflies(value: bool)
@warning_ignore("unused_signal")
signal toggle_storm(value: bool) signal toggle_storm(value: bool)

View File

@@ -18,11 +18,11 @@ seamless = true
[sub_resource type="ShaderMaterial" id="ShaderMaterial_abyor"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_abyor"]
shader = ExtResource("3_jiovi") shader = ExtResource("3_jiovi")
shader_parameter/sky_top_color = Color(0.5659384, 0.36750057, 0.18968758, 1) shader_parameter/sky_top_color = Color(0.050000012, 0.050000012, 0.15, 1)
shader_parameter/sky_horizon_color = Color(0.78500116, 0.5365633, 0.32937515, 1) shader_parameter/sky_horizon_color = Color(0.15000004, 0.100000024, 0.25, 1)
shader_parameter/night_intensity = 0.206248555555554 shader_parameter/night_intensity = 1.0
shader_parameter/cloud_noise = SubResource("NoiseTexture2D_abyor") shader_parameter/cloud_noise = SubResource("NoiseTexture2D_abyor")
shader_parameter/sun_color = Color(0.8143763, 0.49687576, 0.22062486, 1) shader_parameter/sun_color = Color(0.100000024, 0.100000024, 0.3, 1)
shader_parameter/cloud_center_color = Color(1, 1, 1, 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_edge_color = Color(0.8, 0.85, 0.9, 1)
shader_parameter/cloud_direction = Vector2(0.5, 0.2) shader_parameter/cloud_direction = Vector2(0.5, 0.2)
@@ -48,8 +48,8 @@ sky_material = SubResource("ShaderMaterial_abyor")
[sub_resource type="Environment" id="Environment_icuhg"] [sub_resource type="Environment" id="Environment_icuhg"]
background_mode = 2 background_mode = 2
sky = SubResource("Sky_50i22") sky = SubResource("Sky_50i22")
ambient_light_color = Color(0.8143763, 0.49687576, 0.22062486, 1) ambient_light_color = Color(0.100000024, 0.100000024, 0.3, 1)
tonemap_exposure = 0.8365633 tonemap_exposure = 0.4
ssao_enabled = true ssao_enabled = true
ssao_radius = 0.5 ssao_radius = 0.5
ssao_intensity = 14.0 ssao_intensity = 14.0
@@ -57,13 +57,13 @@ ssao_detail = 0.0
ssil_enabled = true ssil_enabled = true
glow_enabled = true glow_enabled = true
glow_levels/4 = 1.0 glow_levels/4 = 1.0
glow_intensity = 1.0474982 glow_intensity = 2.0
glow_strength = 0.65 glow_strength = 0.65
glow_bloom = 1.0 glow_bloom = 1.0
fog_enabled = true fog_enabled = true
fog_mode = 1 fog_mode = 1
fog_light_color = Color(0.78500116, 0.5365633, 0.32937515, 1) fog_light_color = Color(0.15000004, 0.100000024, 0.25, 1)
fog_density = 0.0046812315 fog_density = 0.015
fog_sky_affect = 0.0 fog_sky_affect = 0.0
[sub_resource type="CompositorEffect" id="CompositorEffect_q52t1"] [sub_resource type="CompositorEffect" id="CompositorEffect_q52t1"]
@@ -89,16 +89,17 @@ size = Vector3(200, 0.08, 200)
[node name="Museum" type="Node3D" unique_id=1411616506] [node name="Museum" type="Node3D" unique_id=1411616506]
[node name="DayNight" parent="." unique_id=1578787116 instance=ExtResource("1_daynt")] [node name="DayNight" parent="." unique_id=1578787116 node_paths=PackedStringArray("camera") instance=ExtResource("1_daynt")]
camera = NodePath("../Camera3D")
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=6398994] [node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=6398994]
environment = SubResource("Environment_icuhg") environment = SubResource("Environment_icuhg")
compositor = SubResource("Compositor_jbfcc") compositor = SubResource("Compositor_jbfcc")
[node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=565189502] [node name="DirectionalLight3D" type="DirectionalLight3D" parent="." unique_id=565189502]
transform = Transform3D(0.9572571, 0.26574892, -0.114174426, 0, 0.39474285, 0.9187914, 0.2892374, -0.8795199, 0.3778705, 0, 0, 0) transform = Transform3D(-0.4999999, 0.49673164, -0.70940626, 0, 0.8191519, 0.5735763, 0.86602515, 0.2867882, -0.40957597, 0, 0, 0)
light_color = Color(0.8143763, 0.49687576, 0.22062486, 1) light_color = Color(0.100000024, 0.100000024, 0.3, 1)
light_energy = 0.855626 light_energy = 0.3
light_indirect_energy = 0.0 light_indirect_energy = 0.0
light_volumetric_fog_energy = 0.0 light_volumetric_fog_energy = 0.0
shadow_enabled = true shadow_enabled = true