Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/frontend/StarMainMixer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/frontend/StarMainMixer.cpp')
-rw-r--r--source/frontend/StarMainMixer.cpp52
1 files changed, 29 insertions, 23 deletions
diff --git a/source/frontend/StarMainMixer.cpp b/source/frontend/StarMainMixer.cpp
index 59b6b52..6d68ea2 100644
--- a/source/frontend/StarMainMixer.cpp
+++ b/source/frontend/StarMainMixer.cpp
@@ -7,6 +7,7 @@
#include "StarAssets.hpp"
#include "StarWorldClient.hpp"
#include "StarWorldPainter.hpp"
+#include "StarVoice.hpp"
namespace Star {
@@ -80,34 +81,39 @@ void MainMixer::update(bool muteSfx, bool muteMusic) {
auto cameraPos = m_worldPainter->camera().centerWorldPosition();
auto worldGeometry = currentWorld->geometry();
- m_mixer->update([&](unsigned channel, Vec2F pos, float rangeMultiplier) {
- Vec2F playerDiff = worldGeometry.diff(pos, playerPos);
- Vec2F cameraDiff = worldGeometry.diff(pos, cameraPos);
- float playerMagSq = playerDiff.magnitudeSquared();
- float cameraMagSq = cameraDiff.magnitudeSquared();
-
- Vec2F diff;
- float diffMagnitude;
- if (playerMagSq < cameraMagSq) {
- diff = playerDiff;
- diffMagnitude = sqrt(playerMagSq);
- }
- else {
- diff = cameraDiff;
- diffMagnitude = sqrt(cameraMagSq);
- }
+ Mixer::PositionalAttenuationFunction attenuationFunction = [&](unsigned channel, Vec2F pos, float rangeMultiplier) {
+ Vec2F playerDiff = worldGeometry.diff(pos, playerPos);
+ Vec2F cameraDiff = worldGeometry.diff(pos, cameraPos);
+ float playerMagSq = playerDiff.magnitudeSquared();
+ float cameraMagSq = cameraDiff.magnitudeSquared();
+
+ Vec2F diff;
+ float diffMagnitude;
+ if (playerMagSq < cameraMagSq) {
+ diff = playerDiff;
+ diffMagnitude = sqrt(playerMagSq);
+ }
+ else {
+ diff = cameraDiff;
+ diffMagnitude = sqrt(cameraMagSq);
+ }
- if (diffMagnitude == 0.0f)
- return 0.0f;
+ if (diffMagnitude == 0.0f)
+ return 0.0f;
- Vec2F diffNorm = diff / diffMagnitude;
+ Vec2F diffNorm = diff / diffMagnitude;
- float stereoIncidence = channel == 0 ? -diffNorm[0] : diffNorm[0];
+ float stereoIncidence = channel == 0 ? -diffNorm[0] : diffNorm[0];
+
+ float maxDistance = baseMaxDistance * rangeMultiplier * lerp((stereoIncidence + 1.0f) / 2.0f, stereoAdjustmentRange[0], stereoAdjustmentRange[1]);
+
+ return pow(clamp(diffMagnitude / maxDistance, 0.0f, 1.0f), 1.0f / attenuationGamma);
+ };
- float maxDistance = baseMaxDistance * rangeMultiplier * lerp((stereoIncidence + 1.0f) / 2.0f, stereoAdjustmentRange[0], stereoAdjustmentRange[1]);
+ if (Voice* voice = Voice::singletonPtr())
+ voice->update(attenuationFunction);
- return pow(clamp(diffMagnitude / maxDistance, 0.0f, 1.0f), 1.0f / attenuationGamma);
- });
+ m_mixer->update(attenuationFunction);
} else {
if (m_mixer->hasEffect("lowpass"))