biome generator

This commit is contained in:
2026-04-17 15:31:28 +02:00
parent 060bccd96a
commit b77a6263aa
91 changed files with 4111 additions and 78 deletions

Binary file not shown.

View File

@@ -0,0 +1,44 @@
[remap]
importer="scene"
importer_version=1
type="PackedScene"
uid="uid://bowkbyxbq2jg2"
path="res://.godot/imported/main_train.fbx-3c77896af69edc972695e761c4bf8e47.scn"
[deps]
source_file="res://docs/museums/biome_generator/main_train.fbx"
dest_files=["res://.godot/imported/main_train.fbx-3c77896af69edc972695e761c4bf8e47.scn"]
[params]
nodes/root_type=""
nodes/root_name=""
nodes/root_script=null
nodes/apply_root_scale=true
nodes/root_scale=1.0
nodes/import_as_skeleton_bones=false
nodes/use_name_suffixes=true
nodes/use_node_type_suffixes=true
meshes/ensure_tangents=true
meshes/generate_lods=true
meshes/create_shadow_meshes=true
meshes/light_baking=1
meshes/lightmap_texel_size=0.2
meshes/force_disable_compression=false
skins/use_named_skins=true
animation/import=true
animation/fps=30
animation/trimming=true
animation/remove_immutable_tracks=true
animation/import_rest_as_RESET=false
import_script/path=""
materials/extract=0
materials/extract_format=0
materials/extract_path=""
_subresources={}
fbx/importer=0
fbx/allow_geometry_helper_nodes=false
fbx/embedded_image_handling=1
fbx/naming_version=2

View File

