Merge pull request 'main' (#2) from main into Chunk

Reviewed-on: #2
This commit was merged in pull request #2.
This commit is contained in:
2026-04-21 16:36:48 +00:00
13 changed files with 191 additions and 63 deletions

View File

@@ -225,12 +225,21 @@ theme_override_colors/font_hover_pressed_color = Color(1, 1, 1, 1)
theme_override_colors/font_outline_color = Color(1, 1, 1, 1)
text = "Wind"
[node name="WindSlider" type="HSlider" parent="Control" unique_id=28050098]
layout_mode = 0
offset_left = 26.0
offset_top = 124.0
offset_right = 205.0
offset_bottom = 140.0
max_value = 1.0
step = 0.01
[node name="Fireflies" type="CheckButton" parent="Control" unique_id=1046228444]
layout_mode = 0
offset_left = 21.0
offset_top = 115.0
offset_top = 169.0
offset_right = 130.0
offset_bottom = 146.0
offset_bottom = 200.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -266,18 +275,18 @@ text = "Time 00:00"
[node name="DayTimeSlider" type="HSlider" parent="Control" unique_id=1865778345]
layout_mode = 0
offset_left = 26.0
offset_top = 174.0
offset_top = 228.0
offset_right = 205.0
offset_bottom = 190.0
offset_bottom = 244.0
max_value = 1.0
step = 0.01
[node name="Dust" type="CheckButton" parent="Control" unique_id=760281365]
layout_mode = 0
offset_left = 21.0
offset_top = 250.0
offset_top = 304.0
offset_right = 150.0
offset_bottom = 281.0
offset_bottom = 335.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -290,9 +299,9 @@ text = "Dust"
[node name="Blur" type="CheckButton" parent="Control" unique_id=1083708100]
layout_mode = 0
offset_left = 21.0
offset_top = 278.0
offset_top = 332.0
offset_right = 150.0
offset_bottom = 309.0
offset_bottom = 363.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -305,9 +314,9 @@ text = "Blur"
[node name="Pause" type="CheckButton" parent="Control" unique_id=1587043871]
layout_mode = 0
offset_left = 21.0
offset_top = 189.0
offset_top = 243.0
offset_right = 158.0
offset_bottom = 220.0
offset_bottom = 274.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -319,9 +328,9 @@ text = "Pause Time"
[node name="Shadows" type="CheckButton" parent="Control" unique_id=283354318]
layout_mode = 0
offset_left = 21.0
offset_top = 302.0
offset_top = 356.0
offset_right = 150.0
offset_bottom = 333.0
offset_bottom = 387.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -334,19 +343,22 @@ text = "Shadows"
[node name="Guide" type="Label" parent="Control" unique_id=2121474959]
layout_mode = 0
offset_left = 26.0
offset_top = 347.0
offset_right = 236.0
offset_bottom = 474.0
offset_top = 401.0
offset_right = 339.0
offset_bottom = 606.0
text = "R-> Reset isometric camera
C-> Toggle cinematic mode
Z-> soft zoom
Manual controls (1-5)
T -> go to next stop
F -> fireworks"
F -> fireworks
BACKSPACE -> stop train
ARROW UP/DOWN -> change train speed"
[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="value_changed" from="Control/WindSlider" to="Control" method="_on_wind_slider_value_changed"]
[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"]

View File

@@ -7,7 +7,7 @@ extends Path3D
@export var axes_distance: float = 3.0
@export var rail_distance: float = 1.2
@export var cameras: Node3D
@export_range(0.0, 1.0) var basic_swing: float = 0.5
@export_range(0.0, 1.0) var basic_swing: float = 0.1
@export_group("Rails Bulding")
@export var sleepers_distance: float = 1.0
@@ -37,6 +37,8 @@ var fireworks_colors: Array[Color] = [
var train_instance: Node3D
var train_progress: float = 0.0
var swing_time: float = 0.0
var curve_roll: float = 0.0
var curve_pitch: float = 0.0
var stop_offset: Array[float] = []
var stops_position: Array[Vector3] = []
@@ -52,7 +54,7 @@ func _ready() -> void:
build_train()
_plan_stops()
else:
print("WARNING: Draw your Path3D!")
print("WARNING: Draw Path3D for rails!")
func build_rails() -> void:
var mat_wood = StandardMaterial3D.new()
@@ -112,16 +114,16 @@ func build_rails() -> void:
rail_piece.add_child(rail_dx)
func _plan_stops() -> void:
var currnet_stops = []
var current_stops = []
for child in get_children():
if child is Marker3D:
var offset = curve.get_closest_offset(child.position)
currnet_stops.append({
current_stops.append({
"offset": offset,
"position": child.global_position
})
currnet_stops.sort_custom(func(a, b): return a["offset"] < b["offset"])
for data in currnet_stops:
current_stops.sort_custom(func(a, b): return a["offset"] < b["offset"])
for data in current_stops:
stop_offset.append(data["offset"])
stops_position.append(data["position"])
@@ -130,9 +132,9 @@ func _input(event: InputEvent) -> void:
if event.keycode == KEY_T:
_goto_next_stop()
elif event.keycode == KEY_F:
_test_manual_fires()
_test_manual_fireworks()
func _test_manual_fires() -> void:
func _test_manual_fireworks() -> void:
if fireworks_scene == null or train_instance == null: return
var firework_number = randi_range(5, 8)
@@ -146,8 +148,8 @@ func _test_manual_fires() -> void:
if fire_root.has_method("set_color"):
fire_root.set_color(fireworks_colors.pick_random())
if fire_root.has_method("turnon"):
fire_root.turnon()
if fire_root.has_method("turn_on"):
fire_root.turn_on()
await get_tree().create_timer(randf_range(0.2, 0.6)).timeout
@@ -168,6 +170,8 @@ func input_controls_management(delta: float) -> void:
train_speed += manual_acceleration * delta
elif Input.is_action_pressed("ui_down"):
train_speed -= manual_acceleration * delta
elif Input.is_action_pressed("ui_text_backspace"):
train_speed = 0
train_speed = clamp(train_speed, speed_min, speed_max)
func train_move(delta: float) -> void:
@@ -209,25 +213,42 @@ func train_move(delta: float) -> void:
if stop_offset.size() > 0: next_stop_index = stop_offset.size() - 1
var center_position = to_global(curve.sample_baked(train_progress, true))
var prog_back = wrapf(train_progress - 2.0, 0.0, total_length)
var back_position = to_global(curve.sample_baked(prog_back, true))
var prog_forward = wrapf(train_progress + 2.0, 0.0, total_length)
var forward_position = to_global(curve.sample_baked(prog_forward, true))
if center_position.distance_to(forward_position) > 0.01:
train_instance.global_position = center_position
train_instance.look_at(forward_position, Vector3.UP)
train_instance.rotate_y(PI)
if cameras:
cameras.global_position = center_position
cameras.global_basis = train_instance.global_basis
if cameras:
cameras.global_position = center_position
cameras.global_basis = train_instance.global_basis
var real_speed = abs(train_speed * stop_multiply)
var speed_factor = clamp(real_speed / max(speed_max, 0.001), 0.0, 1.0)
var dir_prev = (center_position - back_position).normalized()
var dir_next = (forward_position - center_position).normalized()
var signed_curve = dir_prev.cross(dir_next).y
var curve_amount = clamp(abs(signed_curve) * 8.0, 0.0, 1.0)
curve_roll = lerp(curve_roll, (-signed_curve * 0.08) * speed_factor, delta * 4.0)
curve_pitch = lerp(curve_pitch, curve_amount * 0.012 * speed_factor, delta * 4.0)
if not stop_ongoing:
var real_speed = abs(train_speed * stop_multiply)
swing_time += delta * real_speed * 2.0
swing_time += delta * real_speed * (2.0 + curve_amount)
var amplitude_z = 0.006 * basic_swing
var amplitude_x = 0.004 * basic_swing
var curve_sway = sin(swing_time * 1.35) * 0.01 * curve_amount * speed_factor
train_instance.rotation.z += sin(swing_time) * amplitude_z
train_instance.rotation.x += cos(swing_time * 0.8) * amplitude_x
train_instance.rotation.z += curve_roll + curve_sway
train_instance.rotation.x += curve_pitch
else:
train_instance.rotation.z += curve_roll
train_instance.rotation.x += curve_pitch
func _execute_stop(go_forward: bool = true) -> void:
stop_ongoing = true
@@ -258,8 +279,8 @@ func _execute_stop(go_forward: bool = true) -> void:
if fire_root.has_method("set_color"):
fire_root.set_color(fireworks_colors.pick_random())
if fire_root.has_method("turnon"):
fire_root.turnon()
if fire_root.has_method("turn_on"):
fire_root.turn_on()
await get_tree().create_timer(randf_range(0.3, 0.8)).timeout

View File

@@ -3,10 +3,13 @@ extends Control
@onready var day_night: EnvironmentManagerRoot = get_node_or_null("../DayNight") as EnvironmentManagerRoot
@onready var day_time_label: Label = $DayTimeLabel
@onready var day_time_slider: HSlider = $DayTimeSlider
@onready var wind_slider: HSlider = get_node_or_null("WindSlider") as HSlider
func _ready() -> void:
UIEvents.day_time_changed.connect(_on_day_time_changed)
if day_night != null and day_night.environment_config != null and wind_slider != null:
wind_slider.set_value_no_signal(day_night.environment_config.wind_strength)
_sync_day_time_ui()
func _on_rain_toggled(toggled_on: bool) -> void:
@@ -18,6 +21,9 @@ func _on_snow_toggled(toggled_on: bool) -> void:
func _on_wind_toggled(toggled_on: bool) -> void:
UIEvents.toggle_wind.emit(toggled_on)
func _on_wind_slider_value_changed(value: float) -> void:
UIEvents.wind_change.emit(value)
func _on_fireflies_toggled(toggled_on: bool) -> void:
UIEvents.toggle_fireflies.emit(toggled_on)

View File

@@ -220,9 +220,9 @@ text = "Storm"
[node name="DayTimeLabel" type="Label" parent="Control" unique_id=1673596218]
layout_mode = 0
offset_left = 26.0
offset_top = 150.0
offset_top = 172.0
offset_right = 360.0
offset_bottom = 173.0
offset_bottom = 195.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_outline_color = Color(1, 1, 1, 1)
text = "Time 00:00"
@@ -230,18 +230,18 @@ text = "Time 00:00"
[node name="DayTimeSlider" type="HSlider" parent="Control" unique_id=530788076]
layout_mode = 0
offset_left = 26.0
offset_top = 174.0
offset_top = 196.0
offset_right = 205.0
offset_bottom = 190.0
offset_bottom = 212.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_top = 272.0
offset_right = 150.0
offset_bottom = 281.0
offset_bottom = 303.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -254,9 +254,9 @@ text = "Dust"
[node name="Blur" type="CheckButton" parent="Control" unique_id=1758807681]
layout_mode = 0
offset_left = 21.0
offset_top = 278.0
offset_top = 300.0
offset_right = 150.0
offset_bottom = 309.0
offset_bottom = 331.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -269,9 +269,9 @@ text = "Blur"
[node name="Pause" type="CheckButton" parent="Control" unique_id=156986934]
layout_mode = 0
offset_left = 21.0
offset_top = 189.0
offset_top = 211.0
offset_right = 158.0
offset_bottom = 220.0
offset_bottom = 242.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -283,9 +283,9 @@ 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_top = 324.0
offset_right = 150.0
offset_bottom = 333.0
offset_bottom = 355.0
theme_override_colors/font_color = Color(1, 1, 1, 1)
theme_override_colors/font_focus_color = Color(1, 1, 1, 1)
theme_override_colors/font_pressed_color = Color(1, 1, 1, 1)
@@ -295,6 +295,15 @@ theme_override_colors/font_outline_color = Color(1, 1, 1, 1)
button_pressed = true
text = "Shadows"
[node name="WindSlider" type="HSlider" parent="Control" unique_id=25258103]
layout_mode = 0
offset_left = 26.0
offset_top = 146.0
offset_right = 205.0
offset_bottom = 162.0
max_value = 1.0
step = 0.01
[node name="Scene" type="Node" parent="." unique_id=701973010]
[node name="Grass2" parent="Scene" unique_id=838519336 instance=ExtResource("7_pd1r3")]
@@ -331,3 +340,4 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 23)
[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"]
[connection signal="value_changed" from="Control/WindSlider" to="Control" method="_on_wind_slider_value_changed"]