summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--engine/src/camera.rs15
-rw-r--r--engine/src/camera/fly.rs29
2 files changed, 41 insertions, 3 deletions
diff --git a/engine/src/camera.rs b/engine/src/camera.rs
index 6b07769..1eb1246 100644
--- a/engine/src/camera.rs
+++ b/engine/src/camera.rs
@@ -27,3 +27,18 @@ impl Default for Camera
/// Marker component for cameras that are active.
#[derive(Debug, Default, Clone, Copy, Component)]
pub struct Active;
+
+/// Cameras that can be controlled have this component.
+#[derive(Debug, Clone, Copy, Component)]
+pub struct Controllable
+{
+ pub control_enabled: bool,
+}
+
+impl Default for Controllable
+{
+ fn default() -> Self
+ {
+ Self { control_enabled: true }
+ }
+}
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 }) {