16 CHECK_XRCMD(xrEnumerateSceneComputeFeaturesMSFT(instance, systemId, 0, &count,
nullptr));
18 std::vector<XrSceneComputeFeatureMSFT> features(count);
19 CHECK_XRCMD(xrEnumerateSceneComputeFeaturesMSFT(instance, systemId, count, &count, features.data()));
20 features.resize(count);
49 const std::vector<XrSceneComputeFeatureMSFT>& requestedFeatures,
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());
62 computeInfo.bounds.sphereCount =
static_cast<uint32_t
>(bounds.
sphereBounds.size());
64 computeInfo.consistency = consistency;
66 XrVisualMeshComputeLodInfoMSFT computeLod{XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT};
67 if (visualMeshLevelOfDetail.has_value()) {
68 computeLod.lod = visualMeshLevelOfDetail.value();
71 CHECK_XRCMD(xrComputeNewSceneMSFT(sceneObserver, &computeInfo));
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;
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};
85 CHECK_XRCMD(xrGetSceneMeshBuffersMSFT(scene, &meshGetInfo, &meshBuffers));
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);
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;
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};
109 CHECK_XRCMD(xrGetSceneMeshBuffersMSFT(scene, &meshGetInfo, &meshBuffers));
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);
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={})