Apply distance attenuation to reverb zones in almultireverb
This commit is contained in:
parent
812cb62617
commit
abc6e37e6e
@ -500,16 +500,20 @@ int main(int argc, char **argv)
|
|||||||
other_dir[1] = local_norm[1] / -2.0f;
|
other_dir[1] = local_norm[1] / -2.0f;
|
||||||
other_dir[2] = local_norm[2] / -2.0f;
|
other_dir[2] = local_norm[2] / -2.0f;
|
||||||
|
|
||||||
|
alEffectf(effects[0], AL_EAXREVERB_GAIN, reverb0.flGain);
|
||||||
alEffectfv(effects[0], AL_EAXREVERB_REFLECTIONS_PAN, this_dir);
|
alEffectfv(effects[0], AL_EAXREVERB_REFLECTIONS_PAN, this_dir);
|
||||||
alEffectfv(effects[0], AL_EAXREVERB_LATE_REVERB_PAN, this_dir);
|
alEffectfv(effects[0], AL_EAXREVERB_LATE_REVERB_PAN, this_dir);
|
||||||
|
|
||||||
|
alEffectf(effects[1], AL_EAXREVERB_GAIN, reverb1.flGain);
|
||||||
alEffectfv(effects[1], AL_EAXREVERB_REFLECTIONS_PAN, other_dir);
|
alEffectfv(effects[1], AL_EAXREVERB_REFLECTIONS_PAN, other_dir);
|
||||||
alEffectfv(effects[1], AL_EAXREVERB_LATE_REVERB_PAN, other_dir);
|
alEffectfv(effects[1], AL_EAXREVERB_LATE_REVERB_PAN, other_dir);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
const EFXEAXREVERBPROPERTIES *other_reverb;
|
||||||
|
const EFXEAXREVERBPROPERTIES *this_reverb;
|
||||||
ALuint other_effect, this_effect;
|
ALuint other_effect, this_effect;
|
||||||
ALfloat spread;
|
ALfloat spread, attn;
|
||||||
|
|
||||||
/* Normalize the direction to the portal. */
|
/* Normalize the direction to the portal. */
|
||||||
local_dir[0] /= dist;
|
local_dir[0] /= dist;
|
||||||
@ -521,6 +525,12 @@ int main(int argc, char **argv)
|
|||||||
*/
|
*/
|
||||||
local_radius = portal_radius * fabsf(dot_product(local_dir, local_norm));
|
local_radius = portal_radius * fabsf(dot_product(local_dir, local_norm));
|
||||||
|
|
||||||
|
/* Calculate distance attenuation for the other zone, using the
|
||||||
|
* standard inverse distance model with the radius as a reference.
|
||||||
|
*/
|
||||||
|
attn = local_radius / dist;
|
||||||
|
if(attn > 1.0f) attn = 1.0f;
|
||||||
|
|
||||||
/* Calculate the 'spread' of the portal, which is the amount of
|
/* Calculate the 'spread' of the portal, which is the amount of
|
||||||
* coverage the other zone has around the listener.
|
* coverage the other zone has around the listener.
|
||||||
*/
|
*/
|
||||||
@ -534,12 +544,16 @@ int main(int argc, char **argv)
|
|||||||
/* We're in front of the portal, so we're in Zone 0. */
|
/* We're in front of the portal, so we're in Zone 0. */
|
||||||
this_effect = effects[0];
|
this_effect = effects[0];
|
||||||
other_effect = effects[1];
|
other_effect = effects[1];
|
||||||
|
this_reverb = &reverb0;
|
||||||
|
other_reverb = &reverb1;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* We're behind the portal, so we're in Zone 1. */
|
/* We're behind the portal, so we're in Zone 1. */
|
||||||
this_effect = effects[1];
|
this_effect = effects[1];
|
||||||
other_effect = effects[0];
|
other_effect = effects[0];
|
||||||
|
this_reverb = &reverb1;
|
||||||
|
other_reverb = &reverb0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Scale the other zone's panning vector down as the portal's
|
/* Scale the other zone's panning vector down as the portal's
|
||||||
@ -555,10 +569,12 @@ int main(int argc, char **argv)
|
|||||||
this_dir[1] = local_dir[1] * -spread;
|
this_dir[1] = local_dir[1] * -spread;
|
||||||
this_dir[2] = local_dir[2] * -spread;
|
this_dir[2] = local_dir[2] * -spread;
|
||||||
|
|
||||||
/* Now set the effects' panning vectors. */
|
/* Now set the effects' panning vectors and distance attenuation. */
|
||||||
|
alEffectf(this_effect, AL_EAXREVERB_GAIN, this_reverb->flGain);
|
||||||
alEffectfv(this_effect, AL_EAXREVERB_REFLECTIONS_PAN, this_dir);
|
alEffectfv(this_effect, AL_EAXREVERB_REFLECTIONS_PAN, this_dir);
|
||||||
alEffectfv(this_effect, AL_EAXREVERB_LATE_REVERB_PAN, this_dir);
|
alEffectfv(this_effect, AL_EAXREVERB_LATE_REVERB_PAN, this_dir);
|
||||||
|
|
||||||
|
alEffectf(other_effect, AL_EAXREVERB_GAIN, other_reverb->flGain * attn);
|
||||||
alEffectfv(other_effect, AL_EAXREVERB_REFLECTIONS_PAN, other_dir);
|
alEffectfv(other_effect, AL_EAXREVERB_REFLECTIONS_PAN, other_dir);
|
||||||
alEffectfv(other_effect, AL_EAXREVERB_LATE_REVERB_PAN, other_dir);
|
alEffectfv(other_effect, AL_EAXREVERB_LATE_REVERB_PAN, other_dir);
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user