mirror of
https://gitlab.com/veloren/veloren.git
synced 2024-08-30 18:12:32 +00:00
Moving audio code
This commit is contained in:
parent
6215ccd522
commit
dc8424c549
@ -1,4 +1,3 @@
|
|||||||
// TODO: Add an ambient-soundtrack that runs independently from the musical soundtrack
|
|
||||||
// Times: Some(Day), Some(Night), None [both]
|
// Times: Some(Day), Some(Night), None [both]
|
||||||
// Biomes: Grassland, Forest, Desert, Snowland, Lake, Mountain, Ocean, Jungle, Savannah, Taiga
|
// Biomes: Grassland, Forest, Desert, Snowland, Lake, Mountain, Ocean, Jungle, Savannah, Taiga
|
||||||
// planned biomes: Swamp
|
// planned biomes: Swamp
|
||||||
|
@ -1685,7 +1685,7 @@ impl Client {
|
|||||||
self.invite = None;
|
self.invite = None;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Lerp the clientside weather.
|
// Lerp the clientside weather.
|
||||||
self.weather.update(&mut self.state.weather_grid_mut());
|
self.weather.update(&mut self.state.weather_grid_mut());
|
||||||
|
|
||||||
// Lerp towards the target time of day - this ensures a smooth transition for
|
// Lerp towards the target time of day - this ensures a smooth transition for
|
||||||
|
@ -13,9 +13,7 @@ pub struct WeatherSim {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl WeatherSim {
|
impl WeatherSim {
|
||||||
pub fn new(size: Vec2<u32>, _world: &World) -> Self {
|
pub fn new(size: Vec2<u32>, _world: &World) -> Self { Self { size } }
|
||||||
Self { size }
|
|
||||||
}
|
|
||||||
|
|
||||||
// Time step is cell size / maximum wind speed
|
// Time step is cell size / maximum wind speed
|
||||||
pub fn tick(&mut self, time_of_day: &TimeOfDay, out: &mut WeatherGrid) {
|
pub fn tick(&mut self, time_of_day: &TimeOfDay, out: &mut WeatherGrid) {
|
||||||
|
@ -48,7 +48,7 @@ impl AmbientMgr {
|
|||||||
// Iterate through each tag
|
// Iterate through each tag
|
||||||
for tag in AmbientChannelTag::iter() {
|
for tag in AmbientChannelTag::iter() {
|
||||||
// If the conditions warrant creating a channel of that tag
|
// If the conditions warrant creating a channel of that tag
|
||||||
if self.check_ambience_necessity(tag, client, camera)
|
if AmbientMgr::check_ambience_necessity(tag, client, camera)
|
||||||
&& audio.get_ambient_channel(tag).is_none()
|
&& audio.get_ambient_channel(tag).is_none()
|
||||||
{
|
{
|
||||||
// Iterate through the supposed number of channels - one for each tag
|
// Iterate through the supposed number of channels - one for each tag
|
||||||
@ -71,8 +71,7 @@ impl AmbientMgr {
|
|||||||
if audio.ambient_channels[index].get_tag() == tag {
|
if audio.ambient_channels[index].get_tag() == tag {
|
||||||
// Maintain: get the correct multiplier of whatever the tag of the current
|
// Maintain: get the correct multiplier of whatever the tag of the current
|
||||||
// channel is
|
// channel is
|
||||||
let target_volume =
|
let target_volume = AmbientChannel::maintain(tag, state, client, camera);
|
||||||
audio.ambient_channels[index].maintain(state, client, camera);
|
|
||||||
// Get multiplier of the current channel
|
// Get multiplier of the current channel
|
||||||
let initial_volume = audio.ambient_channels[index].get_multiplier();
|
let initial_volume = audio.ambient_channels[index].get_multiplier();
|
||||||
|
|
||||||
@ -128,12 +127,7 @@ impl AmbientMgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_ambience_necessity(
|
fn check_ambience_necessity(tag: AmbientChannelTag, client: &Client, camera: &Camera) -> bool {
|
||||||
&mut self,
|
|
||||||
tag: AmbientChannelTag,
|
|
||||||
client: &Client,
|
|
||||||
camera: &Camera,
|
|
||||||
) -> bool {
|
|
||||||
match tag {
|
match tag {
|
||||||
AmbientChannelTag::Wind => {
|
AmbientChannelTag::Wind => {
|
||||||
let focus_off = camera.get_focus_pos().map(f32::trunc);
|
let focus_off = camera.get_focus_pos().map(f32::trunc);
|
||||||
@ -188,57 +182,9 @@ impl AmbientMgr {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AmbientChannel {
|
impl AmbientChannelTag {
|
||||||
pub fn maintain(&mut self, state: &State, client: &Client, camera: &Camera) -> f32 {
|
|
||||||
let tag = self.get_tag();
|
|
||||||
|
|
||||||
let focus_off = camera.get_focus_pos().map(f32::trunc);
|
|
||||||
let cam_pos = camera.dependents().cam_pos + focus_off;
|
|
||||||
|
|
||||||
let mut target_volume: f32 = self.get_ambience_volume(tag, client, camera);
|
|
||||||
|
|
||||||
target_volume = self.check_camera(state, client, cam_pos, target_volume);
|
|
||||||
|
|
||||||
target_volume
|
|
||||||
}
|
|
||||||
|
|
||||||
fn check_camera(
|
|
||||||
&mut self,
|
|
||||||
state: &State,
|
|
||||||
client: &Client,
|
|
||||||
cam_pos: Vec3<f32>,
|
|
||||||
initial_volume: f32,
|
|
||||||
) -> f32 {
|
|
||||||
let mut volume_multiplier = initial_volume;
|
|
||||||
let terrain_alt = if let Some(chunk) = client.current_chunk() {
|
|
||||||
chunk.meta().alt()
|
|
||||||
} else {
|
|
||||||
0.0
|
|
||||||
};
|
|
||||||
// Checks if the camera is underwater to diminish ambient sounds
|
|
||||||
if state
|
|
||||||
.terrain()
|
|
||||||
.get((cam_pos).map(|e| e.floor() as i32))
|
|
||||||
.map(|b| b.is_liquid())
|
|
||||||
.unwrap_or(false)
|
|
||||||
{
|
|
||||||
volume_multiplier *= 0.1;
|
|
||||||
}
|
|
||||||
// Is the camera roughly under the terrain?
|
|
||||||
if cam_pos.z < terrain_alt - 20.0 {
|
|
||||||
volume_multiplier = 0.0;
|
|
||||||
}
|
|
||||||
|
|
||||||
volume_multiplier.clamped(0.0, 1.0)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Gets appropriate volume for each tag
|
// Gets appropriate volume for each tag
|
||||||
fn get_ambience_volume(
|
pub fn get_tag_volume(tag: AmbientChannelTag, client: &Client, camera: &Camera) -> f32 {
|
||||||
&mut self,
|
|
||||||
tag: AmbientChannelTag,
|
|
||||||
client: &Client,
|
|
||||||
camera: &Camera,
|
|
||||||
) -> f32 {
|
|
||||||
match tag {
|
match tag {
|
||||||
AmbientChannelTag::Wind => {
|
AmbientChannelTag::Wind => {
|
||||||
let focus_off = camera.get_focus_pos().map(f32::trunc);
|
let focus_off = camera.get_focus_pos().map(f32::trunc);
|
||||||
@ -327,6 +273,53 @@ impl AmbientChannel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl AmbientChannel {
|
||||||
|
pub fn maintain(
|
||||||
|
tag: AmbientChannelTag,
|
||||||
|
state: &State,
|
||||||
|
client: &Client,
|
||||||
|
camera: &Camera,
|
||||||
|
) -> f32 {
|
||||||
|
let focus_off = camera.get_focus_pos().map(f32::trunc);
|
||||||
|
let cam_pos = camera.dependents().cam_pos + focus_off;
|
||||||
|
|
||||||
|
let mut target_volume: f32 = AmbientChannelTag::get_tag_volume(tag, client, camera);
|
||||||
|
|
||||||
|
target_volume = AmbientChannel::check_camera(state, client, cam_pos, target_volume);
|
||||||
|
|
||||||
|
target_volume
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_camera(
|
||||||
|
state: &State,
|
||||||
|
client: &Client,
|
||||||
|
cam_pos: Vec3<f32>,
|
||||||
|
initial_volume: f32,
|
||||||
|
) -> f32 {
|
||||||
|
let mut volume_multiplier = initial_volume;
|
||||||
|
let terrain_alt = if let Some(chunk) = client.current_chunk() {
|
||||||
|
chunk.meta().alt()
|
||||||
|
} else {
|
||||||
|
0.0
|
||||||
|
};
|
||||||
|
// Checks if the camera is underwater to diminish ambient sounds
|
||||||
|
if state
|
||||||
|
.terrain()
|
||||||
|
.get((cam_pos).map(|e| e.floor() as i32))
|
||||||
|
.map(|b| b.is_liquid())
|
||||||
|
.unwrap_or(false)
|
||||||
|
{
|
||||||
|
volume_multiplier *= 0.1;
|
||||||
|
}
|
||||||
|
// Is the camera roughly under the terrain?
|
||||||
|
if cam_pos.z < terrain_alt - 20.0 {
|
||||||
|
volume_multiplier = 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
volume_multiplier.clamped(0.0, 1.0)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub fn load_ambience_items() -> AssetHandle<AmbientCollection> {
|
pub fn load_ambience_items() -> AssetHandle<AmbientCollection> {
|
||||||
AmbientCollection::load_or_insert_with("voxygen.audio.ambient", |error| {
|
AmbientCollection::load_or_insert_with("voxygen.audio.ambient", |error| {
|
||||||
warn!(
|
warn!(
|
||||||
|
@ -166,6 +166,7 @@ pub enum AmbientChannelTag {
|
|||||||
Thunder,
|
Thunder,
|
||||||
Leaves,
|
Leaves,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A AmbientChannel uses a non-positional audio sink designed to play sounds
|
/// A AmbientChannel uses a non-positional audio sink designed to play sounds
|
||||||
/// which are always heard at the camera's position.
|
/// which are always heard at the camera's position.
|
||||||
pub struct AmbientChannel {
|
pub struct AmbientChannel {
|
||||||
@ -297,11 +298,11 @@ impl SfxChannel {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct UIChannel {
|
pub struct UiChannel {
|
||||||
sink: Sink,
|
sink: Sink,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl UIChannel {
|
impl UiChannel {
|
||||||
pub fn new(stream: &OutputStreamHandle) -> Self {
|
pub fn new(stream: &OutputStreamHandle) -> Self {
|
||||||
Self {
|
Self {
|
||||||
sink: Sink::try_new(stream).unwrap(),
|
sink: Sink::try_new(stream).unwrap(),
|
||||||
|
@ -8,7 +8,7 @@ pub mod sfx;
|
|||||||
pub mod soundcache;
|
pub mod soundcache;
|
||||||
|
|
||||||
use channel::{
|
use channel::{
|
||||||
AmbientChannel, AmbientChannelTag, MusicChannel, MusicChannelTag, SfxChannel, UIChannel,
|
AmbientChannel, AmbientChannelTag, MusicChannel, MusicChannelTag, SfxChannel, UiChannel,
|
||||||
};
|
};
|
||||||
use fader::Fader;
|
use fader::Fader;
|
||||||
use music::MusicTransitionManifest;
|
use music::MusicTransitionManifest;
|
||||||
@ -40,17 +40,17 @@ pub struct AudioFrontend {
|
|||||||
//pub device_list: Vec<String>,
|
//pub device_list: Vec<String>,
|
||||||
//pub audio_device: Option<Device>,
|
//pub audio_device: Option<Device>,
|
||||||
pub stream: Option<rodio::OutputStream>,
|
pub stream: Option<rodio::OutputStream>,
|
||||||
pub audio_stream: Option<rodio::OutputStreamHandle>,
|
audio_stream: Option<rodio::OutputStreamHandle>,
|
||||||
|
|
||||||
pub music_channels: Vec<MusicChannel>,
|
music_channels: Vec<MusicChannel>,
|
||||||
pub ambient_channels: Vec<AmbientChannel>,
|
ambient_channels: Vec<AmbientChannel>,
|
||||||
pub sfx_channels: Vec<SfxChannel>,
|
sfx_channels: Vec<SfxChannel>,
|
||||||
pub ui_channels: Vec<UIChannel>,
|
ui_channels: Vec<UiChannel>,
|
||||||
pub sfx_volume: f32,
|
sfx_volume: f32,
|
||||||
pub ambience_volume: f32,
|
ambience_volume: f32,
|
||||||
pub music_volume: f32,
|
music_volume: f32,
|
||||||
pub master_volume: f32,
|
master_volume: f32,
|
||||||
pub listener: Listener,
|
listener: Listener,
|
||||||
|
|
||||||
mtm: AssetHandle<MusicTransitionManifest>,
|
mtm: AssetHandle<MusicTransitionManifest>,
|
||||||
}
|
}
|
||||||
@ -87,7 +87,7 @@ impl AudioFrontend {
|
|||||||
|
|
||||||
let mut ui_channels = Vec::with_capacity(num_ui_channels);
|
let mut ui_channels = Vec::with_capacity(num_ui_channels);
|
||||||
if let Some(audio_stream) = &audio_stream {
|
if let Some(audio_stream) = &audio_stream {
|
||||||
ui_channels.resize_with(num_ui_channels, || UIChannel::new(audio_stream))
|
ui_channels.resize_with(num_ui_channels, || UiChannel::new(audio_stream))
|
||||||
}
|
}
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
@ -164,7 +164,7 @@ impl AudioFrontend {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_ui_channel(&mut self) -> Option<&mut UIChannel> {
|
fn get_ui_channel(&mut self) -> Option<&mut UiChannel> {
|
||||||
if self.audio_stream.is_some() {
|
if self.audio_stream.is_some() {
|
||||||
let sfx_volume = self.get_sfx_volume();
|
let sfx_volume = self.get_sfx_volume();
|
||||||
if let Some(channel) = self.ui_channels.iter_mut().find(|c| c.is_done()) {
|
if let Some(channel) = self.ui_channels.iter_mut().find(|c| c.is_done()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user