use bevy::prelude::*;
use bevy_mod_raycast::{
DefaultRaycastingPlugin, RayCastMesh, RayCastMethod, RayCastSource, RaycastSystem,
};
fn main() {
App::build()
.insert_resource(WindowDescriptor {
vsync: false, ..Default::default()
})
.add_plugins(DefaultPlugins)
.add_plugin(DefaultRaycastingPlugin::<MyRaycastSet>::default())
.add_system_to_stage(
CoreStage::PostUpdate,
update_raycast_with_cursor
.system()
.before(RaycastSystem::BuildRays),
)
.add_startup_system(setup.system())
.run();
}
struct MyRaycastSet;
fn update_raycast_with_cursor(
mut cursor: EventReader<CursorMoved>,
mut query: Query<&mut RayCastSource<MyRaycastSet>>,
) {
for mut pick_source in &mut query.iter_mut() {
if let Some(cursor_latest) = cursor.iter().last() {
pick_source.cast_method = RayCastMethod::Screenspace(cursor_latest.position);
}
}
}
fn setup(
mut commands: Commands,
mut meshes: ResMut<Assets<Mesh>>,
mut materials: ResMut<Assets<StandardMaterial>>,
) {
commands
.spawn_bundle(PerspectiveCameraBundle::default())
.insert(RayCastSource::<MyRaycastSet>::new()); commands
.spawn_bundle(PbrBundle {
mesh: meshes.add(Mesh::from(shape::Icosphere::default())),
material: materials.add(Color::rgb(1.0, 1.0, 1.0).into()),
transform: Transform::from_translation(Vec3::new(0.0, 0.0, -5.0)),
..Default::default()
})
.insert(RayCastMesh::<MyRaycastSet>::default()); commands.spawn_bundle(LightBundle {
transform: Transform::from_translation(Vec3::new(4.0, 8.0, 4.0)),
..Default::default()
});
}