@@ -0,0 +1,153 @@
[gd_scene format=3 uid="uid://dvk3bytqn3m5s"]
[ext_resource type="PackedScene" uid="uid://bowkbyxbq2jg2" path="res://docs/museums/biome_generator/main_train.fbx" id="1_8k78i"]
[ext_resource type="Material" path="res://docs/museums/biome_generator/train1.tres" id="2_crne2"]
[ext_resource type="Material" path="res://docs/museums/biome_generator/train2.tres" id="3_tf27f"]
[ext_resource type="Material" path="res://docs/museums/biome_generator/train3.tres" id="4_e08y7"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_tvivt"]
[sub_resource type="PlaneMesh" id="PlaneMesh_8k78i"]
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_crne2"]
emission_enabled = true
emission = Color(0.59849787, 0.2744873, 0.018916829, 1)
emission_energy_multiplier = 14.84
[node name="Train2" unique_id=206892833 groups=["weather_node", "wind_node"] instance=ExtResource("1_8k78i")]
transform = Transform3D(-0.85, 0, -1.2834644e-07, 0, 0.85, 0, 1.2834644e-07, 0, -0.85, 0, 0, 0)
[node name="polySurface3708_002" parent="." index="0" unique_id=1080693866]
transform = Transform3D(99.99998, 0, 0, 0, -4.3711375e-06, 99.99999, 0, -99.99997, -4.3711384e-06, 0, 1.5, 0)
material_overlay = SubResource("ShaderMaterial_tvivt")
surface_material_override/0 = ExtResource("2_crne2")
surface_material_override/1 = ExtResource("3_tf27f")
surface_material_override/2 = ExtResource("2_crne2")
surface_material_override/3 = ExtResource("4_e08y7")
[node name="MeshInstance3D" type="MeshInstance3D" parent="." index="1" unique_id=1403632389]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.668482, 1.6818931, 2.5172625, 1.2770853)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="." index="2" unique_id=1336101020]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.668482, 1.6125782, 2.5172625, 2.9643514)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D28" type="MeshInstance3D" parent="." index="3" unique_id=311730556]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.668482, 1.640722, 2.5172625, -4.04725)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D29" type="MeshInstance3D" parent="." index="4" unique_id=1304381077]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.668482, 1.640722, 2.5172625, -2.4448335)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="." index="5" unique_id=663441243]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.47599128, 1.640722, 2.5172625, 6.115757)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D37" type="MeshInstance3D" parent="." index="6" unique_id=332999290]
transform = Transform3D(1.5214157e-15, -4.371139e-08, -1.4922415, -0.796267, -4.371139e-08, 0, -3.4805936e-08, 1, -6.522796e-08, 0.00024104083, 2.668277, 8.483847)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D30" type="MeshInstance3D" parent="." index="7" unique_id=1998746087]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.47599128, 1.640722, 2.5172625, -7.2599697)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="." index="8" unique_id=1980372157]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, 5.212925)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="." index="9" unique_id=122016874]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, 4.909999)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D6" type="MeshInstance3D" parent="." index="10" unique_id=962812717]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, 4.59173)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D7" type="MeshInstance3D" parent="." index="11" unique_id=1668544912]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, 4.283636)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D8" type="MeshInstance3D" parent="." index="12" unique_id=1387960824]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -0.085068464)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D9" type="MeshInstance3D" parent="." index="13" unique_id=1969224680]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -0.387995)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D10" type="MeshInstance3D" parent="." index="14" unique_id=3545667]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -0.7062633)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D11" type="MeshInstance3D" parent="." index="15" unique_id=719869989]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -1.0143578)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D12" type="MeshInstance3D" parent="." index="16" unique_id=424215252]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -5.405431)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D13" type="MeshInstance3D" parent="." index="17" unique_id=593531465]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -5.708358)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D14" type="MeshInstance3D" parent="." index="18" unique_id=1495729886]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -6.0266256)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="MeshInstance3D15" type="MeshInstance3D" parent="." index="19" unique_id=1576847092]
transform = Transform3D(-2.4656883e-08, 1, 0, -0.5640837, -4.371139e-08, 0, 0, 0, 0.1321082, 1.6305791, 2.5172625, -6.3347206)
mesh = SubResource("PlaneMesh_8k78i")
surface_material_override/0 = SubResource("StandardMaterial3D_crne2")
[node name="OmniLight3D" type="OmniLight3D" parent="." index="20" unique_id=1693942993]
transform = Transform3D(1, 0, 0, 0, -1.1920932e-07, -1, 0, 1, -1.1920932e-07, -0.9650913, 1.3310676, 8.449412)
light_color = Color(0.9818843, 0.6206694, 0.26694176, 1)
omni_range = 0.437
omni_attenuation = 0.367
[node name="OmniLight3D2" type="OmniLight3D" parent="." index="21" unique_id=1965838060]
transform = Transform3D(1, 0, 0, 0, -1.1920932e-07, -1, 0, 1, -1.1920932e-07, 0.9597263, 1.3310676, 8.449412)
light_color = Color(0.9818843, 0.6206694, 0.26694176, 1)
omni_range = 0.437
omni_attenuation = 0.367
[node name="SpotLight3D2" type="SpotLight3D" parent="OmniLight3D2" index="0" unique_id=1940430623]
transform = Transform3D(-0.9991066, -0.0071844957, -0.041647904, 0.039682645, 0.1795881, -0.9829413, 0.014541405, -0.98371583, -0.17914255, -2.2325838, -0.021801949, -0.18683863)
light_color = Color(0.8039216, 0.6784314, 0.3254902, 1)
light_energy = 4.0
light_cull_mask = 4294967293
spot_range = 18.0
spot_attenuation = 1.2
spot_angle = 35.0
spot_angle_attenuation = 8.876516
[node name="SpotLight3D3" type="SpotLight3D" parent="OmniLight3D2" index="1" unique_id=1754775574]
transform = Transform3D(-0.9991066, -0.0071844957, -0.041647904, 0.039682645, 0.1795881, -0.9829413, 0.014541405, -0.98371583, -0.17914255, 0.31696087, -0.020600319, -0.18641448)
light_color = Color(0.8574047, 0.65361816, 0.27671134, 1)
light_energy = 4.0
light_cull_mask = 4294967293
spot_range = 18.0
spot_attenuation = 1.2
spot_angle = 35.0
spot_angle_attenuation = 8.876516

View File

