From b2ebb025e7410adaaec73e6db497f1ea48eb0c4e Mon Sep 17 00:00:00 2001 From: Lemonzy Date: Tue, 16 Jul 2024 03:03:50 +0200 Subject: [PATCH] Use object visibility to determine the closest object to the camera (#28) Fix #27 --- src/camera.rs | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/camera.rs b/src/camera.rs index 56aeafa..869af8b 100644 --- a/src/camera.rs +++ b/src/camera.rs @@ -8,7 +8,10 @@ use bevy_hierarchy::prelude::*; use bevy_input::{mouse::MouseMotion, prelude::*}; use bevy_math::{prelude::*, DQuat, DVec3}; use bevy_reflect::prelude::*; -use bevy_render::{primitives::Aabb, view::RenderLayers}; +use bevy_render::{ + primitives::Aabb, + view::{InheritedVisibility, RenderLayers}, +}; use bevy_time::prelude::*; use bevy_transform::{prelude::*, TransformSystem}; use bevy_utils::HashSet; @@ -217,6 +220,7 @@ pub fn nearest_objects_in_frame( &GlobalTransform, &Aabb, Option<&RenderLayers>, + Option<&InheritedVisibility>, )>, mut camera: Query<( Entity, @@ -235,11 +239,15 @@ pub fn nearest_objects_in_frame( let nearest_object = objects .iter() .filter(|(entity, ..)| !cam_children.contains(entity)) - .filter(|(.., obj_layer)| { + .filter(|(.., obj_layer, _)| { let obj_layer = obj_layer.unwrap_or_default(); cam_layer.intersects(obj_layer) }) - .map(|(entity, object_local, obj_pos, aabb, _)| { + .filter(|(.., visibility)| { + let visibility = visibility.copied().unwrap_or(InheritedVisibility::VISIBLE); + visibility.get() + }) + .map(|(entity, object_local, obj_pos, aabb, ..)| { let center_distance = obj_pos.translation().as_dvec3() - cam_pos.translation().as_dvec3(); let nearest_distance = center_distance.length()