use bevy_mod_raycast::RaycastSource;
use bevy_component_extras::components::*;
use bevy::pbr::wireframe::Wireframe;
use bevy_window::PrimaryWindow;
use bevy_mod_raycast::RaycastPluginState;
use bevy::prelude::*;
use bevy_rapier3d::prelude::RigidBody;
use bevy::reflect::TypePath;
pub fn update_raycast_with_cursor<T: Component + TypePath>(
mut query: Query<&mut RaycastSource<T>>,
q_windows: Query<&Window, With<PrimaryWindow>>
) {
for mut pick_source in &mut query.iter_mut() {
if let Some(cursor_pos) = q_windows.single().cursor_position() {
pick_source.cast_method =
bevy_mod_raycast::RaycastMethod::Screenspace(cursor_pos);
}
}
}
pub fn _rigid_body_editor(
mut selected_models: Query<(Entity, &RigidBody, &Selected, &mut Transform), Without<Widget>>,
keys: Res<Input<KeyCode>>,
) {
let mut reset_rotation = false;
let mut _deselect = false;
let mut trans_to_add = Transform::from_xyz(0.0, 0.0, 0.0);
if keys.pressed(KeyCode::Space) {
trans_to_add.translation += Vec3::new(0.0, 0.1, 0.0)
}
if keys.pressed(KeyCode::ShiftLeft) {
trans_to_add.translation += Vec3::new(0.0, -0.1, 0.0)
}
if keys.pressed( KeyCode::Numpad4) {
trans_to_add.rotate(Quat::from_rotation_y(0.1))
}
if keys.pressed( KeyCode::Numpad6) {
trans_to_add.rotate(Quat::from_rotation_y(-0.1))
}
if keys.pressed( KeyCode::Numpad8) {
trans_to_add.rotate(Quat::from_rotation_z(-0.1))
}
if keys.pressed( KeyCode::Numpad2) {
trans_to_add.rotate(Quat::from_rotation_z(0.1))
}
if keys.pressed( KeyCode::Numpad7) {
trans_to_add.rotate(Quat::from_axis_angle(Vec3::new(1.0, 1.0, 0.0), -0.1))
}
if keys.pressed( KeyCode::Numpad9) {
trans_to_add.rotate(Quat::from_axis_angle( Vec3::new(1.0, 1.0, 0.0),-0.1))
}
if keys.pressed( KeyCode::Numpad1) {
trans_to_add.rotate(Quat::from_axis_angle( Vec3::new(-1.0, 1.0, 0.0),0.1))
}
if keys.pressed( KeyCode::Numpad3) {
trans_to_add.rotate(Quat::from_axis_angle( Vec3::new(-1.0, 1.0, 0.0),-0.1))
}
if keys.pressed(KeyCode::ControlLeft) {
reset_rotation = true;
}
for (_e, _rigidbody, _selected, mut trans) in selected_models.iter_mut() {
trans.translation += trans_to_add.translation;
trans.rotate(trans_to_add.rotation);
if reset_rotation == true {
trans.rotation = Quat::IDENTITY;
}
}
}
pub fn hover_mesh_at_mouse<T: Component + TypePath>(
raycast_sources: Query<(&RaycastSource<T>, &SelectionMode)>,
held_entities: Query<(Entity, &Transform, &Held)>,
mut commands: Commands,
) {
for (e, ..) in held_entities.iter() {
let (selecter_camera, selection_mode) = raycast_sources.single();
match *selection_mode {
SelectionMode::Clicking => {
if let Some((_collided_entity, intersection)) = selecter_camera.get_nearest_intersection()
{
commands.entity(e).insert(
Transform::from_translation(intersection.position())
);
}
},
_ => {}
}
}
}
pub fn manage_selection_behaviour<T: Component + TypePath>(
raycast_sources: Query<(&RaycastSource<T>, &SelectionMode)>,
buttons: Res<Input<MouseButton>>,
selected_meshes: Query<&Selected>,
selectable_meshes: Query<&T>,
mut commands: Commands,
widget_querry: Query<Entity, With<Widget>>,
) {
if buttons.just_pressed(MouseButton::Left) {
for (raycast_source, selector_mode) in raycast_sources.iter() {
if let Some((e, ..)) = raycast_source.get_nearest_intersection() {
match *selector_mode {
SelectionMode::Selecting => {
if let Ok(..) = selectable_meshes.get(e) {
if let Ok(..) = selected_meshes.get(e){
println!("selected: {:#?}", e);
commands.entity(e)
.remove::<Selected>()
.remove::<Wireframe>()
.insert(RigidBody::Dynamic) ;
} else {
if let Ok(_) = widget_querry.get(e) {
for widget in widget_querry.iter() {
commands.entity(widget)
.remove::<Selected>()
.remove::<Wireframe>();
}
}
commands.entity(e)
.insert(Selected)
.insert(Wireframe)
.insert(RigidBody::Fixed)
;
}
}
}
SelectionMode::Clicking => {
println!("executing function...")
}
}
}
}
}
}
pub fn attach_selector_to_cam<T: Component + TypePath> (
mut commands: Commands,
debug_cams: Query<Entity, (With<Camera>, With<Debug>, Without<RaycastSource<T>>)>,
) {
if debug_cams.iter().len() > 0 {
let debug_cam = debug_cams.single();
commands.insert_resource(RaycastPluginState::<T>::default().with_debug_cursor());
commands.entity(debug_cam).insert(
(
RaycastSource::<T>::new(),
SelectionMode::default(),
)
);
}
}