From d33f26d31c015b8569683afae84380f3817b27e0 Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Mon, 23 Aug 2021 10:14:03 -0500 Subject: [PATCH] Visibility system cleanup. --- src/visibility.rs | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/src/visibility.rs b/src/visibility.rs index a0f36e5..a53ce19 100644 --- a/src/visibility.rs +++ b/src/visibility.rs @@ -112,7 +112,6 @@ fn update_viewshed( let mut context: Context = Context::default(); let vision_distance = vision_distance::Circle::new(viewshed.range); let coord = Coord::new(start.x_i32(), start.y_i32()); - viewshed.visible.clear(); let shape = Cuboid::new(Vec2::new(0.49, 0.49).into()); let range = viewshed.range as f32; let collider_set = QueryPipelineColliderComponentsSet(&collider_query); @@ -148,6 +147,7 @@ fn update_viewshed( ); opacity }); + let mut new_visible = HashSet::new(); context.for_each_visible( coord, &visibility_grid, @@ -155,13 +155,16 @@ fn update_viewshed( vision_distance, 255, |coord, _directions, _visibility| { - viewshed.visible.insert((coord.x, coord.y)); + new_visible.insert((coord.x, coord.y)); }, ); + if viewshed.visible != new_visible { + viewshed.visible = new_visible; + } } fn update_viewshed_for_coordinates( - visible: Query<&Coordinates, (Changed, With)>, + visible: Query<(Entity, &Coordinates), (Changed, With)>, mut viewers: Query<(Entity, &mut Viewshed, &Coordinates)>, map: Query<&Map>, query_pipeline: Res, @@ -169,9 +172,11 @@ fn update_viewshed_for_coordinates( blocks_visibility: Query<&BlocksVisibility>, coordinates_query: Query<&Coordinates>, ) { - for coordinates in visible.iter() { + for (visible_entity, coordinates) in visible.iter() { for (viewer_entity, mut viewshed, start) in viewers.iter_mut() { - if coordinates.distance(start) > viewshed.range as f32 { + if viewer_entity == visible_entity + || coordinates.distance(start) > viewshed.range as f32 + { continue; } if let Ok(map) = map.single() { @@ -273,12 +278,7 @@ fn log_visible( for timer in recently_lost.values_mut() { timer.tick(time.delta()); } - let recently_lost_clone = recently_lost.clone(); - for (entity, timer) in recently_lost_clone.iter() { - if timer.finished() { - recently_lost.remove(&entity); - } - } + recently_lost.retain(|_, v| !v.finished()); let mut new_seen = HashSet::new(); if let Ok(mut log) = log.single_mut() { for (viewer_entity, viewshed, coordinates, transform) in viewers.iter() {