precomputing all aabbs in level streamer instead of creating a new one every frame
This commit is contained in:
parent
9c2fb7ab9c
commit
c255be1ead
@ -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)
|
||||||
|
|||||||
@ -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
|
||||||
|
|||||||
@ -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:
|
||||||
|
|||||||
@ -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)
|
||||||
|
|||||||
@ -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)
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user