diff --git a/core/biome_generator/biome_generator.gd b/core/biome_generator/biome_generator.gd index a0d36a5..e774fee 100644 --- a/core/biome_generator/biome_generator.gd +++ b/core/biome_generator/biome_generator.gd @@ -212,6 +212,17 @@ func _physics_process(_delta: float) -> void: last_pos_train = current_pos _refresh_world(current_pos) +func generate_initial_world_now() -> void: + if rail_path == null or rail_path.train_instance == null: + return + + var train_pos = rail_path.train_instance.global_position + var current_pos = Vector2i(roundi(train_pos.x / chunk_size), roundi(train_pos.z / chunk_size)) + last_pos_train = current_pos + _rebuild_generation_queue(current_pos) + _drain_generation_queue_now() + _drain_wire_queue_now() + func collect_all_chunkinfo(root: Node, list: Array[Node]) -> void: if root == null: return @@ -535,6 +546,20 @@ func _drain_generation_queue() -> void: pending_generation_cells.clear() pending_generation_cursor = 0 +func _drain_generation_queue_now() -> void: + while pending_generation_cursor < pending_generation_cells.size(): + var grid_pos: Vector2i = pending_generation_cells[pending_generation_cursor] + pending_generation_cursor += 1 + if board.has(grid_pos): + continue + + var is_obstacle = _register_cell_with_ray(grid_pos) + if not is_obstacle: + _add_compatible_biome(grid_pos) + + pending_generation_cells.clear() + pending_generation_cursor = 0 + func _drain_cleanup_queue() -> void: var processed: int = 0 var start_usec: int = Time.get_ticks_usec() @@ -595,6 +620,22 @@ func _drain_wire_queue() -> void: pending_wire_cells.clear() pending_wire_cursor = 0 +func _drain_wire_queue_now() -> void: + while pending_wire_cursor < pending_wire_cells.size(): + var grid_pos: Vector2i = pending_wire_cells[pending_wire_cursor] + pending_wire_cursor += 1 + pending_wire_lookup.erase(grid_pos) + + if not board.has(grid_pos): + continue + if not board[grid_pos].get("have_lamppost", false): + continue + + _connect_lamppost_wires(grid_pos) + + pending_wire_cells.clear() + pending_wire_cursor = 0 + func _generate_pieces_around_train(center: Vector2i) -> void: for x in range(-eye_line, eye_line + 1): for z in range(-eye_line, eye_line + 1): diff --git a/core/biome_generator/rails.gd b/core/biome_generator/rails.gd index b11c634..9888643 100644 --- a/core/biome_generator/rails.gd +++ b/core/biome_generator/rails.gd @@ -50,10 +50,14 @@ enum TrainFacingDirection { KEEP_PATH_DIRECTION, LOCOMOTIVE_LEFT, LOCOMOTIVE_RIG @export_enum("keep_path_direction", "locomotive_left", "locomotive_right") var train_facing_direction: int = TrainFacingDirection.KEEP_PATH_DIRECTION @export_group("Rails Bulding") +##if true builds visible rail pieces along the Path3D +@export var build_track_visuals: bool = true ##distance between sleepers of the rails @export var sleepers_distance: float = 1.0 ##nodel for the sleeper of the rail @export var sleepers_model: PackedScene +##if true add procedural rail bars even when sleepers_model is assigned +@export var add_procedural_rails_to_sleepers_model: bool = false @export_group("Manual Controls") ##max speed @@ -115,7 +119,8 @@ func _ready() -> void: _initial_is_inmotion = is_inmotion if curve != null and curve.get_baked_length() > 0: - build_rails() + if build_track_visuals: + build_rails() build_train() _plan_stops() _apply_initial_train_start() @@ -258,6 +263,7 @@ func build_rails() -> void: var total_length = curve.get_baked_length() var piece_number = int(total_length / sleepers_distance) + var should_add_procedural_rails: bool = sleepers_model == null or add_procedural_rails_to_sleepers_model for i in range(piece_number): var distance = i * sleepers_distance @@ -289,17 +295,18 @@ func build_rails() -> void: 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) + if should_add_procedural_rails: + 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: stop_offset.clear() diff --git a/core/daynight/environment_manager.gd b/core/daynight/environment_manager.gd index 7c8f89f..4c374ac 100644 --- a/core/daynight/environment_manager.gd +++ b/core/daynight/environment_manager.gd @@ -4,6 +4,15 @@ extends Node3D const NOISE_TEXTURE: Texture2D = preload("res://core/daynight/noise.tres") const WEATHER_SHADER: Material = preload("res://core/daynight/weather_overlay.tres") const DYNAMIC_ENVIRONMENT_UPDATES_PER_FRAME: int = 32 #how many update of the environment (apply materials) will be done per frame +const FORCE_WEATHER_MATERIAL_PATH_PARTS: PackedStringArray = [ + "/chunk/material/field.tres", + "/chunk/material/grassflat_chunk.tres", + "/chunk/material/path_chunk.tres", + "/chunk/material/railway_chunk.tres", + "/chunk/material/terrain.tres", + "/chunk/prop/house/house.tres", + "/chunk/prop/house/house_emissiv.tres", +] @export var environment_config: EnvironmentConfig @@ -157,9 +166,17 @@ func _restore_keyboard_action_events() -> void: _blocked_keyboard_events_by_action.clear() func _on_tree_node_added(node: Node) -> void: - if node.is_in_group("wind_node") or node.is_in_group("weather_node") or node.is_in_group("weather_vegetables_node"): + if _should_queue_dynamic_environment_node(node): _queue_dynamic_environment_node(node) +func _should_queue_dynamic_environment_node(node: Node) -> bool: + if node.is_in_group("wind_node"): + return true + if node.is_in_group("weather_vegetables_node"): + return true + + return node is Node3D + func _queue_dynamic_environment_node(node: Node) -> void: if not is_instance_valid(node): return @@ -205,7 +222,7 @@ func _apply_dynamic_environment_materials(node: Node) -> void: if node.is_in_group("wind_node"): _apply_wind_noise_to_node(node, NOISE_TEXTURE) - if node.is_in_group("weather_node") or node.is_in_group("weather_vegetables_node"): + if node is Node3D: _apply_weather_overlay_to_node(node, _get_weather_overlay_material(node)) if _should_ignore_weather_overlay(node): @@ -231,11 +248,9 @@ func _apply_wind_noise_to_node(node: Node, noise_tex: Texture2D) -> void: _apply_wind_noise_to_node(child, noise_tex) func ApplyWeatherShaderToMaterials(): - for node in get_tree().get_nodes_in_group("weather_node"): - _apply_weather_overlay_to_node(node, _get_weather_overlay_material(node)) - - for node in get_tree().get_nodes_in_group("weather_vegetables_node"): - _apply_weather_overlay_to_node(node, _get_weather_overlay_material(node)) + var current_scene := get_tree().current_scene + if current_scene != null: + _apply_weather_overlay_to_node(current_scene, _get_weather_overlay_material(current_scene)) func _get_weather_overlay_material(node: Node) -> Material: if not node.is_in_group("weather_overlay_no_noise"): @@ -255,13 +270,21 @@ func _apply_weather_overlay_to_node(node: Node, material: Material) -> void: return if node is GeometryInstance3D: - if _should_clear_weather_overlay(node) or _geometry_uses_alpha_texture(node): + if _geometry_should_never_receive_weather_overlay(node): + node.material_overlay = null + elif _should_clear_weather_overlay(node) and not _geometry_forces_weather_overlay(node): + node.material_overlay = null + elif _geometry_uses_alpha_texture(node) or _geometry_should_skip_weather_overlay(node): node.material_overlay = null else: node.material_overlay = material + var child_material := _get_weather_overlay_material(node) + if child_material == WEATHER_SHADER and material == weather_shader_no_noise: + child_material = material + for child in node.get_children(): - _apply_weather_overlay_to_node(child, material) + _apply_weather_overlay_to_node(child, child_material) func _clear_weather_overlay_from_node(node: Node) -> void: if node is GeometryInstance3D: @@ -289,11 +312,99 @@ func _geometry_uses_alpha_texture(node: GeometryInstance3D) -> bool: return false +func _geometry_should_never_receive_weather_overlay(node: GeometryInstance3D) -> bool: + if node is GPUParticles3D: + return true + + var node_name := String(node.name).to_lower() + return node_name.contains("cloud") or node_name.contains("fog") or node_name.contains("godray") + +func _geometry_should_skip_weather_overlay(node: GeometryInstance3D) -> bool: + if _geometry_forces_weather_overlay(node): + return false + if _node_name_indicates_water(node): + return true + + var has_material: bool = false + var all_materials_ignored: bool = true + var material_override := node.material_override + if material_override != null: + has_material = true + all_materials_ignored = all_materials_ignored and _material_ignores_weather_overlay(material_override) + + if node is MeshInstance3D: + for surface_index in node.get_surface_override_material_count(): + var surface_material: Material = node.get_surface_override_material(surface_index) + if surface_material == null: + continue + + has_material = true + all_materials_ignored = all_materials_ignored and _material_ignores_weather_overlay(surface_material) + + if node.mesh: + for surface_index in node.mesh.get_surface_count(): + var mesh_material: Material = node.mesh.surface_get_material(surface_index) + if mesh_material == null: + continue + + has_material = true + all_materials_ignored = all_materials_ignored and _material_ignores_weather_overlay(mesh_material) + + return has_material and all_materials_ignored + +func _geometry_forces_weather_overlay(node: GeometryInstance3D) -> bool: + if _material_forces_weather_overlay(node.material_override): + return true + + if node is MeshInstance3D: + for surface_index in node.get_surface_override_material_count(): + if _material_forces_weather_overlay(node.get_surface_override_material(surface_index)): + return true + + if node.mesh: + for surface_index in node.mesh.get_surface_count(): + if _material_forces_weather_overlay(node.mesh.surface_get_material(surface_index)): + return true + + return false + +func _material_forces_weather_overlay(material: Material) -> bool: + if material == null: + return false + + var resource_path := material.resource_path.to_lower() + for path_part in FORCE_WEATHER_MATERIAL_PATH_PARTS: + if resource_path.contains(path_part): + return true + + return false + +func _node_name_indicates_water(node: Node) -> bool: + var node_name := String(node.name).to_lower() + return node_name.begins_with("water") or node_name.contains("/water") + +func _material_ignores_weather_overlay(material: Material) -> bool: + if material == null: + return false + + var resource_path := material.resource_path.to_lower() + if resource_path.contains("/water") or resource_path.contains("water_"): + return true + if resource_path.contains("/cloud/") or resource_path.contains("cloud"): + return true + + var base_material := material as BaseMaterial3D + if base_material != null: + return base_material.transparency != BaseMaterial3D.TRANSPARENCY_DISABLED or base_material.albedo_color.a < 0.99 + + return false + func _shader_material_uses_alpha_texture(material: ShaderMaterial) -> bool: if material == null or material.shader == null: return false - return material.shader.code.find("alpha_texture") != -1 + var shader_code := material.shader.code + return shader_code.find("alpha_texture") != -1 or shader_code.find("ALPHA") != -1 or shader_code.find("opacity") != -1 func _should_ignore_weather_overlay(node: Node) -> bool: return node.is_in_group("weather_overlay_ignore") diff --git a/core/daynight/tree_leaves.gdshader b/core/daynight/tree_leaves.gdshader index 74a1078..bf8ba4a 100644 --- a/core/daynight/tree_leaves.gdshader +++ b/core/daynight/tree_leaves.gdshader @@ -13,8 +13,9 @@ global uniform float global_snow_melt_speed = 0.1; global uniform float global_snow_amount = 0.0; global uniform vec4 global_snow_color; global uniform float global_rain_intensity; -const float LEAVES_FULL_SNOW_START = 0.58; -const float LEAVES_FULL_SNOW_END = 0.86; +const float LEAVES_FULL_SNOW_START = 0.96; +const float LEAVES_FULL_SNOW_END = 1.0; +const float LEAVES_TOP_SNOW_COVERAGE = 0.75; uniform sampler2D wind_noise : filter_linear_mipmap; uniform bool billboard_enabled = true; @@ -110,7 +111,7 @@ void fragment() { float snow_amount = pow(get_snow_progress(), 0.55); float top_mask = 1.0 - shifted_uv.y; - float snow_mask = smoothstep(1.0 - snow_amount * 1.35, 1.08 - snow_amount * 1.35, top_mask) * snow_visibility; + float snow_mask = smoothstep(1.0 - snow_amount * LEAVES_TOP_SNOW_COVERAGE, 1.08 - snow_amount * LEAVES_TOP_SNOW_COVERAGE, top_mask) * snow_visibility; snow_mask *= step(0.01, snow_amount); float full_snow_mask = smoothstep(LEAVES_FULL_SNOW_START, LEAVES_FULL_SNOW_END, snow_amount) * clamp(snow_visibility, 0.0, 1.0); float final_snow_mask = max(snow_mask, full_snow_mask); diff --git a/core/daynight/weather_overlay.gdshader b/core/daynight/weather_overlay.gdshader index 62444cc..f4cccc1 100644 --- a/core/daynight/weather_overlay.gdshader +++ b/core/daynight/weather_overlay.gdshader @@ -17,8 +17,8 @@ global uniform float global_snow_cap_flatness_end = 0.96; global uniform float global_snow_cap_noise_scale = 0.22; global uniform float global_snow_cap_noise_strength = 0.18; const float SNOW_VISUAL_RESPONSE = 0.55; -const float FULL_SNOW_VISUAL_START = 0.82; -const float FULL_SNOW_VISUAL_END = 0.98; +const float FULL_SNOW_VISUAL_START = 0.58; +const float FULL_SNOW_VISUAL_END = 0.86; uniform bool snow_noise_enabled = true; uniform float snow_noise_scale : hint_range(0.01, 1.0) = 0.15; uniform float snow_edge_softness : hint_range(0.01, 0.5) = 0.2; @@ -154,7 +154,7 @@ void fragment() { float flat_accumulation = smoothstep(0.0, 0.35, v_snow_cap_mask) * snow_accumulation; float snow_noise_mask = get_snow_noise_mask(world_pos, snow_progress); float snow_variation = mix(0.75, 1.15, noise_val); - float snow_coverage = clamp(mix(snow_progress * 0.35, snow_progress * snow_variation, snow_noise_mask) + flat_accumulation * 0.15, 0.0, 1.0); + float snow_coverage = clamp(mix(snow_progress * 0.55, snow_progress * snow_variation, snow_noise_mask) + flat_accumulation * 0.2, 0.0, 1.0); float snow_factor = max(snow_edge * snow_coverage, flat_accumulation); float snow_opacity = clamp(snow_factor, 0.0, 1.0); snow_opacity = max(snow_opacity, flat_accumulation * mix(0.45, 0.9, snow_noise_mask)); diff --git a/tgcc/main menu/distant_menu_world.tscn b/tgcc/main menu/distant_menu_world.tscn new file mode 100644 index 0000000..5be2adb --- /dev/null +++ b/tgcc/main menu/distant_menu_world.tscn @@ -0,0 +1,84 @@ +[gd_scene format=3 uid="uid://c7shevn0javuv"] + +[ext_resource type="Material" uid="uid://blqelpjvdv23j" path="res://tgcc/chunk/material/grassflat_chunk.tres" id="1_grass"] +[ext_resource type="Material" uid="uid://c2x7xxweexmj" path="res://tgcc/chunk/material/field.tres" id="2_field"] +[ext_resource type="Material" uid="uid://4xhpd6lust7w" path="res://tgcc/chunk/material/path_chunk.tres" id="3_path"] +[ext_resource type="Material" uid="uid://cnu38m5dsy4uw" path="res://tgcc/chunk/material/terrain.tres" id="4_terrain"] +[ext_resource type="Material" uid="uid://o31kp0jm07q3" path="res://tgcc/chunk/material/rocks.tres" id="7_rocks"] + +[sub_resource type="PlaneMesh" id="PlaneMesh_ground"] +size = Vector2(560, 360) + +[sub_resource type="PlaneMesh" id="PlaneMesh_field_large"] +size = Vector2(70, 95) + +[sub_resource type="PlaneMesh" id="PlaneMesh_field_small"] +size = Vector2(44, 62) + +[sub_resource type="PlaneMesh" id="PlaneMesh_path_long"] +size = Vector2(12, 340) + +[sub_resource type="PlaneMesh" id="PlaneMesh_path_short"] +size = Vector2(10, 120) + +[sub_resource type="SphereMesh" id="SphereMesh_tree_crown"] +radius = 4.0 +height = 5.0 +radial_segments = 8 +rings = 4 + +[node name="DistantMenuWorld" type="Node3D" unique_id=448788103] + +[node name="Ground" type="MeshInstance3D" parent="." unique_id=1769769010] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -0.12, 250) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_ground") +surface_material_override/0 = ExtResource("1_grass") + +[node name="BackDirt" type="MeshInstance3D" parent="." unique_id=441617212] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -155, -0.1, 235) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_field_large") +surface_material_override/0 = ExtResource("4_terrain") + +[node name="FieldA" type="MeshInstance3D" parent="." unique_id=1168162022] +transform = Transform3D(0.9659258, 0, -0.25881904, 0, 1, 0, 0.25881904, 0, 0.9659258, -90, -0.08, 175) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_field_large") +surface_material_override/0 = ExtResource("2_field") + +[node name="FieldB" type="MeshInstance3D" parent="." unique_id=908374467] +transform = Transform3D(0.8660254, 0, 0.5, 0, 1, 0, -0.5, 0, 0.8660254, 105, -0.08, 190) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_field_large") +surface_material_override/0 = ExtResource("2_field") + +[node name="FieldC" type="MeshInstance3D" parent="." unique_id=725405179] +transform = Transform3D(0.9063078, 0, -0.42261827, 0, 1, 0, 0.42261827, 0, 0.9063078, 160, -0.08, 305) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_field_small") +surface_material_override/0 = ExtResource("2_field") + +[node name="FieldD" type="MeshInstance3D" parent="." unique_id=180749651] +transform = Transform3D(0.9848077, 0, 0.17364818, 0, 1, 0, -0.17364818, 0, 0.9848077, -190, -0.08, 320) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_field_small") +surface_material_override/0 = ExtResource("2_field") + +[node name="DistantRoadMain" type="MeshInstance3D" parent="." unique_id=979021818] +transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, 5, -0.06, 240) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_path_long") +surface_material_override/0 = ExtResource("3_path") + +[node name="DistantRoadCross" type="MeshInstance3D" parent="." unique_id=1994181739] +transform = Transform3D(0.25881904, 0, 0.9659258, 0, 1, 0, -0.9659258, 0, 0.25881904, -20, -0.05, 220) +cast_shadow = 0 +mesh = SubResource("PlaneMesh_path_short") +surface_material_override/0 = ExtResource("3_path") + +[node name="RockPatch" type="MeshInstance3D" parent="." unique_id=12563390] +transform = Transform3D(1, 0, 0, 0, 0.35, 0, 0, 0, 0.65, -15, 0.6, 350) +cast_shadow = 0 +mesh = SubResource("SphereMesh_tree_crown") +surface_material_override/0 = ExtResource("7_rocks") diff --git a/tgcc/main menu/main_menu_test.gd b/tgcc/main menu/main_menu_test.gd index 87f4a1c..e4350c6 100644 --- a/tgcc/main menu/main_menu_test.gd +++ b/tgcc/main menu/main_menu_test.gd @@ -4,13 +4,27 @@ extends Node3D @export var play_departure_delay_seconds: float = 1.0 @export var play_move_before_transition_seconds: float = 3.0 @export var menu_train_whistle_volume_db: float = -12.0 +@export var prewarm_chunks_before_show: bool = true var _play_departure_started: bool = false @onready var _rail_path: Node = $rail +@onready var _biome_generator: Node = $biome_generator +@onready var _environment_manager: Node = $EnvironmentManager @onready var _option_menu: Control = $MainMenuUI/SubViewport/OptionMenu func _ready() -> void: + if prewarm_chunks_before_show: + visible = false + await get_tree().physics_frame + if not is_inside_tree(): + return + if _biome_generator != null and _biome_generator.has_method("generate_initial_world_now"): + _biome_generator.generate_initial_world_now() + if _environment_manager != null and _environment_manager.has_method("flush_pending_environment_nodes"): + _environment_manager.flush_pending_environment_nodes() + visible = true + _stop_menu_train() _configure_menu_train_whistle_volume() _configure_play_transition_delay() diff --git a/tgcc/main menu/main_menu_test.tscn b/tgcc/main menu/main_menu_test.tscn index d6b861b..2b155f8 100644 --- a/tgcc/main menu/main_menu_test.tscn +++ b/tgcc/main menu/main_menu_test.tscn @@ -108,6 +108,7 @@ [ext_resource type="Texture2D" uid="uid://kuqxyqwqdrq0" path="res://core/game_menu/assets/page_3/play_button_2.png" id="106_5hxod"] [ext_resource type="Texture2D" uid="uid://c010wpjb66cmb" path="res://core/game_menu/assets/page_3/settings_button_2.png" id="107_cg70g"] [ext_resource type="Texture2D" uid="uid://diqsj3x0ftdo" path="res://core/game_menu/assets/page_3/quit_button_2.png" id="108_0hcuf"] +[ext_resource type="PackedScene" path="res://tgcc/main menu/distant_menu_world.tscn" id="105_background"] [sub_resource type="ShaderMaterial" id="ShaderMaterial_00nq7"] render_priority = 0 @@ -179,13 +180,12 @@ metadata/_custom_type_script = "uid://brcimd12tx3dm" compositor_effects = Array[CompositorEffect]([SubResource("CompositorEffect_q52t1")]) [sub_resource type="Curve3D" id="Curve3D_263ax"] -closed = true bake_interval = 50.0 _data = { -"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 3.5, 0, 0, 0, 0, 0, 0, 0, 0, 3.5, 0, 100, 0, 0, 0, 0, 0, 0, 2.961661, -0.009097099, -56.07381, 0, 0, 0, 0, 0, 0, 3.4848416, -0.013232231, -117.195526, 0, 0, 0, 0, 0, 0, 3.3488476, 0.0048189163, 176.55922, 0, 0, 0, 0, 0, 0, 1.7582202, 0.0118227005, 270.61703), -"tilts": PackedFloat32Array(0, 0, 0, 0, 0, 0) +"points": PackedVector3Array(0, 0, 0, 0, 0, 0, 3.0078363, -1.8119812e-05, -12.587097, 0, 0, 0, 0, 0, 0, 3.360159, -1.8119812e-05, -79.54889, 0, 0, 0, 0, 0, 0, 2.826539, -1.8119812e-05, -159.47318, 0, 0, 0, 0, 0, 0, 3.0367248, -1.8119812e-05, -269.20667), +"tilts": PackedFloat32Array(0, 0, 0, 0) } -point_count = 6 +point_count = 4 [sub_resource type="PlaneMesh" id="PlaneMesh_00nq7"] @@ -287,6 +287,8 @@ size = Vector2(600, 300) [node name="MainMenu" type="Node3D" unique_id=448381304] transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0) script = ExtResource("1_4j5xl") +play_departure_speed = 6.0 +menu_train_whistle_volume_db = -14.0 [node name="EnvironmentManager" parent="." unique_id=1611939731 instance=ExtResource("1_2o8pc")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.822516, 0, 1.9254212) @@ -314,7 +316,7 @@ directional_shadow_mode = 0 directional_shadow_max_distance = 200.0 [node name="rail" type="Path3D" parent="." unique_id=28337754] -transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, -47.25185, 1.7218199, 3.4257338) +transform = Transform3D(1.3113416e-07, 0, 1, 0, 1, 0, -1, 0, 1.3113416e-07, 114.74815, 1.7218199, 3.4257479) curve = SubResource("Curve3D_263ax") script = ExtResource("7_5p27e") train_model = ExtResource("8_ljvyb") @@ -325,7 +327,7 @@ wagon_gap = 0.6 wagon_spacing_scale = 0.9 train_start_mode = 2 train_start_stop_index = 0 -train_start_position = 540.0 +train_start_position = 87.0 train_start_after_delay = false train_facing_direction = 2 sleepers_model = ExtResource("10_00nq7") @@ -334,6 +336,9 @@ fireworks_scene = ExtResource("11_aylkj") [node name="MainMap" parent="." unique_id=1895741703 instance=ExtResource("2_wbrya")] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 63.069893, 0, -4.743943e-06) +[node name="DistantMenuWorld" parent="." unique_id=1852904287 instance=ExtResource("105_background")] +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, -117.95) + [node name="MeshInstance3D" type="MeshInstance3D" parent="." unique_id=1523044435] transform = Transform3D(-80.07708, -1.0239479e-05, 4.277144e-13, 0, -2.9642006e-06, -64.80289, 1.2091303e-05, -67.813, 2.832624e-06, 308.45245, 59.279312, 332.5165) cast_shadow = 0 @@ -378,14 +383,14 @@ transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488 [node name="Fuji4" parent="." unique_id=930179001 instance=ExtResource("99_61psf")] transform = Transform3D(-0.09359112, 0, 0.9713834, 0, 0.56225973, 0, -0.38276488, 0, -0.23751618, 239.46135, 1.7057877, 224.6928) -[node name="Landscape" parent="Fuji4" index="0" unique_id=1897614485] +[node name="Landscape" parent="Fuji4" index="0" unique_id=581950846] transform = Transform3D(28.638817, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638834, -10.786804, 5.0069, 17.382736) surface_material_override/0 = SubResource("ShaderMaterial_g1vc5") [node name="Fuji5" parent="." unique_id=1070037082 instance=ExtResource("99_61psf")] transform = Transform3D(0.0935979, 0, 0.9713791, 0, 0.56225973, 0, -0.38276324, 0, 0.23753339, -275.95566, -3.4616928, 232.02234) -[node name="Landscape" parent="Fuji5" index="0" unique_id=1897614485] +[node name="Landscape" parent="Fuji5" index="0" unique_id=581950846] transform = Transform3D(28.638819, 1.7053026e-13, -7.6293945e-06, 0, 13.6219845, 2.1621709e-06, 0, -1.0284306e-06, 28.638836, -10.786743, 6.703195, 17.382767) surface_material_override/0 = SubResource("ShaderMaterial_g1vc5") @@ -395,7 +400,7 @@ transform = Transform3D(-4.88843, -0.020050459, 0.86837775, -0.010355438, 4.9646 [node name="Fuji6" parent="." unique_id=150126281 instance=ExtResource("100_0aqpp")] transform = Transform3D(-5.287449, -0.020231497, 0.22351237, -0.011200703, 5.009496, 0.014500697, -0.9394429, 0.05414178, -1.2581636, 32.446022, 15.848213, 525.54346) -[node name="Mt Fuji_simplified_3d_mesh" parent="Fuji6" index="0" unique_id=206531083] +[node name="Mt Fuji_simplified_3d_mesh" parent="Fuji6" index="0" unique_id=65404928] transform = Transform3D(0.5151193, -0.011206273, -0.07264297, 0.077138014, 0.07483422, 0.48510167, 3.5762787e-07, -0.4938935, 0.07515043, 6.299696, 12.244916, 3.004303) surface_material_override/0 = SubResource("ShaderMaterial_vvb5q") diff --git a/tgcc/main_scene.tscn b/tgcc/main_scene.tscn index 41e5884..5fa643d 100644 --- a/tgcc/main_scene.tscn +++ b/tgcc/main_scene.tscn @@ -207,7 +207,7 @@ biome_list = Array[ExtResource("6_jfe74")]([SubResource("Resource_3qrd0")]) entity_pool = ExtResource("34_a2cst") entity_spawn_probability = 0.4 max_entities_per_chunk = 5 -eye_line = 4 +eye_line = 7 [node name="Terrain" type="MeshInstance3D" parent="." unique_id=219178561] visible = false