From 609ee742115aa10139d5e4c3f8915306751c227f Mon Sep 17 00:00:00 2001 From: Chris Robinson Date: Thu, 10 Mar 2022 17:47:42 -0800 Subject: Add a config option for reverse-z The same as the __ALSOFT_REVERSE_Z env var, but in the config file. Should only be used for per-game config files (either along side the executable, or setting the ALSOFT_CONF env var when launching the app). --- alc/alc.cpp | 12 +++++++++++- alc/alu.cpp | 26 ++++++++------------------ alc/alu.h | 15 ++++++++++----- alsoftrc.sample | 13 ++++++++++++- 4 files changed, 41 insertions(+), 25 deletions(-) diff --git a/alc/alc.cpp b/alc/alc.cpp index 90da2614..4ba47aea 100644 --- a/alc/alc.cpp +++ b/alc/alc.cpp @@ -1120,7 +1120,17 @@ void alc_initconfig(void) if(auto limopt = ConfigValueBool(nullptr, nullptr, "rt-time-limit")) AllowRTTimeLimit = *limopt; - aluInit(); + CompatFlagBitset compatflags{}; + if(auto optval = al::getenv("__ALSOFT_REVERSE_Z")) + { + if(al::strcasecmp(optval->c_str(), "true") == 0 + || strtol(optval->c_str(), nullptr, 0) == 1) + compatflags.set(CompatFlags::ReverseZ); + } + else if(GetConfigValueBool(nullptr, "game_compat", "reverse-z", false)) + compatflags.set(CompatFlags::ReverseZ); + + aluInit(compatflags); Voice::InitMixer(ConfigValueStr(nullptr, nullptr, "resampler")); auto traperr = al::getenv("ALSOFT_TRAP_ERROR"); diff --git a/alc/alu.cpp b/alc/alu.cpp index 67727bd5..203fd9b6 100644 --- a/alc/alu.cpp +++ b/alc/alu.cpp @@ -125,26 +125,15 @@ float InitConeScale() } return ret; } - -float InitZScale() -{ - float ret{1.0f}; - if(auto optval = al::getenv("__ALSOFT_REVERSE_Z")) - { - if(al::strcasecmp(optval->c_str(), "true") == 0 - || strtol(optval->c_str(), nullptr, 0) == 1) - ret *= -1.0f; - } - return ret; -} - -} // namespace - /* Cone scalar */ const float ConeScale{InitConeScale()}; -/* Localized Z scalar for mono sources */ -const float ZScale{InitZScale()}; +/* Localized Z scalar for mono sources (initialized in aluInit, after + * configuration is loaded). + */ +float ZScale{1.0f}; + +} // namespace namespace { @@ -253,9 +242,10 @@ inline ResamplerFunc SelectResampler(Resampler resampler, uint increment) } // namespace -void aluInit(void) +void aluInit(CompatFlagBitset flags) { MixDirectHrtf = SelectHrtfMixer(); + ZScale = flags.test(CompatFlags::ReverseZ) ? -1.0f : 1.0f; } diff --git a/alc/alu.h b/alc/alu.h index b88f7cf5..03f56f56 100644 --- a/alc/alu.h +++ b/alc/alu.h @@ -1,6 +1,8 @@ #ifndef ALU_H #define ALU_H +#include + #include "aloptional.h" struct ALCcontext; @@ -13,7 +15,14 @@ enum class StereoEncoding : unsigned char; constexpr float GainMixMax{1000.0f}; /* +60dB */ -void aluInit(void); +enum CompatFlags : uint8_t { + ReverseZ, + + Count +}; +using CompatFlagBitset = std::bitset; + +void aluInit(CompatFlagBitset flags); /* aluInitRenderer * @@ -24,8 +33,4 @@ void aluInitRenderer(ALCdevice *device, int hrtf_id, al::optional