use crate::prelude::*;
use crate::client::input::CursorWorldCoordinates;
use crate::ecs::{StarguideCamera, StarguideOrbit};
pub fn starguide_input_plugin(app: &mut App) {
app
.add_systems(Update, (on_click, starguide_drag))
.insert_resource(StarguideDrag::default());
}
#[derive(Resource, Default)]
struct StarguideDrag {
is_dragging: bool,
init_cursor_pos: Vec2,
init_camera_pos: Vec2,
}
fn on_click(
ev: Res<ButtonInput<MouseButton>>,
mut drag: ResMut<StarguideDrag>,
camera: Single<&Transform, With<StarguideCamera>>,
cursor: Res<CursorWorldCoordinates>
) {
let Some(cursor) = cursor.0 else { return };
if ev.just_pressed(MouseButton::Left) {
drag.is_dragging = true;
drag.init_cursor_pos = cursor;
drag.init_camera_pos = camera.translation.truncate();
}
if ev.just_released(MouseButton::Left) {
drag.is_dragging = false;
}
}
fn starguide_drag(
drag: ResMut<StarguideDrag>,
mut camera: Single<&mut Transform, With<StarguideCamera>>,
mut orbit: Single<&mut Transform, (With<StarguideOrbit>, Without<StarguideCamera>)>,
cursor: Res<CursorWorldCoordinates>,
) {
if !drag.is_dragging { return }
let Some(cursor) = cursor.0 else { return };
camera.translation = drag.init_camera_pos.extend(0.0) - (cursor - drag.init_cursor_pos).extend(0.0);
orbit.translation = drag.init_camera_pos.extend(0.0) - (cursor - drag.init_cursor_pos).extend(0.0);
}