use ecs::time::Time; use crate::builder; use crate::camera::{Active as ActiveCamera, Camera, Controllable as ControllableCamera}; use crate::ecs::actions::Actions; use crate::ecs::component::local::Local; use crate::ecs::phase::UPDATE as UPDATE_PHASE; use crate::ecs::query::term::With; use crate::ecs::sole::Single; use crate::ecs::system::initializable::Initializable; use crate::ecs::system::Into; use crate::ecs::{Component, Query}; use crate::input::keyboard::{Key, Keyboard}; use crate::input::mouse::Mouse; use crate::reflection::Reflection; use crate::transform::WorldPosition; use crate::vector::{Vec2, Vec3}; builder! { /// A fly camera. #[builder(name = Builder, derives = (Debug))] #[derive(Debug, Component, Reflection)] #[non_exhaustive] pub struct Fly { pub current_pitch: f64, pub current_yaw: f64, pub speed: f32, } } impl Fly { #[must_use] pub fn builder() -> Builder { Builder::default() } } impl Default for Fly { fn default() -> Self { Self::builder().build() } } impl Default for Builder { fn default() -> Self { Self { current_yaw: -90.0, current_pitch: 0.0, speed: 3.0, } } } /// Fly camera extension. pub struct Extension(pub Options); impl crate::ecs::extension::Extension for Extension { fn collect(self, mut collector: crate::ecs::extension::Collector<'_>) { collector.add_system(*UPDATE_PHASE, update.into_system().initialize((self.0,))); } } #[derive(Debug, Component)] pub struct Options { pub mouse_sensitivity: f32, } fn update( camera_query: Query< ( &mut Camera, &mut WorldPosition, &mut Fly, Option<&ControllableCamera>, ), (With,), >, keyboard: Single, mouse: Single, time: Single