jagua_rs/collision_detection/
hazard_filter.rs
use itertools::Itertools;
use crate::collision_detection::hazard::Hazard;
use crate::collision_detection::hazard::HazardEntity;
pub trait HazardFilter {
fn is_irrelevant(&self, entity: &HazardEntity) -> bool;
}
pub fn generate_irrelevant_hazards<'a>(
filter: &impl HazardFilter,
hazards: impl Iterator<Item = &'a Hazard>,
) -> Vec<HazardEntity> {
hazards
.filter_map(|h| match filter.is_irrelevant(&h.entity) {
true => Some(h.entity),
false => None,
})
.collect_vec()
}
#[derive(Clone)]
pub struct BinHazardFilter;
#[derive(Clone, Debug)]
pub struct QZHazardFilter(pub usize);
pub struct EntityHazardFilter(pub Vec<HazardEntity>);
pub struct CombinedHazardFilter<'a> {
pub filters: Vec<Box<&'a dyn HazardFilter>>,
}
impl HazardFilter for BinHazardFilter {
fn is_irrelevant(&self, entity: &HazardEntity) -> bool {
match entity {
HazardEntity::PlacedItem { .. } => false,
HazardEntity::BinExterior => true,
HazardEntity::BinHole { .. } => true,
HazardEntity::InferiorQualityZone { .. } => true,
}
}
}
impl<'a> HazardFilter for CombinedHazardFilter<'a> {
fn is_irrelevant(&self, entity: &HazardEntity) -> bool {
self.filters.iter().any(|f| f.is_irrelevant(entity))
}
}
impl HazardFilter for EntityHazardFilter {
fn is_irrelevant(&self, entity: &HazardEntity) -> bool {
self.0.contains(entity)
}
}
impl HazardFilter for QZHazardFilter {
fn is_irrelevant(&self, entity: &HazardEntity) -> bool {
match entity {
HazardEntity::InferiorQualityZone { quality, .. } => *quality >= self.0,
_ => false,
}
}
}