use crate::nav_mesh_builder::NavMeshBuilder;
use crate::{NavMesh, NavMeshCreateParams, NavMeshParams, PolyFlags};
pub fn create_minimal_test_navmesh() -> Result<NavMesh, Box<dyn std::error::Error>> {
let nav_mesh_params = NavMeshParams {
origin: [0.0, 0.0, 0.0],
tile_width: 1.0, tile_height: 1.0,
max_tiles: 1,
max_polys_per_tile: 1,
};
let mut nav_mesh = NavMesh::new(nav_mesh_params.clone())?;
let verts = vec![
0.0, 0.0, 0.0, 2.0, 0.0, 0.0, 2.0, 0.0, 2.0, 0.0, 0.0, 2.0, ];
let polys = vec![
0, 1, 2, 3, 0, 0, ];
let poly_flags = vec![PolyFlags::WALK];
let poly_areas = vec![0u8];
let cs = 0.3f32; let ch = 0.2f32;
let tile_params = NavMeshCreateParams {
nav_mesh_params: nav_mesh_params,
verts,
vert_count: 4,
polys,
poly_flags,
poly_areas,
poly_count: 1,
nvp: 6,
detail_meshes: vec![],
detail_verts: vec![],
detail_vert_count: 0,
detail_tris: vec![],
detail_tri_count: 0,
off_mesh_con_verts: vec![],
off_mesh_con_rad: vec![],
off_mesh_con_flags: vec![],
off_mesh_con_areas: vec![],
off_mesh_con_dir: vec![],
off_mesh_con_user_id: vec![],
off_mesh_con_count: 0,
bmin: [0.0, 0.0, 0.0],
bmax: [2.0 * cs, 1.0, 2.0 * cs],
walkable_height: 2.0,
walkable_radius: 0.6,
walkable_climb: 0.9,
cs,
ch,
build_bv_tree: true,
};
let tile = NavMeshBuilder::build_tile(&tile_params)?;
nav_mesh.add_mesh_tile(tile)?;
Ok(nav_mesh)
}
pub fn create_complex_test_navmesh() -> Result<NavMesh, Box<dyn std::error::Error>> {
let nav_mesh_params = NavMeshParams {
origin: [0.0, 0.0, 0.0],
tile_width: 10.0,
tile_height: 10.0,
max_tiles: 1,
max_polys_per_tile: 9,
};
let mut nav_mesh = NavMesh::new(nav_mesh_params.clone())?;
let mut verts = Vec::new();
for z in 0..4 {
for x in 0..4 {
verts.push(x as f32); verts.push(0.0); verts.push(z as f32); }
}
let mut polys = Vec::new();
let mut poly_flags = Vec::new();
let mut poly_areas = Vec::new();
for z in 0..3 {
for x in 0..3 {
let base_idx = (z * 4 + x) as u16;
polys.extend_from_slice(&[
base_idx, base_idx + 1, base_idx + 5, base_idx + 4, 0,
0, ]);
poly_flags.push(PolyFlags::WALK);
poly_areas.push(0u8);
}
}
let cs = 0.3f32;
let ch = 0.2f32;
let tile_params = NavMeshCreateParams {
nav_mesh_params: nav_mesh_params,
verts,
vert_count: 16,
polys,
poly_flags,
poly_areas,
poly_count: 9,
nvp: 6,
detail_meshes: vec![],
detail_verts: vec![],
detail_vert_count: 0,
detail_tris: vec![],
detail_tri_count: 0,
off_mesh_con_verts: vec![],
off_mesh_con_rad: vec![],
off_mesh_con_flags: vec![],
off_mesh_con_areas: vec![],
off_mesh_con_dir: vec![],
off_mesh_con_user_id: vec![],
off_mesh_con_count: 0,
bmin: [0.0, 0.0, 0.0],
bmax: [3.0 * cs, 1.0, 3.0 * cs],
walkable_height: 2.0,
walkable_radius: 0.6,
walkable_climb: 0.9,
cs,
ch,
build_bv_tree: true,
};
let tile = NavMeshBuilder::build_tile(&tile_params)?;
nav_mesh.add_mesh_tile(tile)?;
Ok(nav_mesh)
}
pub fn create_large_test_navmesh() -> Result<NavMesh, Box<dyn std::error::Error>> {
let nav_mesh_params = NavMeshParams {
origin: [0.0, 0.0, 0.0],
tile_width: 30.0,
tile_height: 30.0,
max_tiles: 1,
max_polys_per_tile: 1,
};
let mut nav_mesh = NavMesh::new(nav_mesh_params.clone())?;
let verts = vec![
0.0, 0.0, 0.0, 100.0, 0.0, 0.0, 100.0, 0.0, 100.0, 0.0, 0.0, 100.0, ];
let polys = vec![0, 1, 2, 3, 0, 0];
let poly_flags = vec![PolyFlags::WALK];
let poly_areas = vec![0u8];
let cs = 0.3f32;
let ch = 0.2f32;
let tile_params = NavMeshCreateParams {
nav_mesh_params: nav_mesh_params,
verts,
vert_count: 4,
polys,
poly_flags,
poly_areas,
poly_count: 1,
nvp: 6,
detail_meshes: vec![],
detail_verts: vec![],
detail_vert_count: 0,
detail_tris: vec![],
detail_tri_count: 0,
off_mesh_con_verts: vec![],
off_mesh_con_rad: vec![],
off_mesh_con_flags: vec![],
off_mesh_con_areas: vec![],
off_mesh_con_dir: vec![],
off_mesh_con_user_id: vec![],
off_mesh_con_count: 0,
bmin: [0.0, 0.0, 0.0],
bmax: [100.0 * cs, 1.0, 100.0 * cs],
walkable_height: 2.0,
walkable_radius: 0.6,
walkable_climb: 0.9,
cs,
ch,
build_bv_tree: true,
};
let tile = NavMeshBuilder::build_tile(&tile_params)?;
nav_mesh.add_mesh_tile(tile)?;
Ok(nav_mesh)
}
pub fn get_test_position_minimal() -> [f32; 3] {
[0.3, 0.0, 0.3] }
pub fn get_test_position_complex() -> [f32; 3] {
[0.45, 0.0, 0.45] }
pub fn get_test_position_large() -> [f32; 3] {
[15.0, 0.0, 15.0] }
pub fn get_test_extents() -> [f32; 3] {
[1.0, 1.0, 1.0] }
#[cfg(test)]
mod tests {
use super::*;
use crate::{NavMeshQuery, QueryFilter};
use glam::Vec3;
#[test]
fn test_minimal_mesh_creation() -> Result<(), Box<dyn std::error::Error>> {
let nav_mesh = create_minimal_test_navmesh()?;
let query = NavMeshQuery::new(&nav_mesh);
let filter = QueryFilter::default();
let center = get_test_position_minimal();
let extents = get_test_extents();
let result = query.find_nearest_poly(Vec3::from(center), Vec3::from(extents), &filter);
assert!(result.is_ok(), "Should find polygon in minimal mesh");
let (poly_ref, _pos) = result?;
assert!(poly_ref.is_valid(), "Found polygon should be valid");
Ok(())
}
#[test]
fn test_complex_mesh_creation() -> Result<(), Box<dyn std::error::Error>> {
let nav_mesh = create_complex_test_navmesh()?;
let query = NavMeshQuery::new(&nav_mesh);
let filter = QueryFilter::default();
let center = get_test_position_complex();
let extents = get_test_extents();
let result = query.find_nearest_poly(Vec3::from(center), Vec3::from(extents), &filter);
assert!(result.is_ok(), "Should find polygon in complex mesh");
let (poly_ref, _pos) = result?;
assert!(poly_ref.is_valid(), "Found polygon should be valid");
Ok(())
}
}