use bevy::app::{App, Update}; use bevy::window::PrimaryWindow; use crate::ecs::MainCamera; use crate::prelude::*; pub fn input_plugin(app: &mut App) { app .insert_resource(CursorWorldCoordinates(None)) .add_systems(Update, update_cursor_position); } #[derive(Resource, Default)] pub struct CursorWorldCoordinates(pub Option); fn update_cursor_position( q_windows: Query<&Window, With>, q_camera: Query<(&Camera, &GlobalTransform), With>, mut coords: ResMut, ) { 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; } }