From 4512b6368169b184e3b000facd959a0ab7d863de Mon Sep 17 00:00:00 2001 From: hut Date: Fri, 5 Apr 2024 19:34:01 +0200 Subject: [PATCH] generalize with generics --- src/camera.rs | 46 ++++++++++++++++++++++------------------------ src/hud.rs | 9 ++++++--- 2 files changed, 28 insertions(+), 27 deletions(-) diff --git a/src/camera.rs b/src/camera.rs index 31da49f..414833e 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -336,33 +336,31 @@ fn apply_input_to_player( } // Find the closest world object that the player is looking at -pub fn find_closest_target( - q_objects: Query<(Entity, &Transform), (With, Without)>, - q_camera: Query<&Transform, With>, -) -> (Option, f32) +pub fn find_closest_target( + objects: Vec<(TargetSpecifier, &Transform)>, + camera_transform: &Transform, +) -> (Option, f32) { - let mut closest_entity: Option = None; + let mut closest_entity: Option = None; let mut closest_distance: f32 = f32::MAX; - if let Ok(camtrans) = q_camera.get_single() { - let target_vector = (camtrans.rotation * Vec3::new(0.0, 0.0, -1.0)) + let target_vector = (camera_transform.rotation * Vec3::new(0.0, 0.0, -1.0)) + .normalize_or_zero(); + let field_of_view = 20.0f32.to_radians(); + let max_angle = field_of_view / 2.0; + for (entity, trans) in objects { + // Use Transform instead of Position because we're basing this + // not on the player mesh but on the camera, which doesn't have a position. + let pos_vector = (trans.translation - camera_transform.translation) .normalize_or_zero(); - let field_of_view = 20.0f32.to_radians(); - let max_angle = field_of_view / 2.0; - for (entity, trans) in &q_objects { - // Use Transform instead of Position because we're basing this - // not on the player mesh but on the camera, which doesn't have a position. - let pos_vector = (trans.translation - camtrans.translation) - .normalize_or_zero(); - let cosine_of_angle = target_vector.dot(pos_vector); - let angle = cosine_of_angle.acos(); - if angle <= max_angle { - // It's in the field of view! - //commands.entity(entity).insert(IsTargeted); - let distance = trans.translation.distance(camtrans.translation); - if distance < closest_distance { - closest_distance = distance; - closest_entity = Some(entity); - } + let cosine_of_angle = target_vector.dot(pos_vector); + let angle = cosine_of_angle.acos(); + if angle <= max_angle { + // It's in the field of view! + //commands.entity(entity).insert(IsTargeted); + let distance = trans.translation.distance(camera_transform.translation); + if distance < closest_distance { + closest_distance = distance; + closest_entity = Some(entity); } } } diff --git a/src/hud.rs b/src/hud.rs index e25b36a..299c179 100644 --- a/src/hud.rs +++ b/src/hud.rs @@ -489,7 +489,7 @@ fn update( // Target display let target: Option; - if let Ok((targetpos, actr)) = q_target.get_single() { + if let Ok((targetpos, _actr)) = q_target.get_single() { target = Some(targetpos.0); } else if q_target.is_empty() { @@ -600,8 +600,11 @@ fn handle_input( if mouse_input.just_pressed(settings.key_selectobject) { //ew_sfx.send(audio::PlaySfxEvent(audio::Sfx::Switch)); if q_target.is_empty() { - if let (Some(entity), _dist) = camera::find_closest_target(q_objects, q_camera) { - commands.entity(entity).insert(IsTargeted); + if let Ok(camtrans) = q_camera.get_single() { + let objects: Vec<(Entity, &Transform)> = q_objects.iter().collect(); + if let (Some(entity), _dist) = camera::find_closest_target::(objects, camtrans) { + commands.entity(entity).insert(IsTargeted); + } } } else {