From 324084f23320cb038db83a3056d86f7e27528f24 Mon Sep 17 00:00:00 2001 From: Rijad Zuzo Date: Wed, 8 Jul 2026 15:53:39 +0200 Subject: [PATCH] feat: bake jajce terrain navigation --- docs/BUILD_IN_PUBLIC_PLAN.md | 10 ++-- docs/LEARNING_ROADMAP.md | 4 ++ docs/PROJECT_CONTEXT.md | 18 +++--- tests/jajce_runtime_integration_test.gd | 30 ++++++++-- tests/jajce_world_scaffold_test.gd | 28 ++++++++-- tools/bake_jajce_navigation.gd | 74 +++++++++++++++++++++++++ world/jajce/JajceNavigationMesh.tres | 11 ++++ world/jajce/JajceWorld.tscn | 16 +----- 8 files changed, 157 insertions(+), 34 deletions(-) create mode 100644 tools/bake_jajce_navigation.gd create mode 100644 world/jajce/JajceNavigationMesh.tres diff --git a/docs/BUILD_IN_PUBLIC_PLAN.md b/docs/BUILD_IN_PUBLIC_PLAN.md index c4d3c3a..42ded52 100644 --- a/docs/BUILD_IN_PUBLIC_PLAN.md +++ b/docs/BUILD_IN_PUBLIC_PLAN.md @@ -626,14 +626,14 @@ Completed: 8. Base Terrain3D collision/navigation guardrails: runtime tests now keep Terrain3D collision enabled, keep the old greybox ground out of physics, and verify required navigation paths track the authored height field. +9. Terrain3D-derived playable-loop navigation: `JajceWorld` now uses an + external baked navigation resource generated from Terrain3D source geometry, + and runtime tests reject partial paths that do not reach their targets. Next: -1. Continue replacing the temporary greybox navigation source with baked - Terrain3D-derived navigation for the sculpted playable loop. - -2. Capture and visually review “Jajce Lookdev 01.” -3. Capture “Simulation Garden 01.” +1. Capture and visually review “Jajce Lookdev 01.” +2. Capture “Simulation Garden 01.” Do not start with GIS data, a full city, a large asset pack, or more NPC mechanics. The next proof is a beautiful stage for the systems that already diff --git a/docs/LEARNING_ROADMAP.md b/docs/LEARNING_ROADMAP.md index a82bcfd..4e7a307 100644 --- a/docs/LEARNING_ROADMAP.md +++ b/docs/LEARNING_ROADMAP.md @@ -674,6 +674,10 @@ Recently completed: now assert Terrain3D collision remains enabled, the hidden greybox ground no longer provides physics collision, and tested navigation routes stay close to the authored Terrain3D height field. +- The temporary greybox navigation source was replaced by a project-owned + Terrain3D-derived navigation mesh resource generated by + `tools/bake_jajce_navigation.gd`; route tests now also reject partial paths + that do not reach their requested targets. This order strengthens the simulation while regularly producing visible progress suitable for public development updates. diff --git a/docs/PROJECT_CONTEXT.md b/docs/PROJECT_CONTEXT.md index 2552a53..eea7e6b 100644 --- a/docs/PROJECT_CONTEXT.md +++ b/docs/PROJECT_CONTEXT.md @@ -193,8 +193,8 @@ study, and patrol target typed activity sites. The migration is documented in - **Main scene:** `res://main.tscn` - **Terrain:** Terrain3D 1.0.2 is installed and enabled - **Jajce runtime:** reusable 512 m Terrain3D seed, greybox landmarks, stable - ResourceNode placement, lookdev camera, tested runtime navigation, and base - Terrain3D collision/navigation guardrails + ResourceNode placement, lookdev camera, and Terrain3D-derived runtime + navigation with collision guardrails - **Terrain compatibility floor:** Godot 4.4 according to the bundled extension - **Version control:** Git - **Primary branch:** `main` @@ -328,10 +328,11 @@ distance with resource `safety_risk`, `comfort_distance`, and - warm sky, fog, shadows, and wind-reactive foliage; - eight ResourceNodes preserving stable food/wood discovery IDs; - typed village pantry storage and typed guard, study, and rest activity sites; -- a temporary baked navigation loop with 24 tested routes; +- a Terrain3D-derived baked navigation mesh covering the current playable loop; - base collision/navigation guardrails that keep Terrain3D collision enabled, - keep the hidden greybox ground out of runtime physics, and compare required - navigation paths against the Terrain3D height field; + keep the old greybox ground out of runtime physics, require paths to reach + their targets, and compare required navigation paths against the Terrain3D + height field; - a look-development scene and camera. This is a runtime integration proof, not the final terrain composition. @@ -538,9 +539,10 @@ These are expected prototype constraints, not necessarily isolated bugs: mutation APIs, but selection, execution, target resolution, and active-world queries now have focused collaborators. - Path failure and interruption emit a `navigation_failed` signal and send the NPC to wander; this is functional but not yet polished. -- The old greybox navigation source remains temporary; current tests now guard - against collision/nav regressions, but the next terrain base phase is a - Terrain3D-derived bake for the sculpted playable loop. +- The old greybox navigation source has been replaced by a project-owned + Terrain3D-derived navigation resource. The current bake is still a first + playable-loop pass, so future terrain sculpting should rerun the bake tool and + recheck reachability rather than hand-editing navigation polygons. - Terrain3D and the bounded Jajce beauty baseline now run in the main game scene; final visual review and character/profession readability remain. - Combat, companions, factions, politics, trade, rumours, quests, persistence, diff --git a/tests/jajce_runtime_integration_test.gd b/tests/jajce_runtime_integration_test.gd index e9b0e74..bcb521d 100644 --- a/tests/jajce_runtime_integration_test.gd +++ b/tests/jajce_runtime_integration_test.gd @@ -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] + ) diff --git a/tests/jajce_world_scaffold_test.gd b/tests/jajce_world_scaffold_test.gd index cdf5009..89df0a5 100644 --- a/tests/jajce_world_scaffold_test.gd +++ b/tests/jajce_world_scaffold_test.gd @@ -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] + ) diff --git a/tools/bake_jajce_navigation.gd b/tools/bake_jajce_navigation.gd new file mode 100644 index 0000000..fb4d898 --- /dev/null +++ b/tools/bake_jajce_navigation.gd @@ -0,0 +1,74 @@ +extends SceneTree + +const OUTPUT_PATH := "res://world/jajce/JajceNavigationMesh.tres" +const WORLD_SCENE_PATH := "res://world/jajce/JajceWorld.tscn" +const TERRAIN_PATH := "TerrainRoot/Terrain3D" + + +func _initialize() -> void: + call_deferred("_run") + + +func _run() -> void: + var world_scene := load(WORLD_SCENE_PATH) as PackedScene + if world_scene == null: + push_error("Could not load %s" % WORLD_SCENE_PATH) + quit(1) + return + + var world := world_scene.instantiate() as Node3D + root.add_child(world) + await process_frame + for _frame in 10: + await physics_frame + + var terrain := world.get_node(TERRAIN_PATH) as Terrain3D + if terrain == null or terrain.data == null: + push_error("Jajce Terrain3D data is not available") + quit(1) + return + + var nav_mesh := _create_navigation_mesh_template() + var bake_aabb: AABB = nav_mesh.filter_baking_aabb + bake_aabb.position += nav_mesh.filter_baking_aabb_offset + + var terrain_faces: PackedVector3Array = terrain.generate_nav_mesh_source_geometry(bake_aabb, false) + if terrain_faces.is_empty(): + push_error("Terrain3D produced no navigation source faces") + quit(1) + return + + var source_geometry := NavigationMeshSourceGeometryData3D.new() + source_geometry.add_faces(terrain_faces, Transform3D.IDENTITY) + NavigationServer3D.bake_from_source_geometry_data(nav_mesh, source_geometry) + + if nav_mesh.get_polygon_count() == 0: + push_error("Baked Jajce navigation mesh contains no polygons") + quit(1) + return + + var error := ResourceSaver.save(nav_mesh, OUTPUT_PATH) + if error != OK: + push_error("Could not save %s: %s" % [OUTPUT_PATH, error_string(error)]) + quit(1) + return + + print( + "[TOOL] Saved %s with %d vertices and %d polygons" + % [OUTPUT_PATH, nav_mesh.get_vertices().size(), nav_mesh.get_polygon_count()] + ) + quit(0) + + +func _create_navigation_mesh_template() -> NavigationMesh: + var nav_mesh := NavigationMesh.new() + nav_mesh.agent_height = 1.7 + nav_mesh.agent_radius = 0.4 + nav_mesh.agent_max_climb = 0.55 + nav_mesh.agent_max_slope = 35.0 + nav_mesh.cell_size = 0.25 + nav_mesh.cell_height = 0.1 + nav_mesh.filter_baking_aabb = AABB( + Vector3(-36.0, -8.0, -36.0), Vector3(72.0, 32.0, 72.0) + ) + return nav_mesh diff --git a/world/jajce/JajceNavigationMesh.tres b/world/jajce/JajceNavigationMesh.tres new file mode 100644 index 0000000..a5fb734 --- /dev/null +++ b/world/jajce/JajceNavigationMesh.tres @@ -0,0 +1,11 @@ +[gd_resource type="NavigationMesh" format=3] + +[resource] +vertices = PackedVector3Array(-33.25, 10.300001, -21.25, -32.5, 9.800001, -21.25, -32.25, 9.900002, -22.25, -28.5, 6.2000003, -17.25, -28.5, 5.9, -16, -27.5, 5.1, -15.25, -35.5, 11.5, -20, -33.5, 10.300001, -20.5, -29.5, 7.7000003, -20.25, -29.5, 7.1, -18, -28.833334, 6.6, -18.25, -35.5, 10.5, -35.5, -35.5, 11.1, -32.681816, -35.5, 11.700001, -28.454544, -35.5, 11.800001, -24.227272, -32.575, 10.300001, -23.575, -33.55, 11.1, -27.55, -34.525, 11.1, -31.525, -34.489986, 11.300001, -25.514011, -27.5, 3.2000003, -3, -26.5, 2.5000005, -2.25, 35.5, 3.1, -0.25, 31.435486, 1.7000003, -1.2177429, 23.306454, 0.2999997, -3.153225, -15.306452, 0.20000029, -12.346775, -17.33871, 0.2999997, -12.830645, -19.370968, 0.7000003, -13.314516, -23.435484, 2.4, -14.282259, -27.5, 3.9, -11.166666, -27.5, 3.2999997, -7.083332, -24.5, 1.2999997, -2.185482, -22.5, 0.5000005, -2.1209679, -20.5, 0.20000029, -2.05645, 21.5, 0.20000029, -0.7016144, 25.5, 0.5999999, -0.57258224, 29.5, 1.2999997, -0.4435501, -24.00977, 1.5999999, -9.016245, -20.989746, 0.5000005, -8.99427, -25.525, 3.2000003, -13.525, -22.484951, 1.4000001, -11.9810505, -23.989384, 1.2000003, -6.014658, -22.499096, 0.5999999, -4.500967, -25.51912, 1.9000001, -4.5229416, -25.504614, 2.1, -7.5234127, -23.984108, 1.0999999, -4.5119553, -18.019844, 0.20000029, -10.482166, -20.988781, 0.20000029, -3.0153046, -26.5, 2.5000005, -0.25, -26.5, 2.2999997, -1.25, -24.5, 1.2999997, -0.25, -22.5, 0.5000005, -0.25, -20.5, 0.20000029, -0.25, 21.5, 0.20000029, -0.25, 25.5, 0.5999999, -0.25, 29.5, 1.2999997, -0.25, -31.5, 9.400002, -22.25, -32.3, 10.300001, -24.9, -33.1, 10.900002, -27.55, -34.3, 11, -31.525, -30.590908, 9, -23.022728, -31.681818, 10.1, -25.795456, -32.772728, 10.800001, -28.568182, -33.863636, 10.900002, -31.340908, 35.5, 3.4, -35.5, 30.919357, 2.5000005, -35.5, 28.629028, 2.2999997, -35.5, 1.1451607, 3.1, -35.5, -5.725807, 3.9, -35.5, -10.306452, 4.7999997, -35.5, -21.758064, 7.9, -35.5, 35.5, 3.1, -3.1875, 35.5, 3.7000003, -14.9375, 35.5, 3.7000003, -19.34375, 35.5, 3.5000005, -22.28125, 35.5, 3.9, -28.15625, 35.5, 3.9, -31.09375, 1.4890518, 0.5000005, -23.983337, 20.97575, 0.9000001, -19.484158, -12.015022, 0.7000003, -20.987331, -22.510105, 3.9, -21.01424, -25.489384, 8.200001, -33.01466, 10.518063, 1.2000003, -26.98428, 28.507294, 1.7000003, -14.97781, 19.486519, 2.2999997, -31.490625, 26.987122, 2.2999997, -29.991272, -23.987215, 6.5000005, -26.98698, -16.481094, 2.6, -24.015182, 14.976715, 0.20000029, -16.50519, -16.499552, 1.2000003, -19.508835, -28.51119, 7.7999997, -24.003078, -27.02413, 5.2999997, -18.024286, 21.022644, 0.4000001, -13.509184, -9.02449, 0.20000029, -19.503899, -7.521023, 0.9000001, -23.99926, -19.49907, 1.7000003, -18.019352, -29.993336, 9.5, -30.008781, -33.014446, 10.400002, -33.019592, -15.008057, 0.20000029, -14.996435, -28.49225, 8.6, -27.019943, -1.5025635, 1.5999999, -28.505608, -11.976057, 1.5000005, -23.98222, 8.991436, 2.0000005, -31.517536, 24.014233, 1.7999997, -24.018532, 21.022617, 1.7999997, -28.4908, -19.498251, 5.7000003, -29.98187, -31.489986, 9.800001, -34.51401, 25.488354, 0.7999997, -10.510946, 29.993874, 1.5999999, -7.4885006, 10.5046425, 0.5000005, -22.494968, 28.524788, 2.2000003, -22.513124, 5.9853134, 2.7000003, -34.489334, -17.993551, 0.9000001, -16.496906, -14.977142, 3.2000003, -27.021059, -10.481575, 1.7000003, -25.504665, -23.97883, 7.6, -31.509253, -28.509409, 9.200001, -32.986633, -25.499939, 8.400002, -34.520065, 6.005123, 0.20000029, -21.005486, -25.512756, 7.4, -28.4814, -24.004105, 3.6, -18.002312, -25.518612, 4.0000005, -16.50184, -26.998856, 8.6, -31.481226, 30.007149, 2.7000003, -30.019299, -22.492733, 6.2000003, -28.509426, -22.479916, 7.7000003, -34.49809, 25.521801, 1.2000003, -16.47828, -31.503891, 10.1, -31.514187, 32.983772, 3.1, -25.48604, -20.998104, 1.5000005, -14.990383, 31.520836, 2.6, -19.507248, -17.988783, 5.6, -31.515305, 25.509102, 0.5999999, -4.479746, -20.984348, 7.0000005, -32.981697, 28.488205, 2.5000005, -27.002434, 0.005821228, 2.7000003, -32.97788, -4.5097713, 3.4, -34.516247, -18.00507, 2.1, -20.98128, 11.975361, 2.7000003, -34.495388, -25.522228, 7.1, -26.997969, -25.491165, 6.4, -23.981104, -28.500153, 7.0000005, -21.00819, -27.02066, 6.6, -22.519648, -4.4954796, 0.4000001, -22.50484, -25.513844, 8, -31.520239, -25.4883, 7.7999997, -29.975819, 16.520714, 0.5000005, -19.517118, -12.02401, 0.20000029, -18.014416, -14.990564, 1.7000003, -22.48175, -27.003624, 4.9, -16.512829, 30.006332, 2.2999997, -18.006777, 27.0158, 1.7999997, -19.49021, 24.016014, 2.4, -33.002083, -18.5, 2.9, 19.75, -18.5, 3.2999997, 20.5, -17.75, 2.9, 20.5, -7.5, 5.7999997, 31.75, -7.5, 6.2000003, 32.5, -6.75, 6.0000005, 32.5, -7.75, 5.0000005, 30.5, -8, 5.7000003, 31.5, -20.5, 2.6, 16.75, -20.5, 2.9, 17.5, -19.5, 2.5000005, 17.75, -17.5, 3.2999997, 21.5, -16.75, 2.9, 21.5, -11.75, 3.7000003, 26.5, -11.5, 4.2000003, 27.5, -10.75, 4.0000005, 27.5, -10.5, 4.5000005, 28.5, -9.75, 4.2999997, 28.5, -16.5, 3.2999997, 22.5, -15.5, 3.0000005, 22.75, -6.5, 6.6, 33.5, -5.5, 6.6, 33.75, -23.5, 2.2999997, 10.75, -23.5, 2.7000003, 12, -22.5, 2.2999997, 12.75, -22.5, 2.7000003, 14, -21.5, 2.4, 14.75, -21.5, 2.9, 16, -19.5, 3.0000005, 19, -25.5, 2.2999997, 4.75, -25.5, 2.7000003, 7, -24.5, 2.2000003, 7.75, -24.5, 2.7000003, 10, -23.833332, 2.2000003, 9.75, -6.25, 5.9, 32.666664, -15.5, 3.7000003, 24, -13, 4.1, 26.5, -13.833334, 3.7999997, 25.666668, -26.5, 2.9, 4, 35.5, 9, 35.5, -25.75, 1.9000001, 0.97999954, -24.25, 1.2999997, 3.4399986, -21.25, 0.5999999, 8.360001, -19, 0.5000005, 12.049999, -15.25, 0.9000001, 18.2, -13.75, 1.2999997, 20.66, -11.5, 2.2999997, 24.349998, -9.25, 3.7999997, 28.04, -1.1071434, 5.9, 33.9375, 12.071426, 5.2999997, 34.5, 13.535713, 5.1, 34.5625, 17.928574, 5.2000003, 34.75, 22.321426, 5.1, 34.9375, 26.714287, 6.1, 35.125, 29.642853, 7.2000003, 35.25, 35.5, 8.6, 32.520836, 35.5, 7.2999997, 28.052086, 35.5, 6.2999997, 22.09375, 35.5, 4.1, 11.666668, 35.5, 3.2000003, 4.21875, 35.5, 3.0000005, 1.2395821, 12.0204735, 0.4000001, 19.513142, -0.018127441, 1.2999997, 25.48764, 25.505966, 2.4, 21.01361, -3.009262, 0.20000029, 21.004856, 12.011967, 1.7000003, 25.47554, 28.502716, 1.5000005, 8.997097, -6.008539, 1.2000003, 24.01408, 21.002739, 3.4, 28.478714, 30.01281, 5.2999997, 28.494637, 19.513508, 0.2999997, 12.0222435, -4.492466, 3.1, 28.491936, 0.0125694275, 2.6, 28.524895, 29.996376, 4.0000005, 22.487171, 7.5211983, 0.5999999, 22.522366, 4.486908, 1.2999997, 25.520603, -12.010105, 0.2999997, 17.98576, 20.980545, 1.2999997, 19.479061, 25.477077, 3.2999997, 25.524422, 24.010857, 0.4000001, 3.005085, -22.489986, 0.5000005, 1.4859886, -10.484322, 0.7999997, 20.99992, -7.493189, 2.0000005, 25.482708, -18.022228, 0.20000029, 10.502033, 22.508953, 0.7999997, 13.478767, 19.486668, 2.0000005, 24.000862, 9.008621, 4.7999997, 32.980774, -20.989506, 0.20000029, 2.9754715, -3.0228043, 2.1, 26.984295, -2.988514, 0.9000001, 23.986053, 4.5176086, 2.5000005, 28.507858, 2.9932709, 4.1, 31.512146, -0.0038642883, 0.4000001, 22.51743, 13.479702, 0.20000029, 16.509968, 31.48317, 2.5000005, 10.514606, 10.487991, 3.4, 30.009445, 9.00045, 0.20000029, 19.491165, 31.520447, 1.7999997, 1.4815216, 11.976231, 0.9000001, 22.505325, 16.497704, 3.0000005, 28.49575, 28.488472, 5.7999997, 31.498924, 25.518452, 4.9, 31.476952, 31.5085, 6.7000003, 31.520897, 34.52385, 8.6, 34.489525, 26.988567, 1.5000005, 11.9771805, 25.487244, 0.7999997, 7.5186005, -7.478924, 0.7999997, 22.512493, 27.011726, 3.2999997, 24.005798, 12.003342, 4.1, 31.478065, 34.516037, 5.5000005, 20.979534, 31.505241, 3.7000003, 18.004387, -2.9771156, 3.7000003, 30.01056, 19.519749, 0.7000003, 16.503914, 22.523727, 4.7999997, 32.979652, 24.00874, 4.9, 32.99064, -5.997141, 4.2000003, 29.988586, 33.016403, 5.2000003, 22.509148, 24.000568, 1.7999997, 19.501038, -21.75, 2.1, 14, -25.5, 2.0000005, 3.75, -17.55, 2.4, 19.900002, -14.625, 2.7000003, 23.125, -19.514927, 1.4000001, 14.990921, -21.019964, 1.2000003, 12.007961, -22.489986, 1.2000003, 8.985989, -17.994904, 1.7999997, 18.012897, -24.025, 1.5000005, 5.9749985, -14.65625, 2.7000003, 23.21875, -17.5625, 2.4, 19.9375, -14.638889, 2.7000003, 23.166668, -17.555555, 2.4, 19.916668, -5.75, 7.7999997, 35.5, -1.3303566, 7.0000005, 35.5, 11.928574, 5.6, 35.5, 14.875, 5.4, 35.5, 22.24107, 5.2999997, 35.5, 25.1875, 5.7999997, 35.5, -34.5, 21.800001, 32.25, -35.5, 22.300001, 31.25, -35.5, 22.400002, 35.5, -31.5, 20.400002, 34, -33.5, 21.2, 32, -31.25, 20.5, 35.5, -32.666668, 21.2, 35.5) +polygons = [PackedInt32Array(2, 1, 0), PackedInt32Array(5, 4, 3), PackedInt32Array(6, 0, 7), PackedInt32Array(3, 9, 10), PackedInt32Array(10, 9, 8), PackedInt32Array(17, 12, 11), PackedInt32Array(12, 17, 13), PackedInt32Array(13, 18, 14), PackedInt32Array(14, 0, 6), PackedInt32Array(0, 15, 2), PackedInt32Array(15, 18, 16), PackedInt32Array(16, 13, 17), PackedInt32Array(18, 15, 14), PackedInt32Array(13, 16, 18), PackedInt32Array(14, 15, 0), PackedInt32Array(3, 10, 5), PackedInt32Array(5, 10, 8), PackedInt32Array(35, 22, 21), PackedInt32Array(22, 35, 23), PackedInt32Array(23, 33, 24), PackedInt32Array(24, 45, 25), PackedInt32Array(25, 45, 26), PackedInt32Array(26, 39, 27), PackedInt32Array(27, 38, 5), PackedInt32Array(5, 38, 28), PackedInt32Array(28, 43, 29), PackedInt32Array(29, 42, 19), PackedInt32Array(19, 42, 20), PackedInt32Array(20, 42, 30), PackedInt32Array(30, 44, 31), PackedInt32Array(31, 46, 32), PackedInt32Array(32, 24, 33), PackedInt32Array(33, 23, 34), PackedInt32Array(34, 23, 35), PackedInt32Array(24, 32, 45), PackedInt32Array(45, 37, 26), PackedInt32Array(39, 38, 27), PackedInt32Array(26, 37, 39), PackedInt32Array(38, 36, 28), PackedInt32Array(43, 42, 29), PackedInt32Array(28, 36, 43), PackedInt32Array(42, 44, 30), PackedInt32Array(44, 41, 31), PackedInt32Array(46, 45, 32), PackedInt32Array(31, 41, 46), PackedInt32Array(45, 46, 37), PackedInt32Array(39, 36, 38), PackedInt32Array(37, 36, 39), PackedInt32Array(43, 40, 42), PackedInt32Array(36, 40, 43), PackedInt32Array(42, 40, 44), PackedInt32Array(44, 40, 41), PackedInt32Array(41, 37, 46), PackedInt32Array(37, 40, 36), PackedInt32Array(40, 37, 41), PackedInt32Array(20, 30, 48), PackedInt32Array(48, 30, 47), PackedInt32Array(47, 30, 49), PackedInt32Array(49, 30, 31), PackedInt32Array(49, 31, 50), PackedInt32Array(50, 31, 32), PackedInt32Array(50, 32, 51), PackedInt32Array(51, 32, 33), PackedInt32Array(51, 33, 52), PackedInt32Array(52, 33, 34), PackedInt32Array(52, 34, 53), PackedInt32Array(53, 34, 35), PackedInt32Array(53, 35, 54), PackedInt32Array(54, 35, 21), PackedInt32Array(2, 15, 55), PackedInt32Array(55, 15, 56), PackedInt32Array(56, 15, 57), PackedInt32Array(57, 15, 16), PackedInt32Array(57, 16, 58), PackedInt32Array(58, 16, 17), PackedInt32Array(58, 17, 11), PackedInt32Array(8, 55, 59), PackedInt32Array(59, 55, 56), PackedInt32Array(59, 56, 60), PackedInt32Array(60, 56, 57), PackedInt32Array(60, 57, 61), PackedInt32Array(61, 57, 62), PackedInt32Array(62, 57, 58), PackedInt32Array(62, 58, 11), PackedInt32Array(75, 64, 63), PackedInt32Array(64, 122, 65), PackedInt32Array(65, 137, 66), PackedInt32Array(66, 135, 67), PackedInt32Array(67, 135, 68), PackedInt32Array(68, 130, 69), PackedInt32Array(69, 105, 11), PackedInt32Array(11, 96, 62), PackedInt32Array(62, 126, 61), PackedInt32Array(61, 98, 60), PackedInt32Array(60, 89, 59), PackedInt32Array(59, 140, 8), PackedInt32Array(8, 148, 5), PackedInt32Array(5, 120, 27), PackedInt32Array(27, 128, 26), PackedInt32Array(26, 111, 25), PackedInt32Array(25, 97, 24), PackedInt32Array(24, 87, 23), PackedInt32Array(23, 131, 22), PackedInt32Array(22, 70, 21), PackedInt32Array(70, 107, 71), PackedInt32Array(71, 129, 72), PackedInt32Array(72, 129, 73), PackedInt32Array(73, 127, 74), PackedInt32Array(74, 122, 75), PackedInt32Array(75, 122, 64), PackedInt32Array(122, 84, 65), PackedInt32Array(137, 110, 66), PackedInt32Array(65, 151, 137), PackedInt32Array(66, 134, 135), PackedInt32Array(135, 113, 68), PackedInt32Array(130, 132, 69), PackedInt32Array(68, 112, 130), PackedInt32Array(105, 96, 11), PackedInt32Array(69, 116, 105), PackedInt32Array(96, 126, 62), PackedInt32Array(126, 95, 61), PackedInt32Array(98, 89, 60), PackedInt32Array(61, 95, 98), PackedInt32Array(89, 140, 59), PackedInt32Array(140, 90, 8), PackedInt32Array(148, 120, 5), PackedInt32Array(8, 90, 148), PackedInt32Array(120, 119, 27), PackedInt32Array(128, 111, 26), PackedInt32Array(27, 119, 128), PackedInt32Array(111, 97, 25), PackedInt32Array(97, 146, 24), PackedInt32Array(87, 91, 23), PackedInt32Array(24, 117, 87), PackedInt32Array(131, 107, 22), PackedInt32Array(23, 106, 131), PackedInt32Array(22, 107, 70), PackedInt32Array(107, 82, 71), PackedInt32Array(71, 149, 129), PackedInt32Array(129, 127, 73), PackedInt32Array(127, 122, 74), PackedInt32Array(84, 151, 65), PackedInt32Array(122, 133, 84), PackedInt32Array(110, 134, 66), PackedInt32Array(137, 101, 110), PackedInt32Array(151, 83, 137), PackedInt32Array(134, 99, 135), PackedInt32Array(113, 112, 68), PackedInt32Array(135, 99, 113), PackedInt32Array(132, 124, 69), PackedInt32Array(130, 104, 132), PackedInt32Array(112, 104, 130), PackedInt32Array(105, 126, 96), PackedInt32Array(116, 115, 105), PackedInt32Array(69, 124, 116), PackedInt32Array(126, 115, 95), PackedInt32Array(98, 138, 89), PackedInt32Array(95, 121, 98), PackedInt32Array(89, 141, 140), PackedInt32Array(140, 141, 90), PackedInt32Array(148, 90, 120), PackedInt32Array(120, 90, 119), PackedInt32Array(128, 94, 111), PackedInt32Array(119, 94, 128), PackedInt32Array(111, 88, 97), PackedInt32Array(146, 92, 24), PackedInt32Array(97, 88, 146), PackedInt32Array(91, 106, 23), PackedInt32Array(87, 145, 91), PackedInt32Array(117, 108, 87), PackedInt32Array(24, 92, 117), PackedInt32Array(131, 106, 107), PackedInt32Array(82, 149, 71), PackedInt32Array(107, 106, 82), PackedInt32Array(149, 109, 129), PackedInt32Array(129, 109, 127), PackedInt32Array(127, 133, 122), PackedInt32Array(84, 103, 151), PackedInt32Array(133, 102, 84), PackedInt32Array(110, 101, 134), PackedInt32Array(137, 81, 101), PackedInt32Array(83, 81, 137), PackedInt32Array(151, 103, 83), PackedInt32Array(134, 101, 99), PackedInt32Array(113, 100, 112), PackedInt32Array(99, 93, 113), PackedInt32Array(132, 114, 124), PackedInt32Array(104, 123, 132), PackedInt32Array(112, 86, 104), PackedInt32Array(105, 115, 126), PackedInt32Array(116, 80, 115), PackedInt32Array(124, 80, 116), PackedInt32Array(115, 121, 95), PackedInt32Array(138, 139, 89), PackedInt32Array(98, 118, 138), PackedInt32Array(121, 118, 98), PackedInt32Array(89, 139, 141), PackedInt32Array(141, 119, 90), PackedInt32Array(94, 88, 111), PackedInt32Array(119, 79, 94), PackedInt32Array(146, 78, 92), PackedInt32Array(88, 78, 146), PackedInt32Array(91, 125, 106), PackedInt32Array(145, 77, 91), PackedInt32Array(87, 108, 145), PackedInt32Array(117, 81, 108), PackedInt32Array(92, 142, 117), PackedInt32Array(82, 125, 149), PackedInt32Array(106, 125, 82), PackedInt32Array(149, 150, 109), PackedInt32Array(109, 133, 127), PackedInt32Array(84, 102, 103), PackedInt32Array(133, 109, 102), PackedInt32Array(81, 76, 101), PackedInt32Array(83, 103, 81), PackedInt32Array(101, 76, 99), PackedInt32Array(100, 86, 112), PackedInt32Array(113, 93, 100), PackedInt32Array(99, 142, 93), PackedInt32Array(114, 80, 124), PackedInt32Array(132, 123, 114), PackedInt32Array(104, 86, 123), PackedInt32Array(80, 121, 115), PackedInt32Array(138, 85, 139), PackedInt32Array(118, 85, 138), PackedInt32Array(121, 144, 118), PackedInt32Array(139, 79, 141), PackedInt32Array(141, 79, 119), PackedInt32Array(94, 136, 88), PackedInt32Array(79, 136, 94), PackedInt32Array(78, 93, 92), PackedInt32Array(88, 147, 78), PackedInt32Array(91, 77, 125), PackedInt32Array(145, 103, 77), PackedInt32Array(108, 81, 145), PackedInt32Array(117, 76, 81), PackedInt32Array(142, 76, 117), PackedInt32Array(92, 93, 142), PackedInt32Array(125, 150, 149), PackedInt32Array(150, 102, 109), PackedInt32Array(102, 77, 103), PackedInt32Array(103, 145, 81), PackedInt32Array(76, 142, 99), PackedInt32Array(100, 147, 86), PackedInt32Array(93, 78, 100), PackedInt32Array(114, 143, 80), PackedInt32Array(123, 144, 114), PackedInt32Array(86, 85, 123), PackedInt32Array(80, 143, 121), PackedInt32Array(85, 79, 139), PackedInt32Array(118, 123, 85), PackedInt32Array(144, 123, 118), PackedInt32Array(121, 143, 144), PackedInt32Array(136, 147, 88), PackedInt32Array(79, 86, 136), PackedInt32Array(147, 100, 78), PackedInt32Array(77, 150, 125), PackedInt32Array(150, 77, 102), PackedInt32Array(147, 136, 86), PackedInt32Array(114, 144, 143), PackedInt32Array(86, 79, 85), PackedInt32Array(154, 153, 152), PackedInt32Array(157, 156, 155), PackedInt32Array(155, 159, 158), PackedInt32Array(162, 161, 160), PackedInt32Array(154, 164, 163), PackedInt32Array(165, 167, 166), PackedInt32Array(167, 169, 168), PackedInt32Array(170, 164, 171), PackedInt32Array(172, 157, 173), PackedInt32Array(176, 175, 174), PackedInt32Array(178, 177, 176), PackedInt32Array(160, 179, 178), PackedInt32Array(152, 180, 162), PackedInt32Array(158, 157, 155), PackedInt32Array(183, 182, 181), PackedInt32Array(174, 184, 185), PackedInt32Array(185, 184, 183), PackedInt32Array(154, 152, 162), PackedInt32Array(162, 160, 178), PackedInt32Array(173, 157, 186), PackedInt32Array(186, 157, 158), PackedInt32Array(188, 189, 165), PackedInt32Array(165, 189, 187), PackedInt32Array(165, 187, 171), PackedInt32Array(164, 154, 162), PackedInt32Array(181, 190, 47), PackedInt32Array(212, 249, 21), PackedInt32Array(21, 249, 54), PackedInt32Array(54, 231, 53), PackedInt32Array(53, 231, 52), PackedInt32Array(52, 245, 51), PackedInt32Array(51, 232, 50), PackedInt32Array(50, 232, 49), PackedInt32Array(49, 192, 47), PackedInt32Array(192, 232, 193), PackedInt32Array(193, 239, 194), PackedInt32Array(194, 235, 195), PackedInt32Array(195, 235, 196), PackedInt32Array(196, 228, 197), PackedInt32Array(197, 233, 198), PackedInt32Array(198, 234, 199), PackedInt32Array(199, 267, 158), PackedInt32Array(158, 267, 186), PackedInt32Array(186, 263, 173), PackedInt32Array(173, 263, 200), PackedInt32Array(200, 238, 201), PackedInt32Array(201, 260, 202), PackedInt32Array(202, 251, 203), PackedInt32Array(203, 265, 204), PackedInt32Array(204, 266, 205), PackedInt32Array(205, 252, 206), PackedInt32Array(206, 255, 191), PackedInt32Array(191, 255, 207), PackedInt32Array(207, 254, 208), PackedInt32Array(208, 268, 209), PackedInt32Array(209, 261, 210), PackedInt32Array(210, 246, 211), PackedInt32Array(211, 249, 212), PackedInt32Array(249, 231, 54), PackedInt32Array(231, 222, 52), PackedInt32Array(245, 216, 51), PackedInt32Array(52, 222, 245), PackedInt32Array(51, 239, 232), PackedInt32Array(232, 192, 49), PackedInt32Array(232, 239, 193), PackedInt32Array(239, 235, 194), PackedInt32Array(235, 228, 196), PackedInt32Array(228, 233, 197), PackedInt32Array(233, 258, 198), PackedInt32Array(234, 267, 199), PackedInt32Array(198, 258, 234), PackedInt32Array(267, 263, 186), PackedInt32Array(263, 224, 200), PackedInt32Array(238, 260, 201), PackedInt32Array(200, 243, 238), PackedInt32Array(260, 251, 202), PackedInt32Array(251, 220, 203), PackedInt32Array(265, 266, 204), PackedInt32Array(203, 220, 265), PackedInt32Array(266, 253, 205), PackedInt32Array(252, 254, 206), PackedInt32Array(205, 253, 252), PackedInt32Array(206, 254, 255), PackedInt32Array(255, 254, 207), PackedInt32Array(254, 221, 208), PackedInt32Array(268, 261, 209), PackedInt32Array(208, 221, 268), PackedInt32Array(261, 262, 210), PackedInt32Array(246, 218, 211), PackedInt32Array(210, 262, 246), PackedInt32Array(211, 218, 249), PackedInt32Array(249, 257, 231), PackedInt32Array(231, 257, 222), PackedInt32Array(216, 235, 51), PackedInt32Array(245, 248, 216), PackedInt32Array(222, 264, 245), PackedInt32Array(51, 235, 239), PackedInt32Array(235, 216, 228), PackedInt32Array(228, 216, 233), PackedInt32Array(233, 216, 258), PackedInt32Array(234, 223, 267), PackedInt32Array(258, 219, 234), PackedInt32Array(267, 223, 263), PackedInt32Array(224, 243, 200), PackedInt32Array(263, 240, 224), PackedInt32Array(238, 247, 260), PackedInt32Array(243, 242, 238), PackedInt32Array(260, 247, 251), PackedInt32Array(251, 237, 220), PackedInt32Array(265, 253, 266), PackedInt32Array(220, 253, 265), PackedInt32Array(252, 221, 254), PackedInt32Array(253, 221, 252), PackedInt32Array(268, 262, 261), PackedInt32Array(221, 225, 268), PackedInt32Array(246, 256, 218), PackedInt32Array(262, 256, 246), PackedInt32Array(218, 257, 249), PackedInt32Array(257, 236, 222), PackedInt32Array(248, 244, 216), PackedInt32Array(245, 213, 248), PackedInt32Array(264, 229, 245), PackedInt32Array(222, 236, 264), PackedInt32Array(216, 219, 258), PackedInt32Array(234, 240, 223), PackedInt32Array(219, 240, 234), PackedInt32Array(223, 240, 263), PackedInt32Array(224, 242, 243), PackedInt32Array(240, 214, 224), PackedInt32Array(238, 242, 247), PackedInt32Array(247, 217, 251), PackedInt32Array(237, 230, 220), PackedInt32Array(251, 217, 237), PackedInt32Array(220, 230, 253), PackedInt32Array(253, 230, 221), PackedInt32Array(268, 225, 262), PackedInt32Array(221, 259, 225), PackedInt32Array(256, 257, 218), PackedInt32Array(262, 269, 256), PackedInt32Array(257, 256, 236), PackedInt32Array(244, 241, 216), PackedInt32Array(248, 226, 244), PackedInt32Array(213, 250, 248), PackedInt32Array(245, 229, 213), PackedInt32Array(264, 269, 229), PackedInt32Array(236, 269, 264), PackedInt32Array(216, 241, 219), PackedInt32Array(219, 241, 240), PackedInt32Array(224, 227, 242), PackedInt32Array(214, 227, 224), PackedInt32Array(240, 241, 214), PackedInt32Array(242, 227, 247), PackedInt32Array(247, 227, 217), PackedInt32Array(237, 215, 230), PackedInt32Array(217, 250, 237), PackedInt32Array(230, 259, 221), PackedInt32Array(225, 215, 262), PackedInt32Array(259, 215, 225), PackedInt32Array(269, 236, 256), PackedInt32Array(262, 215, 269), PackedInt32Array(244, 214, 241), PackedInt32Array(226, 227, 244), PackedInt32Array(248, 250, 226), PackedInt32Array(213, 237, 250), PackedInt32Array(229, 237, 213), PackedInt32Array(269, 237, 229), PackedInt32Array(214, 244, 227), PackedInt32Array(227, 226, 217), PackedInt32Array(215, 259, 230), PackedInt32Array(237, 269, 215), PackedInt32Array(217, 226, 250), PackedInt32Array(174, 185, 176), PackedInt32Array(176, 185, 183), PackedInt32Array(176, 270, 178), PackedInt32Array(178, 270, 162), PackedInt32Array(171, 164, 162), PackedInt32Array(183, 181, 271), PackedInt32Array(271, 181, 47), PackedInt32Array(192, 271, 47), PackedInt32Array(271, 278, 183), PackedInt32Array(183, 276, 176), PackedInt32Array(176, 275, 270), PackedInt32Array(270, 274, 162), PackedInt32Array(162, 277, 272), PackedInt32Array(272, 197, 273), PackedInt32Array(273, 198, 169), PackedInt32Array(169, 199, 158), PackedInt32Array(199, 169, 198), PackedInt32Array(198, 273, 197), PackedInt32Array(197, 272, 196), PackedInt32Array(196, 274, 195), PackedInt32Array(195, 275, 194), PackedInt32Array(194, 278, 193), PackedInt32Array(193, 271, 192), PackedInt32Array(278, 276, 183), PackedInt32Array(271, 193, 278), PackedInt32Array(276, 275, 176), PackedInt32Array(275, 274, 270), PackedInt32Array(274, 277, 162), PackedInt32Array(277, 196, 272), PackedInt32Array(274, 275, 195), PackedInt32Array(196, 277, 274), PackedInt32Array(275, 276, 194), PackedInt32Array(194, 276, 278), PackedInt32Array(165, 171, 279), PackedInt32Array(279, 171, 280), PackedInt32Array(280, 171, 162), PackedInt32Array(162, 282, 280), PackedInt32Array(280, 282, 281), PackedInt32Array(280, 281, 279), PackedInt32Array(279, 281, 165), PackedInt32Array(165, 281, 167), PackedInt32Array(162, 272, 282), PackedInt32Array(282, 272, 273), PackedInt32Array(282, 273, 281), PackedInt32Array(281, 273, 167), PackedInt32Array(167, 273, 169), PackedInt32Array(283, 173, 284), PackedInt32Array(284, 173, 200), PackedInt32Array(284, 200, 285), PackedInt32Array(285, 200, 201), PackedInt32Array(285, 201, 202), PackedInt32Array(285, 202, 286), PackedInt32Array(286, 202, 203), PackedInt32Array(286, 203, 287), PackedInt32Array(287, 203, 204), PackedInt32Array(287, 204, 288), PackedInt32Array(288, 204, 205), PackedInt32Array(288, 205, 206), PackedInt32Array(288, 206, 191), PackedInt32Array(291, 290, 289), PackedInt32Array(294, 295, 292), PackedInt32Array(292, 295, 293), PackedInt32Array(293, 295, 289), PackedInt32Array(289, 295, 291)] +cell_height = 0.1 +agent_height = 1.7 +agent_radius = 0.4 +agent_max_climb = 0.55 +agent_max_slope = 35.0 +filter_baking_aabb = AABB(-36, -8, -36, 72, 32, 72) diff --git a/world/jajce/JajceWorld.tscn b/world/jajce/JajceWorld.tscn index f0f899e..50ed59c 100644 --- a/world/jajce/JajceWorld.tscn +++ b/world/jajce/JajceWorld.tscn @@ -1,4 +1,4 @@ -[gd_scene load_steps=26 format=3] +[gd_scene load_steps=27 format=3] [ext_resource type="Terrain3DAssets" path="res://terrain/jajce/assets.tres" id="1_assets"] [ext_resource type="PackedScene" path="res://world/resource_nodes/ResourceNode.tscn" id="2_resource"] @@ -15,6 +15,7 @@ [ext_resource type="Script" path="res://world/jajce/day_night_cycle.gd" id="13_daynight"] [ext_resource type="PackedScene" path="res://world/storage/StorageNode.tscn" id="14_storage"] [ext_resource type="Script" path="res://world/activity/ActivitySite.gd" id="15_activity"] +[ext_resource type="NavigationMesh" path="res://world/jajce/JajceNavigationMesh.tres" id="16_nav"] [sub_resource type="Terrain3DMaterial" id="Terrain3DMaterial_jajce"] _shader_parameters = { @@ -118,18 +119,7 @@ size = Vector3(2.8, 0.3, 0.9) script = ExtResource("3_world") [node name="NavigationRegion3D" type="NavigationRegion3D" parent="."] -navigation_mesh = SubResource("NavigationMesh_greybox") - -[node name="GreyboxGround" type="StaticBody3D" parent="NavigationRegion3D"] -collision_layer = 0 -collision_mask = 0 - -[node name="Mesh" type="MeshInstance3D" parent="NavigationRegion3D/GreyboxGround"] -visible = false -mesh = SubResource("Mesh_ground") - -[node name="Collision" type="CollisionShape3D" parent="NavigationRegion3D/GreyboxGround"] -shape = SubResource("Shape_ground") +navigation_mesh = ExtResource("16_nav") [node name="TerrainRoot" type="Node3D" parent="."]