use std::any::Any;
use world::CollisionObject;
use math::Point;
pub trait BroadPhasePairFilter<P: Point, M, T>: Any + Send + Sync {
fn is_pair_valid(&self, b1: &CollisionObject<P, M, T>, b2: &CollisionObject<P, M, T>) -> bool;
}
pub struct BroadPhasePairFilters<P: Point, M, T> {
filters: Vec<(String, Box<BroadPhasePairFilter<P, M, T>>)>,
}
impl<P: Point, M, T> BroadPhasePairFilters<P, M, T> {
pub fn new() -> BroadPhasePairFilters<P, M, T> {
BroadPhasePairFilters {
filters: Vec::new(),
}
}
pub fn register_collision_filter(
&mut self,
name: &str,
callback: Box<BroadPhasePairFilter<P, M, T>>,
) {
for &mut (ref mut n, ref mut f) in self.filters.iter_mut() {
if name == &n[..] {
*f = callback;
return;
}
}
self.filters.push((name.to_string(), callback))
}
pub fn unregister_collision_filter(&mut self, name: &str) -> bool {
let mut to_remove = self.filters.len();
for (i, &mut (ref n, _)) in self.filters.iter_mut().enumerate() {
if name == &n[..] {
to_remove = i;
}
}
if to_remove != self.filters.len() {
let _ = self.filters.remove(to_remove);
true
} else {
false
}
}
pub fn is_pair_valid(
&self,
b1: &CollisionObject<P, M, T>,
b2: &CollisionObject<P, M, T>,
) -> bool {
self.filters
.iter()
.all(|&(_, ref f)| f.is_pair_valid(b1, b2))
}
}