Fix volumetric sound and adapt sound icon code to new bevy_synthizer.

This commit is contained in:
Nolan Darilek 2024-12-02 13:30:37 -06:00
parent 8c930c321d
commit d268ed2b0c
3 changed files with 65 additions and 49 deletions

View File

@ -49,7 +49,7 @@ features = [
[dependencies] [dependencies]
bevy_rapier2d = "0.27" bevy_rapier2d = "0.27"
bevy_synthizer = "0.7" bevy_synthizer = "0.8"
bevy_tts = { version = "0.9", default-features = false, features = ["tolk"] } bevy_tts = { version = "0.9", default-features = false, features = ["tolk"] }
coord_2d = "0.3" coord_2d = "0.3"
here_be_dragons = { version = "0.3", features = ["serde"] } here_be_dragons = { version = "0.3", features = ["serde"] }

View File

@ -75,13 +75,16 @@ fn update<S>(
} else { } else {
None None
}; };
if let Some(entity) = entity { let Some(entity) = entity else {
continue;
};
if visible.contains(&entity) { if visible.contains(&entity) {
if let Some(interval) = icon.interval.as_mut() { if let Some(interval) = icon.interval.as_mut() {
if interval.finished() { if interval.finished() {
interval.reset(); interval.reset();
continue; continue;
} else if interval.fraction() == 0. { } else if interval.fraction() == 0. {
sound.playback_position = 0.;
sound.generator = None; sound.generator = None;
} }
interval.tick(time.delta()); interval.tick(time.delta());
@ -101,6 +104,7 @@ fn update<S>(
} }
if sound.paused { if sound.paused {
sound.paused = false; sound.paused = false;
sound.playback_position = 0.;
sound.generator = None; sound.generator = None;
} }
} else if !sound.paused { } else if !sound.paused {
@ -109,9 +113,6 @@ fn update<S>(
interval.reset(); interval.reset();
} }
} }
} else {
panic!("Should not happen");
}
} }
} }
} }

View File

@ -9,31 +9,46 @@ use crate::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<(&Sound, &Parent, &mut Transform), With<Volumetric>>, mut sounds: Query<(Entity, &Sound, &Parent, Option<&mut Transform>), With<Volumetric>>,
colliders: Query<(&Collider, &GlobalTransform)>, colliders: Query<(&Collider, &GlobalTransform)>,
) { ) {
if let Ok((listener_collider, listener_global_transform)) = listener.get_single() { if let Ok((listener_collider, listener_global_transform)) = listener.get_single() {
for (sound, parent, mut sound_transform) in &mut sounds { for (sound_entity, sound, parent, sound_transform) in &mut sounds {
if sound.paused { if sound.paused {
continue; continue;
} }
if let Ok((sound_collider, sound_global_transform)) = colliders.get(**parent) { let Ok((sound_collider, sound_global_transform)) = colliders.get(**parent) else {
continue;
};
let closest = listener_global_transform.closest_points( let closest = listener_global_transform.closest_points(
listener_collider, listener_collider,
sound_global_transform, sound_global_transform,
sound_collider, sound_collider,
); );
if let ClosestPoints::WithinMargin(_p1, p2) = closest { if let ClosestPoints::WithinMargin(_p1, p2) = closest {
let p2 = Vec3::new(p2.x, p2.y, 0.); if let Some(mut sound_transform) = sound_transform {
sound_transform.translation.x = p2.x - sound_global_transform.translation().x; sound_transform.translation.x = p2.x - sound_global_transform.translation().x;
sound_transform.translation.y = p2.y - sound_global_transform.translation().y; sound_transform.translation.y = p2.y - sound_global_transform.translation().y;
} else if closest == ClosestPoints::Intersecting { } else {
sound_transform.translation.x = listener_global_transform.translation().x let sound_translation = Vec3::new(
- sound_global_transform.translation().x; p2.x - sound_global_transform.translation().x,
sound_transform.translation.y = listener_global_transform.translation().y p2.y - sound_global_transform.translation().y,
- sound_global_transform.translation().y; 0.,
);
commands
.entity(sound_entity)
.insert(TransformBundle::from_transform(
Transform::from_translation(sound_translation),
));
} }
} else if closest == ClosestPoints::Intersecting && sound_transform.is_some() {
println!("Clearing volumetric");
commands
.entity(sound_entity)
.remove::<Transform>()
.remove::<GlobalTransform>();
} }
} }
} }