diff --git a/src/debug_plugin.rs b/src/debug_plugin.rs new file mode 100644 index 00000000..792e128d --- /dev/null +++ b/src/debug_plugin.rs @@ -0,0 +1,50 @@ +use bevy::{prelude::*, sprite::MaterialMesh2dBundle, window::PrimaryWindow}; + +pub struct BoidsDebugPlugin; + +impl Plugin for BoidsDebugPlugin { + fn build(&self, app: &mut App) { + app.add_systems(Startup, setup) + .add_systems(FixedUpdate, update_cursor); + } +} + +fn setup( + mut commands: Commands, + mut meshes: ResMut>, + mut materials: ResMut>, +) { + commands.spawn(( + Cursor, + MaterialMesh2dBundle { + mesh: meshes.add(Annulus::new(9.5, 10.0)).into(), + material: materials.add(Color::srgb(0.0, 0.0, 0.0)), + ..default() + }, + )); +} + +#[derive(Component)] +struct Cursor; + +fn update_cursor( + window: Query<&Window, With>, + camera: Query<(&Camera, &GlobalTransform)>, + mut cursor_query: Query<&mut Transform, With>, +) { + // I'm trusting that only one thing has the `Cursor` component + // It's defined here in this module, so that *should* be the case... + let win = window.get_single().unwrap(); + let (cam, cam_transform) = camera.get_single().unwrap(); + // the cursor might not be on the window. Only adjust position when it is. + if let Some(cursor_pos_in_window) = win.cursor_position() { + // transform the window position into world space + // I'm trusting that this viewport actually displays this camera + // (or at least that the coordinates can map correctly) + let cursor_in_world = cam + .viewport_to_world_2d(cam_transform, cursor_pos_in_window) + .unwrap(); + let mut cursor = cursor_query.get_single_mut().unwrap(); + cursor.translation = cursor_in_world.extend(0.0); + } +} diff --git a/src/main.rs b/src/main.rs index 6320a2ca..5e089a04 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,12 +1,15 @@ use bevy::prelude::*; mod birdoids_plugin; +mod debug_plugin; use birdoids_plugin::BoidsPlugin; +use debug_plugin::BoidsDebugPlugin; fn main() { App::new() .add_plugins(DefaultPlugins) + .add_plugins(BoidsDebugPlugin) .add_plugins(BoidsPlugin) .run(); }