Compare commits

...

3 Commits

Author SHA1 Message Date
1f3aa8eaa0 Add ordering to navigation-related systems.
Some checks reported errors
continuous-integration/drone/push Build encountered an error
2022-08-29 12:25:07 -05:00
8148aa4092 Tweak shape extents and position, and viewshed range, to correctly flag tiles as visible or blocked. 2022-08-29 12:24:32 -05:00
124cd74cb1 Use correct transform when computing offsets. 2022-08-27 12:26:58 -05:00
3 changed files with 22 additions and 44 deletions

View File

@ -270,7 +270,7 @@ fn add_speed(mut commands: Commands, query: Query<Entity, (Added<Speed>, Without
} }
} }
fn limit_speed(mut query: Query<(&mut Speed, &MaxSpeed)>) { pub(crate) fn limit_speed(mut query: Query<(&mut Speed, &MaxSpeed)>) {
for (mut speed, max_speed) in &mut query { for (mut speed, max_speed) in &mut query {
if **speed > **max_speed { if **speed > **max_speed {
**speed = **max_speed; **speed = **max_speed;
@ -391,8 +391,12 @@ where
.add_system_to_stage(CoreStage::PostUpdate, log_area_descriptions::<S, A>); .add_system_to_stage(CoreStage::PostUpdate, log_area_descriptions::<S, A>);
const MOVEMENT_CONTROLS: &str = "MOVEMENT_CONTROLS"; const MOVEMENT_CONTROLS: &str = "MOVEMENT_CONTROLS";
if config.movement_control_states.is_empty() { if config.movement_control_states.is_empty() {
app.add_system(movement_controls::<S>.label(MOVEMENT_CONTROLS)) app.add_system(
.add_system(snap.chain(error_handler).before(MOVEMENT_CONTROLS)); movement_controls::<S>
.label(MOVEMENT_CONTROLS)
.after(limit_speed),
)
.add_system(snap.chain(error_handler).before(MOVEMENT_CONTROLS));
} else { } else {
let states = config.movement_control_states; let states = config.movement_control_states;
for state in states { for state in states {

View File

@ -8,32 +8,16 @@ use crate::{commands::RunIfExistsExt, core::GlobalTransformExt};
pub struct Volumetric; pub struct Volumetric;
fn update( fn update(
mut commands: Commands,
listener: Query<(&Collider, &GlobalTransform), With<Listener>>, listener: Query<(&Collider, &GlobalTransform), With<Listener>>,
mut sounds: Query< mut sounds: Query<(&Sound, &Parent, &mut Transform), With<Volumetric>>,
( colliders: Query<(&Collider, &GlobalTransform)>,
Entity,
Option<&Collider>,
Option<&Parent>,
&mut Transform,
&GlobalTransform,
),
With<Volumetric>,
>,
colliders: Query<&Collider>,
) { ) {
if let Ok((listener_collider, listener_global_transform)) = listener.get_single() { if let Ok((listener_collider, listener_global_transform)) = listener.get_single() {
for (sound_entity, sound_collider, parent, mut sound_transform, sound_global_transform) in for (sound, parent, mut sound_transform) in &mut sounds {
&mut sounds if sound.paused {
{ continue;
let sound_collider = if sound_collider.is_some() { }
sound_collider if let Ok((sound_collider, sound_global_transform)) = colliders.get(**parent) {
} else if let Some(parent) = parent {
colliders.get(**parent).ok()
} else {
None
};
if let Some(sound_collider) = sound_collider {
let closest = listener_global_transform.closest_points( let closest = listener_global_transform.closest_points(
listener_collider, listener_collider,
sound_global_transform, sound_global_transform,
@ -41,23 +25,13 @@ fn update(
); );
if let ClosestPoints::WithinMargin(_p1, p2) = closest { if let ClosestPoints::WithinMargin(_p1, p2) = closest {
let p2 = Vec3::new(p2.x, p2.y, 0.); let p2 = Vec3::new(p2.x, p2.y, 0.);
if p2.distance(sound_global_transform.translation()) >= 1. { sound_transform.translation.x = p2.x - sound_global_transform.translation().x;
sound_transform.translation.x = sound_transform.translation.y = p2.y - sound_global_transform.translation().y;
p2.x - sound_global_transform.translation().x;
sound_transform.translation.y =
p2.y - sound_global_transform.translation().y;
}
} else if closest == ClosestPoints::Intersecting { } else if closest == ClosestPoints::Intersecting {
if sound_global_transform sound_transform.translation.x = listener_global_transform.translation().x
.translation() - sound_global_transform.translation().x;
.distance(listener_global_transform.translation()) sound_transform.translation.y = listener_global_transform.translation().y
>= 1. - sound_global_transform.translation().y;
{
sound_transform.translation.x = listener_global_transform.translation().x
- sound_global_transform.translation().x;
sound_transform.translation.y = listener_global_transform.translation().y
- sound_global_transform.translation().y;
}
} }
} }
} }

View File

@ -85,7 +85,7 @@ impl Viewshed {
); );
let mut context: Context<u8> = Context::default(); let mut context: Context<u8> = Context::default();
let vision_distance = vision_distance::Circle::new(self.range); let vision_distance = vision_distance::Circle::new(self.range);
let shape = Collider::cuboid(0.5 - f32::EPSILON, 0.5 - f32::EPSILON); let shape = Collider::cuboid(0.49, 0.49);
let mut new_visible_entities = HashSet::new(); let mut new_visible_entities = HashSet::new();
let size = ( let size = (
(start.translation().x.abs() + self.range as f32) as u32, (start.translation().x.abs() + self.range as f32) as u32,
@ -96,7 +96,7 @@ impl Viewshed {
RefCell::new(Box::new(|coord: Coord| { RefCell::new(Box::new(|coord: Coord| {
let shape_pos = Vec2::new(coord.x as f32 + 0.5, coord.y as f32 + 0.5); let shape_pos = Vec2::new(coord.x as f32 + 0.5, coord.y as f32 + 0.5);
// println!("Checking {:?}", shape_pos); // println!("Checking {:?}", shape_pos);
if start.distance(&shape_pos) > self.range as f32 + 1. { if start.distance(&shape_pos) > self.range as f32 {
// println!("Out of range"); // println!("Out of range");
return u8::MAX; return u8::MAX;
} }