mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-18 02:12:00 +00:00
Handle sounds marked as 'area sounds'
Note, the area radius is 128 units for it to actually do something, unlike FMOD where it's only 32.
This commit is contained in:
parent
845e369b87
commit
a434af92ee
1 changed files with 37 additions and 6 deletions
|
@ -527,6 +527,8 @@ public:
|
||||||
|
|
||||||
extern ReverbContainer *ForcedEnvironment;
|
extern ReverbContainer *ForcedEnvironment;
|
||||||
|
|
||||||
|
#define AREA_SOUND_RADIUS (128.f)
|
||||||
|
|
||||||
#define PITCH_MULT (0.7937005f) /* Approx. 4 semitones lower; what Nash suggested */
|
#define PITCH_MULT (0.7937005f) /* Approx. 4 semitones lower; what Nash suggested */
|
||||||
|
|
||||||
#define PITCH(pitch) (snd_pitched ? (pitch)/128.f : 1.f)
|
#define PITCH(pitch) (snd_pitched ? (pitch)/128.f : 1.f)
|
||||||
|
@ -1210,10 +1212,28 @@ FISoundChannel *OpenALSoundRenderer::StartSound3D(SoundHandle sfx, SoundListener
|
||||||
float gain = GetRolloff(rolloff, sqrt(dist_sqr) * distscale);
|
float gain = GetRolloff(rolloff, sqrt(dist_sqr) * distscale);
|
||||||
dir.Resize((gain > 0.00001f) ? 1.f/gain : 100000.f);
|
dir.Resize((gain > 0.00001f) ? 1.f/gain : 100000.f);
|
||||||
}
|
}
|
||||||
|
if((chanflags&SNDF_AREA) && dist_sqr < AREA_SOUND_RADIUS*AREA_SOUND_RADIUS)
|
||||||
|
{
|
||||||
|
FVector3 near(0.f, !(dir.Y>=0.f) ? -1.f : 1.f, 0.f);
|
||||||
|
float a = sqrt(dist_sqr) / AREA_SOUND_RADIUS;
|
||||||
|
dir = near + (dir-near)*a;
|
||||||
|
}
|
||||||
dir += listener->position;
|
dir += listener->position;
|
||||||
|
|
||||||
alSource3f(source, AL_POSITION, dir[0], dir[1], -dir[2]);
|
alSource3f(source, AL_POSITION, dir[0], dir[1], -dir[2]);
|
||||||
}
|
}
|
||||||
|
else if((chanflags&SNDF_AREA) && dist_sqr < AREA_SOUND_RADIUS*AREA_SOUND_RADIUS)
|
||||||
|
{
|
||||||
|
FVector3 dir = pos - listener->position;
|
||||||
|
|
||||||
|
float mindist = rolloff->MinDistance/distscale;
|
||||||
|
FVector3 near(0.f, !(dir.Y>=0.f) ? -mindist : mindist, 0.f);
|
||||||
|
float a = sqrt(dist_sqr) / AREA_SOUND_RADIUS;
|
||||||
|
dir = near + (dir-near)*a;
|
||||||
|
|
||||||
|
dir += listener->position;
|
||||||
|
alSource3f(source, AL_POSITION, dir[0], dir[1], -dir[2]);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
alSource3f(source, AL_POSITION, pos[0], pos[1], -pos[2]);
|
alSource3f(source, AL_POSITION, pos[0], pos[1], -pos[2]);
|
||||||
alSource3f(source, AL_VELOCITY, vel[0], vel[1], -vel[2]);
|
alSource3f(source, AL_VELOCITY, vel[0], vel[1], -vel[2]);
|
||||||
|
@ -1425,7 +1445,6 @@ void OpenALSoundRenderer::UpdateSoundParams3D(SoundListener *listener, FISoundCh
|
||||||
FVector3 dir = pos - listener->position;
|
FVector3 dir = pos - listener->position;
|
||||||
chan->DistanceSqr = dir.LengthSquared();
|
chan->DistanceSqr = dir.LengthSquared();
|
||||||
|
|
||||||
ALuint source = GET_PTRID(chan->SysChannel);
|
|
||||||
if(chan->ManualRolloff)
|
if(chan->ManualRolloff)
|
||||||
{
|
{
|
||||||
if(dir.DoesNotApproximatelyEqual(FVector3(0.f, 0.f, 0.f)))
|
if(dir.DoesNotApproximatelyEqual(FVector3(0.f, 0.f, 0.f)))
|
||||||
|
@ -1433,12 +1452,24 @@ void OpenALSoundRenderer::UpdateSoundParams3D(SoundListener *listener, FISoundCh
|
||||||
float gain = GetRolloff(&chan->Rolloff, sqrt(chan->DistanceSqr) * chan->DistanceScale);
|
float gain = GetRolloff(&chan->Rolloff, sqrt(chan->DistanceSqr) * chan->DistanceScale);
|
||||||
dir.Resize((gain > 0.00001f) ? 1.f/gain : 100000.f);
|
dir.Resize((gain > 0.00001f) ? 1.f/gain : 100000.f);
|
||||||
}
|
}
|
||||||
dir += listener->position;
|
if(areasound && chan->DistanceSqr < AREA_SOUND_RADIUS*AREA_SOUND_RADIUS)
|
||||||
|
{
|
||||||
alSource3f(source, AL_POSITION, dir[0], dir[1], -dir[2]);
|
FVector3 near(0.f, !(dir.Y>=0.f) ? -1.f : 1.f, 0.f);
|
||||||
|
float a = sqrt(chan->DistanceSqr) / AREA_SOUND_RADIUS;
|
||||||
|
dir = near + (dir-near)*a;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else if(areasound && chan->DistanceSqr < AREA_SOUND_RADIUS*AREA_SOUND_RADIUS)
|
||||||
alSource3f(source, AL_POSITION, pos[0], pos[1], -pos[2]);
|
{
|
||||||
|
float mindist = chan->Rolloff.MinDistance / chan->DistanceScale;
|
||||||
|
FVector3 near(0.f, !(dir.Y>=0.f) ? -mindist : mindist, 0.f);
|
||||||
|
float a = sqrt(chan->DistanceSqr) / AREA_SOUND_RADIUS;
|
||||||
|
dir = near + (dir-near)*a;
|
||||||
|
}
|
||||||
|
dir += listener->position;
|
||||||
|
|
||||||
|
ALuint source = GET_PTRID(chan->SysChannel);
|
||||||
|
alSource3f(source, AL_POSITION, dir[0], dir[1], -dir[2]);
|
||||||
alSource3f(source, AL_VELOCITY, vel[0], vel[1], -vel[2]);
|
alSource3f(source, AL_VELOCITY, vel[0], vel[1], -vel[2]);
|
||||||
getALError();
|
getALError();
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue