use crate::bodies::*;
use crate::physics_components::Transform2D;
use crate::transform_mode::TransformMode;
use bevy::prelude::*;
use crate::normal_coll;
pub struct Physics2dPlugin;
#[derive(Debug, Clone)]
pub struct CollisionEvent {
pub entity_a: Entity,
pub entity_b: Entity,
pub is_b_static: bool,
pub normal: Vec2,
pub penetration: Vec2,
}
pub mod stage {
pub use bevy::prelude::CoreStage;
pub const PHYSICS_STEP: &str = "phy_physics_step";
pub const JOINT_STEP: &str = "phy_joint_step";
pub const COLLISION_DETECTION: &str = "phy_collision";
pub const RAYCAST_DETECTION: &str = "phy_raycast_detection";
}
impl Plugin for Physics2dPlugin {
fn build(
&self,
app: &mut App,
) {
app.add_stage_after(
CoreStage::Update,
stage::COLLISION_DETECTION,
SystemStage::single_threaded(),
);
app.add_event::<CollisionEvent>(); app.add_event::<normal_coll::CollPairKin>();
app.add_event::<normal_coll::CollPairStatic>();
app.add_event::<normal_coll::CollPairSensor>();
app.insert_resource(TransformMode::XY);
app.add_system_to_stage(
stage::COLLISION_DETECTION,
Transform2D::sync_from_global_transform
.chain(sensor_clean)
.chain(normal_coll::broad_phase_2)
.chain(normal_coll::narrow_phase_2)
.chain(normal_coll::ray_phase)
.chain(Transform2D::sync_to_transform),
);
app.add_system(Transform2D::auto_insert_system);
}
}
fn sensor_clean(mut query: Query<&mut Sensor>) {
query
.iter_mut()
.for_each(|mut s| s.bodies.clear());
}