@@ -0,0 +1,156 @@
[gd_scene format=3 uid="uid://cae0mnf353dy3"]
[ext_resource type="Shader" uid="uid://bneoex8xpmcm8" path="res://core/daynight/sky.gdshader" id="1_p4ojb"]
[ext_resource type="Texture2D" uid="uid://dest0qa7vaid0" path="res://core/daynight/stars_albedo.png" id="2_yrmqs"]
[ext_resource type="Script" uid="uid://brcimd12tx3dm" path="res://core/daynight/edge_detection_compositor.gd" id="3_8tojn"]
[ext_resource type="PackedScene" uid="uid://ujv2f1l4d2ps" path="res://core/biome_generator/biome_generator.tscn" id="4_yrmqs"]
[ext_resource type="Script" uid="uid://wv6kcqkibium" path="res://core/biome_generator/biome.gd" id="5_2wjys"]
[ext_resource type="PackedScene" uid="uid://cv5xmnow451kl" path="res://core/camera.tscn" id="5_8tojn"]
[ext_resource type="PackedScene" uid="uid://botm0dqtr5whb" path="res://docs/museums/daynight/scenes/chunk_c_e_1/chunk_c_e_1.tscn" id="6_21usy"]
[ext_resource type="Script" uid="uid://dboerd4a6dwj7" path="res://docs/museums/biome_generator/rails.gd" id="6_pypsn"]
[ext_resource type="PackedScene" uid="uid://dvk3bytqn3m5s" path="res://docs/museums/biome_generator/main_train.tscn" id="6_wjpfq"]
[ext_resource type="PackedScene" uid="uid://givg3dyrxsk5" path="res://docs/museums/daynight/scenes/chunk_c_f_1/chunk_c_f_1.tscn" id="7_qe84w"]
[ext_resource type="PackedScene" uid="uid://0kgjaqijaqku" path="res://docs/museums/biome_generator/rails.tscn" id="8_mb5yv"]
[ext_resource type="PackedScene" uid="uid://bi12g5nj421jv" path="res://docs/museums/daynight/scenes/chunk_f_e_1/chunk_f_e_1.tscn" id="8_qe84w"]
[ext_resource type="PackedScene" uid="uid://dn1btv0e0ses7" path="res://core/fireworks.tscn" id="8_xtogr"]
[ext_resource type="PackedScene" uid="uid://cpebna545ihfh" path="res://docs/museums/daynight/scenes/chunk_f_l_2/chunk_f_l_2.tscn" id="9_3qrd0"]
[sub_resource type="FastNoiseLite" id="FastNoiseLite_wjpfq"]
fractal_lacunarity = 1.915
fractal_gain = 0.53
fractal_weighted_strength = 0.35
[sub_resource type="NoiseTexture2D" id="NoiseTexture2D_abyor"]
noise = SubResource("FastNoiseLite_wjpfq")
seamless = true
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pypsn"]
shader = ExtResource("1_p4ojb")
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("2_yrmqs")
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_pypsn")
[sub_resource type="Environment" id="Environment_xtogr"]
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("3_8tojn")
metadata/_custom_type_script = "uid://brcimd12tx3dm"
[sub_resource type="Compositor" id="Compositor_mb5yv"]
compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_q52t1")])
[sub_resource type="Resource" id="Resource_3qrd0"]
script = ExtResource("5_2wjys")
name = "countryside"
available_chunks = Array[PackedScene]([ExtResource("6_21usy"), ExtResource("7_qe84w")])
metadata/_custom_type_script = "uid://wv6kcqkibium"
[sub_resource type="Resource" id="Resource_2qks6"]
script = ExtResource("5_2wjys")
name = "Forest"
available_chunks = Array[PackedScene]([ExtResource("8_qe84w"), ExtResource("9_3qrd0")])
metadata/_custom_type_script = "uid://wv6kcqkibium"
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_pypsn"]
albedo_color = Color(0.135, 0.45, 0.18224995, 1)
[sub_resource type="BoxMesh" id="BoxMesh_xtogr"]
size = Vector3(200, 0.08, 200)
[sub_resource type="Curve3D" id="Curve3D_xtogr"]
_data = {
"points": PackedVector3Array(0, 0, 0, 0, 0, 0, -74.84181, 0, -74.77032, 0, 0, 0, 0, 0, 0, -11.457085, 0, -86.17957, 0, 0, 0, 0, 0, 0, 55.006348, 0, -78.211205, 0, 0, 0, 0, 0, 0, 73.47847, 0, -30.582096, 0, 0, 0, 0, 0, 0, 78.73035, 0, 30.810556, 0, 0, 0, 0, 0, 0, 50.841064, 0, 77.896355, 0, 0, 0, 0, 0, 0, -53.834305, 0, 74.817665, 0, 0, 0, 0, 0, 0, -84.621185, 0, 37.149036, 0, 0, 0, 0, 0, 0, -77.19612, 0, -10.117877, 0, 0, 0, 0, 0, 0, 4.8418427, 0, 26.10198, 0, 0, 0, 0, 0, 0, 42.32939, 0, -18.267347, 0, 0, 0, 0, 0, 0, -19.96875, 0, -47.24322),
"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
}
point_count = 12
[node name="museum" type="Node3D" unique_id=2135293927]
[node name="WorldEnvironment" type="WorldEnvironment" parent="." unique_id=1936550760]
environment = SubResource("Environment_xtogr")
compositor = SubResource("Compositor_mb5yv")
[node name="biome_generator" parent="." unique_id=1861369341 node_paths=PackedStringArray("rail_path") instance=ExtResource("4_yrmqs")]
rail_path = NodePath("../rails")
biome_list = Array[ExtResource("5_2wjys")]([SubResource("Resource_3qrd0"), SubResource("Resource_2qks6")])
[node name="Terrain" type="MeshInstance3D" parent="." unique_id=219178561]
material_override = SubResource("StandardMaterial3D_pypsn")
mesh = SubResource("BoxMesh_xtogr")
[node name="cameras" parent="." unique_id=310254818 instance=ExtResource("5_8tojn")]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 28.635147, 0)
[node name="rails" type="Path3D" parent="." unique_id=1302444918 node_paths=PackedStringArray("cameras")]
curve = SubResource("Curve3D_xtogr")
script = ExtResource("6_pypsn")
train_model = ExtResource("6_wjpfq")
cameras = NodePath("../cameras")
sleepers_model = ExtResource("8_mb5yv")
fireworks_scene = ExtResource("8_xtogr")
[node name="Control" type="Control" parent="." unique_id=865533651]
layout_mode = 3
anchors_preset = 0
offset_right = 40.0
offset_bottom = 40.0
[node name="guide" type="Label" parent="Control" unique_id=2121474959]
layout_mode = 0
offset_right = 40.0
offset_bottom = 23.0
text = "R-> Reset isometric camera
C-> Toggle cinematic mode
Z-> soft zoom
Manual controls (1-5)
"

