use crate::components::{Camera3D, ControlsCommand};
use crate::ecs::{EventCursor, PipelineContext};
pub(crate) struct Look<'a> {
pub mouse_sensitivity: &'a mut f32,
pub(crate) gamepad_look_sensitivity: &'a mut f32,
}
pub(crate) fn apply_persisted(ctx: &mut PipelineContext, look: Look) {
let settings =
crate::config::Settings::load(ctx.resource::<concinnity_host::store::paths::StateTree>());
if let Some(s) = settings.controls.mouse_sensitivity {
*look.mouse_sensitivity = s;
}
if let Some(s) = settings.controls.gamepad_look_sensitivity {
*look.gamepad_look_sensitivity = s;
}
if let Some(fov) = settings.graphics.fov {
for camera in ctx.query_mut::<Camera3D>() {
camera.fov_y_degrees = fov;
}
}
}
pub(crate) fn drain_commands(
ctx: &PipelineContext,
cursor: &mut EventCursor,
look: Look,
) -> Option<f32> {
let mut pending_fov = None;
if let Some(events) = ctx.events::<ControlsCommand>() {
for cmd in events.read(cursor) {
if let Some(s) = cmd.mouse_sensitivity {
*look.mouse_sensitivity = s;
}
if let Some(s) = cmd.gamepad_look_sensitivity {
*look.gamepad_look_sensitivity = s;
}
if let Some(fov) = cmd.fov_y_degrees {
pending_fov = Some(fov);
}
}
}
pending_fov
}