Calculate EFX occlusion as in Creative's EFX-Util

This commit is contained in:
Boris I. Bendovsky 2020-11-26 17:22:09 +02:00 committed by Daniel Gibson
parent 432b86fdeb
commit fa51007a6f
2 changed files with 37 additions and 15 deletions

View file

@ -593,7 +593,8 @@ public:
idStr listenerAreaName;
ALuint listenerEffect;
ALuint listenerSlot;
ALuint listenerFilter;
bool listenerAreFiltersInitialized;
ALuint listenerFilters[2]; // 0 - direct; 1 - send.
int gameMsec;
int game44kHz;

View file

@ -61,23 +61,37 @@ void idSoundWorldLocal::Init( idRenderWorld *renderWorld ) {
}
}
if (!soundSystemLocal.alIsFilter(listenerFilter)) {
alGetError();
if (!listenerAreFiltersInitialized) {
listenerAreFiltersInitialized = true;
soundSystemLocal.alGenFilters(1, &listenerFilter);
alGetError();
soundSystemLocal.alGenFilters(2, listenerFilters);
ALuint e = alGetError();
if (e != AL_NO_ERROR) {
common->Warning("idSoundWorldLocal::Init: alGenFilters failed: 0x%x", e);
listenerFilter = AL_FILTER_NULL;
listenerFilters[0] = AL_FILTER_NULL;
listenerFilters[1] = AL_FILTER_NULL;
} else {
soundSystemLocal.alFilteri(listenerFilter, AL_FILTER_TYPE, AL_FILTER_LOWPASS);
soundSystemLocal.alFilteri(listenerFilters[0], AL_FILTER_TYPE, AL_FILTER_LOWPASS);
// original EAX occusion value was -1150
// default OCCLUSIONLFRATIO is 0.25
// default OCCLUSIONDIRECTRATIO is 1.0
// pow(10.0, (-1150*0.25)/2000.0)
soundSystemLocal.alFilterf(listenerFilter, AL_LOWPASS_GAIN, 0.718208f);
// pow(10.0, -1150/2000.0)
soundSystemLocal.alFilterf(listenerFilter, AL_LOWPASS_GAINHF, 0.266073f);
// pow(10.0, (-1150*0.25*1.0)/2000.0)
soundSystemLocal.alFilterf(listenerFilters[0], AL_LOWPASS_GAIN, 0.718208f);
// pow(10.0, (-1150*1.0)/2000.0)
soundSystemLocal.alFilterf(listenerFilters[0], AL_LOWPASS_GAINHF, 0.266073f);
soundSystemLocal.alFilteri(listenerFilters[1], AL_FILTER_TYPE, AL_FILTER_LOWPASS);
// original EAX occusion value was -1150
// default OCCLUSIONLFRATIO is 0.25
// default OCCLUSIONROOMRATIO is 1.5
// pow(10.0, (-1150*(0.25+1.5-1.0))/2000.0)
soundSystemLocal.alFilterf(listenerFilters[1], AL_LOWPASS_GAIN, 0.370467f);
// pow(10.0, (-1150*1.5)/2000.0)
soundSystemLocal.alFilterf(listenerFilters[1], AL_LOWPASS_GAINHF, 0.137246f);
}
}
}
@ -113,6 +127,7 @@ idSoundWorldLocal::idSoundWorldLocal
===============
*/
idSoundWorldLocal::idSoundWorldLocal() {
listenerAreFiltersInitialized = false;
}
/*
@ -147,9 +162,14 @@ void idSoundWorldLocal::Shutdown() {
listenerSlot = AL_EFFECTSLOT_NULL;
}
if (soundSystemLocal.alIsFilter(listenerFilter)) {
soundSystemLocal.alDeleteFilters(1, &listenerFilter);
listenerFilter = AL_FILTER_NULL;
if (listenerAreFiltersInitialized) {
listenerAreFiltersInitialized = false;
if (listenerFilters[0] != AL_FILTER_NULL && listenerFilters[1] != AL_FILTER_NULL) {
soundSystemLocal.alDeleteFilters(2, listenerFilters);
listenerFilters[0] = AL_FILTER_NULL;
listenerFilters[1] = AL_FILTER_NULL;
}
}
}
@ -1792,9 +1812,10 @@ void idSoundWorldLocal::AddChannelContribution( idSoundEmitterLocal *sound, idSo
if (idSoundSystemLocal::useEFXReverb) {
if (enviroSuitActive) {
alSourcei(chan->openalSource, AL_DIRECT_FILTER, listenerFilter);
alSource3i(chan->openalSource, AL_AUXILIARY_SEND_FILTER, listenerSlot, 0, listenerFilter);
alSourcei(chan->openalSource, AL_DIRECT_FILTER, listenerFilters[0]);
alSource3i(chan->openalSource, AL_AUXILIARY_SEND_FILTER, listenerSlot, 0, listenerFilters[1]);
} else {
alSourcei(chan->openalSource, AL_DIRECT_FILTER, AL_FILTER_NULL);
alSource3i(chan->openalSource, AL_AUXILIARY_SEND_FILTER, listenerSlot, 0, AL_FILTER_NULL);
}
}