From 41bfe08a03303d4729ba385fde6f2912fc140315 Mon Sep 17 00:00:00 2001 From: Nolan Darilek Date: Mon, 24 May 2021 10:19:01 -0500 Subject: [PATCH] Refactor indexing into individual setter functions. --- src/map.rs | 17 ++++++++ src/navigation.rs | 100 +++++++++++++++++++++++++++------------------- src/visibility.rs | 63 +++++++++++++++++------------ 3 files changed, 114 insertions(+), 66 deletions(-) diff --git a/src/map.rs b/src/map.rs index 29accb8..6ebe4e7 100644 --- a/src/map.rs +++ b/src/map.rs @@ -314,6 +314,17 @@ fn area_description( } } +fn remove_coordinates(removed: RemovedComponents, mut map: Query<&mut Map>) { + for removed in removed.iter() { + println!("Removing {:?} from map", removed); + for mut map in map.iter_mut() { + for entities in map.entities.iter_mut() { + entities.retain(|e| *e != removed); + } + } + } +} + #[derive(Default, Deref, DerefMut)] struct PreviousIndex(HashMap); @@ -369,6 +380,12 @@ impl Plugin for MapPlugin { .label(SPAWN_PORTALS) .before(UPDATE_ENTITY_INDEX_LABEL), ) + .add_system_to_stage( + CoreStage::PostUpdate, + remove_coordinates + .system() + .before(UPDATE_ENTITY_INDEX_LABEL), + ) .add_system_to_stage( CoreStage::PostUpdate, entity_indexing.system().label(UPDATE_ENTITY_INDEX_LABEL), diff --git a/src/navigation.rs b/src/navigation.rs index 7a7c92e..74bfab9 100644 --- a/src/navigation.rs +++ b/src/navigation.rs @@ -215,6 +215,24 @@ fn movement( } } +pub(crate) fn set_motion_blocked( + map: &Map, + index: usize, + motion_blockers: &Query<&BlocksMotion>, + motion_blocked: &mut MotionBlocked, +) { + let mut new_motion_blocked = map.base.tiles[index].blocks_motion(); + if !new_motion_blocked { + for e in &map.entities[index] { + if motion_blockers.get(*e).is_ok() { + new_motion_blocked = true; + break; + } + } + } + motion_blocked[index] = new_motion_blocked; +} + pub const UPDATE_COLLISION_INDEX_LABEL: &str = "UPDATE_COLLISION_INDEX"; #[derive(Default, Deref, DerefMut)] @@ -236,17 +254,7 @@ fn blocks_motion_indexing( if *prev_idx == idx { continue; } - let tile = map.base.tiles[*prev_idx]; - let mut new_motion_blocked = tile.blocks_motion(); - if !new_motion_blocked { - for e in &map.entities[*prev_idx] { - if motion_blockers.get(*e).is_ok() { - new_motion_blocked = true; - break; - } - } - } - motion_blocked[*prev_idx] = new_motion_blocked; + set_motion_blocked(map, *prev_idx, &motion_blockers, &mut motion_blocked); } motion_blocked[idx] = true; prev_index.insert(entity, idx); @@ -262,22 +270,35 @@ fn remove_blocks_motion( blocks_motion: Query<&BlocksMotion>, ) { for entity in removed.iter() { - if let Ok(coordinates) = coordinates.get_component::(entity) { + for (map, mut motion_blocked) in map.iter_mut() { + if let Some(prev) = prev_index.get(&entity) { + set_motion_blocked(&map, *prev, &blocks_motion, &mut motion_blocked) + } prev_index.remove(&entity); - for (map, mut motion_blocked) in map.iter_mut() { - let idx = (**coordinates).to_index(map.width()); - let tile = map.base.tiles[idx]; - let mut new_motion_blocked = tile.blocks_motion(); - for e in &map.entities[idx] { - new_motion_blocked = new_motion_blocked - || blocks_motion.get_component::(*e).is_ok(); - } - motion_blocked[idx] = new_motion_blocked; + if let Ok(coordinates) = coordinates.get(entity) { + let idx = coordinates.to_index(map.width()); + set_motion_blocked(&map, idx, &blocks_motion, &mut motion_blocked) } } } } +pub(crate) fn set_monitors_collisions( + map: &Map, + index: usize, + collision_monitors: &Query<&MonitorsCollisions>, + collisions_monitored: &mut CollisionsMonitored, +) { + let mut new_collisions_monitored = false; + for e in &map.entities[index] { + if collision_monitors.get(*e).is_ok() { + new_collisions_monitored = true; + break; + } + } + collisions_monitored[index] = new_collisions_monitored; +} + #[derive(Default, Deref, DerefMut)] struct PreviousMonitorsCollisionsIndex(HashMap); @@ -297,14 +318,12 @@ fn monitors_collisions_indexing( if *prev_idx == idx { continue; } - let mut new_collisions_monitored = false; - for e in &map.entities[*prev_idx] { - if collision_monitors.get(*e).is_ok() { - new_collisions_monitored = true; - break; - } - } - collisions_monitored[*prev_idx] = new_collisions_monitored; + set_monitors_collisions( + &map, + *prev_idx, + &collision_monitors, + &mut collisions_monitored, + ); } collisions_monitored[idx] = true; prev_index.insert(entity, idx); @@ -320,18 +339,19 @@ fn remove_monitors_collisions( monitors_collisions: Query<&MonitorsCollisions>, ) { for entity in removed.iter() { - if let Ok(coordinates) = coordinates.get_component::(entity) { - prev_index.remove(&entity); - for (map, mut collisions_monitored) in map.iter_mut() { - let idx = (**coordinates).to_index(map.width()); - let mut new_collisions_monitored = false; - for e in &map.entities[idx] { - new_collisions_monitored = new_collisions_monitored - || monitors_collisions - .get_component::(*e) - .is_ok(); + for (map, mut collisions_monitored) in map.iter_mut() { + if let Ok(coordinates) = coordinates.get_component::(entity) { + if let Some(prev) = prev_index.get(&entity) { + set_monitors_collisions( + &map, + *prev, + &monitors_collisions, + &mut collisions_monitored, + ); } - collisions_monitored[idx] = new_collisions_monitored; + prev_index.remove(&entity); + let idx = coordinates.to_index(map.width()); + set_monitors_collisions(&map, idx, &monitors_collisions, &mut collisions_monitored); } } } diff --git a/src/visibility.rs b/src/visibility.rs index da845ae..ecaba02 100644 --- a/src/visibility.rs +++ b/src/visibility.rs @@ -38,7 +38,6 @@ impl Default for Viewshed { } } -#[allow(dead_code)] impl Viewshed { pub fn is_visible(&self, point: &dyn PointLike) -> bool { self.visible.contains(&point.into()) @@ -82,6 +81,24 @@ fn add_visibility_indices( } } +pub(crate) fn set_visibility_blocked( + map: &Map, + index: usize, + visibility_blockers: &Query<&BlocksVisibility>, + visibility_blocked: &mut VisibilityBlocked, +) { + let mut new_visibility_blocked = map.base.tiles[index].blocks_visibility(); + if !new_visibility_blocked { + for e in &map.entities[index] { + if visibility_blockers.get(*e).is_ok() { + new_visibility_blocked = true; + break; + } + } + } + visibility_blocked[index] = new_visibility_blocked; +} + #[derive(Default, Deref, DerefMut)] struct PreviousIndex(HashMap); @@ -104,17 +121,12 @@ fn map_visibility_indexing( if *prev_idx == idx { continue; } - let tile = map.base.tiles[*prev_idx]; - let mut new_visibility_blocked = tile.blocks_visibility(); - if !new_visibility_blocked { - for e in &map.entities[*prev_idx] { - if visibility_blockers.get(*e).is_ok() { - new_visibility_blocked = true; - break; - } - } - } - visibility_blocked[*prev_idx] = new_visibility_blocked; + set_visibility_blocked( + &map, + *prev_idx, + &visibility_blockers, + &mut visibility_blocked, + ); } visibility_blocked[idx] = true; prev_index.insert(entity, idx); @@ -130,21 +142,20 @@ fn remove_blocks_visibility( blocks_visibility: Query<&BlocksVisibility>, ) { for entity in removed.iter() { - if let Ok(coordinates) = coordinates.get_component::(entity) { - prev_index.remove(&entity); - for (map, mut visibility_blocked) in map.iter_mut() { - let idx = coordinates.to_index(map.width()); - let tile = map.base.tiles[idx]; - let mut new_visibility_blocked = tile.blocks_visibility(); - if !new_visibility_blocked { - for e in &map.entities[idx] { - if blocks_visibility.get(*e).is_ok() { - new_visibility_blocked = true; - break; - } - } + for (map, mut visibility_blocked) in map.iter_mut() { + if let Ok(coordinates) = coordinates.get_component::(entity) { + if let Some(prev) = prev_index.get(&entity) { + set_visibility_blocked( + &map, + *prev, + &blocks_visibility, + &mut visibility_blocked, + ); } - visibility_blocked[idx] = new_visibility_blocked; + prev_index.remove(&entity); + let idx = coordinates.to_index(map.width()); + set_visibility_blocked(&map, idx, &blocks_visibility, &mut visibility_blocked); + prev_index.insert(entity, idx); } } }