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