VRTowerDef/Plugins/MetaXR/Source/OculusXRAnchors/Private/OculusXRRoomLayoutManager.cpp

149 lines
4.9 KiB
C++

// Copyright (c) Meta Platforms, Inc. and affiliates.
#include "OculusXRRoomLayoutManager.h"
#include "OculusXRHMD.h"
#include "OculusXRAnchorDelegates.h"
#include "OculusXRAnchorsModule.h"
namespace OculusXRAnchors
{
void FOculusXRRoomLayoutManager::OnPollEvent(ovrpEventDataBuffer* EventDataBuffer, bool& EventPollResult)
{
ovrpEventDataBuffer& buf = *EventDataBuffer;
switch (buf.EventType)
{
case ovrpEventType_None:
break;
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));
FOculusXRAnchorEventDelegates::OculusSceneCaptureComplete.Broadcast(FOculusXRUInt64(sceneCaptureComplete.requestId), sceneCaptureComplete.result >= 0);
break;
}
default:
{
EventPollResult = false;
break;
}
}
EventPollResult = true;
}
/**
* @brief Requests the launch of Capture Flow
* @param OutRequestID The requestId returned by the system
* @return returns true if sucessfull
*/
bool FOculusXRRoomLayoutManager::RequestSceneCapture(uint64& OutRequestID)
{
OutRequestID = 0;
ovrpSceneCaptureRequest sceneCaptureRequest;
sceneCaptureRequest.request = nullptr;
sceneCaptureRequest.requestByteCount = 0;
const ovrpResult Result = FOculusXRHMDModule::GetPluginWrapper().RequestSceneCapture(&sceneCaptureRequest, &OutRequestID);
if (OVRP_FAILURE(Result))
{
return false;
}
return true;
}
/**
* @brief Gets the room layout for a specific space
* @param Space The space to get the room layout for
* @param MaxWallsCapacity Maximum number of walls to query
* @param OutCeilingUuid The ceiling entity's uuid
* @param OutFloorUuid The floor entity's uuid
* @param OutWallsUuid Array of uuids belonging to the walls in the room layout
* @return returns true if successful
*/
bool FOculusXRRoomLayoutManager::GetSpaceRoomLayout(const uint64 Space, const uint32 MaxWallsCapacity,
FOculusXRUUID& OutCeilingUuid, FOculusXRUUID& OutFloorUuid, TArray<FOculusXRUUID>& OutWallsUuid)
{
ovrpRoomLayout roomLayout;
roomLayout.wallUuidCapacityInput = 0;
roomLayout.wallUuidCountOutput = 0;
// First call to get output size
const ovrpResult firstCallResult = FOculusXRHMDModule::GetPluginWrapper().GetSpaceRoomLayout(&Space, &roomLayout);
if (OVRP_FAILURE(firstCallResult))
{
return false;
}
// Set the input size and pointer to the uuid array
TArray<ovrpUuid> uuids;
uuids.InsertZeroed(0, roomLayout.wallUuidCountOutput);
roomLayout.wallUuidCapacityInput = roomLayout.wallUuidCountOutput;
roomLayout.wallUuids = uuids.GetData();
const ovrpResult secondCallResult = FOculusXRHMDModule::GetPluginWrapper().GetSpaceRoomLayout(&Space, &roomLayout);
if (OVRP_FAILURE(secondCallResult))
{
return false;
}
OutCeilingUuid = FOculusXRUUID(roomLayout.ceilingUuid.data);
OutFloorUuid = FOculusXRUUID(roomLayout.floorUuid.data);
OutWallsUuid.Empty();
OutWallsUuid.InsertZeroed(0, uuids.Num());
for (int32 i = 0; i < uuids.Num(); ++i)
{
OutWallsUuid[i] = FOculusXRUUID(roomLayout.wallUuids[i].data);
}
return true;
}
bool FOculusXRRoomLayoutManager::GetSpaceTriangleMesh(uint64 Space, TArray<FVector>& Vertices, TArray<int32>& Triangles)
{
ovrpTriangleMesh OVRPMesh = { 0, 0, nullptr, 0, 0, nullptr };
ovrpResult CountResult = FOculusXRHMDModule::GetPluginWrapper().GetSpaceTriangleMesh(&Space, &OVRPMesh);
if (OVRP_FAILURE(CountResult))
{
UE_LOG(LogOculusXRAnchors, Warning, TEXT("Failed to load TriangleMesh info - Space: %llu - Result: %d"), Space, CountResult);
return false;
}
OVRPMesh.indexCapacityInput = OVRPMesh.indexCountOutput;
OVRPMesh.vertexCapacityInput = OVRPMesh.vertexCountOutput;
TArray<ovrpVector3f> OVRPVertices;
OVRPVertices.SetNum(OVRPMesh.vertexCapacityInput);
OVRPMesh.vertices = OVRPVertices.GetData();
Triangles.SetNum(OVRPMesh.indexCapacityInput);
check(sizeof(TRemoveReference<decltype(Triangles)>::Type::ElementType) == sizeof(TRemovePointer<decltype(OVRPMesh.indices)>::Type));
OVRPMesh.indices = Triangles.GetData();
const ovrpResult MeshResult = FOculusXRHMDModule::GetPluginWrapper().GetSpaceTriangleMesh(&Space, &OVRPMesh);
if (OVRP_FAILURE(MeshResult))
{
UE_LOG(LogOculusXRAnchors, Warning, TEXT("Failed to load TriangleMesh data - Space: %llu - Result: %d"), Space, MeshResult);
return false;
}
UE_LOG(LogOculusXRAnchors, Verbose, TEXT("Loaded TriangleMesh data - Space: %llu - Vertices: %d - Faces: %d"),
Space, OVRPMesh.vertexCapacityInput, OVRPMesh.indexCapacityInput);
Vertices.Empty(OVRPVertices.Num());
Algo::Transform(OVRPVertices, Vertices, [](const auto& Vertex) { return OculusXRHMD::ToFVector(Vertex); });
return true;
return false;
}
} // namespace OculusXRAnchors