vleue_navigator 0.11.0

Navmesh plugin for Bevy
Documentation
use bevy::{
    math::{vec3, Dir3, Quat, Vec2, Vec3, Vec3Swizzles},
    render::primitives::Aabb,
    transform::components::{GlobalTransform, Transform},
};

use crate::world_to_mesh;

use super::ObstacleSource;

impl ObstacleSource for Aabb {
    fn get_polygons(
        &self,
        obstacle_transform: &GlobalTransform,
        navmesh_transform: &Transform,
        (up, _shift): (Dir3, f32),
    ) -> Vec<Vec<Vec2>> {
        let transform = obstacle_transform.compute_transform();
        let world_to_mesh = world_to_mesh(navmesh_transform);

        let to_world = |v: Vec3| {
            let v = v.xzy();
            let v = if up.is_negative_bitmask().count_ones() % 2 == 1 {
                Quat::from_rotation_arc(-Vec3::Y, up.into()).mul_vec3(v)
            } else {
                Quat::from_rotation_arc(Vec3::Y, up.into()).mul_vec3(v)
            };
            transform.transform_point(v)
        };
        let to_navmesh = |v: Vec3| world_to_mesh.transform_point3(v).xy();

        vec![vec![
            to_navmesh(to_world(vec3(
                -self.half_extents.x,
                self.half_extents.y,
                self.half_extents.z,
            ))),
            to_navmesh(to_world(vec3(
                -self.half_extents.x,
                -self.half_extents.y,
                -self.half_extents.z,
            ))),
            to_navmesh(to_world(vec3(
                self.half_extents.x,
                -self.half_extents.y,
                -self.half_extents.z,
            ))),
            to_navmesh(to_world(vec3(
                self.half_extents.x,
                self.half_extents.y,
                self.half_extents.z,
            ))),
        ]]
    }
}