rocketsim 0.2.4

Simulate Rocket League games at maximum efficiency
Documentation
use glam::Vec4;

use crate::{
    bullet::collision::shapes::{
        triangle_callback::{ProcessQuadRayTriangle, ProcessTriangle},
        triangle_mesh::TriangleMesh,
        triangle_shape::TriangleShape,
    },
    shared::bvh::{ProcessNode, ProcessQuadRayNode},
};

pub struct NodeOverlapCallback<'a, T: ProcessTriangle> {
    tris: &'a [TriangleShape],
    callback: &'a mut T,
}

impl<'a, T: ProcessTriangle> NodeOverlapCallback<'a, T> {
    pub fn new(mesh_interface: &'a TriangleMesh, callback: &'a mut T) -> Self {
        Self {
            tris: mesh_interface.get_tris(),
            callback,
        }
    }
}

impl<T: ProcessTriangle> ProcessNode for NodeOverlapCallback<'_, T> {
    fn process_node(&mut self, node_triangle_idx: usize) {
        self.callback
            .process_triangle(&self.tris[node_triangle_idx], node_triangle_idx);
    }
}

pub struct QuadRayNodeOverlapCallback<'a, T: ProcessQuadRayTriangle> {
    tris: &'a [TriangleShape],
    callback: &'a mut T,
}

impl<'a, T: ProcessQuadRayTriangle> QuadRayNodeOverlapCallback<'a, T> {
    pub fn new(mesh_interface: &'a TriangleMesh, callback: &'a mut T) -> Self {
        Self {
            tris: mesh_interface.get_tris(),
            callback,
        }
    }
}

impl<T: ProcessQuadRayTriangle> ProcessQuadRayNode for QuadRayNodeOverlapCallback<'_, T> {
    fn process_node(&mut self, triangle_idx: usize, active_mask: u8, lambda_max: &mut Vec4) {
        self.callback
            .process_node(&self.tris[triangle_idx], active_mask, lambda_max);
    }
}