54 inline std::vector<SceneObject>
GetSceneObjects(XrSceneMSFT scene,
const std::vector<SceneObject::Type>& filterObjectType = {}) {
55 XrSceneComponentsGetInfoMSFT getInfo{XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT};
56 getInfo.componentType = XR_SCENE_COMPONENT_TYPE_OBJECT_MSFT;
58 XrSceneObjectTypesFilterInfoMSFT typesFilter{XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT};
59 if (!filterObjectType.empty()) {
60 typesFilter.objectTypeCount =
static_cast<uint32_t
>(filterObjectType.size());
61 typesFilter.objectTypes = filterObjectType.data();
65 XrSceneComponentsMSFT sceneComponents{XR_TYPE_SCENE_COMPONENTS_MSFT};
66 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
67 const uint32_t count = sceneComponents.componentCountOutput;
69 std::vector<XrSceneComponentMSFT> components(count);
70 sceneComponents.componentCapacityInput = count;
71 sceneComponents.components = components.data();
73 std::vector<XrSceneObjectMSFT> objects(count);
74 XrSceneObjectsMSFT sceneObjects{XR_TYPE_SCENE_OBJECTS_MSFT};
75 sceneObjects.sceneObjectCount = count;
76 sceneObjects.sceneObjects = objects.data();
79 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
81 std::vector<SceneObject> result(count);
82 for (uint32_t k = 0; k < count; k++) {
83 result[k].id = components[k].id;
84 result[k].updateTime = components[k].updateTime;
85 result[k].type = objects[k].objectType;
96 std::optional<SceneObject::Id> parentId = {},
97 const std::vector<SceneObject::Type>& filterObjectType = {},
98 const std::vector<ScenePlane::Alignment>& filterAlignment = {}) {
99 XrSceneComponentsGetInfoMSFT getInfo{XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT};
100 getInfo.componentType = XR_SCENE_COMPONENT_TYPE_PLANE_MSFT;
102 XrSceneComponentParentFilterInfoMSFT parentFilter{XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT};
103 if (parentId.has_value()) {
104 parentFilter.parentId =
static_cast<XrUuidMSFT
>(parentId.value());
108 XrSceneObjectTypesFilterInfoMSFT typesFilter{XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT};
109 if (!filterObjectType.empty()) {
110 typesFilter.objectTypeCount =
static_cast<uint32_t
>(filterObjectType.size());
111 typesFilter.objectTypes = filterObjectType.data();
115 XrScenePlaneAlignmentFilterInfoMSFT alignmentFilter{XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT};
116 if (!filterAlignment.empty()) {
117 alignmentFilter.alignmentCount =
static_cast<uint32_t
>(filterAlignment.size());
118 alignmentFilter.alignments = filterAlignment.data();
122 XrSceneComponentsMSFT sceneComponents{XR_TYPE_SCENE_COMPONENTS_MSFT};
123 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
124 const uint32_t count = sceneComponents.componentCountOutput;
126 std::vector<XrSceneComponentMSFT> components(count);
127 sceneComponents.componentCapacityInput = count;
128 sceneComponents.components = components.data();
130 std::vector<XrScenePlaneMSFT> planes(count);
131 XrScenePlanesMSFT scenePlanes{XR_TYPE_SCENE_PLANES_MSFT};
132 scenePlanes.scenePlaneCount = count;
133 scenePlanes.scenePlanes = planes.data();
136 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
138 std::vector<ScenePlane> result(count);
139 for (uint32_t k = 0; k < count; k++) {
140 result[k].id = components[k].id;
141 result[k].parentId = components[k].parentId;
142 result[k].updateTime = components[k].updateTime;
143 result[k].alignment = planes[k].alignment;
144 result[k].size = planes[k].size;
145 result[k].meshBufferId = planes[k].meshBufferId;
146 result[k].supportsIndicesUint16 = planes[k].supportsIndicesUint16;
155 std::optional<SceneObject::Id> parentId = {},
156 const std::vector<SceneObject::Type>& filterObjectType = {}) {
157 XrSceneComponentsGetInfoMSFT getInfo{XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT};
158 getInfo.componentType = XR_SCENE_COMPONENT_TYPE_VISUAL_MESH_MSFT;
160 XrSceneComponentParentFilterInfoMSFT parentFilter{XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT};
161 if (parentId.has_value()) {
162 parentFilter.parentId =
static_cast<XrUuidMSFT
>(parentId.value());
166 XrSceneObjectTypesFilterInfoMSFT typesFilter{XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT};
167 if (!filterObjectType.empty()) {
168 typesFilter.objectTypeCount =
static_cast<uint32_t
>(filterObjectType.size());
169 typesFilter.objectTypes = filterObjectType.data();
173 XrSceneComponentsMSFT sceneComponents{XR_TYPE_SCENE_COMPONENTS_MSFT};
174 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
175 const uint32_t count = sceneComponents.componentCountOutput;
177 std::vector<XrSceneComponentMSFT> components(count);
178 sceneComponents.componentCapacityInput = count;
179 sceneComponents.components = components.data();
181 std::vector<XrSceneMeshMSFT> meshes(count);
182 XrSceneMeshesMSFT sceneMeshes{XR_TYPE_SCENE_MESHES_MSFT};
183 sceneMeshes.sceneMeshCount = count;
184 sceneMeshes.sceneMeshes = meshes.data();
187 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
189 std::vector<SceneMesh> result(count);
190 for (uint32_t k = 0; k < count; k++) {
191 result[k].id = components[k].id;
192 result[k].parentId = components[k].parentId;
193 result[k].updateTime = components[k].updateTime;
194 result[k].meshBufferId = meshes[k].meshBufferId;
195 result[k].supportsIndicesUint16 = meshes[k].supportsIndicesUint16;
201 std::optional<SceneObject::Id> parentId = {},
202 const std::vector<SceneObject::Type>& filterObjectType = {}) {
203 XrSceneComponentsGetInfoMSFT getInfo{XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT};
204 getInfo.componentType = XR_SCENE_COMPONENT_TYPE_COLLIDER_MESH_MSFT;
206 XrSceneComponentParentFilterInfoMSFT parentFilter{XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT};
207 if (parentId.has_value()) {
208 parentFilter.parentId =
static_cast<XrUuidMSFT
>(parentId.value());
212 XrSceneObjectTypesFilterInfoMSFT typesFilter{XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT};
213 if (!filterObjectType.empty()) {
214 typesFilter.objectTypeCount =
static_cast<uint32_t
>(filterObjectType.size());
215 typesFilter.objectTypes = filterObjectType.data();
219 XrSceneComponentsMSFT sceneComponents{XR_TYPE_SCENE_COMPONENTS_MSFT};
220 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
221 const uint32_t count = sceneComponents.componentCountOutput;
223 std::vector<XrSceneComponentMSFT> components(count);
224 sceneComponents.componentCapacityInput = count;
225 sceneComponents.components = components.data();
227 std::vector<XrSceneMeshMSFT> meshes(count);
228 XrSceneMeshesMSFT sceneMeshes{XR_TYPE_SCENE_MESHES_MSFT};
229 sceneMeshes.sceneMeshCount = count;
230 sceneMeshes.sceneMeshes = meshes.data();
233 CHECK_XRCMD(xrGetSceneComponentsMSFT(scene, &getInfo, &sceneComponents));
235 std::vector<SceneColliderMesh> result(count);
236 for (uint32_t k = 0; k < count; k++) {
237 result[k].id = components[k].id;
238 result[k].parentId = components[k].parentId;
239 result[k].updateTime = components[k].updateTime;
240 result[k].meshBufferId = meshes[k].meshBufferId;
241 result[k].supportsIndicesUint16 = meshes[k].supportsIndicesUint16;
251 const std::vector<TUuid>& componentIds,
252 std::vector<XrSceneComponentLocationMSFT>& locations) {
253 XrSceneComponentsLocateInfoMSFT locateInfo{XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT};
254 locateInfo.baseSpace = baseSpace;
255 locateInfo.time = time;
256 locateInfo.componentIdCount =
static_cast<uint32_t
>(componentIds.size());
257 static_assert(
sizeof(TUuid) ==
sizeof(XrUuidMSFT));
258 locateInfo.componentIds =
static_cast<const XrUuidMSFT*
>(componentIds.data());
260 locations.resize(componentIds.size());
261 XrSceneComponentLocationsMSFT componentLocations{XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT};
262 componentLocations.locationCount =
static_cast<uint32_t
>(locations.size());
263 componentLocations.locations = locations.data();
265 CHECK_XRCMD(xrLocateSceneComponentsMSFT(scene, &locateInfo, &componentLocations));