From 24db52abd9aa5564248444060728aba8a4c2554a Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Wed, 9 Jun 2021 17:42:04 -0500 Subject: [PATCH] Refine visibility algorithm. --- src/visibility.rs | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/src/visibility.rs b/src/visibility.rs index 508d888..3bb81ae 100644 --- a/src/visibility.rs +++ b/src/visibility.rs @@ -49,6 +49,16 @@ impl Viewshed { #[reflect(Component)] pub struct VisibleTiles(pub Vec); +impl PointLike for Coord { + fn x(&self) -> f32 { + self.x as f32 + } + + fn y(&self) -> f32 { + self.y as f32 + } +} + fn add_visibility_indices( mut commands: Commands, query: Query<(Entity, &Map), (Added, Without, Without)>, @@ -85,13 +95,13 @@ where } fn update_viewshed<'a>( - mut viewers: Query<(&mut Viewshed, &Coordinates), Changed>, + mut viewers: Query<(Entity, &mut Viewshed, &Coordinates), Changed>, map: Query<&Map>, query_pipeline: Res, collider_query: QueryPipelineColliderComponentsQuery, blocks_visibility: Query<&BlocksVisibility>, ) { - for (mut viewshed, start) in viewers.iter_mut() { + for (viewer_entity, mut viewshed, start) in viewers.iter_mut() { for map in map.iter() { let mut context: Context = Context::default(); let vision_distance = vision_distance::Circle::new(viewshed.range); @@ -99,7 +109,13 @@ fn update_viewshed<'a>( viewshed.visible.clear(); let collider_set = QueryPipelineColliderComponentsSet(&collider_query); let shape = Cuboid::new(Vec2::new(0.5, 0.5).into()); + let range = viewshed.range as f32; let visibility_grid = VisibilityGrid(map, |coord: Coord| { + if start.x_i32() == coord.x && start.y_i32() == coord.y { + return 0; + } else if coord.distance(start) > range { + return 255; + } let shape_pos = (Vec2::new(coord.x as f32, coord.y as f32), 0.); let mut opacity = 0; query_pipeline.intersections_with_shape( @@ -107,7 +123,9 @@ fn update_viewshed<'a>( &shape_pos.into(), &shape, InteractionGroups::all(), - Some(&|v| blocks_visibility.get(v.entity()).is_ok()), + Some(&|v| { + v.entity() != viewer_entity && blocks_visibility.get(v.entity()).is_ok() + }), |_| { opacity = 255; false