]> git.xonotic.org Git - xonotic/darkplaces.git/blobdiff - snd_mix.c
physics: fix and refactor unsticking
[xonotic/darkplaces.git] / snd_mix.c
index 499c16f487a40bb9336d9fcaf22de9d949f60008..d8ea1dbe3764a297ead5aef44712325d5d901ee4 100644 (file)
--- a/snd_mix.c
+++ b/snd_mix.c
@@ -309,66 +309,67 @@ static void S_ConvertPaintBuffer(portable_sampleframe_t *painted_ptr, void *rb_p
        }
 }
 
+
+
 /*
 ===============================================================================
 
 UNDERWATER EFFECT
 
+Muffles the intensity of sounds when the player is underwater
+
 ===============================================================================
 */
 
-static struct {
-       float   intensity;
-       float   alpha;
-       float   accum[SND_LISTENERS];
-} underwater = {0.f, 1.f, {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}};
+static struct
+{
+       float intensity;
+       float alpha;
+       float accum[SND_LISTENERS];
+}
+underwater = {0.f, 1.f, {0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f, 0.f}};
 
 void S_SetUnderwaterIntensity(void)
 {
-       float host_frametime = cl.realframetime;
-       float target = cl.view_underwater ? 1.f : 0.f;
-
-       if (snd_waterfx.value < 0.f)
-               target *= 0.f;
-       else if (snd_waterfx.value > 2.f)
-               target *= 2.f;
-       else
-               target *= snd_waterfx.value;
+       float target = cl.view_underwater ? bound(0.f, snd_waterfx.value, 2.f) : 0.f;
 
        if (underwater.intensity < target)
        {
-               underwater.intensity += host_frametime * 4.f;
+               underwater.intensity += cl.realframetime * 4.f;
                underwater.intensity = min(underwater.intensity, target);
        }
        else if (underwater.intensity > target)
        {
-               underwater.intensity -= host_frametime * 4.f;
+               underwater.intensity -= cl.realframetime * 4.f;
                underwater.intensity = max(underwater.intensity, target);
        }
 
-       underwater.alpha = exp(-underwater.intensity * log(12.f));
+       underwater.alpha = underwater.intensity ? exp(-underwater.intensity * log(12.f)) : 1.f;
 }
 
 static void S_UnderwaterFilter(int endtime)
 {
        int i;
        int sl;
-       if (!underwater.intensity) {
-               if (endtime > 0) {
-                       for (sl = 0; sl < SND_LISTENERS; sl++) {
+
+       if (!underwater.intensity)
+       {
+               if (endtime > 0)
+                       for (sl = 0; sl < SND_LISTENERS; sl++)
                                underwater.accum[sl] = paintbuffer[endtime-1].sample[sl];
-                       }
-               }
                return;
        }
-       for (i = 0; i < endtime; i++) {
-               for (sl = 0; sl < SND_LISTENERS; sl++) {
+
+       for (i = 0; i < endtime; i++)
+               for (sl = 0; sl < SND_LISTENERS; sl++)
+               {
                        underwater.accum[sl] += underwater.alpha * (paintbuffer[i].sample[sl] - underwater.accum[sl]);
                        paintbuffer[i].sample[sl] = underwater.accum[sl];
                }
-       }
 }
 
+
+
 /*
 ===============================================================================