feat: bake jajce terrain navigation

This commit is contained in:
2026-07-08 15:53:39 +02:00
parent cc0d6ef548
commit 324084f233
8 changed files with 157 additions and 34 deletions
+26 -4
View File
@@ -11,7 +11,8 @@ func _run() -> void:
var main_scene: Node = load("res://main.tscn").instantiate()
root.add_child(main_scene)
await process_frame
await physics_frame
for _frame in 10:
await physics_frame
var simulation_manager: Node = main_scene.get_node("SimulationManager")
simulation_manager.set_process(false)
@@ -27,10 +28,9 @@ func _run() -> void:
"Runtime Terrain3D should bind to the gameplay camera"
)
_check(terrain.collision_mode != 0, "Runtime Terrain3D collision should be enabled")
var greybox_ground := main_scene.get_node("JajceWorld/NavigationRegion3D/GreyboxGround") as StaticBody3D
_check(
greybox_ground.collision_layer == 0 and greybox_ground.collision_mask == 0,
"Runtime GreyboxGround should not provide physics collision"
not main_scene.has_node("JajceWorld/NavigationRegion3D/GreyboxGround"),
"Runtime should not keep the temporary greybox navigation ground"
)
_check(
(
@@ -49,6 +49,11 @@ func _run() -> void:
)
var navigation_map: RID = main_scene.get_world_3d().navigation_map
var navigation_region := main_scene.get_node("JajceWorld/NavigationRegion3D") as NavigationRegion3D
_check(
navigation_region.navigation_mesh.resource_path == "res://world/jajce/JajceNavigationMesh.tres",
"Runtime navigation should use the Terrain3D-derived baked mesh resource"
)
await _wait_for_navigation_map(navigation_map)
NavigationServer3D.map_force_update(navigation_map)
@@ -82,6 +87,9 @@ func _run() -> void:
_check_path_tracks_terrain(
terrain, path, "Runtime navigation path should track Terrain3D height"
)
_check_path_reaches_destination(
path, destination, "Runtime navigation path should reach its requested target"
)
var village := SimVillage.new()
var worker := SimNPC.new(100, "BaselineWorker", SimulationIds.PROFESSION_SCHOLAR, 5.0, 5.0)
@@ -152,3 +160,17 @@ func _check_path_tracks_terrain(terrain: Terrain3D, path: PackedVector3Array, me
% [message, point, terrain_height]
)
return
func _check_path_reaches_destination(path: PackedVector3Array, destination: Vector3, message: String) -> void:
if path.is_empty():
return
var final_point := path[path.size() - 1]
var final_xz := Vector2(final_point.x, final_point.z)
var destination_xz := Vector2(destination.x, destination.z)
if final_xz.distance_to(destination_xz) > 1.5:
failures.append(
"%s: final path point %s is too far from %s"
% [message, final_point, destination]
)
+24 -4
View File
@@ -17,7 +17,7 @@ func _run() -> void:
var world: Node3D = load("res://world/jajce/JajceWorld.tscn").instantiate()
root.add_child(world)
await process_frame
for frame in 10:
for _frame in 10:
await physics_frame
var terrain = world.get_node("TerrainRoot/Terrain3D")
@@ -27,10 +27,9 @@ func _run() -> void:
"Terrain3D should use dedicated Jajce data"
)
_check(terrain.collision_mode != 0, "Terrain3D collision should be enabled for gameplay")
var greybox_ground := world.get_node("NavigationRegion3D/GreyboxGround") as StaticBody3D
_check(
greybox_ground.collision_layer == 0 and greybox_ground.collision_mask == 0,
"GreyboxGround should not provide runtime physics collision"
not world.has_node("NavigationRegion3D/GreyboxGround"),
"JajceWorld should not keep the temporary greybox navigation ground"
)
_check(
configured_texture_count == 6,
@@ -203,6 +202,10 @@ func _run() -> void:
navigation_region.navigation_mesh.get_polygon_count() > 0,
"Jajce navigation mesh should contain baked polygons"
)
_check(
navigation_region.navigation_mesh.resource_path == "res://world/jajce/JajceNavigationMesh.tres",
"Jajce navigation should use the Terrain3D-derived baked mesh resource"
)
await _wait_for_navigation_map(navigation_map)
NavigationServer3D.map_force_update(navigation_map)
@@ -224,6 +227,9 @@ func _run() -> void:
_check_path_tracks_terrain(
terrain, path, "Jajce navigation path should track Terrain3D height"
)
_check_path_reaches_destination(
path, destination, "Jajce navigation path should reach its requested target"
)
var adapter := ActiveWorldAdapter.new()
adapter.pantry_storage = pantry
@@ -330,3 +336,17 @@ func _check_path_tracks_terrain(terrain: Terrain3D, path: PackedVector3Array, me
% [message, point, terrain_height]
)
return
func _check_path_reaches_destination(path: PackedVector3Array, destination: Vector3, message: String) -> void:
if path.is_empty():
return
var final_point := path[path.size() - 1]
var final_xz := Vector2(final_point.x, final_point.z)
var destination_xz := Vector2(destination.x, destination.z)
if final_xz.distance_to(destination_xz) > 1.5:
failures.append(
"%s: final path point %s is too far from %s"
% [message, final_point, destination]
)