mirror of
https://github.com/lightsoutgames/bevy_openal.git
synced 2024-11-23 09:45:56 +00:00
Add support for global effects.
This commit is contained in:
parent
ab0e8e60c8
commit
43b8c2c793
|
@ -1,5 +1,5 @@
|
||||||
use bevy::{asset::LoadState, prelude::*};
|
use bevy::{asset::LoadState, prelude::*};
|
||||||
use bevy_openal::{Listener, OpenAlPlugin, Sound, Sounds};
|
use bevy_openal::{efx, Context, GlobalEffects, Listener, OpenAlPlugin, Sound, Sounds};
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
struct AssetHandles {
|
struct AssetHandles {
|
||||||
|
@ -7,8 +7,20 @@ struct AssetHandles {
|
||||||
loaded: bool,
|
loaded: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
fn setup(asset_server: Res<AssetServer>, mut handles: ResMut<AssetHandles>) {
|
fn setup(
|
||||||
|
asset_server: Res<AssetServer>,
|
||||||
|
mut handles: ResMut<AssetHandles>,
|
||||||
|
context: ResMut<Context>,
|
||||||
|
mut global_effects: ResMut<GlobalEffects>,
|
||||||
|
) {
|
||||||
handles.sounds = asset_server.load_folder(".").expect("Failed to load sfx");
|
handles.sounds = asset_server.load_folder(".").expect("Failed to load sfx");
|
||||||
|
if let Ok(mut slot) = context.new_aux_effect_slot() {
|
||||||
|
if let Ok(mut reverb) = context.new_effect::<efx::EaxReverbEffect>() {
|
||||||
|
reverb.set_preset(&efx::REVERB_PRESET_GENERIC).unwrap();
|
||||||
|
slot.set_effect(&reverb).unwrap();
|
||||||
|
global_effects.push(slot);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn load_and_create_system(
|
fn load_and_create_system(
|
||||||
|
@ -32,6 +44,7 @@ fn load_and_create_system(
|
||||||
Sound {
|
Sound {
|
||||||
buffer,
|
buffer,
|
||||||
autoplay: true,
|
autoplay: true,
|
||||||
|
gain: 0.4,
|
||||||
looping: true,
|
looping: true,
|
||||||
..Default::default()
|
..Default::default()
|
||||||
},
|
},
|
||||||
|
|
30
src/lib.rs
30
src/lib.rs
|
@ -1,9 +1,14 @@
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
|
pub use alto::efx;
|
||||||
|
use alto::efx::AuxEffectSlot;
|
||||||
|
pub use alto::Context;
|
||||||
|
pub use alto::Device;
|
||||||
pub use alto::Source;
|
pub use alto::Source;
|
||||||
use alto::{Alto, Context, Mono, StaticSource, Stereo};
|
use alto::{Alto, Mono, StaticSource, Stereo};
|
||||||
use bevy::{
|
use bevy::{
|
||||||
asset::{AssetLoader, HandleId, LoadContext, LoadedAsset},
|
asset::{AssetLoader, HandleId, LoadContext, LoadedAsset},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
@ -140,9 +145,27 @@ impl Default for Sound {
|
||||||
}
|
}
|
||||||
pub type Sounds = HashMap<String, Sound>;
|
pub type Sounds = HashMap<String, Sound>;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct GlobalEffects(Vec<AuxEffectSlot>);
|
||||||
|
|
||||||
|
impl Deref for GlobalEffects {
|
||||||
|
type Target = Vec<AuxEffectSlot>;
|
||||||
|
|
||||||
|
fn deref(&self) -> &Self::Target {
|
||||||
|
&self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DerefMut for GlobalEffects {
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
&mut self.0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn source_system(
|
fn source_system(
|
||||||
context: Res<Context>,
|
context: Res<Context>,
|
||||||
buffers: Res<Buffers>,
|
buffers: Res<Buffers>,
|
||||||
|
mut global_effects: ResMut<GlobalEffects>,
|
||||||
mut query: Query<(&mut Sounds, Option<&Transform>)>,
|
mut query: Query<(&mut Sounds, Option<&Transform>)>,
|
||||||
) {
|
) {
|
||||||
for (mut sounds, transform) in query.iter_mut() {
|
for (mut sounds, transform) in query.iter_mut() {
|
||||||
|
@ -175,6 +198,9 @@ fn source_system(
|
||||||
source.set_relative(true);
|
source.set_relative(true);
|
||||||
source.set_position([0., 0., 0.]).unwrap();
|
source.set_position([0., 0., 0.]).unwrap();
|
||||||
}
|
}
|
||||||
|
for (send, effect) in global_effects.iter_mut().enumerate() {
|
||||||
|
source.set_aux_send(send as i32, effect).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -218,8 +244,10 @@ impl Plugin for OpenAlPlugin {
|
||||||
let context = device.new_context(None).expect("Could not create context");
|
let context = device.new_context(None).expect("Could not create context");
|
||||||
app.add_asset::<Buffer>()
|
app.add_asset::<Buffer>()
|
||||||
.init_asset_loader::<BufferAssetLoader>()
|
.init_asset_loader::<BufferAssetLoader>()
|
||||||
|
.add_thread_local_resource(device)
|
||||||
.add_resource(context)
|
.add_resource(context)
|
||||||
.add_resource(Buffers::default())
|
.add_resource(Buffers::default())
|
||||||
|
.add_resource(GlobalEffects::default())
|
||||||
.register_type::<Listener>()
|
.register_type::<Listener>()
|
||||||
.add_system(buffer_creation_system)
|
.add_system(buffer_creation_system)
|
||||||
.add_system(source_system)
|
.add_system(source_system)
|
||||||
|
|
Loading…
Reference in New Issue
Block a user