VR2024_WizardVR/TheProject/VRWizardProject/Plugins/MetaXR/Source/OculusXRHMD/Private/OculusXRHMDPrivate.cpp

96 lines
2.5 KiB
C++

// @lint-ignore-every LICENSELINT
// Copyright Epic Games, Inc. All Rights Reserved.
#include "OculusXRHMDPrivate.h"
#include "RHICommandList.h"
#include "RenderingThread.h"
namespace OculusXRHMD
{
//-------------------------------------------------------------------------------------------------
// Utility functions
//-------------------------------------------------------------------------------------------------
// TODO: Change in case of parallel game threads
bool InGameThread()
{
if (GIsGameThreadIdInitialized)
{
return FPlatformTLS::GetCurrentThreadId() == GGameThreadId;
}
else
{
return true;
}
}
bool InRenderThread()
{
if (GIsThreadedRendering && !GIsRenderingThreadSuspended.Load(EMemoryOrder::Relaxed))
{
return IsInParallelRenderingThread();
}
else
{
return InGameThread();
}
}
// TODO: Change in case of parallel RHI threads
bool InRHIThread()
{
if (GIsThreadedRendering && !GIsRenderingThreadSuspended.Load(EMemoryOrder::Relaxed))
{
if (IsRHIThreadRunning())
{
if (IsInRHIThread())
{
return true;
}
if (IsInParallelRenderingThread())
{
return GetImmediateCommandList_ForRenderCommand().Bypass();
}
return false;
}
else
{
return IsInParallelRenderingThread();
}
}
else
{
return InGameThread();
}
}
bool ConvertPose_Internal(const FPose& InPose, FPose& OutPose, const FQuat BaseOrientation, const FVector BaseOffset, float WorldToMetersScale)
{
// apply base orientation correction
OutPose.Orientation = BaseOrientation.Inverse() * InPose.Orientation;
OutPose.Orientation.Normalize();
// correct position according to BaseOrientation and BaseOffset.
OutPose.Position = (InPose.Position - BaseOffset) * WorldToMetersScale;
OutPose.Position = BaseOrientation.Inverse().RotateVector(OutPose.Position);
return true;
}
bool ConvertPose_Internal(const ovrpPosef& InPose, FPose& OutPose, const FQuat BaseOrientation, const FVector BaseOffset, float WorldToMetersScale)
{
return ConvertPose_Internal(FPose(ToFQuat(InPose.Orientation), ToFVector(InPose.Position)), OutPose, BaseOrientation, BaseOffset, WorldToMetersScale);
}
bool ConvertPose_Internal(const FPose& InPose, ovrpPosef& OutPose, const FQuat BaseOrientation, const FVector BaseOffset, float WorldToMetersScale)
{
OutPose.Orientation = ToOvrpQuatf(BaseOrientation * InPose.Orientation);
OutPose.Position = ToOvrpVector3f(BaseOrientation.RotateVector(InPose.Position) / WorldToMetersScale + BaseOffset);
return true;
}
} // namespace OculusXRHMD