diff options
| author | HampusM <hampus@hampusmat.com> | 2026-06-05 21:36:17 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-06-05 21:36:17 +0200 |
| commit | 4c7d0038826e48104a6853333afd3c64383b3991 (patch) | |
| tree | c16af103aa740a6aaf9a1042f102864edfcf3752 /engine/src/camera | |
| parent | d9df85eb2a645f328a5ae9dcaa1ca75b787ef67e (diff) | |
feat(engine): add controllable camera component
Diffstat (limited to 'engine/src/camera')
| -rw-r--r-- | engine/src/camera/fly.rs | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/engine/src/camera/fly.rs b/engine/src/camera/fly.rs index a6b336c..589ba8a 100644 --- a/engine/src/camera/fly.rs +++ b/engine/src/camera/fly.rs @@ -1,8 +1,10 @@ use crate::builder; -use crate::camera::{Active as ActiveCamera, Camera}; +use crate::camera::{Active as ActiveCamera, Camera, Controllable as ControllableCamera}; use crate::delta_time::DeltaTime; +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; @@ -71,14 +73,35 @@ pub struct Options } fn update( - camera_query: Query<(&mut Camera, &mut WorldPosition, &mut Fly, &ActiveCamera)>, + camera_query: Query< + ( + &mut Camera, + &mut WorldPosition, + &mut Fly, + Option<&ControllableCamera>, + ), + (With<ActiveCamera>,), + >, keyboard: Single<Keyboard>, mouse: Single<Mouse>, delta_time: Single<DeltaTime>, options: Local<Options>, + mut actions: Actions, ) { - for (mut camera, mut camera_world_pos, mut fly_camera, _) in &camera_query { + for ( + camera_ent_id, + (mut camera, mut camera_world_pos, mut fly_camera, controllable_camera), + ) in camera_query.iter_with_euids() + { + if let Some(controllable_camera) = controllable_camera { + if !controllable_camera.control_enabled { + continue; + } + } else { + actions.add_components(camera_ent_id, (ControllableCamera::default(),)); + } + let delta_time = delta_time.duration; if mouse.curr_tick_position_delta != (Vec2 { x: 0.0, y: 0.0 }) { |
