79 lines
2.3 KiB
C++
79 lines
2.3 KiB
C++
// Copyright (c) Meta Platforms, Inc. and affiliates.
|
|
|
|
#include "OculusXRGuardianExtensionPlugin.h"
|
|
#include "Engine/GameEngine.h"
|
|
#include "IXRTrackingSystem.h"
|
|
#include "OculusXROpenXRUtilities.h"
|
|
#include "OpenXRCore.h"
|
|
|
|
DEFINE_LOG_CATEGORY(LogOculusXRGuardian);
|
|
|
|
namespace OculusXR
|
|
{
|
|
void FGuardianExtensionPlugin::PostCreateSession(XrSession InSession)
|
|
{
|
|
Session = InSession;
|
|
}
|
|
|
|
bool FGuardianExtensionPlugin::IsGuardianConfigured()
|
|
{
|
|
XrExtent2Df Extent;
|
|
const XrResult Result = xrGetReferenceSpaceBoundsRect(Session, XR_REFERENCE_SPACE_TYPE_STAGE, &Extent);
|
|
return (XR_SUCCEEDED(Result) && (Result != XR_SPACE_BOUNDS_UNAVAILABLE));
|
|
}
|
|
|
|
bool FGuardianExtensionPlugin::GetGuardianPoints(TArray<FVector>& BoundaryPoints)
|
|
{
|
|
XrExtent2Df Extent;
|
|
XrResult Result = xrGetReferenceSpaceBoundsRect(Session, XR_REFERENCE_SPACE_TYPE_STAGE, &Extent);
|
|
if (!XR_SUCCEEDED(Result) || Result == XR_SPACE_BOUNDS_UNAVAILABLE)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
IXRTrackingSystem* TrackingSystem = GetOpenXRTrackingSystem();
|
|
if (TrackingSystem == nullptr)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
FTransform OriginTransform;
|
|
if (!TrackingSystem->GetTrackingOriginTransform(EHMDTrackingOrigin::Stage, OriginTransform))
|
|
{
|
|
return false;
|
|
}
|
|
|
|
const float WorldToMetersScale = TrackingSystem->GetWorldToMetersScale();
|
|
|
|
const XrVector3f XrPoints[] = {
|
|
{ -Extent.width * 0.5f, 0.0f, -Extent.height * 0.5 },
|
|
{ -Extent.width * 0.5f, 0.0f, Extent.height * 0.5f },
|
|
{ Extent.width * 0.5f, 0.0f, Extent.height * 0.5f },
|
|
{ Extent.width * 0.5f, 0.0f, -Extent.height * 0.5f }
|
|
};
|
|
|
|
BoundaryPoints.Reset(UE_ARRAY_COUNT(XrPoints));
|
|
for (int Index = 0; Index < UE_ARRAY_COUNT(XrPoints); ++Index)
|
|
{
|
|
BoundaryPoints.Emplace(OriginTransform.TransformPosition(ToFVector(XrPoints[Index], WorldToMetersScale)));
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
FVector FGuardianExtensionPlugin::GetGuardianDimensions()
|
|
{
|
|
XrExtent2Df Extent;
|
|
FVector Dimensions;
|
|
XrResult Result = xrGetReferenceSpaceBoundsRect(Session, XR_REFERENCE_SPACE_TYPE_STAGE, &Extent);
|
|
if (XR_SUCCEEDED(Result) && Result == XR_SPACE_BOUNDS_UNAVAILABLE)
|
|
{
|
|
// Set height to 10.0f which matches expected OVRPlugin Version
|
|
const float BoundsHeight = 10.0f;
|
|
Dimensions = FVector(Extent.width, BoundsHeight, Extent.height);
|
|
}
|
|
return Dimensions;
|
|
}
|
|
|
|
} // namespace OculusXR
|