mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 09:08:47 +02:00
Experimental attenuation curve: linear falloff, with prescribed propagation limit.
A positive coefficient sets logarithmic falloff, as before. A negative coefficient sets linear falloff, where abs(coefficient) is the distance limit in meters.
This commit is contained in:
parent
7cade1e354
commit
3ffaced0f3
2 changed files with 23 additions and 9 deletions
|
@ -736,7 +736,7 @@ void AudioMixer::parseSettingsObject(const QJsonObject& settingsObject) {
|
||||||
float coefficient = coefficientObject.value(COEFFICIENT).toString().toFloat(&ok);
|
float coefficient = coefficientObject.value(COEFFICIENT).toString().toFloat(&ok);
|
||||||
|
|
||||||
|
|
||||||
if (ok && coefficient >= 0.0f && coefficient <= 1.0f &&
|
if (ok && coefficient <= 1.0f &&
|
||||||
itSource != end(_audioZones) &&
|
itSource != end(_audioZones) &&
|
||||||
itListener != end(_audioZones)) {
|
itListener != end(_audioZones)) {
|
||||||
|
|
||||||
|
|
|
@ -770,15 +770,29 @@ float computeGain(float masterListenerGain, const AvatarAudioStream& listeningNo
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// translate the zone setting to gain per log2(distance)
|
|
||||||
|
if (attenuationPerDoublingInDistance < 0.0f) {
|
||||||
|
// translate a negative zone setting to distance limit
|
||||||
|
const float MIN_DISTANCE_LIMIT = ATTN_DISTANCE_REF + 1.0f; // silent after 1m
|
||||||
|
float distanceLimit = std::max(-attenuationPerDoublingInDistance, MIN_DISTANCE_LIMIT);
|
||||||
|
|
||||||
|
// calculate the LINEAR attenuation using the distance to this node
|
||||||
|
// reference attenuation of 0dB at distance = ATTN_DISTANCE_REF
|
||||||
|
float d = distance - ATTN_DISTANCE_REF;
|
||||||
|
gain *= std::max(1.0f - d / (distanceLimit - ATTN_DISTANCE_REF), 0.0f);
|
||||||
|
gain = std::min(gain, ATTN_GAIN_MAX);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
// translate a positive zone setting to gain per log2(distance)
|
||||||
const float MIN_ATTENUATION_COEFFICIENT = 0.001f; // -60dB per log2(distance)
|
const float MIN_ATTENUATION_COEFFICIENT = 0.001f; // -60dB per log2(distance)
|
||||||
float g = glm::clamp(1.0f - attenuationPerDoublingInDistance, MIN_ATTENUATION_COEFFICIENT, 1.0f);
|
float g = glm::clamp(1.0f - attenuationPerDoublingInDistance, MIN_ATTENUATION_COEFFICIENT, 1.0f);
|
||||||
|
|
||||||
// calculate the attenuation using the distance to this node
|
// calculate the LOGARITHMIC attenuation using the distance to this node
|
||||||
// reference attenuation of 0dB at distance = ATTN_DISTANCE_REF
|
// reference attenuation of 0dB at distance = ATTN_DISTANCE_REF
|
||||||
float d = (1.0f / ATTN_DISTANCE_REF) * std::max(distance, HRTF_NEARFIELD_MIN);
|
float d = (1.0f / ATTN_DISTANCE_REF) * std::max(distance, HRTF_NEARFIELD_MIN);
|
||||||
gain *= fastExp2f(fastLog2f(g) * fastLog2f(d));
|
gain *= fastExp2f(fastLog2f(g) * fastLog2f(d));
|
||||||
gain = std::min(gain, ATTN_GAIN_MAX);
|
gain = std::min(gain, ATTN_GAIN_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
return gain;
|
return gain;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue