precomputing all aabbs in level streamer instead of creating a new one every frame

This commit is contained in:
SchimmelSpreu83 2026-03-08 01:01:43 +01:00
parent 9c2fb7ab9c
commit c255be1ead
5 changed files with 37 additions and 20 deletions

View File

@ -6,7 +6,7 @@ extends Node
var load_progress: Array = [] var load_progress: Array = []
static func create_onshot(bound_node: Node) -> InteractiveLoader: static func create_oneshot(bound_node: Node) -> InteractiveLoader:
var loader := InteractiveLoader.new() var loader := InteractiveLoader.new()
loader.auto_free = true loader.auto_free = true
bound_node.add_child(loader) bound_node.add_child(loader)

View File

@ -21,6 +21,10 @@ signal loading_finished
@export var load_aabbs: Array[AABB] = []: @export var load_aabbs: Array[AABB] = []:
set(value): set(value):
load_aabbs = value load_aabbs = value
if not is_node_ready():
await ready
precompute_aabb() precompute_aabb()
#await get_tree().process_frame #await get_tree().process_frame
#clear_gizmos() #clear_gizmos()
@ -31,7 +35,8 @@ signal loading_finished
var loaded_level: Node var loaded_level: Node
var is_loading_level: bool = false var is_loading_level: bool = false
var _unload_time_left: float = 0.0 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 var _previous_camera: Camera3D
@ -116,8 +121,12 @@ func _process(delta: float) -> void:
func precompute_aabb() -> 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: 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) _precomputed_aabb = _precomputed_aabb.merge(aabb)
@ -128,9 +137,11 @@ func load_level() -> void:
return return
is_loading_level = true is_loading_level = true
var scene: PackedScene = await load_scene_threaded() if threaded_loading else load(scene_path) var scene: PackedScene = await load_scene_threaded() if threaded_loading else load(scene_path)
loaded_level = scene.instantiate() loaded_level = scene.instantiate()
add_child(loaded_level) add_child(loaded_level)
is_loading_level = false is_loading_level = false
loading_finished.emit() loading_finished.emit()
@ -145,7 +156,7 @@ func is_level_loaded() -> bool:
func load_scene_threaded() -> PackedScene: 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) var resource: Resource = await interactive_loader.load_threaded(scene_path)
return resource as PackedScene return resource as PackedScene
@ -161,14 +172,14 @@ func get_camera() -> Camera3D:
func is_position_in_bounds(point: Vector3) -> bool: 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 return false
if load_aabbs.size() == 1: if _precomputed_aabbs.size() == 1:
return true return true
for aabb: AABB in load_aabbs: for aabb: AABB in _precomputed_aabbs:
if get_aabb_with_correct_position(aabb, self).has_point(point): if aabb.has_point(point):
return true return true
return false return false

View File

@ -45,9 +45,9 @@ func initialize_level_streamers() -> void:
func initialize_world_proxies() -> void: func initialize_world_proxies() -> void:
for world_object: WorldProxy in WorldProxy.world_proxies: for world_proxy: WorldProxy in WorldProxy.world_proxies:
if is_ancestor_of(world_object): if is_ancestor_of(world_proxy):
world_object.set_world(self) world_proxy.set_world(self)
func initialize_default_world_state() -> void: func initialize_default_world_state() -> void:

View File

@ -72,7 +72,7 @@ func load_world(world_path: String, save_previous: bool = true, load_from_save:
unload_main_menu() unload_main_menu()
unload_world(save_previous) 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) var loaded_scene: PackedScene = await loader.load_threaded(world_path)
world = loaded_scene.instantiate() as World world = loaded_scene.instantiate() as World
@ -130,7 +130,7 @@ func load_world_state(world_path: String) -> WorldState:
func load_main_menu() -> void: 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 loaded_scene: PackedScene = await loader.load_threaded(main_menu_path)
var _main_menu: MainMenu = loaded_scene.instantiate() var _main_menu: MainMenu = loaded_scene.instantiate()
_main_menu.load_game_request.connect(load_game) _main_menu.load_game_request.connect(load_game)

View File

@ -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://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://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="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"] [sub_resource type="Resource" id="Resource_iwot8"]
script = ExtResource("2_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"]) loaded_level_ids = Array[StringName]([&"OutsideArea", &"EntranceHall"])
metadata/_custom_type_script = "uid://c37fw2nbnti8o" 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") 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_enabled = true
debug_world_state = SubResource("Resource_iwot8") debug_world_state = SubResource("Resource_iwot8")
debug_player_position = NodePath("_DebugPlayerSpawn") debug_player_position = NodePath("_DebugPlayerSpawn")
metadata/_custom_type_script = "uid://ds86aqvaybgjy" 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") script = ExtResource("2_wa7si")
level_id = &"OutsideArea" level_id = &"OutsideArea"
scene_path = "uid://lraild3yetsh" scene_path = "uid://lraild3yetsh"
load_aabbs = Array[AABB]([AABB(-15.5, -7.5, -47.999996, 31.8, 25, 91.49999)]) load_aabbs = Array[AABB]([AABB(-15.5, -7.5, -47.999996, 31.8, 25, 91.49999)])
metadata/_custom_type_script = "uid://bgau5aa5a00w3" 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) transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.3, 3.5, 33)
script = ExtResource("2_wa7si") script = ExtResource("2_wa7si")
level_id = &"EntranceHall" level_id = &"EntranceHall"
scene_path = "uid://cmdy6f6kesmbj" scene_path = "uid://cmdy6f6kesmbj"
load_aabbs = Array[AABB]([AABB(-20, -14, -4.7683716e-07, 40, 40, 40)]) load_aabbs = Array[AABB]([AABB(-20, -14, -4.7683716e-07, 40, 40, 40)])
metadata/_custom_type_script = "uid://bgau5aa5a00w3" 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)