use bevy::prelude::*;
use bevy_fpc_core::{
angular::{apply_motion, free_cursor, handle_request, lock_cursor, VisionMotionTarget},
incarnation::embody,
linear::{handle_movements, Gravity},
};
use bevy_rapier3d::prelude::*;
pub use bevy_fpc_core::{
angular::AngularState,
config::{FpcConfiguration, KeyboardLinearInputs, LINEAR_AZERTY_LAYOUT, LINEAR_QWERTY_LAYOUT},
linear::WalkSpeed,
Player,
};
#[cfg(feature = "bevy_fpc_sprint")]
pub use bevy_fpc_sprint::{FpcSprintConfiguration, SprintRate};
pub struct FpcPlugin;
impl Plugin for FpcPlugin {
fn build(&self, app: &mut bevy::prelude::App) {
app.init_resource::<FpcConfiguration>()
.init_state::<AngularState>()
.add_systems(
Update,
(
handle_request.run_if(in_state(AngularState::Enabled)),
apply_motion,
)
.chain(),
)
.add_systems(OnEnter(AngularState::Enabled), lock_cursor)
.add_systems(OnExit(AngularState::Enabled), free_cursor)
.add_systems(Update, (handle_movements, embody));
#[cfg(feature = "bevy_fpc_sprint")]
app.init_resource::<bevy_fpc_sprint::FpcSprintConfiguration>()
.add_systems(Update, bevy_fpc_sprint::handle_sprint);
}
}
#[derive(Component, Default)]
pub struct Fpc;
#[derive(Bundle)]
pub struct FpcBundle {
pub fpc: Fpc,
pub body: RigidBody,
pub ccd: Ccd,
pub collider: Collider,
pub controller: KinematicCharacterController,
pub controller_output: KinematicCharacterControllerOutput,
pub vmt: VisionMotionTarget,
pub walk_speed: WalkSpeed,
pub spatial: SpatialBundle,
#[cfg(feature = "bevy_fpc_sprint")]
pub sprint_rate: bevy_fpc_sprint::SprintRate,
pub gravity: Gravity,
}
impl Default for FpcBundle {
fn default() -> Self {
Self {
fpc: Fpc,
body: RigidBody::KinematicPositionBased,
ccd: Ccd::enabled(),
collider: Collider::capsule_y(0.5, 0.25),
controller: KinematicCharacterController::default(),
controller_output: KinematicCharacterControllerOutput::default(),
spatial: SpatialBundle::default(),
vmt: VisionMotionTarget::default(),
walk_speed: WalkSpeed::default(),
#[cfg(feature = "bevy_fpc_sprint")]
sprint_rate: bevy_fpc_sprint::SprintRate::default(),
gravity: Gravity(0.0),
}
}
}