use crate::prelude::*; use crate::client::input::CursorWorldCoordinates; use crate::ecs::StarguideCamera; 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>, mut drag: ResMut, camera: Single<&Transform, With>, cursor: Res ) { 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, mut camera: Single<&mut Transform, (With)>, cursor: Res, ) { 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); }