View File

@@ -0,0 +1,319 @@
extends Path3D
@export_group("Train")
@export var train_speed: float = 6.0
@export var is_inmotion: bool = true
@export var train_model: PackedScene
@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_group("Rails Bulding")
@export var sleepers_distance: float = 1.0
@export var sleepers_model: PackedScene
@export_group("Manual Controls")
@export var speed_max: float = 15.0
@export var speed_min: float = -5.0
@export var manual_acceleration: float = 5.0
@export_group("Train Stops")
@export var enable_stops: bool = true
@export var stop_time: float = 4.0
@export var brake_distance: float = 15.0
@export var restart_time: float = 3.0
@export var fireworks_scene: PackedScene
var fireworks_colors: Array[Color] = [
Color(1.0, 0.2, 0.2), # Rosso vivo
Color(0.2, 1.0, 0.2), # Verde lime
Color(0.3, 0.5, 1.0), # Blu cielo
Color(1.0, 0.8, 0.1), # Oro
Color(0.8, 0.2, 1.0), # Viola
Color(0.1, 1.0, 0.9) # Ciano
]
var train_instance: Node3D
var train_progress: float = 0.0
var swing_time: float = 0.0
var stop_offset: Array[float] = []
var stops_position: Array[Vector3] = []
var stop_ongoing: bool = false
var next_stop_index: int = 0
var stop_multiply: float = 1.0
var is_restarting: bool = false
var tween_restart: Tween
func _ready() -> void:
if curve != null and curve.get_baked_length() > 0:
build_rails()
build_train()
_plan_stops()
else:
print("WARNING: Draw your Path3D!")
func build_rails() -> void:
var mat_wood = StandardMaterial3D.new()
mat_wood.albedo_color = Color(0.35, 0.2, 0.1)
var mat_iron = StandardMaterial3D.new()
mat_iron.albedo_color = Color(0.6, 0.6, 0.65)
mat_iron.metallic = 0.8
var mesh_sleeper = BoxMesh.new()
mesh_sleeper.size = Vector3(rail_distance + 0.6, 0.1, 0.3)
var mesh_rail = BoxMesh.new()
mesh_rail.size = Vector3(0.1, 0.15, sleepers_distance + 0.05)
var total_length = curve.get_baked_length()
var piece_number = int(total_length / sleepers_distance)
for i in range(piece_number):
var distance = i * sleepers_distance
var rail_piece = Node3D.new()
add_child(rail_piece)
var local_pos = curve.sample_baked(distance, true)
var distance_forward = distance + 0.1
var local_pos_forward = Vector3.ZERO
if distance_forward > total_length:
var pos_back = curve.sample_baked(distance - 0.1, true)
local_pos_forward = local_pos + (local_pos - pos_back)
else:
local_pos_forward = curve.sample_baked(distance_forward, true)
rail_piece.position = local_pos
var global_pos = to_global(local_pos)
var global_pos_forward = to_global(local_pos_forward)
if global_pos.distance_to(global_pos_forward) > 0.001:
rail_piece.look_at(global_pos_forward, Vector3.UP)
if sleepers_model != null:
var sleeper_custom = sleepers_model.instantiate()
rail_piece.add_child(sleeper_custom)
else:
var sleeper = MeshInstance3D.new()
sleeper.mesh = mesh_sleeper
sleeper.material_override = mat_wood
rail_piece.add_child(sleeper)
var rail_sx = MeshInstance3D.new()
rail_sx.mesh = mesh_rail
rail_sx.material_override = mat_iron
rail_sx.position = Vector3(-rail_distance / 2.0, 0.1, 0)
rail_piece.add_child(rail_sx)
var rail_dx = MeshInstance3D.new()
rail_dx.mesh = mesh_rail
rail_dx.material_override = mat_iron
rail_dx.position = Vector3(rail_distance / 2.0, 0.1, 0)
rail_piece.add_child(rail_dx)
func _plan_stops() -> void:
var currnet_stops = []
for child in get_children():
if child is Marker3D:
var offset = curve.get_closest_offset(child.position)
currnet_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:
stop_offset.append(data["offset"])
stops_position.append(data["position"])
func _input(event: InputEvent) -> void:
if event is InputEventKey and event.pressed and not event.echo:
if event.keycode == KEY_T:
_goto_next_stop()
elif event.keycode == KEY_F:
_test_manual_fires()
func _test_manual_fires() -> void:
if fireworks_scene == null or train_instance == null: return
var firework_number = randi_range(5, 8)
for i in range(firework_number):
var fire_root = fireworks_scene.instantiate()
get_tree().current_scene.add_child(fire_root)
var offset_x = randf_range(-6.0, 6.0)
var offset_z = randf_range(-6.0, 6.0)
fire_root.global_position = train_instance.global_position + Vector3(offset_x, 0.5, offset_z)
if fire_root.has_method("set_color"):
fire_root.set_color(fireworks_colors.pick_random())
if fire_root.has_method("turnon"):
fire_root.turnon()
await get_tree().create_timer(randf_range(0.2, 0.6)).timeout
func _goto_next_stop() -> void:
if stop_offset.size() == 0 or stop_ongoing or is_restarting:
return
var target_offset = stop_offset[next_stop_index]
train_progress = target_offset
_execute_stop(train_speed >= 0)
func _physics_process(delta: float) -> void:
input_controls_management(delta)
train_move(delta)
func input_controls_management(delta: float) -> void:
if not is_inmotion: return
if Input.is_action_pressed("ui_up"):
train_speed += manual_acceleration * delta
elif Input.is_action_pressed("ui_down"):
train_speed -= manual_acceleration * delta
train_speed = clamp(train_speed, speed_min, speed_max)
func train_move(delta: float) -> void:
if is_inmotion and train_instance and curve:
var total_length = curve.get_baked_length()
if total_length <= 0: return
if not stop_ongoing:
var last_progress = train_progress
if enable_stops and stop_offset.size() > 0 and not is_restarting:
var target_offset = stop_offset[next_stop_index]
var dist = target_offset - train_progress
dist = wrapf(dist + total_length / 2.0, 0.0, total_length) - total_length / 2.0
if abs(dist) < brake_distance and sign(dist) == sign(train_speed):
var t = abs(dist) / brake_distance
stop_multiply = max(smoothstep(0.0, 1.0, t), 0.05)
else:
stop_multiply = 1.0
var current_speed = train_speed * stop_multiply
train_progress += current_speed * delta
if enable_stops and stop_offset.size() > 0:
var target_offset = stop_offset[next_stop_index]
var exceeded_forward = (current_speed > 0 and last_progress < target_offset and train_progress >= target_offset)
var exceeded_back = (current_speed < 0 and last_progress > target_offset and train_progress <= target_offset)
if exceeded_forward or exceeded_back:
train_progress = target_offset
_execute_stop(current_speed > 0)
if train_progress > total_length:
train_progress -= total_length
if stop_offset.size() > 0: next_stop_index = 0
elif train_progress < 0:
train_progress += total_length
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_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 not stop_ongoing:
var real_speed = abs(train_speed * stop_multiply)
swing_time += delta * real_speed * 2.0
var amplitude_z = 0.006 * basic_swing
var amplitude_x = 0.004 * basic_swing
train_instance.rotation.z += sin(swing_time) * amplitude_z
train_instance.rotation.x += cos(swing_time * 0.8) * amplitude_x
func _execute_stop(go_forward: bool = true) -> void:
stop_ongoing = true
stop_multiply = 0.0
var current_stop_index = next_stop_index
if go_forward:
next_stop_index += 1
if next_stop_index >= stop_offset.size():
next_stop_index = 0
else:
next_stop_index -= 1
if next_stop_index < 0:
next_stop_index = stop_offset.size() - 1
if fireworks_scene != null:
var marker_position = stops_position[current_stop_index]
var firework_number = randi_range(5, 8)
for i in range(firework_number):
var fire_root = fireworks_scene.instantiate()
get_tree().current_scene.add_child(fire_root)
var offset_x = randf_range(-5.0, 5.0)
var offset_z = randf_range(-5.0, 5.0)
fire_root.global_position = marker_position + Vector3(offset_x, 0.5, offset_z)
if fire_root.has_method("set_color"):
fire_root.set_color(fireworks_colors.pick_random())
if fire_root.has_method("turnon"):
fire_root.turnon()
await get_tree().create_timer(randf_range(0.3, 0.8)).timeout
await get_tree().create_timer(stop_time).timeout
stop_ongoing = false
is_restarting = true
if tween_restart and tween_restart.is_valid():
tween_restart.kill()
tween_restart = create_tween()
tween_restart.set_trans(Tween.TRANS_SINE).set_ease(Tween.EASE_IN_OUT)
tween_restart.tween_property(self, "stop_multiply", 1.0, restart_time)
tween_restart.tween_callback(func(): is_restarting = false)
func build_train() -> void:
if train_model != null:
train_instance = train_model.instantiate()
add_child(train_instance)
else:
build_default_train()
func build_default_train() -> void:
train_instance = Node3D.new()
add_child(train_instance)
var mat_body = StandardMaterial3D.new()
mat_body.albedo_color = Color(0.8, 0.15, 0.15)
var mat_glass = StandardMaterial3D.new()
mat_glass.albedo_color = Color(0.2, 0.8, 1.0)
var train_base = MeshInstance3D.new()
var mesh_base = BoxMesh.new()
mesh_base.size = Vector3(1.4, 0.8, 3.0)
train_base.mesh = mesh_base
train_base.material_override = mat_body
train_base.position = Vector3(0, 0.6, 0)
train_instance.add_child(train_base)
var cabin = MeshInstance3D.new()
var mesh_cabin = BoxMesh.new()
mesh_cabin.size = Vector3(1.4, 1.0, 1.2)
cabin.mesh = mesh_cabin
cabin.material_override = mat_glass
cabin.position = Vector3(0, 1.5, -0.8)
train_instance.add_child(cabin)
var stack = MeshInstance3D.new()
var mesh_stack = CylinderMesh.new()
mesh_stack.top_radius = 0.2
mesh_stack.bottom_radius = 0.3
mesh_stack.height = 0.8
stack.mesh = mesh_stack
stack.material_override = mat_body
stack.position = Vector3(0, 1.2, 1.0)
train_instance.add_child(stack)

