Don't use air absorption for being underwater

This commit is contained in:
Chris Robinson 2014-06-18 23:41:45 -07:00
parent 34c9a47435
commit b94a2949e5
3 changed files with 30 additions and 49 deletions

View file

@ -56,13 +56,7 @@
CVAR (String, snd_aldevice, "Default", CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (String, snd_aldevice, "Default", CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CVAR (Bool, snd_efx, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG) CVAR (Bool, snd_efx, true, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
CUSTOM_CVAR (Float, snd_waterabsorption, 10.0f, CVAR_ARCHIVE|CVAR_GLOBALCONFIG)
{
if(*self < 0.0f)
self = 0.0f;
else if(*self > 10.0f)
self = 10.0f;
}
void I_BuildALDeviceList(FOptionValues *opt) void I_BuildALDeviceList(FOptionValues *opt)
{ {
@ -687,7 +681,7 @@ OpenALSoundRenderer::OpenALSoundRenderer()
} }
DPrintf(" Allocated "TEXTCOLOR_BLUE"%u"TEXTCOLOR_NORMAL" sources\n", Sources.size()); DPrintf(" Allocated "TEXTCOLOR_BLUE"%u"TEXTCOLOR_NORMAL" sources\n", Sources.size());
LastWaterAbsorb = 0.0f; WasInWater = false;
if(*snd_efx && alcIsExtensionPresent(Device, "ALC_EXT_EFX")) if(*snd_efx && alcIsExtensionPresent(Device, "ALC_EXT_EFX"))
{ {
// EFX function pointers // EFX function pointers
@ -1095,18 +1089,16 @@ FISoundChannel *OpenALSoundRenderer::StartSound(SoundHandle sfx, float vol, int
{ {
alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]); alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]); alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
alSourcef(source, AL_AIR_ABSORPTION_FACTOR, LastWaterAbsorb);
} }
else else
{ {
alSourcei(source, AL_DIRECT_FILTER, AL_FILTER_NULL); alSourcei(source, AL_DIRECT_FILTER, AL_FILTER_NULL);
alSource3i(source, AL_AUXILIARY_SEND_FILTER, 0, 0, AL_FILTER_NULL); alSource3i(source, AL_AUXILIARY_SEND_FILTER, 0, 0, AL_FILTER_NULL);
alSourcef(source, AL_AIR_ABSORPTION_FACTOR, 0.f);
} }
alSourcef(source, AL_ROOM_ROLLOFF_FACTOR, 0.f); alSourcef(source, AL_ROOM_ROLLOFF_FACTOR, 0.f);
alSourcef(source, AL_PITCH, PITCH(pitch)); alSourcef(source, AL_PITCH, PITCH(pitch));
} }
else if(LastWaterAbsorb > 0.f && !(chanflags&SNDF_NOREVERB)) else if(WasInWater && !(chanflags&SNDF_NOREVERB))
alSourcef(source, AL_PITCH, PITCH(pitch)*PITCH_MULT); alSourcef(source, AL_PITCH, PITCH(pitch)*PITCH_MULT);
else else
alSourcef(source, AL_PITCH, PITCH(pitch)); alSourcef(source, AL_PITCH, PITCH(pitch));
@ -1239,18 +1231,16 @@ FISoundChannel *OpenALSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener
{ {
alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]); alSourcei(source, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]); alSource3i(source, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
alSourcef(source, AL_AIR_ABSORPTION_FACTOR, LastWaterAbsorb);
} }
else else
{ {
alSourcei(source, AL_DIRECT_FILTER, AL_FILTER_NULL); alSourcei(source, AL_DIRECT_FILTER, AL_FILTER_NULL);
alSource3i(source, AL_AUXILIARY_SEND_FILTER, 0, 0, AL_FILTER_NULL); alSource3i(source, AL_AUXILIARY_SEND_FILTER, 0, 0, AL_FILTER_NULL);
alSourcef(source, AL_AIR_ABSORPTION_FACTOR, 0.f);
} }
alSourcef(source, AL_ROOM_ROLLOFF_FACTOR, rolloffFactor); alSourcef(source, AL_ROOM_ROLLOFF_FACTOR, rolloffFactor);
alSourcef(source, AL_PITCH, PITCH(pitch)); alSourcef(source, AL_PITCH, PITCH(pitch));
} }
else if(LastWaterAbsorb > 0.f && !(chanflags&SNDF_NOREVERB)) else if(WasInWater && !(chanflags&SNDF_NOREVERB))
alSourcef(source, AL_PITCH, PITCH(pitch)*PITCH_MULT); alSourcef(source, AL_PITCH, PITCH(pitch)*PITCH_MULT);
else else
alSourcef(source, AL_PITCH, PITCH(pitch)); alSourcef(source, AL_PITCH, PITCH(pitch));
@ -1486,14 +1476,13 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
const_cast<ReverbContainer*>(env)->Modified = false; const_cast<ReverbContainer*>(env)->Modified = false;
} }
// NOTE: Moving into and out of water (and changing water absorption) will // NOTE: Moving into and out of water will undo pitch variations on sounds
// undo pitch variations on sounds if either snd_waterreverb or EFX are // if either snd_waterreverb or EFX are disabled.
// disabled.
if(listener->underwater || env->SoftwareWater) if(listener->underwater || env->SoftwareWater)
{ {
if(LastWaterAbsorb != *snd_waterabsorption) if(!WasInWater)
{ {
LastWaterAbsorb = *snd_waterabsorption; WasInWater = true;
if(EnvSlot != 0 && *snd_waterreverb) if(EnvSlot != 0 && *snd_waterreverb)
{ {
@ -1503,15 +1492,14 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
env = env->Next; env = env->Next;
LoadReverb(env ? env : DefaultEnvironments[0]); LoadReverb(env ? env : DefaultEnvironments[0]);
alFilterf(EnvFilters[0], AL_LOWPASS_GAIN, 0.25f); alFilterf(EnvFilters[0], AL_LOWPASS_GAIN, 0.1f);
alFilterf(EnvFilters[0], AL_LOWPASS_GAINHF, 0.75f); alFilterf(EnvFilters[0], AL_LOWPASS_GAINHF, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAIN, 1.f); alFilterf(EnvFilters[1], AL_LOWPASS_GAIN, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAINHF, 1.f); alFilterf(EnvFilters[1], AL_LOWPASS_GAINHF, 1.f);
// Apply the updated filters on the sources // Apply the updated filters on the sources
foreach(ALuint, i, ReverbSfx) foreach(ALuint, i, ReverbSfx)
{ {
alSourcef(*i, AL_AIR_ABSORPTION_FACTOR, LastWaterAbsorb);
alSourcei(*i, AL_DIRECT_FILTER, EnvFilters[0]); alSourcei(*i, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(*i, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]); alSource3i(*i, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
} }
@ -1524,34 +1512,30 @@ void OpenALSoundRenderer::UpdateListener(SoundListener *listener)
getALError(); getALError();
} }
} }
else else if(WasInWater)
{ {
if(LastWaterAbsorb > 0.f) WasInWater = false;
if(EnvSlot != 0)
{ {
LastWaterAbsorb = 0.f; LoadReverb(env);
if(EnvSlot != 0) alFilterf(EnvFilters[0], AL_LOWPASS_GAIN, 1.f);
alFilterf(EnvFilters[0], AL_LOWPASS_GAINHF, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAIN, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAINHF, 1.f);
foreach(ALuint, i, ReverbSfx)
{ {
LoadReverb(env); alSourcei(*i, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(*i, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
alFilterf(EnvFilters[0], AL_LOWPASS_GAIN, 1.f);
alFilterf(EnvFilters[0], AL_LOWPASS_GAINHF, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAIN, 1.f);
alFilterf(EnvFilters[1], AL_LOWPASS_GAINHF, 1.f);
foreach(ALuint, i, ReverbSfx)
{
alSourcef(*i, AL_AIR_ABSORPTION_FACTOR, 0.f);
alSourcei(*i, AL_DIRECT_FILTER, EnvFilters[0]);
alSource3i(*i, AL_AUXILIARY_SEND_FILTER, EnvSlot, 0, EnvFilters[1]);
}
} }
else
{
foreach(ALuint, i, ReverbSfx)
alSourcef(*i, AL_PITCH, 1.f);
}
getALError();
} }
else
{
foreach(ALuint, i, ReverbSfx)
alSourcef(*i, AL_PITCH, 1.f);
}
getALError();
} }
} }

View file

@ -191,10 +191,10 @@ private:
typedef std::map<WORD,ALuint> EffectMap; typedef std::map<WORD,ALuint> EffectMap;
ALuint EnvSlot; ALuint EnvSlot;
ALuint EnvFilters[2];
EffectMap EnvEffects; EffectMap EnvEffects;
ALuint EnvFilters[2]; bool WasInWater;
float LastWaterAbsorb;
std::vector<SoundStream*> Streams; std::vector<SoundStream*> Streams;
friend class OpenALSoundStream; friend class OpenALSoundStream;

View file

@ -1448,9 +1448,6 @@ OptionMenu OpenALSoundItems
Title "OPENAL OPTIONS" Title "OPENAL OPTIONS"
Option "Playback device", "snd_aldevice", "ALDevices" Option "Playback device", "snd_aldevice", "ALDevices"
Option "Enable EFX", "snd_efx", "OnOff" Option "Enable EFX", "snd_efx", "OnOff"
StaticText " "
StaticText "Requires EFX", 1
Slider "Underwater absorption", "snd_waterabsorption", 0.0, 10.0, 0.5
} }