2022-08-23 14:49:14 +00:00
|
|
|
use bevy::{prelude::*, transform::TransformSystem};
|
|
|
|
use bevy_rapier2d::{parry::query::ClosestPoints, prelude::*};
|
|
|
|
use bevy_synthizer::{Listener, Sound};
|
|
|
|
|
2023-04-01 12:20:59 +00:00
|
|
|
use crate::core::GlobalTransformExt;
|
2022-08-23 14:49:14 +00:00
|
|
|
|
2022-12-19 20:08:31 +00:00
|
|
|
#[derive(Component, Default, Reflect, Clone, Copy, Debug)]
|
|
|
|
#[reflect(Component)]
|
2022-08-23 14:49:14 +00:00
|
|
|
pub struct Volumetric;
|
|
|
|
|
|
|
|
fn update(
|
|
|
|
listener: Query<(&Collider, &GlobalTransform), With<Listener>>,
|
2022-08-27 17:26:58 +00:00
|
|
|
mut sounds: Query<(&Sound, &Parent, &mut Transform), With<Volumetric>>,
|
|
|
|
colliders: Query<(&Collider, &GlobalTransform)>,
|
2022-08-23 14:49:14 +00:00
|
|
|
) {
|
|
|
|
if let Ok((listener_collider, listener_global_transform)) = listener.get_single() {
|
2022-08-27 17:26:58 +00:00
|
|
|
for (sound, parent, mut sound_transform) in &mut sounds {
|
|
|
|
if sound.paused {
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if let Ok((sound_collider, sound_global_transform)) = colliders.get(**parent) {
|
2022-08-23 14:49:14 +00:00
|
|
|
let closest = listener_global_transform.closest_points(
|
|
|
|
listener_collider,
|
|
|
|
sound_global_transform,
|
|
|
|
sound_collider,
|
|
|
|
);
|
|
|
|
if let ClosestPoints::WithinMargin(_p1, p2) = closest {
|
|
|
|
let p2 = Vec3::new(p2.x, p2.y, 0.);
|
2022-08-27 17:26:58 +00:00
|
|
|
sound_transform.translation.x = p2.x - sound_global_transform.translation().x;
|
|
|
|
sound_transform.translation.y = p2.y - sound_global_transform.translation().y;
|
2022-08-23 14:49:14 +00:00
|
|
|
} else if closest == ClosestPoints::Intersecting {
|
2022-08-27 17:26:58 +00:00
|
|
|
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;
|
2022-08-23 14:49:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-03-28 16:57:37 +00:00
|
|
|
fn removed(mut commands: Commands, mut removed: RemovedComponents<Volumetric>) {
|
|
|
|
for entity in &mut removed {
|
2023-04-01 12:20:59 +00:00
|
|
|
commands.entity(entity).insert(TransformBundle::default());
|
2022-08-23 14:49:14 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
pub struct VolumetricPlugin;
|
|
|
|
|
|
|
|
impl Plugin for VolumetricPlugin {
|
|
|
|
fn build(&self, app: &mut App) {
|
2022-12-19 20:08:31 +00:00
|
|
|
app.register_type::<Volumetric>()
|
2023-03-28 16:57:37 +00:00
|
|
|
.add_system(
|
|
|
|
update
|
|
|
|
.in_base_set(CoreSet::PostUpdate)
|
|
|
|
.before(TransformSystem::TransformPropagate),
|
2022-12-19 20:08:31 +00:00
|
|
|
)
|
2023-03-28 16:57:37 +00:00
|
|
|
.add_system(removed.in_base_set(CoreSet::PostUpdate));
|
2022-08-23 14:49:14 +00:00
|
|
|
}
|
|
|
|
}
|