Compare commits
2 Commits
4e6c01d654
...
5615a28ece
Author | SHA1 | Date | |
---|---|---|---|
5615a28ece | |||
28718d2e85 |
51
src/lib.rs
51
src/lib.rs
|
@ -73,6 +73,16 @@ impl Default for Sound {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Component, Clone, Copy, Debug, Deref, DerefMut)]
|
||||||
|
// #[reflect(Component)]
|
||||||
|
pub struct PannerStrategy(pub syz::PannerStrategy);
|
||||||
|
|
||||||
|
impl Default for PannerStrategy {
|
||||||
|
fn default() -> Self {
|
||||||
|
Self(syz::PannerStrategy::Delegate)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Component, Clone, Copy, Debug, Deref, DerefMut)]
|
#[derive(Component, Clone, Copy, Debug, Deref, DerefMut)]
|
||||||
pub struct DistanceModel(pub syz::DistanceModel);
|
pub struct DistanceModel(pub syz::DistanceModel);
|
||||||
|
|
||||||
|
@ -189,11 +199,33 @@ fn swap_buffers(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn change_panner_strategy(
|
||||||
|
changed: Query<Entity, Changed<PannerStrategy>>,
|
||||||
|
removed: RemovedComponents<PannerStrategy>,
|
||||||
|
mut sounds: Query<&mut Sound>,
|
||||||
|
) {
|
||||||
|
let mut check = vec![];
|
||||||
|
for entity in changed.iter() {
|
||||||
|
check.push(entity);
|
||||||
|
}
|
||||||
|
for entity in removed.iter() {
|
||||||
|
check.push(entity);
|
||||||
|
}
|
||||||
|
for entity in check.iter() {
|
||||||
|
if let Ok(mut sound) = sounds.get_mut(*entity) {
|
||||||
|
if sound.source.is_some() {
|
||||||
|
sound.source = None;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn update_sound_properties(
|
pub fn update_sound_properties(
|
||||||
context: Res<syz::Context>,
|
context: Res<syz::Context>,
|
||||||
buffers: Res<Assets<Buffer>>,
|
buffers: Res<Assets<Buffer>>,
|
||||||
mut query: Query<(
|
mut query: Query<(
|
||||||
&mut Sound,
|
&mut Sound,
|
||||||
|
Option<&PannerStrategy>,
|
||||||
Option<&DistanceModel>,
|
Option<&DistanceModel>,
|
||||||
Option<&DistanceRef>,
|
Option<&DistanceRef>,
|
||||||
Option<&DistanceMax>,
|
Option<&DistanceMax>,
|
||||||
|
@ -208,6 +240,7 @@ pub fn update_sound_properties(
|
||||||
) {
|
) {
|
||||||
for (
|
for (
|
||||||
mut sound,
|
mut sound,
|
||||||
|
panner_strategy,
|
||||||
distance_model,
|
distance_model,
|
||||||
distance_ref,
|
distance_ref,
|
||||||
distance_max,
|
distance_max,
|
||||||
|
@ -250,9 +283,10 @@ pub fn update_sound_properties(
|
||||||
if let Some(generator) = sound.generator.as_mut() {
|
if let Some(generator) = sound.generator.as_mut() {
|
||||||
generator.buffer().set(&**b).expect("Unable to set buffer");
|
generator.buffer().set(&**b).expect("Unable to set buffer");
|
||||||
if let Some(translation) = translation {
|
if let Some(translation) = translation {
|
||||||
|
let panner_strategy = panner_strategy.cloned().unwrap_or_default();
|
||||||
let source = syz::Source3D::new(
|
let source = syz::Source3D::new(
|
||||||
&context,
|
&context,
|
||||||
syz::PannerStrategy::Delegate,
|
*panner_strategy,
|
||||||
(
|
(
|
||||||
translation.x as f64,
|
translation.x as f64,
|
||||||
translation.y as f64,
|
translation.y as f64,
|
||||||
|
@ -265,20 +299,19 @@ pub fn update_sound_properties(
|
||||||
.expect("Unable to add generator");
|
.expect("Unable to add generator");
|
||||||
sound.source = Some(source.into());
|
sound.source = Some(source.into());
|
||||||
} else if let Some(scalar_pan) = scalar_pan {
|
} else if let Some(scalar_pan) = scalar_pan {
|
||||||
let source = syz::ScalarPannedSource::new(
|
let panner_strategy = panner_strategy.cloned().unwrap_or_default();
|
||||||
&context,
|
let source =
|
||||||
syz::PannerStrategy::Delegate,
|
syz::ScalarPannedSource::new(&context, *panner_strategy, **scalar_pan)
|
||||||
**scalar_pan,
|
|
||||||
)
|
|
||||||
.expect("Failed to create source");
|
.expect("Failed to create source");
|
||||||
source
|
source
|
||||||
.add_generator(generator)
|
.add_generator(generator)
|
||||||
.expect("Failed to add generator");
|
.expect("Failed to add generator");
|
||||||
sound.source = Some(source.into());
|
sound.source = Some(source.into());
|
||||||
} else if let Some(angular_pan) = angular_pan {
|
} else if let Some(angular_pan) = angular_pan {
|
||||||
|
let panner_strategy = panner_strategy.cloned().unwrap_or_default();
|
||||||
let source = syz::AngularPannedSource::new(
|
let source = syz::AngularPannedSource::new(
|
||||||
&context,
|
&context,
|
||||||
syz::PannerStrategy::Delegate,
|
*panner_strategy,
|
||||||
angular_pan.azimuth,
|
angular_pan.azimuth,
|
||||||
angular_pan.elevation,
|
angular_pan.elevation,
|
||||||
)
|
)
|
||||||
|
@ -559,6 +592,10 @@ impl Plugin for SynthizerPlugin {
|
||||||
CoreStage::PostUpdate,
|
CoreStage::PostUpdate,
|
||||||
swap_buffers.before(update_sound_properties),
|
swap_buffers.before(update_sound_properties),
|
||||||
)
|
)
|
||||||
|
.add_system_to_stage(
|
||||||
|
CoreStage::PostUpdate,
|
||||||
|
change_panner_strategy.before(update_sound_properties),
|
||||||
|
)
|
||||||
.add_system_to_stage(
|
.add_system_to_stage(
|
||||||
CoreStage::PostUpdate,
|
CoreStage::PostUpdate,
|
||||||
update_listener
|
update_listener
|
||||||
|
|
Loading…
Reference in New Issue
Block a user