October3d55/Matain/ViveOpenXR/Source/ViveOpenXRHTCCompositionLay.../Private/ViveOpenXRHTCCompositionLay...

240 lines
9.3 KiB
C++
Raw Normal View History

2025-03-10 09:43:27 +08:00
// Copyright HTC Corporation. All Rights Reserved.
#include "ViveOpenXRHTCCompositionLayerExtraSettingsModule.h"
#include "OpenXRCore.h"
#include "Misc/ConfigCacheIni.h"
#include "Modules/ModuleManager.h"
DEFINE_LOG_CATEGORY(LogViveOpenXRHTCCompositionLayerExtraSettings);
void FViveOpenXRHTCCompositionLayerExtraSettings::StartupModule()
{
check(GConfig && GConfig->IsReadyForUse());
FString modeName;
if (GConfig->GetString(TEXT("/Script/ViveOpenXRRuntimeSettings.ViveOpenXRRuntimeSettings"), TEXT("bEnableSharpening"), modeName, GEngineIni))
{
if (modeName.Equals("False"))
{
m_bEnableHTCCompositionLayerExtraSettings = false;
}
else if (modeName.Equals("True"))
{
m_bEnableHTCCompositionLayerExtraSettings = true;
}
}
float SharpeningLevel;
if (GConfig->GetFloat(TEXT("/Script/ViveOpenXRRuntimeSettings.ViveOpenXRRuntimeSettings"), TEXT("SharpeningLevel"), SharpeningLevel, GEngineIni))
{
ProjectSettingsSharpeningLevel = SharpeningLevel;
}
FString SharpeningModeName;
if (GConfig->GetString(TEXT("/Script/ViveOpenXRRuntimeSettings.ViveOpenXRRuntimeSettings"), TEXT("SharpeningMode"), SharpeningModeName, GEngineIni))
{
if (SharpeningModeName == "FAST")
{
ProjectSettingsSharpeningMode = ESharpeningMode::FAST;
}
else if (SharpeningModeName == "QUALITY")
{
ProjectSettingsSharpeningMode = ESharpeningMode::QUALITY;
}
else if (SharpeningModeName == "AUTOMATIC")
{
ProjectSettingsSharpeningMode = ESharpeningMode::AUTOMATIC;
}
else
{
ProjectSettingsSharpeningMode = ESharpeningMode::NORMAL;
}
}
if (m_bEnableHTCCompositionLayerExtraSettings)
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Enable HTCCompositionLayerExtraSettings."));
}
else
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Disable HTCCompositionLayerExtraSettings."));
return;
}
RegisterOpenXRExtensionModularFeature();
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("StartupModule() Finished."));
}
void FViveOpenXRHTCCompositionLayerExtraSettings::PostCreateInstance(XrInstance InInstance)
{
if (!m_bEnableHTCCompositionLayerExtraSettings) return;
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Entry HTCCompositionLayerExtraSettings PostCreateInstance."));
m_XrInstance = InInstance;
}
bool FViveOpenXRHTCCompositionLayerExtraSettings::GetRequiredExtensions(TArray<const ANSICHAR*>& OutExtensions)
{
if (m_bEnableHTCCompositionLayerExtraSettings)
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("GetRequiredExtensions() Add HTCCompositionLayerExtraSettings Extension Name %s."), ANSI_TO_TCHAR(XR_HTC_COMPOSITION_LAYER_EXTRA_SETTINGS_EXTENSION_NAME));
OutExtensions.Add(XR_HTC_COMPOSITION_LAYER_EXTRA_SETTINGS_EXTENSION_NAME);
}
return true;
}
void FViveOpenXRHTCCompositionLayerExtraSettings::PostGetSystem(XrInstance InInstance, XrSystemId InSystem)
{
if (!m_bEnableHTCCompositionLayerExtraSettings) return;
m_XrSystemId = InSystem;
XR_ENSURE(xrGetInstanceProcAddr(InInstance, "xrGetSystemProperties", (PFN_xrVoidFunction*)&FHTCCompositionLayerExtraSettings_ext.xrGetSystemProperties));
XrSystemCompositionLayerExtraSettingsPropertiesHTC CompositionLayerExtraSettingsSystemProperties;
CompositionLayerExtraSettingsSystemProperties.type = XR_TYPE_SYSTEM_COMPOSITION_LAYER_EXTRA_SETTINGS_PROPERTIES_HTC;
CompositionLayerExtraSettingsSystemProperties.next = NULL;
XrSystemProperties systemProperties;
systemProperties.type = XrStructureType::XR_TYPE_SYSTEM_PROPERTIES;
systemProperties.next = &CompositionLayerExtraSettingsSystemProperties;
XR_ENSURE(FHTCCompositionLayerExtraSettings_ext.xrGetSystemProperties(InInstance, InSystem, &systemProperties));
{
if (CompositionLayerExtraSettingsSystemProperties.supportsSharpening == 0) {
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Entry HTCCompositionLayerExtraSettings sharpening unsupported."));
m_supportsSharpening = false;
}
else
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Entry HTCCompositionLayerExtraSettings support sharpening."));
m_supportsSharpening = true;
}
}
}
void FViveOpenXRHTCCompositionLayerExtraSettings::PostCreateSession(XrSession InSession)
{
if (!m_bEnableHTCCompositionLayerExtraSettings) return;
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Entry HTCCompositionLayerExtraSettings PostCreateSession."));
m_Session = InSession;
}
const void* FViveOpenXRHTCCompositionLayerExtraSettings::OnBeginSession(XrSession InSession, const void* InNext)
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Entry HTCCompositionLayerExtraSettings OnBeginSession."));
if (!m_bEnableHTCCompositionLayerExtraSettings || !m_supportsSharpening) return InNext;
if (!m_bSharpeningInitialization)
{
m_bSharpeningInitialization = true;
XrCompositionLayerSharpeningSettingHTC* newCompositionLayerSharpeningSettingHTC = new XrCompositionLayerSharpeningSettingHTC;
newCompositionLayerSharpeningSettingHTC->type = XR_TYPE_COMPOSITION_LAYER_SHARPENING_SETTING_HTC;
newCompositionLayerSharpeningSettingHTC->next = nullptr;
newCompositionLayerSharpeningSettingHTC->sharpeningLevel = ProjectSettingsSharpeningLevel;
switch (ProjectSettingsSharpeningMode)
{
case ESharpeningMode::FAST:
newCompositionLayerSharpeningSettingHTC->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_FAST_HTC;
break;
case ESharpeningMode::NORMAL:
newCompositionLayerSharpeningSettingHTC->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_NORMAL_HTC;
break;
case ESharpeningMode::QUALITY:
newCompositionLayerSharpeningSettingHTC->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_QUALITY_HTC;
break;
case ESharpeningMode::AUTOMATIC:
newCompositionLayerSharpeningSettingHTC->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_AUTOMATIC_HTC;
break;
}
XrCompositionLayerSharpeningSettingHTCPtr = newCompositionLayerSharpeningSettingHTC;
}
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("HTCCompositionLayerExtraSettings OnBeginSession End"));
return InNext;
}
const void* FViveOpenXRHTCCompositionLayerExtraSettings::OnEndProjectionLayer(XrSession InSession, int32 InLayerIndex, const void* InNext, XrCompositionLayerFlags& OutFlags)
{
if (!m_bEnableHTCCompositionLayerExtraSettings || !XrCompositionLayerSharpeningSettingHTCPtr) return InNext;
XrCompositionLayerSharpeningSettingHTCPtr->next = InNext;
return reinterpret_cast<const void*>(XrCompositionLayerSharpeningSettingHTCPtr);
}
void FViveOpenXRHTCCompositionLayerExtraSettings::OnDestroySession(XrSession InSession)
{
if (!m_bEnableHTCCompositionLayerExtraSettings) return;
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Entry HTCCompositionLayerExtraSettings OnDestroySession."));
delete XrCompositionLayerSharpeningSettingHTCPtr;
XrCompositionLayerSharpeningSettingHTCPtr = nullptr;
m_supportsSharpening = false;
m_XrInstance = XR_NULL_HANDLE;
m_Session = XR_NULL_HANDLE;
m_XrSystemId = XR_NULL_SYSTEM_ID;
}
ESharpeningMode FViveOpenXRHTCCompositionLayerExtraSettings::GetProjectSettingsSharpeningMode()
{
return ProjectSettingsSharpeningMode;
}
float FViveOpenXRHTCCompositionLayerExtraSettings::GetProjectSettingsSharpeningLevel()
{
return ProjectSettingsSharpeningLevel;
}
bool FViveOpenXRHTCCompositionLayerExtraSettings::CompositionLayerSetSharpeningMode(ESharpeningMode Mode)
{
if (!m_bEnableHTCCompositionLayerExtraSettings) return false;
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("HTCCompositionLayerExtraSettings CompositionLayerSetSharpeningMode."));
if (XrCompositionLayerSharpeningSettingHTCPtr)
{
switch (Mode)
{
case ESharpeningMode::FAST:
XrCompositionLayerSharpeningSettingHTCPtr->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_FAST_HTC;
break;
case ESharpeningMode::NORMAL:
XrCompositionLayerSharpeningSettingHTCPtr->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_NORMAL_HTC;
break;
case ESharpeningMode::QUALITY:
XrCompositionLayerSharpeningSettingHTCPtr->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_QUALITY_HTC;
break;
case ESharpeningMode::AUTOMATIC:
XrCompositionLayerSharpeningSettingHTCPtr->mode = XrSharpeningModeHTC::XR_SHARPENING_MODE_AUTOMATIC_HTC;
break;
}
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Set XrCompositionLayerSharpeningSettingHTC Sharpening Mode"));
return true;
}
else
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Warning, TEXT("XrCompositionLayerSharpeningSettingHTC is null pointer"));
return false;
}
}
bool FViveOpenXRHTCCompositionLayerExtraSettings::CompositionLayerSetSharpeningLevel(float Level)
{
if (!m_bEnableHTCCompositionLayerExtraSettings) return false;
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("HTCCompositionLayerExtraSettings CompositionLayerSetSharpeningLevel."));
if (XrCompositionLayerSharpeningSettingHTCPtr)
{
XrCompositionLayerSharpeningSettingHTCPtr->sharpeningLevel = Level;
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Log, TEXT("Set XrCompositionLayerSharpeningSettingHTC Sharpening Level %f"), Level);
return true;
}
else
{
UE_LOG(LogViveOpenXRHTCCompositionLayerExtraSettings, Warning, TEXT("XrCompositionLayerSharpeningSettingHTC is null pointer"));
return false;
}
}
IMPLEMENT_MODULE(FViveOpenXRHTCCompositionLayerExtraSettings, ViveOpenXRHTCCompositionLayerExtraSettings)