96 lines
2.5 KiB
C++
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
|