From c5dea3b7c9fa6cae4ffcb9a3a5ff5ec7d0111cd7 Mon Sep 17 00:00:00 2001 From: Nova Date: Sat, 19 Apr 2025 01:32:35 -0700 Subject: [PATCH] fix(input): don't limit to closest handler --- src/objects/input/mod.rs | 28 +++++++++++----------------- src/objects/input/mouse_pointer.rs | 14 ++++++++++++-- src/objects/input/sk_controller.rs | 3 ++- src/objects/input/sk_hand.rs | 3 ++- 4 files changed, 27 insertions(+), 21 deletions(-) diff --git a/src/objects/input/mod.rs b/src/objects/input/mod.rs index 36ab8ce..a94542e 100644 --- a/src/objects/input/mod.rs +++ b/src/objects/input/mod.rs @@ -9,7 +9,10 @@ use crate::nodes::{ spatial::Spatial, }; use glam::vec3; -use std::sync::{Arc, Weak}; +use std::{ + collections::VecDeque, + sync::{Arc, Weak}, +}; #[derive(Default)] pub struct CaptureManager { @@ -64,11 +67,12 @@ pub fn find_closest_capture( .unwrap_or_default() } +/// sorts them greatest to least distance (so you can pop off the closest ones easily) pub fn get_sorted_handlers( method: &InputMethod, distance_calculator: DistanceCalculator, -) -> Vec> { - INPUT_HANDLER_REGISTRY +) -> Vec<(Arc, f32)> { + let mut handlers = INPUT_HANDLER_REGISTRY .get_valid_contents() .into_iter() .filter(|handler| handler.spatial.node().is_some_and(|node| node.enabled())) @@ -81,19 +85,9 @@ pub fn get_sorted_handlers( }) .filter_map(|handler| { distance_calculator(&method.spatial, &method.data.lock(), &handler.field) - .map(|distance| (vec![handler], distance)) + .map(|distance| (handler, distance)) }) - .filter(|(_, distance)| *distance > 0.0) - .reduce(|(mut handlers_a, distance_a), (handlers_b, distance_b)| { - if (distance_a - distance_b).abs() < 0.001 { - handlers_a.extend(handlers_b); - (handlers_a, distance_a) - } else if distance_a < distance_b { - (handlers_a, distance_a) - } else { - (handlers_b, distance_b) - } - }) - .map(|(handlers, _)| handlers) - .unwrap_or_default() + .collect::>(); + handlers.sort_by(|(_, dist_a), (_, dist_b)| dist_a.partial_cmp(dist_b).unwrap()); + handlers } diff --git a/src/objects/input/mouse_pointer.rs b/src/objects/input/mouse_pointer.rs index 79cca22..602172f 100644 --- a/src/objects/input/mouse_pointer.rs +++ b/src/objects/input/mouse_pointer.rs @@ -146,8 +146,18 @@ impl MousePointer { return; } - let sorted_handlers = get_sorted_handlers(&self.pointer, distance_calculator); - self.pointer.set_handler_order(sorted_handlers.iter()); + let mut handlers = get_sorted_handlers(&self.pointer, distance_calculator); + let first_distance = handlers + .first() + .map(|(_, distance)| *distance) + .unwrap_or(std::f32::NEG_INFINITY); + + self.pointer.set_handler_order( + handlers + .iter() + .filter(|(handler, distance)| (distance - first_distance).abs() <= 0.001) + .map(|(handler, _)| handler), + ); } pub fn send_keyboard_input( diff --git a/src/objects/input/sk_controller.rs b/src/objects/input/sk_controller.rs index 14f579c..ba35273 100644 --- a/src/objects/input/sk_controller.rs +++ b/src/objects/input/sk_controller.rs @@ -133,6 +133,7 @@ impl SkController { } let sorted_handlers = get_sorted_handlers(&self.input, distance_calculator); - self.input.set_handler_order(sorted_handlers.iter()); + self.input + .set_handler_order(sorted_handlers.iter().map(|(handler, _)| handler)); } } diff --git a/src/objects/input/sk_hand.rs b/src/objects/input/sk_hand.rs index 1e32721..e6653fe 100644 --- a/src/objects/input/sk_hand.rs +++ b/src/objects/input/sk_hand.rs @@ -179,7 +179,8 @@ impl SkHand { } let sorted_handlers = get_sorted_handlers(&self.input, distance_calculator); - self.input.set_handler_order(sorted_handlers.iter()); + self.input + .set_handler_order(sorted_handlers.iter().map(|(handler, _)| handler)); } } impl Drop for SkHand {