aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--al/auxeffectslot.cpp17
-rw-r--r--al/auxeffectslot.h3
-rw-r--r--al/source.cpp61
3 files changed, 62 insertions, 19 deletions
diff --git a/al/auxeffectslot.cpp b/al/auxeffectslot.cpp
index 9da8824b..0cfd6636 100644
--- a/al/auxeffectslot.cpp
+++ b/al/auxeffectslot.cpp
@@ -1379,6 +1379,19 @@ void ALeffectslot::eax5_fx_slot_set_all(const EaxCall& call)
dst = src;
}
+bool ALeffectslot::eax_fx_slot_should_update_sources() const noexcept
+{
+ const auto dirty_bits =
+ eax_occlusion_dirty_bit |
+ eax_occlusion_lf_ratio_dirty_bit |
+ eax_flags_dirty_bit;
+
+ if((eax_df_ & dirty_bits) != EaxDirtyFlags{})
+ return true;
+
+ return false;
+}
+
// Returns `true` if all sources should be updated, or `false` otherwise.
bool ALeffectslot::eax4_fx_slot_set(const EaxCall& call)
{
@@ -1409,7 +1422,7 @@ bool ALeffectslot::eax4_fx_slot_set(const EaxCall& call)
eax_fail_unknown_property_id();
}
- return (eax_df_ & (eax_occlusion_dirty_bit | eax_occlusion_lf_ratio_dirty_bit)) != EaxDirtyFlags{};
+ return eax_fx_slot_should_update_sources();
}
// Returns `true` if all sources should be updated, or `false` otherwise.
@@ -1446,7 +1459,7 @@ bool ALeffectslot::eax5_fx_slot_set(const EaxCall& call)
eax_fail_unknown_property_id();
}
- return (eax_df_ & (eax_occlusion_dirty_bit | eax_occlusion_lf_ratio_dirty_bit)) != EaxDirtyFlags{};
+ return eax_fx_slot_should_update_sources();
}
// Returns `true` if all sources should be updated, or `false` otherwise.
diff --git a/al/auxeffectslot.h b/al/auxeffectslot.h
index bf2060fe..9b6403f4 100644
--- a/al/auxeffectslot.h
+++ b/al/auxeffectslot.h
@@ -84,6 +84,7 @@ struct ALeffectslot {
public:
void eax_initialize(ALCcontext& al_context, EaxFxSlotIndexValue index);
+ EaxFxSlotIndexValue eax_get_index() const noexcept { return eax_fx_slot_index_; }
const EAX50FXSLOTPROPERTIES& eax_get_eax_fx_slot() const noexcept
{ return eax_; }
@@ -306,6 +307,8 @@ private:
void eax4_fx_slot_set_all(const EaxCall& call);
void eax5_fx_slot_set_all(const EaxCall& call);
+ bool eax_fx_slot_should_update_sources() const noexcept;
+
// Returns `true` if all sources should be updated, or `false` otherwise.
bool eax4_fx_slot_set(const EaxCall& call);
// Returns `true` if all sources should be updated, or `false` otherwise.
diff --git a/al/source.cpp b/al/source.cpp
index 6483473d..8856bafc 100644
--- a/al/source.cpp
+++ b/al/source.cpp
@@ -4016,27 +4016,44 @@ EaxAlLowPassParam ALsource::eax_create_direct_filter_param() const noexcept
eax_.source.flOcclusionDirectRatio,
eax_.source.flOcclusionLFRatio);
+ const auto has_source_occlusion = (eax_.source.lOcclusion != 0);
+
auto gain_hf_mb =
static_cast<float>(eax_.source.lDirectHF) +
- static_cast<float>(eax_.source.lObstruction) +
- (static_cast<float>(eax_.source.lOcclusion) * eax_.source.flOcclusionDirectRatio);
+ static_cast<float>(eax_.source.lObstruction);
for (auto i = std::size_t{}; i < EAX_MAX_FXSLOTS; ++i)
{
if(!eax_active_fx_slots_[i])
continue;
- const auto& send = eax_.sends[i];
+ if(has_source_occlusion) {
+ const auto& fx_slot = eax_al_context_->eax_get_fx_slot(i);
+ const auto& fx_slot_eax = fx_slot.eax_get_eax_fx_slot();
+ const auto is_environmental_fx = ((fx_slot_eax.ulFlags & EAXFXSLOTFLAGS_ENVIRONMENT) != 0);
+ const auto is_primary = (eax_primary_fx_slot_id_.value_or(-1) == fx_slot.eax_get_index());
+ const auto is_listener_environment = (is_environmental_fx && is_primary);
- if(send.lOcclusion == 0)
- continue;
+ if(is_listener_environment) {
+ gain_mb += eax_calculate_dst_occlusion_mb(
+ eax_.source.lOcclusion,
+ eax_.source.flOcclusionDirectRatio,
+ eax_.source.flOcclusionLFRatio);
- gain_mb += eax_calculate_dst_occlusion_mb(
- send.lOcclusion,
- send.flOcclusionDirectRatio,
- send.flOcclusionLFRatio);
+ gain_hf_mb += static_cast<float>(eax_.source.lOcclusion) * eax_.source.flOcclusionDirectRatio;
+ }
+ }
- gain_hf_mb += static_cast<float>(send.lOcclusion) * send.flOcclusionDirectRatio;
+ const auto& send = eax_.sends[i];
+
+ if(send.lOcclusion != 0) {
+ gain_mb += eax_calculate_dst_occlusion_mb(
+ send.lOcclusion,
+ send.flOcclusionDirectRatio,
+ send.flOcclusionLFRatio);
+
+ gain_hf_mb += static_cast<float>(send.lOcclusion) * send.flOcclusionDirectRatio;
+ }
}
const auto al_low_pass_param = EaxAlLowPassParam{
@@ -4052,27 +4069,37 @@ EaxAlLowPassParam ALsource::eax_create_room_filter_param(
{
const auto& fx_slot_eax = fx_slot.eax_get_eax_fx_slot();
const auto is_environmental_fx = ((fx_slot_eax.ulFlags & EAXFXSLOTFLAGS_ENVIRONMENT) != 0);
+ const auto is_primary = (eax_primary_fx_slot_id_.value_or(-1) == fx_slot.eax_get_index());
+ const auto is_listener_environment = (is_environmental_fx && is_primary);
const auto gain_mb =
(static_cast<float>(fx_slot_eax.lOcclusion) * fx_slot_eax.flOcclusionLFRatio) +
static_cast<float>((is_environmental_fx ? eax_.source.lRoom : 0) + send.lSend) +
- eax_calculate_dst_occlusion_mb(
- eax_.source.lOcclusion,
- eax_.source.flOcclusionRoomRatio,
- eax_.source.flOcclusionLFRatio) +
+ (is_listener_environment ?
+ eax_calculate_dst_occlusion_mb(
+ eax_.source.lOcclusion,
+ eax_.source.flOcclusionRoomRatio,
+ eax_.source.flOcclusionLFRatio) :
+ 0.0f) +
eax_calculate_dst_occlusion_mb(
send.lOcclusion,
send.flOcclusionRoomRatio,
send.flOcclusionLFRatio) +
- (static_cast<float>(eax_.source.lExclusion) * eax_.source.flExclusionLFRatio) +
+ (is_listener_environment ?
+ (static_cast<float>(eax_.source.lExclusion) * eax_.source.flExclusionLFRatio) :
+ 0.0f) +
(static_cast<float>(send.lExclusion) * send.flExclusionLFRatio);
const auto gain_hf_mb =
static_cast<float>(fx_slot_eax.lOcclusion) +
static_cast<float>((is_environmental_fx ? eax_.source.lRoomHF : 0) + send.lSendHF) +
- (static_cast<float>(eax_.source.lOcclusion) * eax_.source.flOcclusionRoomRatio) +
+ (is_listener_environment ?
+ ((static_cast<float>(eax_.source.lOcclusion) * eax_.source.flOcclusionRoomRatio)) :
+ 0.0f) +
(static_cast<float>(send.lOcclusion) * send.flOcclusionRoomRatio) +
- static_cast<float>(eax_.source.lExclusion + send.lExclusion);
+ (is_listener_environment ?
+ static_cast<float>(eax_.source.lExclusion + send.lExclusion) :
+ 0.0f);
const auto al_low_pass_param = EaxAlLowPassParam{
level_mb_to_gain(gain_mb),