pub mod util;
use bevy::app::{App, Update};
use bevy::window::PrimaryWindow;
use leafwing_input_manager::Actionlike;
use leafwing_input_manager::input_map::InputMap;
use leafwing_input_manager::prelude::ActionState;
use crate::ecs::MainCamera;
use crate::prelude::*;
#[derive(Actionlike, PartialEq, Eq, Hash, Clone, Copy, Debug, Reflect)]
pub enum ClientAction {
ThrustForward,
ThrustBackward,
ThrustRight,
ThrustLeft,
TorqueCw,
TorqueCcw
}
pub fn input_plugin(app: &mut App) {
app
.insert_resource(CursorWorldCoordinates(None))
.insert_resource(InputMap::new([
(ClientAction::ThrustForward, KeyCode::KeyW),
(ClientAction::ThrustForward, KeyCode::ArrowUp),
(ClientAction::ThrustBackward, KeyCode::KeyS),
(ClientAction::ThrustBackward, KeyCode::ArrowDown),
(ClientAction::ThrustLeft, KeyCode::KeyQ),
// TODO: Shift+left
(ClientAction::ThrustRight, KeyCode::KeyE),
// TODO: Shift+right
(ClientAction::TorqueCw, KeyCode::KeyD),
(ClientAction::TorqueCw, KeyCode::ArrowRight),
(ClientAction::TorqueCcw, KeyCode::KeyA),
(ClientAction::TorqueCcw, KeyCode::ArrowLeft),
]))
.init_resource::<ActionState<ClientAction>>()
.add_systems(Update, update_cursor_position);
}
#[derive(Resource, Default)]
pub struct CursorWorldCoordinates(pub Option<Vec2>);
fn update_cursor_position(
q_windows: Query<&Window, With<PrimaryWindow>>,
q_camera: Query<(&Camera, &GlobalTransform), With<MainCamera>>,
mut coords: ResMut<CursorWorldCoordinates>,
) {
let (camera, camera_transform) = q_camera.single().unwrap();
let window = q_windows.single().unwrap();
if let Some(world_position) = window
.cursor_position()
.and_then(|cursor| camera.viewport_to_world(camera_transform, cursor).ok())
.map(|ray| ray.origin.truncate())
{
coords.0 = Some(world_position);
} else {
coords.0 = None;
}
}