use bevy_ecs::prelude::{Entity, Message};
use boxdd::{ApiError, BodyId, ContactId, ShapeId, Transform as BoxddTransform, Vec2 as BoxddVec2};
#[derive(Copy, Clone, Debug, Eq, PartialEq, thiserror::Error)]
pub enum BoxddPluginError {
#[error(transparent)]
Api(#[from] ApiError),
#[error("failed to create Box2D world")]
CreateWorldFailed,
}
impl From<boxdd::world::Error> for BoxddPluginError {
fn from(value: boxdd::world::Error) -> Self {
match value {
boxdd::world::Error::InvalidDefinition(error) => Self::Api(error),
boxdd::world::Error::CreateFailed => Self::CreateWorldFailed,
_ => Self::CreateWorldFailed,
}
}
}
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
pub enum BoxddOperation {
CreateWorld,
CreateBody,
CreateShape,
CreateJoint,
DestroyBody,
DestroyShape,
DestroyJoint,
ApplyBodyControl,
ApplyBodySettings,
ConfigureFixedTimestep,
SyncTransform,
StepWorld,
ReadEvents,
}
#[derive(Message, Copy, Clone, Debug, Eq, PartialEq)]
pub struct BoxddErrorMessage {
pub operation: BoxddOperation,
pub entity: Option<Entity>,
pub error: BoxddPluginError,
}
#[derive(Message, Clone, Debug)]
pub struct BoxddBodyMoveMessage {
pub body_id: BodyId,
pub entity: Option<Entity>,
pub transform: BoxddTransform,
pub fell_asleep: bool,
}
#[derive(Message, Copy, Clone, Debug, Eq, PartialEq)]
pub struct BoxddContactBeginMessage {
pub shape_a: ShapeId,
pub shape_b: ShapeId,
pub entity_a: Option<Entity>,
pub entity_b: Option<Entity>,
pub contact_id: ContactId,
}
#[derive(Message, Copy, Clone, Debug, Eq, PartialEq)]
pub struct BoxddContactEndMessage {
pub shape_a: ShapeId,
pub shape_b: ShapeId,
pub entity_a: Option<Entity>,
pub entity_b: Option<Entity>,
}
#[derive(Message, Copy, Clone, Debug, PartialEq)]
pub struct BoxddContactHitMessage {
pub shape_a: ShapeId,
pub shape_b: ShapeId,
pub entity_a: Option<Entity>,
pub entity_b: Option<Entity>,
pub point: BoxddVec2,
pub normal: BoxddVec2,
pub approach_speed: f32,
}
#[derive(Message, Copy, Clone, Debug, Eq, PartialEq)]
pub struct BoxddSensorBeginMessage {
pub sensor_shape: ShapeId,
pub visitor_shape: ShapeId,
pub sensor_entity: Option<Entity>,
pub visitor_entity: Option<Entity>,
}
#[derive(Message, Copy, Clone, Debug, Eq, PartialEq)]
pub struct BoxddSensorEndMessage {
pub sensor_shape: ShapeId,
pub visitor_shape: ShapeId,
pub sensor_entity: Option<Entity>,
pub visitor_entity: Option<Entity>,
}