use bevy::{ecs::entity::Entity, math::Vec3, prelude::Reflect, reflect::FromReflect};
use smallvec::SmallVec;
use crate::CollisionLayers;
#[derive(Debug, Clone)]
pub enum CollisionEvent {
Started(CollisionData, CollisionData),
Stopped(CollisionData, CollisionData),
}
#[derive(Debug, Clone, PartialEq, Reflect, FromReflect)]
pub struct CollisionData {
rigid_body_entity: Entity,
collision_shape_entity: Entity,
collision_layers: CollisionLayers,
normals: SmallVec<[Vec3; 1]>,
}
impl From<CollisionEvent> for (CollisionData, CollisionData) {
fn from(event: CollisionEvent) -> Self {
event.data()
}
}
impl CollisionEvent {
#[must_use]
pub fn is_started(&self) -> bool {
matches!(self, CollisionEvent::Started(_, _))
}
#[must_use]
pub fn is_stopped(&self) -> bool {
matches!(self, CollisionEvent::Stopped(_, _))
}
#[must_use]
pub fn data(self) -> (CollisionData, CollisionData) {
match self {
CollisionEvent::Started(d1, d2) | CollisionEvent::Stopped(d1, d2) => (d1, d2),
}
}
#[must_use]
pub fn collision_shape_entities(&self) -> (Entity, Entity) {
match self {
CollisionEvent::Started(d1, d2) | CollisionEvent::Stopped(d1, d2) => {
(d1.collision_shape_entity, d2.collision_shape_entity)
}
}
}
#[must_use]
pub fn rigid_body_entities(&self) -> (Entity, Entity) {
match self {
CollisionEvent::Started(d1, d2) | CollisionEvent::Stopped(d1, d2) => {
(d1.rigid_body_entity, d2.rigid_body_entity)
}
}
}
#[must_use]
pub fn collision_layers(&self) -> (CollisionLayers, CollisionLayers) {
match self {
CollisionEvent::Started(d1, d2) | CollisionEvent::Stopped(d1, d2) => {
(d1.collision_layers, d2.collision_layers)
}
}
}
}
impl CollisionData {
#[must_use]
#[allow(missing_docs)]
pub fn new(
rigid_body_entity: Entity,
collision_shape_entity: Entity,
collision_layers: CollisionLayers,
normals: impl IntoIterator<Item = Vec3>,
) -> Self {
Self {
rigid_body_entity,
collision_shape_entity,
collision_layers,
normals: normals.into_iter().collect(),
}
}
#[must_use]
pub fn rigid_body_entity(&self) -> Entity {
self.rigid_body_entity
}
#[must_use]
pub fn collision_shape_entity(&self) -> Entity {
self.collision_shape_entity
}
#[must_use]
pub fn collision_layers(&self) -> CollisionLayers {
self.collision_layers
}
#[must_use]
pub fn normals(&self) -> &[Vec3] {
&self.normals
}
}