Skyscraper 2.0
XrSceneUnderstanding.h
Go to the documentation of this file.
1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4#pragma once
5
6#include "XrStruct.h"
7#include "XrHandle.h"
8#include "XrMath.h"
9
10namespace xr {
11 class SceneObserverHandle : public xr::UniqueXrHandle<XrSceneObserverMSFT> {};
12 class SceneHandle : public xr::UniqueXrHandle<XrSceneMSFT> {};
13
14 inline std::vector<XrSceneComputeFeatureMSFT> EnumerateSceneComputeFeatures(XrInstance instance, XrSystemId systemId) {
15 uint32_t count = 0;
16 CHECK_XRCMD(xrEnumerateSceneComputeFeaturesMSFT(instance, systemId, 0, &count, nullptr));
17
18 std::vector<XrSceneComputeFeatureMSFT> features(count);
19 CHECK_XRCMD(xrEnumerateSceneComputeFeaturesMSFT(instance, systemId, count, &count, features.data()));
20 features.resize(count);
21 return features;
22 }
23
24 inline xr::SceneObserverHandle CreateSceneObserver(XrSession session) {
25 xr::SceneObserverHandle sceneObserverHandle;
26 XrSceneObserverCreateInfoMSFT createInfo{XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT};
27 CHECK_XRCMD(xrCreateSceneObserverMSFT(session, &createInfo, sceneObserverHandle.Put(xrDestroySceneObserverMSFT)));
28 return sceneObserverHandle;
29 }
30
31 inline xr::SceneHandle CreateScene(XrSceneObserverMSFT sceneObserver) {
32 xr::SceneHandle sceneHandle;
33 XrSceneCreateInfoMSFT createInfo{XR_TYPE_SCENE_CREATE_INFO_MSFT};
34 CHECK_XRCMD(xrCreateSceneMSFT(sceneObserver, &createInfo, sceneHandle.Put(xrDestroySceneMSFT)));
35 return sceneHandle;
36 }
37
38 struct SceneBounds {
39 XrSpace space;
40 XrTime time;
41 std::vector<XrSceneSphereBoundMSFT> sphereBounds;
42 std::vector<XrSceneFrustumBoundMSFT> frustumBounds;
43 std::vector<XrSceneOrientedBoxBoundMSFT> boxBounds;
44 };
45
46 // Begins computing a new scene asynchronously.
47 // - visualMeshLevelOfDetail only applies to visual meshes
48 inline void ComputeNewScene(XrSceneObserverMSFT sceneObserver,
49 const std::vector<XrSceneComputeFeatureMSFT>& requestedFeatures,
50 const SceneBounds& bounds,
51 XrSceneComputeConsistencyMSFT consistency = XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_COMPLETE_MSFT,
52 std::optional<XrMeshComputeLodMSFT> visualMeshLevelOfDetail = {}) {
53 XrNewSceneComputeInfoMSFT computeInfo{XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT};
54 computeInfo.requestedFeatureCount = static_cast<uint32_t>(requestedFeatures.size());
55 computeInfo.requestedFeatures = requestedFeatures.data();
56 computeInfo.bounds.space = bounds.space;
57 computeInfo.bounds.time = bounds.time;
58 computeInfo.bounds.boxCount = static_cast<uint32_t>(bounds.boxBounds.size());
59 computeInfo.bounds.boxes = bounds.boxBounds.data();
60 computeInfo.bounds.frustumCount = static_cast<uint32_t>(bounds.frustumBounds.size());
61 computeInfo.bounds.frustums = bounds.frustumBounds.data();
62 computeInfo.bounds.sphereCount = static_cast<uint32_t>(bounds.sphereBounds.size());
63 computeInfo.bounds.spheres = bounds.sphereBounds.data();
64 computeInfo.consistency = consistency;
65
66 XrVisualMeshComputeLodInfoMSFT computeLod{XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT};
67 if (visualMeshLevelOfDetail.has_value()) {
68 computeLod.lod = visualMeshLevelOfDetail.value();
69 xr::InsertExtensionStruct(computeInfo, computeLod);
70 }
71 CHECK_XRCMD(xrComputeNewSceneMSFT(sceneObserver, &computeInfo));
72 }
73
74 // Reads mesh vertices and 32-bit indices.
75 inline void
76 ReadMeshBuffers(XrSceneMSFT scene, uint64_t meshBufferId, std::vector<XrVector3f>& vertexBuffer, std::vector<uint32_t>& indexBuffer) {
77 XrSceneMeshBuffersGetInfoMSFT meshGetInfo{XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT};
78 meshGetInfo.meshBufferId = meshBufferId;
79
80 XrSceneMeshBuffersMSFT meshBuffers{XR_TYPE_SCENE_MESH_BUFFERS_MSFT};
81 XrSceneMeshVertexBufferMSFT vertices{XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT};
82 XrSceneMeshIndicesUint32MSFT indices{XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT};
83 xr::InsertExtensionStruct(meshBuffers, vertices);
84 xr::InsertExtensionStruct(meshBuffers, indices);
85 CHECK_XRCMD(xrGetSceneMeshBuffersMSFT(scene, &meshGetInfo, &meshBuffers));
86
87 vertexBuffer.resize(vertices.vertexCountOutput);
88 indexBuffer.resize(indices.indexCountOutput);
89 vertices.vertexCapacityInput = vertices.vertexCountOutput;
90 indices.indexCapacityInput = indices.indexCountOutput;
91 vertices.vertices = vertexBuffer.data();
92 indices.indices = indexBuffer.data();
93 CHECK_XRCMD(xrGetSceneMeshBuffersMSFT(scene, &meshGetInfo, &meshBuffers));
94 vertexBuffer.resize(vertices.vertexCountOutput);
95 indexBuffer.resize(indices.indexCountOutput);
96 }
97
98 // Reads mesh vertices and 16-bit indices.
99 inline void
100 ReadMeshBuffers(XrSceneMSFT scene, uint64_t meshBufferId, std::vector<XrVector3f>& vertexBuffer, std::vector<uint16_t>& indexBuffer) {
101 XrSceneMeshBuffersGetInfoMSFT meshGetInfo{XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT};
102 meshGetInfo.meshBufferId = meshBufferId;
103
104 XrSceneMeshBuffersMSFT meshBuffers{XR_TYPE_SCENE_MESH_BUFFERS_MSFT};
105 XrSceneMeshVertexBufferMSFT vertices{XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT};
106 XrSceneMeshIndicesUint16MSFT indices{XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT};
107 xr::InsertExtensionStruct(meshBuffers, vertices);
108 xr::InsertExtensionStruct(meshBuffers, indices);
109 CHECK_XRCMD(xrGetSceneMeshBuffersMSFT(scene, &meshGetInfo, &meshBuffers));
110
111 vertexBuffer.resize(vertices.vertexCountOutput);
112 indexBuffer.resize(indices.indexCountOutput);
113 vertices.vertexCapacityInput = vertices.vertexCountOutput;
114 indices.indexCapacityInput = indices.indexCountOutput;
115 vertices.vertices = vertexBuffer.data();
116 indices.indices = indexBuffer.data();
117 CHECK_XRCMD(xrGetSceneMeshBuffersMSFT(scene, &meshGetInfo, &meshBuffers));
118 vertexBuffer.resize(vertices.vertexCountOutput);
119 indexBuffer.resize(indices.indexCountOutput);
120 }
121} // namespace xr
#define CHECK_XRCMD(cmd)
Definition XrError.h:14
HandleType * Put(PFN_DestroyFunction destroyFunction) noexcept
Definition XrHandle.h:56
The xr::DispatchTable struct contains all available PFN pointers to xr functions including those in a...
std::vector< XrSceneComputeFeatureMSFT > EnumerateSceneComputeFeatures(XrInstance instance, XrSystemId systemId)
void InsertExtensionStruct(XrStruct &xrStruct, XrExtension &xrExtension)
Definition XrStruct.h:43
xr::SceneObserverHandle CreateSceneObserver(XrSession session)
void ReadMeshBuffers(XrSceneMSFT scene, uint64_t meshBufferId, std::vector< XrVector3f > &vertexBuffer, std::vector< uint32_t > &indexBuffer)
void ComputeNewScene(XrSceneObserverMSFT sceneObserver, const std::vector< XrSceneComputeFeatureMSFT > &requestedFeatures, const SceneBounds &bounds, XrSceneComputeConsistencyMSFT consistency=XR_SCENE_COMPUTE_CONSISTENCY_SNAPSHOT_COMPLETE_MSFT, std::optional< XrMeshComputeLodMSFT > visualMeshLevelOfDetail={})
xr::SceneHandle CreateScene(XrSceneObserverMSFT sceneObserver)
std::vector< XrSceneOrientedBoxBoundMSFT > boxBounds
std::vector< XrSceneFrustumBoundMSFT > frustumBounds
std::vector< XrSceneSphereBoundMSFT > sphereBounds