View File

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

View File

@@ -0,0 +1,156 @@
[gd_scene format=3 uid="uid://0kgjaqijaqku"]
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="2_0y2rr"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_m6haf"]
render_priority = 0
shader = ExtResource("2_0y2rr")
shader_parameter/albedo_color = Color(0.08235294, 0.105882354, 0.10980392, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_duyun"]
[sub_resource type="BoxMesh" id="BoxMesh_w0ibq"]
size = Vector3(0.2, 0.2, 2)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_fttrp"]
render_priority = 0
shader = ExtResource("2_0y2rr")
shader_parameter/albedo_color = Color(0.08061289, 0.10506997, 0.11154168, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_hb1ej"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pp4r2"]
render_priority = 0
shader = ExtResource("2_0y2rr")
shader_parameter/albedo_color = Color(0.2584173, 0.19781098, 0.10103748, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_pur2n"]
[sub_resource type="BoxMesh" id="BoxMesh_ysg1u"]
size = Vector3(2.5, 0.15, 0.5)
[sub_resource type="ShaderMaterial" id="ShaderMaterial_x2uev"]
render_priority = 0
shader = ExtResource("2_0y2rr")
shader_parameter/albedo_color = Color(0.25882354, 0.19607843, 0.101960786, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0
[sub_resource type="ShaderMaterial" id="ShaderMaterial_qv8m2"]
[sub_resource type="ShaderMaterial" id="ShaderMaterial_5u2u8"]
render_priority = 0
shader = ExtResource("2_0y2rr")
shader_parameter/albedo_color = Color(0.22494644, 0.08867701, 0.01631488, 1)
shader_parameter/use_texture = false
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0
[sub_resource type="BoxMesh" id="BoxMesh_m6haf"]
size = Vector3(3.705, 0.2, 1.92)
[node name="rails" type="Node3D" unique_id=1464572050 groups=["weather_node", "wind_node"]]
[node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1040579890]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -0.7, 0.214, 0)
material_override = SubResource("ShaderMaterial_m6haf")
material_overlay = SubResource("ShaderMaterial_duyun")
mesh = SubResource("BoxMesh_w0ibq")
[node name="MeshInstance3D2" type="MeshInstance3D" parent="." unique_id=1870708237]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.7, 0.214, 0)
material_override = SubResource("ShaderMaterial_fttrp")
material_overlay = SubResource("ShaderMaterial_hb1ej")
mesh = SubResource("BoxMesh_w0ibq")
[node name="MeshInstance3D3" type="MeshInstance3D" parent="." unique_id=170245195]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, 0.5)
material_override = SubResource("ShaderMaterial_pp4r2")
material_overlay = SubResource("ShaderMaterial_pur2n")
mesh = SubResource("BoxMesh_ysg1u")
[node name="MeshInstance3D4" type="MeshInstance3D" parent="." unique_id=1389288735]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0.05, -0.5)
material_override = SubResource("ShaderMaterial_x2uev")
material_overlay = SubResource("ShaderMaterial_qv8m2")
mesh = SubResource("BoxMesh_ysg1u")
[node name="MeshInstance3D5" type="MeshInstance3D" parent="." unique_id=1376217081]
visible = false
material_override = SubResource("ShaderMaterial_5u2u8")
mesh = SubResource("BoxMesh_m6haf")

