235 lines
9.2 KiB
C++
235 lines
9.2 KiB
C++
// Copyright PICO Technology Co., Ltd. All rights reserved.
|
|
// This plugin incorporates portions of the Unreal® Engine. Unreal® is a trademark or registered trademark of Epic Games, Inc. in the United States of America and elsewhere.
|
|
// Copyright Epic Games, Inc. All Rights Reserved.
|
|
|
|
#include "PXR_HMDRuntimeSettings.h"
|
|
#include "Misc/ConfigUtilities.h"
|
|
#if WITH_EDITOR
|
|
#include "Editor.h"
|
|
#endif
|
|
#include "Engine/RendererSettings.h"
|
|
#include "Interfaces/IPluginManager.h"
|
|
#include "Misc/ConfigUtilities.h"
|
|
|
|
static TAutoConsoleVariable<int32> CVarWaitFrameAtGameFrameTail(
|
|
TEXT("PICO.WaitFrameAtGameFrameTail"),
|
|
0,
|
|
TEXT("Whether to WaitFrame() at the end of the GameFrame!"),
|
|
ECVF_Default);
|
|
|
|
UPICOXRSettings::UPICOXRSettings(const FObjectInitializer& ObjectInitializer)
|
|
: Super(ObjectInitializer),
|
|
bEnablePSensor(false),
|
|
bIsHMD3Dof(false),
|
|
bEnableHomeKey(false),
|
|
bIsController3Dof(false),
|
|
HandTrackingSupport(EPICOXRHandTrackingSupport::ControllersOnly),
|
|
bAdaptiveHandModel(false),
|
|
bHighFrequencyTracking(false),
|
|
bEnableAutoKeyMapping(true),
|
|
bEnableLateLatching(false),
|
|
bUseHWsRGBEncoding(true),
|
|
bUseRecommendedMSAA(false),
|
|
CoordinateType(EPICOXRCoordinateType::Local),
|
|
bEnableEyeTracking(false),
|
|
bEnableEyeTrackingCalibration(false),
|
|
bEnableFaceTracking(false),
|
|
bEnableBodyTracking(false),
|
|
bUseContentProtect(false),
|
|
bSplashScreenAutoShow(true),
|
|
refreshRate(ERefreshRate::Default),
|
|
bEnableMRSafeguard(false),
|
|
bEnableVST(false),
|
|
bEnableAnchor(false),
|
|
bEnableMesh(false),
|
|
bSemanticsAlignWithTriangle(false),
|
|
bSemanticsAlignWithVertex(false),
|
|
MeshLod(EPICOSpatialMeshLod::High),
|
|
FoveationRenderingMode(EFoveationRenderingMode::FixedFoveationRendering),
|
|
FoveationLevel(EFoveationLevel::None),
|
|
bEnableEyeTrackingFoveationRendering(false),
|
|
bEnableSuperResolution(false),
|
|
SharpeningSetting(EPICOXRSharpeningType::None),
|
|
SharpeningEnhanceMode(EPICOXRSharpeningEnhanceModeType::None)
|
|
{
|
|
#if WITH_EDITOR
|
|
ResetsRGBConfig();
|
|
#endif
|
|
UE::ConfigUtilities::ApplyCVarSettingsFromIni(TEXT("/Script/PICOXRHMD.PICOXRSettings"), *GEngineIni, ECVF_SetByProjectSetting);
|
|
}
|
|
|
|
void UPICOXRSettings::PostInitProperties()
|
|
{
|
|
Super::PostInitProperties();
|
|
bUseHWsRGBEncoding = true;
|
|
}
|
|
|
|
#if WITH_EDITOR
|
|
void UPICOXRSettings::PostEditChangeProperty(FPropertyChangedEvent & PropertyChangedEvent)
|
|
{
|
|
bUsingOSSplash = FPaths::FileExists(OSSplashScreen.FilePath) ? true : false;
|
|
|
|
Super::PostEditChangeProperty(PropertyChangedEvent);
|
|
Super::TryUpdateDefaultConfigFile();
|
|
HandlesRGBHWSupport();
|
|
|
|
FString Dst = FPaths::ProjectDir() / TEXT("pico_splash.png");
|
|
|
|
if (bUsingOSSplash)
|
|
{
|
|
IFileManager::Get().Copy(*Dst, *OSSplashScreen.FilePath, true);
|
|
}
|
|
else
|
|
{
|
|
IFileManager::Get().Delete(*Dst, true);
|
|
}
|
|
|
|
static const FName HandTrackingSupportName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, HandTrackingSupport);
|
|
if (PropertyChangedEvent.Property->GetFName() == HandTrackingSupportName)
|
|
{
|
|
if (HandTrackingSupport==EPICOXRHandTrackingSupport::ControllersOnly)
|
|
{
|
|
bAdaptiveHandModel=false;
|
|
bHighFrequencyTracking=false;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bAdaptiveHandModel)), GetDefaultConfigFilename());
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bHighFrequencyTracking)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName EnableVSTName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableVST);
|
|
if (PropertyChangedEvent.Property->GetFName() == EnableVSTName)
|
|
{
|
|
if (!bEnableVST)
|
|
{
|
|
bEnableAnchor = false;
|
|
bEnableSceneCapture=false;
|
|
bEnableMesh=false;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableAnchor)), GetDefaultConfigFilename());
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableSceneCapture)), GetDefaultConfigFilename());
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableMesh)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName EnableAnchorName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableAnchor);
|
|
if (PropertyChangedEvent.Property->GetFName() == EnableAnchorName)
|
|
{
|
|
if (bEnableAnchor)
|
|
{
|
|
bEnableVST = true;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableVST)), GetDefaultConfigFilename());
|
|
}
|
|
else
|
|
{
|
|
bEnableCloudAnchor=false;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableCloudAnchor)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName EnableSceneCaptureName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableSceneCapture);
|
|
if (PropertyChangedEvent.Property->GetFName() == EnableSceneCaptureName)
|
|
{
|
|
if (bEnableSceneCapture)
|
|
{
|
|
bEnableVST = true;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableVST)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName EnableMeshName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableMesh);
|
|
if (PropertyChangedEvent.Property->GetFName() == EnableMeshName)
|
|
{
|
|
if (bEnableMesh)
|
|
{
|
|
bEnableVST = true;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableVST)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName SuperResolutionName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableSuperResolution);
|
|
if (PropertyChangedEvent.Property->GetFName() == SuperResolutionName)
|
|
{
|
|
if (bEnableSuperResolution)
|
|
{
|
|
SharpeningSetting = EPICOXRSharpeningType::None;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, SharpeningSetting)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName SharpeningName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, SharpeningSetting);
|
|
if (PropertyChangedEvent.Property->GetFName() == SharpeningName)
|
|
{
|
|
if (SharpeningSetting!=EPICOXRSharpeningType::None)
|
|
{
|
|
bEnableSuperResolution = false;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableSuperResolution)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName FoveationRenderingModeName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, FoveationRenderingMode);
|
|
if (PropertyChangedEvent.Property && PropertyChangedEvent.Property->GetFName() == FoveationRenderingModeName)
|
|
{
|
|
if (FoveationRenderingMode == EFoveationRenderingMode::EyeTrackingFoveationRendering)
|
|
{
|
|
bEnableEyeTrackingFoveationRendering = true;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableEyeTrackingFoveationRendering)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName EnableEyeTrackingFoveationName = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bEnableEyeTrackingFoveationRendering);
|
|
if (PropertyChangedEvent.Property && PropertyChangedEvent.Property->GetFName() == EnableEyeTrackingFoveationName)
|
|
{
|
|
if (bEnableEyeTrackingFoveationRendering == false)
|
|
{
|
|
FoveationRenderingMode = EFoveationRenderingMode::FixedFoveationRendering;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, FoveationRenderingMode)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
static const FName EnableSemanticsAlignWithVertex = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bSemanticsAlignWithVertex);
|
|
if (PropertyChangedEvent.Property && PropertyChangedEvent.Property->GetFName() == EnableSemanticsAlignWithVertex)
|
|
{
|
|
if (bSemanticsAlignWithVertex == true)
|
|
{
|
|
bSemanticsAlignWithTriangle = false;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bSemanticsAlignWithTriangle)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
|
|
static const FName EnableSemanticsAlignWithTriangle = GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bSemanticsAlignWithTriangle);
|
|
if (PropertyChangedEvent.Property && PropertyChangedEvent.Property->GetFName() == EnableSemanticsAlignWithTriangle)
|
|
{
|
|
if (bSemanticsAlignWithTriangle == true)
|
|
{
|
|
bSemanticsAlignWithVertex = false;
|
|
UpdateSinglePropertyInConfigFile(GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(UPICOXRSettings, bSemanticsAlignWithVertex)), GetDefaultConfigFilename());
|
|
}
|
|
}
|
|
}
|
|
|
|
void UPICOXRSettings::HandlesRGBHWSupport()
|
|
{
|
|
URendererSettings* const Settings = GetMutableDefault<URendererSettings>();
|
|
static auto* MobileUseHWsRGBEncodingCVAR = IConsoleManager::Get().FindConsoleVariable(TEXT("r.Mobile.UseHWsRGBEncoding"));
|
|
|
|
if (bUseHWsRGBEncoding != Settings->bMobileUseHWsRGBEncoding)
|
|
{
|
|
Settings->bMobileUseHWsRGBEncoding = bUseHWsRGBEncoding;
|
|
Settings->UpdateSinglePropertyInConfigFile(Settings->GetClass()->FindPropertyByName(GET_MEMBER_NAME_CHECKED(URendererSettings, bMobileUseHWsRGBEncoding)), GetDefaultConfigFilename());
|
|
}
|
|
|
|
if (MobileUseHWsRGBEncodingCVAR && MobileUseHWsRGBEncodingCVAR->GetInt() != (int)bUseHWsRGBEncoding)
|
|
{
|
|
MobileUseHWsRGBEncodingCVAR->Set((int)bUseHWsRGBEncoding);
|
|
}
|
|
}
|
|
|
|
void UPICOXRSettings::ResetsRGBConfig()
|
|
{
|
|
// To Prevent sRGB from being turned off by AndroidSetting
|
|
FEditorDelegates::RefreshAllBrowsers.AddUObject(this,&UPICOXRSettings::HandlesRGBHWSupport);
|
|
}
|
|
#endif
|
|
|
|
|
|
|
|
|