#include "graphics/rtao.h" #include "graphics/2d.h" #include "graphics/shadows.h" #include "options/Option.h" int Rtao_samples = 0; // coverity[GLOBAL_INIT_ORDER] -- safe; OptionBuilder::finish() uses Meyers singleton auto RtaoQualityOption = options::OptionBuilder("Graphics.RtaoQuality", std::pair{"Raytraced Ambient Occlusion", -1}, std::pair{"Rays traced per pixel for ambient occlusion in the deferred ambient pass; Off keeps baked AO maps only", -1}) .enumerator([]() -> SCP_vector { if (rtao_supported()) { return {0, 4, 8, 16}; } return {0}; // inert default when RT isn't supported }) .display(options::MapValueDisplay({ {0, {"Off", -1}}, {4, {"Low", -1}}, {8, {"Medium", -1}}, {16, {"High", -1}} })) .bind_to(&Rtao_samples) .flags({options::OptionFlags::ForceMultiValueSelection}) .level(options::ExpertLevel::Advanced) .category(std::make_pair("Graphics", 1825)) .default_func([]() { return 0; }) .importance(71) .finish(); bool rtao_supported() { return gr_is_capable(gr_capability::CAPABILITY_RAYTRACED_SHADOWS); } bool rtao_enabled() { // The shadow cascade parameters that RTAO reads are only created when shadows are on. return Rtao_samples > 0 && rtao_supported() && Shadow_quality != ShadowQuality::Disabled; } void rtao_remove_unsupported_options() { if (!rtao_supported()) { // The option has no effect without raytracing support, so remove it. options::OptionsManager::instance()->removeOption(RtaoQualityOption); } }