From c4239e074fa6aa146c4e95cec7e37a717a17153f Mon Sep 17 00:00:00 2001 From: DaforLynx Date: Sat, 19 Mar 2022 02:37:45 -0700 Subject: [PATCH] Prevent unnecessary running of code --- voxygen/src/audio/ambient.rs | 156 ++++++++++++++++++++++------------- voxygen/src/scene/mod.rs | 28 ++++--- 2 files changed, 114 insertions(+), 70 deletions(-) diff --git a/voxygen/src/audio/ambient.rs b/voxygen/src/audio/ambient.rs index bd3da0e618..796d285e96 100644 --- a/voxygen/src/audio/ambient.rs +++ b/voxygen/src/audio/ambient.rs @@ -48,69 +48,107 @@ impl AmbientMgr { let sfx_volume = audio.get_sfx_volume(); // iterate through each tag for tag in AmbientChannelTag::iter() { - // iterate through the supposed number of channels - one for each tag - for index in 0..AmbientChannelTag::iter().len() { - // if index would exceed current number of channels, create a new one with - // current tag - if index >= audio.ambient_channels.len() { - audio.new_ambient_channel(tag); - } - // update with sfx volume - audio.ambient_channels[index].set_volume(sfx_volume); - // if current channel's tag is not the current tag, move on to next channel - if audio.ambient_channels[index].get_tag() == tag { - // maintain: get the correct multiplier of whatever the tag of the current - // channel is - let target_volume = - audio.ambient_channels[index].maintain(state, client, camera); - // get multiplier of the current channel - let initial_volume = audio.ambient_channels[index].get_multiplier(); - - // lerp multiplier of current channel - audio.ambient_channels[index].set_multiplier(Lerp::lerp( - initial_volume, - target_volume, - 0.01, - )); - - // set the duration of the loop to whatever the current value is (0.0 by - // default) - let next_track_change = audio.ambient_channels[index].get_next_track_change(); - - // if the sound should loop at this point: - if audio.ambient_channels[index] - .get_began_playing() - .elapsed() - .as_secs_f32() - > next_track_change - { - let ambience = self.ambience.read(); - let track = ambience.tracks.iter().find(|track| track.tag == tag); - // set the track's start point at this instant - audio.ambient_channels[index].set_began_playing(Instant::now()); - if let Some(track) = track { - // set loop duration to the one specified in the ron - audio.ambient_channels[index].set_next_track_change(track.length); - // play the file of the current tag at the current multiplier - let current_multiplier = audio.ambient_channels[index].get_multiplier(); - audio.play_ambient(tag, &track.path, current_multiplier); - } - }; - - // remove channel if not playing - if audio.ambient_channels[index].get_multiplier() == 0.0 { - audio.ambient_channels[index].stop(); - audio.ambient_channels.remove(index); - }; - // move on to next tag - break; - } else { - // channel tag and current tag don't match, move on to next channel - continue; + // check if current conditions necessitate the current tag at all + let should_create: bool = match tag { + AmbientChannelTag::Wind => self.check_wind_necessity(client, camera), + AmbientChannelTag::Rain => self.check_rain_necessity(client), + }; + if should_create { + // iterate through the supposed number of channels - one for each tag + for index in 0..AmbientChannelTag::iter().len() { + // if index would exceed current number of channels, create a new one with + // current tag + if index >= audio.ambient_channels.len() { + audio.new_ambient_channel(tag); + } + // update with sfx volume + audio.ambient_channels[index].set_volume(sfx_volume); + // if current channel's tag is not the current tag, move on to next channel + if audio.ambient_channels[index].get_tag() == tag { + // maintain: get the correct multiplier of whatever the tag of the current + // channel is + let target_volume = + audio.ambient_channels[index].maintain(state, client, camera); + // get multiplier of the current channel + let initial_volume = audio.ambient_channels[index].get_multiplier(); + + // lerp multiplier of current channel + audio.ambient_channels[index].set_multiplier(Lerp::lerp( + initial_volume, + target_volume, + 0.01, + )); + + // set the duration of the loop to whatever the current value is (0.0 by + // default) + let next_track_change = + audio.ambient_channels[index].get_next_track_change(); + + // if the sound should loop at this point: + if audio.ambient_channels[index] + .get_began_playing() + .elapsed() + .as_secs_f32() + > next_track_change + { + let ambience = self.ambience.read(); + let track = ambience.tracks.iter().find(|track| track.tag == tag); + // set the track's start point at this instant + audio.ambient_channels[index].set_began_playing(Instant::now()); + if let Some(track) = track { + // set loop duration to the one specified in the ron + audio.ambient_channels[index].set_next_track_change(track.length); + // play the file of the current tag at the current multiplier + let current_multiplier = + audio.ambient_channels[index].get_multiplier(); + audio.play_ambient(tag, &track.path, current_multiplier); + } + }; + + // remove channel if not playing + if audio.ambient_channels[index].get_multiplier() == 0.0 { + audio.ambient_channels[index].stop(); + audio.ambient_channels.remove(index); + }; + // move on to next tag + break; + } else { + // channel tag and current tag don't match, move on to next channel + continue; + } } + } else { + // no need to run code at all, move on to the next tag + continue; } } } + + fn check_wind_necessity(&mut self, client: &Client, camera: &Camera) -> bool { + let focus_off = camera.get_focus_pos().map(f32::trunc); + let cam_pos = camera.dependents().cam_pos + focus_off; + + let (terrain_alt, tree_density) = if let Some(chunk) = client.current_chunk() { + (chunk.meta().alt(), chunk.meta().tree_density()) + } else { + (0.0, 0.0) + }; + + // Wind volume increases with altitude + let alt_multiplier = (cam_pos.z / 1200.0).abs(); + + // Tree density factors into wind volume. The more trees, + // the lower wind volume. The trees make more of an impact + // the closer the camera is to the ground. + let tree_multiplier = + ((1.0 - tree_density) + ((cam_pos.z - terrain_alt).abs() / 150.0).powi(2)).min(1.0); + + return alt_multiplier * tree_multiplier > 0.0; + } + + fn check_rain_necessity(&mut self, client: &Client) -> bool { + client.current_weather().rain * 5.0 > 0.0 + } } impl AmbientChannel { diff --git a/voxygen/src/scene/mod.rs b/voxygen/src/scene/mod.rs index a27d27ed8d..f22dcfcb88 100644 --- a/voxygen/src/scene/mod.rs +++ b/voxygen/src/scene/mod.rs @@ -1070,17 +1070,23 @@ impl Scene { self.figure_mgr.clean(scene_data.tick); // Maintain audio - self.sfx_mgr.maintain( - audio, - scene_data.state, - scene_data.player_entity, - &self.camera, - &self.terrain, - client, - ); - self.music_mgr.maintain(audio, scene_data.state, client); - self.ambient_mgr - .maintain(audio, scene_data.state, client, &self.camera); + if audio.sfx_enabled() { + self.sfx_mgr.maintain( + audio, + scene_data.state, + scene_data.player_entity, + &self.camera, + &self.terrain, + client, + ); + self.ambient_mgr + .maintain(audio, scene_data.state, client, &self.camera); + } + + if audio.music_enabled() { + self.music_mgr.maintain(audio, scene_data.state, client); + } + // self.ambient_wind_mgr // .maintain(audio, scene_data.state, client, &self.camera); // self.ambient_rain_mgr