~starkingdoms/starkingdoms

ref: 54589315a90d94a48978d94420ff0a656d81a2df starkingdoms/crates/unified/src/client/input/mod.rs -rw-r--r-- 955 bytes
54589315 — core feat: thruster metadata 24 days ago
                                                                                
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
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<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;
    }
}