diff --git a/game/src/core/interactive_loader.gd b/game/src/core/interactive_loader.gd index 13f0b1b..845e703 100644 --- a/game/src/core/interactive_loader.gd +++ b/game/src/core/interactive_loader.gd @@ -6,7 +6,7 @@ extends Node var load_progress: Array = [] -static func create_onshot(bound_node: Node) -> InteractiveLoader: +static func create_oneshot(bound_node: Node) -> InteractiveLoader: var loader := InteractiveLoader.new() loader.auto_free = true bound_node.add_child(loader) diff --git a/game/src/core/world/level/level_streamer.gd b/game/src/core/world/level/level_streamer.gd index 6e35fdb..bc1317e 100644 --- a/game/src/core/world/level/level_streamer.gd +++ b/game/src/core/world/level/level_streamer.gd @@ -21,6 +21,10 @@ signal loading_finished @export var load_aabbs: Array[AABB] = []: set(value): load_aabbs = value + + if not is_node_ready(): + await ready + precompute_aabb() #await get_tree().process_frame #clear_gizmos() @@ -31,7 +35,8 @@ signal loading_finished var loaded_level: Node var is_loading_level: bool = false var _unload_time_left: float = 0.0 -var _precomputed_aabb: AABB +var _precomputed_aabb: AABB # Big bounding box covering all [_precomputed_aabbs] for faster checking. +var _precomputed_aabbs: Array[AABB] var _previous_camera: Camera3D @@ -116,8 +121,12 @@ func _process(delta: float) -> void: func precompute_aabb() -> void: - _precomputed_aabb = AABB(Vector3.ZERO, Vector3.ZERO) if load_aabbs.is_empty() else load_aabbs.front() + _precomputed_aabbs.clear() for aabb: AABB in load_aabbs: + _precomputed_aabbs.append(get_aabb_with_correct_position(aabb, self)) + + _precomputed_aabb = AABB(global_position, Vector3.ZERO) if _precomputed_aabbs.is_empty() else _precomputed_aabbs.front() + for aabb: AABB in _precomputed_aabbs: _precomputed_aabb = _precomputed_aabb.merge(aabb) @@ -128,9 +137,11 @@ func load_level() -> void: return is_loading_level = true + var scene: PackedScene = await load_scene_threaded() if threaded_loading else load(scene_path) loaded_level = scene.instantiate() add_child(loaded_level) + is_loading_level = false loading_finished.emit() @@ -145,7 +156,7 @@ func is_level_loaded() -> bool: func load_scene_threaded() -> PackedScene: - var interactive_loader := InteractiveLoader.create_onshot(self) + var interactive_loader := InteractiveLoader.create_oneshot(self) var resource: Resource = await interactive_loader.load_threaded(scene_path) return resource as PackedScene @@ -161,14 +172,14 @@ func get_camera() -> Camera3D: func is_position_in_bounds(point: Vector3) -> bool: - if not get_aabb_with_correct_position(_precomputed_aabb, self).has_point(point): + if not _precomputed_aabb.has_point(point): return false - if load_aabbs.size() == 1: + if _precomputed_aabbs.size() == 1: return true - for aabb: AABB in load_aabbs: - if get_aabb_with_correct_position(aabb, self).has_point(point): + for aabb: AABB in _precomputed_aabbs: + if aabb.has_point(point): return true return false diff --git a/game/src/core/world/world.gd b/game/src/core/world/world.gd index 419d1f9..b79b137 100644 --- a/game/src/core/world/world.gd +++ b/game/src/core/world/world.gd @@ -45,9 +45,9 @@ func initialize_level_streamers() -> void: func initialize_world_proxies() -> void: - for world_object: WorldProxy in WorldProxy.world_proxies: - if is_ancestor_of(world_object): - world_object.set_world(self) + for world_proxy: WorldProxy in WorldProxy.world_proxies: + if is_ancestor_of(world_proxy): + world_proxy.set_world(self) func initialize_default_world_state() -> void: diff --git a/game/src/game.gd b/game/src/game.gd index 4a60a84..1ce1234 100644 --- a/game/src/game.gd +++ b/game/src/game.gd @@ -72,7 +72,7 @@ func load_world(world_path: String, save_previous: bool = true, load_from_save: unload_main_menu() unload_world(save_previous) - var loader := InteractiveLoader.create_onshot(self) + var loader := InteractiveLoader.create_oneshot(self) var loaded_scene: PackedScene = await loader.load_threaded(world_path) world = loaded_scene.instantiate() as World @@ -130,7 +130,7 @@ func load_world_state(world_path: String) -> WorldState: func load_main_menu() -> void: - var loader := InteractiveLoader.create_onshot(self) + var loader := InteractiveLoader.create_oneshot(self) var loaded_scene: PackedScene = await loader.load_threaded(main_menu_path) var _main_menu: MainMenu = loaded_scene.instantiate() _main_menu.load_game_request.connect(load_game) diff --git a/game/src/worlds/test_world/test_world.tscn b/game/src/worlds/test_world/test_world.tscn index 03182de..1076da3 100644 --- a/game/src/worlds/test_world/test_world.tscn +++ b/game/src/worlds/test_world/test_world.tscn @@ -3,6 +3,7 @@ [ext_resource type="Script" uid="uid://ds86aqvaybgjy" path="res://src/core/world/world.gd" id="1_x7bpi"] [ext_resource type="Script" uid="uid://c37fw2nbnti8o" path="res://src/core/world_state.gd" id="2_iwot8"] [ext_resource type="Script" uid="uid://bgau5aa5a00w3" path="res://src/core/world/level/level_streamer.gd" id="2_wa7si"] +[ext_resource type="PackedScene" uid="uid://clhy3kiceqf2o" path="res://src/gameplay/characters/player/player_character.tscn" id="4_iwot8"] [sub_resource type="Resource" id="Resource_iwot8"] script = ExtResource("2_iwot8") @@ -10,28 +11,33 @@ player_transform = Transform3D(-1, 0, -8.742278e-08, 0, 1, 0, 8.742278e-08, 0, - loaded_level_ids = Array[StringName]([&"OutsideArea", &"EntranceHall"]) metadata/_custom_type_script = "uid://c37fw2nbnti8o" -[node name="World" type="Node" unique_id=4290880 node_paths=PackedStringArray("level_streamers", "debug_player_position")] +[node name="World" type="Node" unique_id=4290880 node_paths=PackedStringArray("level_streamers", "player", "debug_player_position")] script = ExtResource("1_x7bpi") -level_streamers = [NodePath("LS_OutsideArea"), NodePath("LS_EntranceHall")] +level_streamers = [NodePath("LevelStreamers/OutsideArea"), NodePath("LevelStreamers/EntranceHall")] +player = NodePath("PlayerCharacter") debug_enabled = true debug_world_state = SubResource("Resource_iwot8") debug_player_position = NodePath("_DebugPlayerSpawn") metadata/_custom_type_script = "uid://ds86aqvaybgjy" -[node name="LS_OutsideArea" type="Marker3D" parent="." unique_id=1784608705] +[node name="PlayerCharacter" parent="." unique_id=1678220543 instance=ExtResource("4_iwot8")] + +[node name="_DebugPlayerSpawn" type="Marker3D" parent="." unique_id=118447663] +transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 1, 3.5000005, 62) + +[node name="LevelStreamers" type="Node" parent="." unique_id=1422117962] + +[node name="OutsideArea" type="Marker3D" parent="LevelStreamers" unique_id=1784608705] script = ExtResource("2_wa7si") level_id = &"OutsideArea" scene_path = "uid://lraild3yetsh" load_aabbs = Array[AABB]([AABB(-15.5, -7.5, -47.999996, 31.8, 25, 91.49999)]) metadata/_custom_type_script = "uid://bgau5aa5a00w3" -[node name="LS_EntranceHall" type="Marker3D" parent="." unique_id=39813527] +[node name="EntranceHall" type="Marker3D" parent="LevelStreamers" unique_id=39813527] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 3.5, 33) script = ExtResource("2_wa7si") level_id = &"EntranceHall" scene_path = "uid://cmdy6f6kesmbj" load_aabbs = Array[AABB]([AABB(-20, -14, -4.7683716e-07, 40, 40, 40)]) metadata/_custom_type_script = "uid://bgau5aa5a00w3" - -[node name="_DebugPlayerSpawn" type="Marker3D" parent="." unique_id=118447663] -transform = Transform3D(0.99999994, 0, 0, 0, 1, 0, 0, 0, 0.99999994, 1, 3.5000005, 62)