use bevy::math::Vec2; use bevy::prelude::{Bundle, Component, Event, Resource}; use bevy_rapier2d::math::{Real, Vect}; use bevy_rapier2d::prelude::Collider; use serde::{Deserialize, Serialize}; #[derive(Component, Serialize, Deserialize)] pub struct Ball; #[derive(Component, Serialize, Deserialize)] pub struct Ground; #[derive(Component)] pub struct MainCamera; #[derive(Resource, Default)] pub struct CursorWorldCoordinates(pub Option); #[derive(Debug, Default, Deserialize, Event, Serialize)] pub struct SendBallHere(pub Vec2); #[derive(Bundle)] pub struct ReplColliderBundle(ReplicableCollider, Collider); #[derive(Serialize, Deserialize, Copy, Clone, Component)] pub enum ReplicableCollider { Ball(Real), Cuboid { half_x: Real, half_y: Real }, RoundCuboid { half_x: Real, half_y: Real, border_radius: Real }, Capsule { start: Vect, end: Vect, radius: Real } } impl ReplicableCollider { pub fn to_collider(&self) -> Collider { match self { ReplicableCollider::Ball(radius) => Collider::ball(*radius), ReplicableCollider::Cuboid { half_x, half_y } => Collider::cuboid(*half_x, *half_y), ReplicableCollider::RoundCuboid { half_x, half_y, border_radius } => Collider::round_cuboid(*half_x, *half_y, *border_radius), ReplicableCollider::Capsule { start, end, radius } => Collider::capsule(*start, *end, *radius), } } pub fn ball(radius: Real) -> ReplColliderBundle { let rc = ReplicableCollider::Ball(radius); ReplColliderBundle(rc, rc.to_collider()) } pub fn cuboid(half_x: Real, half_y: Real) -> ReplColliderBundle { let rc = ReplicableCollider::Cuboid { half_x, half_y }; ReplColliderBundle(rc, rc.to_collider()) } pub fn round_cuboid(half_x: Real, half_y: Real, border_radius: Real) -> ReplColliderBundle { let rc = ReplicableCollider::RoundCuboid { half_x, half_y, border_radius }; ReplColliderBundle(rc, rc.to_collider()) } pub fn capsule(start: Vect, end: Vect, radius: Real) -> ReplColliderBundle { let rc = ReplicableCollider::Capsule { start, end, radius }; ReplColliderBundle(rc, rc.to_collider()) } }