Giant_Beast_2025/Plugins/MetaXR/Source/OculusXRScene/Private/OculusXRSceneEventHandling.cpp

84 lines
2.7 KiB
C++

// Copyright (c) Meta Platforms, Inc. and affiliates.
#include "OculusXRSceneEventHandling.h"
#include "OculusXRHMD.h"
#include "IOculusXRSceneModule.h"
#include "OculusXRAnchorBPFunctionLibrary.h"
#include "OculusXRSceneDelegates.h"
#include "OculusXRSceneEventDelegates.h"
#include "OculusXRSceneModule.h"
namespace OculusXRScene
{
template <typename T>
void GetEventData(ovrpEventDataBuffer& Buffer, T& OutEventData)
{
unsigned char* BufData = Buffer.EventData;
BufData -= sizeof(Buffer.EventType); // Offset buffer data to get to the actual event payload
memcpy(&OutEventData, BufData, sizeof(T));
}
void FOculusXRSceneEventHandling::OnPollEvent(ovrpEventDataBuffer* EventDataBuffer, bool& EventPollResult)
{
ovrpEventDataBuffer& buf = *EventDataBuffer;
EventPollResult = true;
switch (buf.EventType)
{
case ovrpEventType_SceneCaptureComplete:
{
ovrpEventSceneCaptureComplete sceneCaptureComplete;
unsigned char* bufData = buf.EventData;
memcpy(&sceneCaptureComplete.requestId, bufData, sizeof(sceneCaptureComplete.requestId));
bufData += sizeof(ovrpUInt64); // move forward
memcpy(&sceneCaptureComplete.result, bufData, sizeof(sceneCaptureComplete.result));
FOculusXRSceneEventDelegates::OculusSceneCaptureComplete.Broadcast(FOculusXRUInt64(sceneCaptureComplete.requestId), sceneCaptureComplete.result >= 0);
break;
}
case ovrpEventType_BoundaryVisibilityChanged:
{
ovrpEventDataBoundaryVisibilityChanged visibilityChangedEvent;
GetEventData(buf, visibilityChangedEvent);
ovrpBoundaryVisibility newVisibility = visibilityChangedEvent.BoundaryVisibility;
EOculusXRBoundaryVisibility ueVisibility = EOculusXRBoundaryVisibility::Invalid;
switch (newVisibility)
{
case ovrpBoundaryVisibility_Suppressed:
ueVisibility = EOculusXRBoundaryVisibility::Suppressed;
break;
case ovrpBoundaryVisibility_NotSuppressed:
ueVisibility = EOculusXRBoundaryVisibility::NotSuppressed;
break;
default:
UE_LOG(LogOculusXRScene, Error, TEXT("Unknown ovrp boundary type in BoundaryVisibilityChanged event! Enum value(%d)"), newVisibility);
}
UE_LOG(LogOculusXRScene, Log, TEXT("FOculusXRSceneEventHandling - Boundary visibility changed. Visibility(%s)"), *UEnum::GetValueAsString(ueVisibility));
FOculusXRSceneEventDelegates::OculusBoundaryVisibilityChanged.Broadcast(ueVisibility);
UOculusXRSceneEventDelegates* eventDelegates = GEngine->GetEngineSubsystem<UOculusXRSceneEventDelegates>();
if (eventDelegates != nullptr)
{
eventDelegates->OnBoundaryVisibilityChanged.Broadcast(ueVisibility);
}
break;
}
case ovrpEventType_None:
default:
{
EventPollResult = false;
break;
}
}
}
} // namespace OculusXRScene