gemini_engine/containers/
collision_container.rsuse crate::{
containers::PixelContainer,
core::{CanDraw, Vec2D},
};
pub trait CanCollide {
#[must_use]
fn collides_with_pos(&self, pos: Vec2D) -> bool;
}
#[derive(Clone)]
pub struct CollisionContainer<'a> {
pub elements: Vec<&'a dyn CanCollide>,
}
impl<'a> Default for CollisionContainer<'a> {
fn default() -> Self {
Self::new()
}
}
impl<'a> CollisionContainer<'a> {
#[must_use]
pub const fn new() -> Self {
Self { elements: vec![] }
}
pub fn push(&mut self, element: &'a impl CanCollide) {
self.elements.push(element);
}
pub fn overlaps_element(&self, element: &impl CanDraw) -> bool {
self.will_overlap_element(element, Vec2D::ZERO)
}
pub fn will_overlap_element(&self, element: &impl CanDraw, offset: Vec2D) -> bool {
PixelContainer::from(element)
.pixels
.into_iter()
.any(|p| self.collides_with_pos(p.pos + offset))
}
}
impl<'a> CanCollide for CollisionContainer<'a> {
fn collides_with_pos(&self, pos: Vec2D) -> bool {
self.elements.iter().any(|e| e.collides_with_pos(pos))
}
}
impl<'a> From<&'a dyn CanCollide> for CollisionContainer<'a> {
fn from(element: &'a dyn CanCollide) -> Self {
Self {
elements: vec![element],
}
}
}