Giant_Beast_2025/Plugins/MetaXR/Source/OculusXRHMD/Private/OculusXRStereoLayersFlagsSupplier.cpp

86 lines
2.8 KiB
C++

// @lint-ignore-every LICENSELINT
// Copyright Epic Games, Inc. All Rights Reserved.
#include "OculusXRStereoLayersFlagsSupplier.h"
#include "IStereoLayers.h"
#include "OVR_Plugin_Types.h"
TSharedPtr<FOculusXRStereoLayersFlagsSupplier> FOculusXRStereoLayersFlagsSupplier::Instance = NULL;
TSharedPtr<FOculusXRStereoLayersFlagsSupplier> FOculusXRStereoLayersFlagsSupplier::Get()
{
if (!Instance.IsValid())
{
Instance = MakeShared<FOculusXRStereoLayersFlagsSupplier>();
}
return Instance;
}
FOculusXRStereoLayersFlagsSupplier::FOculusXRStereoLayersFlagsSupplier()
{
#if !UE_VERSION_OLDER_THAN(5, 4, 0)
uint32 Value = IStereoLayers::ELayerFlags::LAYER_FLAG_MAX_VALUE << 1;
UnrealFlagValOvrpFlagValMap.Add(Value, ovrpLayerFlag_BicubicFiltering);
SupportedFilters.Add(FName("Bicubic Filtering"));
Value = Value << 1;
UnrealFlagValOvrpFlagValMap.Add(Value, ovrpLayerSubmitFlag_AutoLayerFilter);
SupportedFilters.Add(FName("Auto Filtering"));
Value = Value << 1;
UnrealFlagValOvrpFlagValMap.Add(Value, ovrpLayerSubmitFlag_EfficientSuperSample);
SupportedFilters.Add(FName("Normal SuperSampling"));
Value = Value << 1;
UnrealFlagValOvrpFlagValMap.Add(Value, ovrpLayerSubmitFlag_ExpensiveSuperSample);
SupportedFilters.Add(FName("Quality SuperSampling"));
Value = Value << 1;
UnrealFlagValOvrpFlagValMap.Add(Value, ovrpLayerSubmitFlag_EfficientSharpen);
SupportedFilters.Add(FName("Normal Sharpening"));
Value = Value << 1;
UnrealFlagValOvrpFlagValMap.Add(Value, ovrpLayerSubmitFlag_QualitySharpen);
SupportedFilters.Add(FName("Quality Sharpening"));
#endif // !UE_VERSION_OLDER_THAN(5, 4, 0)
}
int FOculusXRStereoLayersFlagsSupplier::GetOvrpFlag(uint32 DescFlags, bool bMQSR)
{
int LayerSubmitFlags = 0;
#if !UE_VERSION_OLDER_THAN(5, 4, 0)
for (auto& FlagPair : UnrealFlagValOvrpFlagValMap)
{
if (bMQSR && FlagPair.Value == ovrpLayerFlag_BicubicFiltering)
{
continue;
}
else if (!bMQSR && FlagPair.Value != ovrpLayerFlag_BicubicFiltering)
{
continue;
}
if (DescFlags & FlagPair.Key)
{
LayerSubmitFlags |= FlagPair.Value;
}
}
if (bMQSR)
{ // validate if autofilter conflicts with supersampling and sharpening
bool bAutoFiltering = LayerSubmitFlags & ovrpLayerSubmitFlag_AutoLayerFilter;
bool bSuperSamplingType = ((LayerSubmitFlags & ovrpLayerSubmitFlag_EfficientSuperSample) || (LayerSubmitFlags & ovrpLayerSubmitFlag_ExpensiveSuperSample));
bool bSSharpenType = ((LayerSubmitFlags & ovrpLayerSubmitFlag_EfficientSharpen) || (LayerSubmitFlags & ovrpLayerSubmitFlag_QualitySharpen));
if (!bAutoFiltering && bSuperSamplingType && bSSharpenType)
{
UE_LOG(LogTemp, Error, TEXT("XR sharpening and supersampling cannot be enabled simultaneously.\n Either enable autofiltering or disable one of the options."));
return 0;
}
}
#endif // !UE_VERSION_OLDER_THAN(5, 4, 0)
return LayerSubmitFlags;
}