View File

@@ -0,0 +1,24 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://df1ghvw3d61x8"]
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="1_i3cgb"]
[resource]
render_priority = 0
shader = ExtResource("1_i3cgb")
shader_parameter/albedo_color = Color(0.16250518, 0.23871198, 0.21290374, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0

View File

@@ -0,0 +1,24 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://cufolpn48xxmv"]
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="1_qkrhb"]
[resource]
render_priority = 0
shader = ExtResource("1_qkrhb")
shader_parameter/albedo_color = Color(0.2520276, 0.25202766, 0.25202763, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 10.0
shader_parameter/light_steps = 3.0
shader_parameter/step_softness = 0.1
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0

View File

@@ -0,0 +1,24 @@
[gd_resource type="ShaderMaterial" format=3 uid="uid://bu8wmlp0ffark"]
[ext_resource type="Shader" uid="uid://d0ch5ofrgf7y6" path="res://core/daynight/trunk_shader.gdshader" id="1_gtyqp"]
[resource]
render_priority = 0
shader = ExtResource("1_gtyqp")
shader_parameter/albedo_color = Color(0.40934297, 0.38911393, 0.34586716, 1)
shader_parameter/use_texture = true
shader_parameter/uv_scale = Vector2(1, 1)
shader_parameter/palette_shift_y = 0.0
shader_parameter/gradient_start_y = 0.0
shader_parameter/gradient_end_y = 5.0
shader_parameter/light_steps = 5.0
shader_parameter/step_softness = 0.00999999977648
shader_parameter/shadow_color = Color(0.4, 0.4, 0.6, 1)
shader_parameter/shadow_offset = 0.0
shader_parameter/cast_shadow_strength = 0.6
shader_parameter/use_ghibli_glint = true
shader_parameter/glint_color = Color(1, 0.95, 0.85, 1)
shader_parameter/glint_intensity = 1.0
shader_parameter/glint_sharpness = 32.0
shader_parameter/emission_color = Color(0, 0, 0, 1)
shader_parameter/emission_energy = 0.0