diff --git a/src/kneeboardplugin.rs b/src/kneeboardplugin.rs index 59785a9..00cdb56 100644 --- a/src/kneeboardplugin.rs +++ b/src/kneeboardplugin.rs @@ -16,6 +16,9 @@ use crate::{ vrplugin::{Headset, MainCamera, create_view_space}, }; +#[derive(Component)] +pub struct LookedAt; + #[derive(Component)] pub struct Kneeboard; @@ -88,23 +91,32 @@ fn scroll_handler( return; }; - let delta = Vec2::new(thumbstick.current_state.x, thumbstick.current_state.y) * 8.0; + let delta = Vec2::new(thumbstick.current_state.x, thumbstick.current_state.y) * 12.0; for webview in webviews.iter() { browsers.send_mouse_wheel(&webview, Vec2::ZERO, delta); } } +#[allow(clippy::type_complexity)] fn position_kneeboard( - mut transform: Query<&mut Transform, With>, + mut transform: Query<(&mut Transform, Option<&LookedAt>), (With, Without)>, kneeboard: Res, + head: Query<&Transform, (With, Without)>, ) { - let Ok(mut transform) = transform.single_mut() else { + let Ok((mut transform, looked_at)) = transform.single_mut() else { return; }; + let head = head.single().expect("a head to exist"); + transform.translation = kneeboard.position; transform.rotation = kneeboard.rotation; + + if looked_at.is_some() { + transform.translation = head.translation; + transform.rotation = head.rotation; + } } fn move_keyboard( @@ -170,28 +182,21 @@ fn spawn_kneeboard( } fn gaze( - material_handles: Query<&MeshMaterial3d, With>, - mut materials: ResMut>, + mut commands: Commands, position: Res, - head_query: Query<&Transform, With>, + kneeboard: Query>, + head: Query<&Transform, With>, ) { - let head = head_query.single().expect("a head to exist"); + let head = head.single().expect("a head to exist"); + let kneeboard = kneeboard.single().expect("a kneeboard to exist"); let facing = head.forward().normalize(); let to_target = (position.position - head.translation).normalize(); let dot = facing.dot(to_target); let cos_fov_angle: f32 = (35.0f32 / 2.0f32).to_radians().cos(); - let mut alpha = 1.0; + commands.entity(kneeboard).remove::(); if dot < cos_fov_angle { - alpha = 0.0; - } - - for material_handle in material_handles.iter() { - if let Some(material) = materials.get_mut(material_handle) - && let Color::LinearRgba(ref mut rgba) = material.base.base_color - { - rgba.alpha = alpha; - } + commands.entity(kneeboard).insert(LookedAt); } }