Use MeshRayCast to render debug ray

main
copygirl 1 week ago
parent 69ae279f76
commit 42460a76fb
  1. 9
      src/main.rs
  2. 27
      src/placement.rs

@ -3,11 +3,20 @@ use bevy::prelude::*;
mod free_camera;
use free_camera::*;
mod placement;
use placement::*;
fn main() {
App::new()
.add_plugins(DefaultPlugins)
.add_systems(Startup, setup)
.add_systems(Update, (camera_free_look, noclip_controller).chain())
// This system requires `GlobalTransform`, so for a most
// up-to-date value, run it right after it's been updated.
.add_systems(
PostUpdate,
debug_ray_cast.after(TransformSystems::Propagate),
)
.run();
}

@ -0,0 +1,27 @@
use bevy::prelude::*;
use bevy::window::{CursorGrabMode, CursorOptions};
pub fn debug_ray_cast(
mut gizmos: Gizmos,
mut ray_cast: MeshRayCast,
window: Single<(&Window, &CursorOptions)>,
camera: Single<(&GlobalTransform, &Camera)>,
) {
let (window, cursor) = window.into_inner();
let (transform, camera) = camera.into_inner();
let ray = if cursor.grab_mode == CursorGrabMode::Locked {
Ray3d::new(transform.translation(), transform.forward())
} else if let Some(cursor_pos) = window.cursor_position() {
camera.viewport_to_world(transform, cursor_pos).unwrap()
} else {
return; // cursor outside window area
};
let settings = &MeshRayCastSettings::default();
let Some((_entity, hit)) = ray_cast.cast_ray(ray, settings).first() else {
return; // ray didn't hit anything
};
gizmos.arrow(hit.point, hit.point + hit.normal / 2., Color::WHITE);
}
Loading…
Cancel
Save