add prewarm chunk generation

This commit is contained in:
2026-07-08 11:22:21 +02:00
parent 185b1b4744
commit 2358dc8b53
5 changed files with 73 additions and 140 deletions

View File

@@ -212,6 +212,17 @@ func _physics_process(_delta: float) -> void:
last_pos_train = current_pos last_pos_train = current_pos
_refresh_world(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: func collect_all_chunkinfo(root: Node, list: Array[Node]) -> void:
if root == null: return if root == null: return
@@ -535,6 +546,20 @@ func _drain_generation_queue() -> void:
pending_generation_cells.clear() pending_generation_cells.clear()
pending_generation_cursor = 0 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: func _drain_cleanup_queue() -> void:
var processed: int = 0 var processed: int = 0
var start_usec: int = Time.get_ticks_usec() var start_usec: int = Time.get_ticks_usec()
@@ -595,6 +620,22 @@ func _drain_wire_queue() -> void:
pending_wire_cells.clear() pending_wire_cells.clear()
pending_wire_cursor = 0 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: func _generate_pieces_around_train(center: Vector2i) -> void:
for x in range(-eye_line, eye_line + 1): for x in range(-eye_line, eye_line + 1):
for z in range(-eye_line, eye_line + 1): for z in range(-eye_line, eye_line + 1):

View File

@@ -1,12 +1,10 @@
[gd_scene load_steps=18 format=3] [gd_scene format=3 uid="uid://c7shevn0javuv"]
[ext_resource type="Material" path="res://tgcc/chunk/material/grassflat_chunk.tres" id="1_grass"] [ext_resource type="Material" uid="uid://blqelpjvdv23j" path="res://tgcc/chunk/material/grassflat_chunk.tres" id="1_grass"]
[ext_resource type="Material" path="res://tgcc/chunk/material/field.tres" id="2_field"] [ext_resource type="Material" uid="uid://c2x7xxweexmj" path="res://tgcc/chunk/material/field.tres" id="2_field"]
[ext_resource type="Material" path="res://tgcc/chunk/material/path_chunk.tres" id="3_path"] [ext_resource type="Material" uid="uid://4xhpd6lust7w" path="res://tgcc/chunk/material/path_chunk.tres" id="3_path"]
[ext_resource type="Material" path="res://tgcc/chunk/material/terrain.tres" id="4_terrain"] [ext_resource type="Material" uid="uid://cnu38m5dsy4uw" path="res://tgcc/chunk/material/terrain.tres" id="4_terrain"]
[ext_resource type="Material" path="res://tgcc/chunk/prop/house/house.tres" id="5_house"] [ext_resource type="Material" uid="uid://o31kp0jm07q3" path="res://tgcc/chunk/material/rocks.tres" id="7_rocks"]
[ext_resource type="Material" path="res://tgcc/chunk/material/wood.tres" id="6_wood"]
[ext_resource type="Material" path="res://tgcc/chunk/material/rocks.tres" id="7_rocks"]
[sub_resource type="PlaneMesh" id="PlaneMesh_ground"] [sub_resource type="PlaneMesh" id="PlaneMesh_ground"]
size = Vector2(560, 360) size = Vector2(560, 360)
@@ -23,185 +21,63 @@ size = Vector2(12, 340)
[sub_resource type="PlaneMesh" id="PlaneMesh_path_short"] [sub_resource type="PlaneMesh" id="PlaneMesh_path_short"]
size = Vector2(10, 120) size = Vector2(10, 120)
[sub_resource type="BoxMesh" id="BoxMesh_house"]
size = Vector3(11, 6, 9)
[sub_resource type="BoxMesh" id="BoxMesh_roof"]
size = Vector3(13, 2, 11)
[sub_resource type="BoxMesh" id="BoxMesh_tree_trunk"]
size = Vector3(1.4, 5, 1.4)
[sub_resource type="SphereMesh" id="SphereMesh_tree_crown"] [sub_resource type="SphereMesh" id="SphereMesh_tree_crown"]
radius = 4.0 radius = 4.0
height = 5.0 height = 5.0
radial_segments = 8 radial_segments = 8
rings = 4 rings = 4
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_orange_crown"] [node name="DistantMenuWorld" type="Node3D" unique_id=448788103]
albedo_color = Color(0.85, 0.32, 0.09, 1)
roughness = 0.85
[sub_resource type="StandardMaterial3D" id="StandardMaterial3D_red_crown"] [node name="Ground" type="MeshInstance3D" parent="." unique_id=1769769010]
albedo_color = Color(0.6, 0.12, 0.08, 1)
roughness = 0.85
[node name="DistantMenuWorld" type="Node3D"]
[node name="Ground" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -0.12, 250) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 20, -0.12, 250)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_ground") mesh = SubResource("PlaneMesh_ground")
surface_material_override/0 = ExtResource("1_grass") surface_material_override/0 = ExtResource("1_grass")
[node name="BackDirt" type="MeshInstance3D" parent="."] [node name="BackDirt" type="MeshInstance3D" parent="." unique_id=441617212]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -155, -0.1, 235) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -155, -0.1, 235)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_field_large") mesh = SubResource("PlaneMesh_field_large")
surface_material_override/0 = ExtResource("4_terrain") surface_material_override/0 = ExtResource("4_terrain")
[node name="FieldA" type="MeshInstance3D" parent="."] [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) transform = Transform3D(0.9659258, 0, -0.25881904, 0, 1, 0, 0.25881904, 0, 0.9659258, -90, -0.08, 175)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_field_large") mesh = SubResource("PlaneMesh_field_large")
surface_material_override/0 = ExtResource("2_field") surface_material_override/0 = ExtResource("2_field")
[node name="FieldB" type="MeshInstance3D" parent="."] [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) transform = Transform3D(0.8660254, 0, 0.5, 0, 1, 0, -0.5, 0, 0.8660254, 105, -0.08, 190)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_field_large") mesh = SubResource("PlaneMesh_field_large")
surface_material_override/0 = ExtResource("2_field") surface_material_override/0 = ExtResource("2_field")
[node name="FieldC" type="MeshInstance3D" parent="."] [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) transform = Transform3D(0.9063078, 0, -0.42261827, 0, 1, 0, 0.42261827, 0, 0.9063078, 160, -0.08, 305)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_field_small") mesh = SubResource("PlaneMesh_field_small")
surface_material_override/0 = ExtResource("2_field") surface_material_override/0 = ExtResource("2_field")
[node name="FieldD" type="MeshInstance3D" parent="."] [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) transform = Transform3D(0.9848077, 0, 0.17364818, 0, 1, 0, -0.17364818, 0, 0.9848077, -190, -0.08, 320)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_field_small") mesh = SubResource("PlaneMesh_field_small")
surface_material_override/0 = ExtResource("2_field") surface_material_override/0 = ExtResource("2_field")
[node name="DistantRoadMain" type="MeshInstance3D" parent="."] [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) transform = Transform3D(0.70710677, 0, -0.70710677, 0, 1, 0, 0.70710677, 0, 0.70710677, 5, -0.06, 240)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_path_long") mesh = SubResource("PlaneMesh_path_long")
surface_material_override/0 = ExtResource("3_path") surface_material_override/0 = ExtResource("3_path")
[node name="DistantRoadCross" type="MeshInstance3D" parent="."] [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) transform = Transform3D(0.25881904, 0, 0.9659258, 0, 1, 0, -0.9659258, 0, 0.25881904, -20, -0.05, 220)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("PlaneMesh_path_short") mesh = SubResource("PlaneMesh_path_short")
surface_material_override/0 = ExtResource("3_path") surface_material_override/0 = ExtResource("3_path")
[node name="VillageA" type="Node3D" parent="."] [node name="RockPatch" type="MeshInstance3D" parent="." unique_id=12563390]
transform = Transform3D(0.9396926, 0, -0.34202015, 0, 1, 0, 0.34202015, 0, 0.9396926, -130, 0, 205)
[node name="House1" type="MeshInstance3D" parent="VillageA"]
transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 3, 0)
cast_shadow = 0
mesh = SubResource("BoxMesh_house")
surface_material_override/0 = ExtResource("5_house")
[node name="Roof1" type="MeshInstance3D" parent="VillageA"]
transform = Transform3D(1, 0, 0, 0, 0.8660254, -0.5, 0, 0.5, 0.8660254, 0, 7.2, 0)
cast_shadow = 0
mesh = SubResource("BoxMesh_roof")
surface_material_override/0 = ExtResource("6_wood")
[node name="House2" type="MeshInstance3D" parent="VillageA"]
transform = Transform3D(0.88, 0, 0, 0, 0.88, 0, 0, 0, 0.88, 20, 2.64, -12)
cast_shadow = 0
mesh = SubResource("BoxMesh_house")
surface_material_override/0 = ExtResource("5_house")
[node name="Roof2" type="MeshInstance3D" parent="VillageA"]
transform = Transform3D(0.88, 0, 0, 0, 0.76210237, -0.44, 0, 0.44, 0.76210237, 20, 6.3, -12)
cast_shadow = 0
mesh = SubResource("BoxMesh_roof")
surface_material_override/0 = ExtResource("6_wood")
[node name="VillageB" type="Node3D" parent="."]
transform = Transform3D(0.81915206, 0, 0.57357645, 0, 1, 0, -0.57357645, 0, 0.81915206, 150, 0, 255)
[node name="House1" type="MeshInstance3D" parent="VillageB"]
transform = Transform3D(1.1, 0, 0, 0, 1.1, 0, 0, 0, 1.1, 0, 3.3, 0)
cast_shadow = 0
mesh = SubResource("BoxMesh_house")
surface_material_override/0 = ExtResource("5_house")
[node name="Roof1" type="MeshInstance3D" parent="VillageB"]
transform = Transform3D(1.1, 0, 0, 0, 0.95262796, -0.55, 0, 0.55, 0.95262796, 0, 7.9, 0)
cast_shadow = 0
mesh = SubResource("BoxMesh_roof")
surface_material_override/0 = ExtResource("6_wood")
[node name="House2" type="MeshInstance3D" parent="VillageB"]
transform = Transform3D(0.8, 0, 0, 0, 0.8, 0, 0, 0, 0.8, -18, 2.4, 15)
cast_shadow = 0
mesh = SubResource("BoxMesh_house")
surface_material_override/0 = ExtResource("5_house")
[node name="Roof2" type="MeshInstance3D" parent="VillageB"]
transform = Transform3D(0.8, 0, 0, 0, 0.6928203, -0.4, 0, 0.4, 0.6928203, -18, 5.75, 15)
cast_shadow = 0
mesh = SubResource("BoxMesh_roof")
surface_material_override/0 = ExtResource("6_wood")
[node name="TreeLine" type="Node3D" parent="."]
[node name="TreeA_Trunk" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1, 0, 0, 0, 1.2, 0, 0, 0, 1, -210, 3, 210)
cast_shadow = 0
mesh = SubResource("BoxMesh_tree_trunk")
surface_material_override/0 = ExtResource("6_wood")
[node name="TreeA_Crown" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1.4, 0, 0, 0, 1.1, 0, 0, 0, 1.4, -210, 8.5, 210)
cast_shadow = 0
mesh = SubResource("SphereMesh_tree_crown")
surface_material_override/0 = SubResource("StandardMaterial3D_orange_crown")
[node name="TreeB_Trunk" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1, 0, 0, 0, 1.1, 0, 0, 0, 1, -175, 2.75, 255)
cast_shadow = 0
mesh = SubResource("BoxMesh_tree_trunk")
surface_material_override/0 = ExtResource("6_wood")
[node name="TreeB_Crown" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1.2, 0, 0, 0, 1.0, 0, 0, 0, 1.2, -175, 7.7, 255)
cast_shadow = 0
mesh = SubResource("SphereMesh_tree_crown")
surface_material_override/0 = SubResource("StandardMaterial3D_red_crown")
[node name="TreeC_Trunk" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1, 0, 0, 0, 1.15, 0, 0, 0, 1, 218, 2.9, 235)
cast_shadow = 0
mesh = SubResource("BoxMesh_tree_trunk")
surface_material_override/0 = ExtResource("6_wood")
[node name="TreeC_Crown" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1.45, 0, 0, 0, 1.05, 0, 0, 0, 1.45, 218, 8.0, 235)
cast_shadow = 0
mesh = SubResource("SphereMesh_tree_crown")
surface_material_override/0 = SubResource("StandardMaterial3D_orange_crown")
[node name="TreeD_Trunk" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1, 0, 0, 0, 1.05, 0, 0, 0, 1, 240, 2.65, 290)
cast_shadow = 0
mesh = SubResource("BoxMesh_tree_trunk")
surface_material_override/0 = ExtResource("6_wood")
[node name="TreeD_Crown" type="MeshInstance3D" parent="TreeLine"]
transform = Transform3D(1.2, 0, 0, 0, 0.95, 0, 0, 0, 1.2, 240, 7.4, 290)
cast_shadow = 0
mesh = SubResource("SphereMesh_tree_crown")
surface_material_override/0 = SubResource("StandardMaterial3D_red_crown")
[node name="RockPatch" type="MeshInstance3D" parent="."]
transform = Transform3D(1, 0, 0, 0, 0.35, 0, 0, 0, 0.65, -15, 0.6, 350) transform = Transform3D(1, 0, 0, 0, 0.35, 0, 0, 0, 0.65, -15, 0.6, 350)
cast_shadow = 0 cast_shadow = 0
mesh = SubResource("SphereMesh_tree_crown") mesh = SubResource("SphereMesh_tree_crown")

View File

@@ -4,13 +4,27 @@ extends Node3D
@export var play_departure_delay_seconds: float = 1.0 @export var play_departure_delay_seconds: float = 1.0
@export var play_move_before_transition_seconds: float = 3.0 @export var play_move_before_transition_seconds: float = 3.0
@export var menu_train_whistle_volume_db: float = -12.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 var _play_departure_started: bool = false
@onready var _rail_path: Node = $rail @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 @onready var _option_menu: Control = $MainMenuUI/SubViewport/OptionMenu
func _ready() -> void: 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() _stop_menu_train()
_configure_menu_train_whistle_volume() _configure_menu_train_whistle_volume()
_configure_play_transition_delay() _configure_play_transition_delay()

View File

@@ -284,6 +284,8 @@ size = Vector2(600, 300)
[node name="MainMenu" type="Node3D" unique_id=448381304] [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) transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, -1, 0, 0, 0)
script = ExtResource("1_4j5xl") 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")] [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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 1.822516, 0, 1.9254212)