Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qopenxrspaceextension.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
5#include "qopenxrhelpers_p.h"
7
8#if defined(Q_OS_ANDROID)
9# include <QtCore/private/qandroidextras_p.h>
10#endif
11
13
14//<uses-permission android:name="com.oculus.permission.USE_ANCHOR_API" />
15
16static const uint32_t MAX_PERSISTENT_SPACES = 100;
17
18QOpenXRSpaceExtension::QOpenXRSpaceExtension()
19{
20
21}
22
23QOpenXRSpaceExtension::~QOpenXRSpaceExtension()
24{
25
26}
27
33
34void QOpenXRSpaceExtension::initialize(XrInstance instance, XrSession session)
35{
36#if defined(Q_OS_ANDROID)
37 auto res = QtAndroidPrivate::requestPermission(QLatin1StringView("com.oculus.permission.USE_SCENE"));
38 res.waitForFinished();
39#endif
40
41 m_instance = instance;
42 m_session = session;
43
44 // Get the function pointers
45 checkXrResult(xrGetInstanceProcAddr(m_instance,
46 "xrEnumerateSpaceSupportedComponentsFB",
47 (PFN_xrVoidFunction*)(&xrEnumerateSpaceSupportedComponentsFB)));
48 checkXrResult(xrGetInstanceProcAddr(m_instance,
49 "xrGetSpaceComponentStatusFB",
50 (PFN_xrVoidFunction*)(&xrGetSpaceComponentStatusFB)));
51 checkXrResult(xrGetInstanceProcAddr(m_instance,
52 "xrSetSpaceComponentStatusFB",
53 (PFN_xrVoidFunction*)(&xrSetSpaceComponentStatusFB)));
54 checkXrResult(xrGetInstanceProcAddr(m_instance,
55 "xrGetSpaceUuidFB",
56 (PFN_xrVoidFunction*)(&xrGetSpaceUuidFB)));
57 checkXrResult(xrGetInstanceProcAddr(m_instance,
58 "xrQuerySpacesFB",
59 (PFN_xrVoidFunction*)(&xrQuerySpacesFB)));
60 checkXrResult(xrGetInstanceProcAddr(m_instance,
61 "xrRetrieveSpaceQueryResultsFB",
62 (PFN_xrVoidFunction*)(&xrRetrieveSpaceQueryResultsFB)));
63 checkXrResult(xrGetInstanceProcAddr(m_instance,
64 "xrGetSpaceBoundingBox2DFB",
65 (PFN_xrVoidFunction*)(&xrGetSpaceBoundingBox2DFB)));
66 checkXrResult(xrGetInstanceProcAddr(m_instance,
67 "xrGetSpaceBoundingBox3DFB",
68 (PFN_xrVoidFunction*)(&xrGetSpaceBoundingBox3DFB)));
69 checkXrResult(xrGetInstanceProcAddr(m_instance,
70 "xrGetSpaceSemanticLabelsFB",
71 (PFN_xrVoidFunction*)(&xrGetSpaceSemanticLabelsFB)));
72 checkXrResult(xrGetInstanceProcAddr(m_instance,
73 "xrGetSpaceBoundary2DFB",
74 (PFN_xrVoidFunction*)(&xrGetSpaceBoundary2DFB)));
75 checkXrResult(xrGetInstanceProcAddr(m_instance,
76 "xrGetSpaceRoomLayoutFB",
77 (PFN_xrVoidFunction*)(&xrGetSpaceRoomLayoutFB)));
78 checkXrResult(xrGetInstanceProcAddr(m_instance,
79 "xrGetSpaceContainerFB",
80 (PFN_xrVoidFunction*)(&xrGetSpaceContainerFB)));
81 checkXrResult(xrGetInstanceProcAddr(m_instance,
82 "xrRequestSceneCaptureFB",
83 (PFN_xrVoidFunction*)(&xrRequestSceneCaptureFB)));
84}
85
90
92{
93 return {
94 // XR_EXT_UUID_EXTENSION_NAME, // ### Crashes on Quest 3. Theoretically required for XR_FB_spatial_entity (would work anyway, but is a validation error)
95 XR_FB_SPATIAL_ENTITY_EXTENSION_NAME,
96 XR_FB_SPATIAL_ENTITY_QUERY_EXTENSION_NAME,
97 XR_FB_SPATIAL_ENTITY_STORAGE_EXTENSION_NAME,
98 XR_FB_SPATIAL_ENTITY_CONTAINER_EXTENSION_NAME,
99 XR_FB_SCENE_EXTENSION_NAME,
100#ifdef Q_OS_ANDROID // no scene capture with Simulator as of version 57
101 XR_FB_SCENE_CAPTURE_EXTENSION_NAME
102#endif
103 };
104}
105
106void QOpenXRSpaceExtension::handleEvent(const XrEventDataBaseHeader *event)
107{
108 if (event->type == XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB) {
109 qDebug("QOpenXRSpaceExtension::handleEvent: received XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB");
110 const XrEventDataSpaceSetStatusCompleteFB* setStatusComplete = (const XrEventDataSpaceSetStatusCompleteFB*)(event);
111 if (setStatusComplete->result == XR_SUCCESS) {
112 if (setStatusComplete->componentType == XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB) {
113 addAnchor(setStatusComplete->space, setStatusComplete->uuid);
114 }
115 }
116 } else if (event->type == XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB) {
117 qDebug("QOpenXRSpaceExtension::handleEvent: received XR_TYPE_EVENT_DATA_SCENE_CAPTURE_COMPLETE_FB");
118 const XrEventDataSceneCaptureCompleteFB* captureResult = (const XrEventDataSceneCaptureCompleteFB*)(event);
119 if (captureResult->result == XR_SUCCESS) {
121 qDebug(
122 "QOpenXRSpaceExtension::handleEvent: Scene capture (ID = %llu) succeeded",
123 static_cast<long long unsigned int>(captureResult->requestId));
124 } else {
125 qDebug(
126 "QOpenXRSpaceExtension::handleEvent: Scene capture (ID = %llu) failed with an error %d",
127 static_cast<long long unsigned int>(captureResult->requestId),
128 captureResult->result);
129 }
130
131 } else if (event->type == XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB) {
132 qDebug("QOpenXRSpaceExtension::handleEvent: received XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB");
133 const XrEventDataSpaceQueryResultsAvailableFB* resultsAvailable = (const XrEventDataSpaceQueryResultsAvailableFB*)(event);
134
135 XrSpaceQueryResultsFB queryResults{};
136 queryResults.type = XR_TYPE_SPACE_QUERY_RESULTS_FB;
137 queryResults.resultCapacityInput = 0;
138 queryResults.resultCountOutput = 0;
139 queryResults.results = nullptr;
140
141 checkXrResult(retrieveSpaceQueryResults(resultsAvailable->requestId, &queryResults));
142
143 QVector<XrSpaceQueryResultFB> results(queryResults.resultCountOutput);
144 queryResults.resultCapacityInput = results.size();
145 queryResults.resultCountOutput = 0;
146 queryResults.results = results.data();
147
148 checkXrResult(retrieveSpaceQueryResults(resultsAvailable->requestId, &queryResults));
149
150 qDebug("retrieveSpaceQueryResults: num of results received: %d", queryResults.resultCountOutput);
151 for (const auto &result : results) {
152 if (isComponentSupported(result.space, XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB)) {
153 XrSpaceComponentStatusSetInfoFB request = {
154 XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB,
155 nullptr,
156 XR_SPACE_COMPONENT_TYPE_LOCATABLE_FB,
157 true,
158 0
159 };
160 XrAsyncRequestIdFB requestId;
161 XrResult res = setSpaceComponentStatus(result.space, &request, &requestId);
162 if (res == XR_ERROR_SPACE_COMPONENT_STATUS_ALREADY_SET_FB) {
163 addAnchor(result.space, result.uuid);
164 }
165 }
166 }
167 } else if (event->type == XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB) {
168 qDebug("QOpenXRSpaceExtension::handleEvent: received XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB");
169 }
170}
171
173{
174 XrAsyncRequestIdFB requestId;
175 XrSceneCaptureRequestInfoFB request{};
176 request.type = XR_TYPE_SCENE_CAPTURE_REQUEST_INFO_FB;
177 request.requestByteCount = 0;
178 request.request = nullptr;
179 checkXrResult(requestSceneCapture(&request, &requestId));
180}
181
182bool QOpenXRSpaceExtension::isComponentSupported(XrSpace space, XrSpaceComponentTypeFB type) {
183 uint32_t numComponents = 0;
184 checkXrResult(enumerateSpaceSupportedComponents(space, 0, &numComponents, nullptr));
185 QVector<XrSpaceComponentTypeFB> components(numComponents);
186 checkXrResult(enumerateSpaceSupportedComponents(space, numComponents, &numComponents, components.data()));
187
188 bool supported = false;
189 for (const auto &component : components) {
190 if (component == type) {
191 supported = true;
192 break;
193 }
194 }
195
196 return supported;
197}
198
199bool QOpenXRSpaceExtension::isComponentEnabled(XrSpace space, XrSpaceComponentTypeFB type)
200{
201 XrSpaceComponentStatusFB status = {XR_TYPE_SPACE_COMPONENT_STATUS_FB, nullptr, 0, 0};
202 checkXrResult(getSpaceComponentStatus(space, type, &status));
203 return (status.enabled && !status.changePending);
204}
205
207{
208 if (isComponentEnabled(space, XR_SPACE_COMPONENT_TYPE_BOUNDED_2D_FB)) {
209 // Get the 2D bounds
210 XrRect2Df boundingBox2D;
211 checkXrResult(getSpaceBoundingBox2D(space, &boundingBox2D));
212 offset = QVector2D(boundingBox2D.offset.x, boundingBox2D.offset.y);
213 extent = QVector2D(boundingBox2D.extent.width, boundingBox2D.extent.height);
214 return true;
215 }
216 return false;
217}
218
220{
221 if (isComponentEnabled(space, XR_SPACE_COMPONENT_TYPE_BOUNDED_3D_FB)) {
222 // Get the 3D bounds
223 XrRect3DfFB boundingBox3D;
224 checkXrResult(getSpaceBoundingBox3D(space, &boundingBox3D));
225 offset = QVector3D(boundingBox3D.offset.x, boundingBox3D.offset.y, boundingBox3D.offset.z);
226 extent = QVector3D(boundingBox3D.extent.width, boundingBox3D.extent.height, boundingBox3D.extent.depth);
227 return true;
228 }
229
230 return false;
231}
232
233namespace {
234bool isValidUuid(const XrUuidEXT& uuid) {
235 for (int i = 0; i < XR_UUID_SIZE_EXT; ++i) {
236 if (uuid.data[i] > 0) {
237 return true;
238 }
239 }
240 return false;
241}
242
243QUuid fromXrUuidExt(XrUuidEXT uuid) {
244 return QUuid::fromBytes(uuid.data);
245}
246
247XrUuidEXT fromQUuid(QUuid uuid) {
248 XrUuidEXT xrUuid;
249 auto bytes = uuid.toBytes();
250 memcpy(xrUuid.data, bytes.data, XR_UUID_SIZE_EXT);
251 return xrUuid;
252}
253
254}
255
257 XrRoomLayoutFB roomLayout{};
258 roomLayout.type = XR_TYPE_ROOM_LAYOUT_FB;
259 QVector<XrUuidEXT> wallUuids;
260 QSet<QUuid> uuidSet;
261
262 // First call
263 checkXrResult(getSpaceRoomLayout(space, &roomLayout));
264 // If wallUuidCountOutput == 0, no walls in the component. The UUIDs of the ceiling and floor
265 // has been returned if available
266 if (roomLayout.wallUuidCountOutput != 0) {
267 // Second call
268 wallUuids.resize(roomLayout.wallUuidCountOutput);
269 roomLayout.wallUuidCapacityInput = wallUuids.size();
270 roomLayout.wallUuids = wallUuids.data();
271 checkXrResult(getSpaceRoomLayout(space, &roomLayout));
272 }
273 if (isValidUuid(roomLayout.floorUuid))
274 uuidSet.insert(fromXrUuidExt(roomLayout.floorUuid));
275 if (isValidUuid(roomLayout.ceilingUuid))
276 uuidSet.insert(fromXrUuidExt(roomLayout.ceilingUuid));
277 for (uint32_t i = 0; i < roomLayout.wallUuidCountOutput; i++)
278 uuidSet.insert(fromXrUuidExt(roomLayout.wallUuids[i]));
279 return uuidSet;
280}
281
283 XrSpaceContainerFB spaceContainer{};
284 spaceContainer.type = XR_TYPE_SPACE_CONTAINER_FB;
285 QSet<QUuid> uuidSet;
286 // First call
287 checkXrResult(getSpaceContainer(space, &spaceContainer));
288 if (spaceContainer.uuidCountOutput != 0) {
289 // Second call
290 QVector<XrUuidEXT> uuids(spaceContainer.uuidCountOutput);
291 spaceContainer.uuidCapacityInput = uuids.size();
292 spaceContainer.uuids = uuids.data();
293 checkXrResult(getSpaceContainer(space, &spaceContainer));
294
295 for (uint32_t i = 0; i < spaceContainer.uuidCountOutput; i++)
296 uuidSet.insert(fromXrUuidExt(spaceContainer.uuids[i]));
297 }
298
299 return uuidSet;
300}
301
303 static const std::string recognizedLabels = "TABLE,COUCH,FLOOR,CEILING,WALL_FACE,WINDOW_FRAME,DOOR_FRAME,STORAGE,BED,SCREEN,LAMP,PLANT,WALL_ART,OTHER";
304 const XrSemanticLabelsSupportInfoFB semanticLabelsSupportInfo = {
305 XR_TYPE_SEMANTIC_LABELS_SUPPORT_INFO_FB,
306 nullptr,
307 XR_SEMANTIC_LABELS_SUPPORT_MULTIPLE_SEMANTIC_LABELS_BIT_FB | XR_SEMANTIC_LABELS_SUPPORT_ACCEPT_DESK_TO_TABLE_MIGRATION_BIT_FB,
308 recognizedLabels.c_str()
309 };
310
311 XrSemanticLabelsFB labels{};
312 labels.type = XR_TYPE_SEMANTIC_LABELS_FB;
313 labels.next = &semanticLabelsSupportInfo;
314
315 if (!isComponentEnabled(space, XR_SPACE_COMPONENT_TYPE_SEMANTIC_LABELS_FB))
316 return QString();
317
318 // First call.
319 checkXrResult(getSpaceSemanticLabels(space, &labels));
320 // Second call
321 QByteArray labelData(labels.bufferCountOutput, Qt::Uninitialized);
322 labels.bufferCapacityInput = labelData.size();
323 labels.buffer = labelData.data();
324 checkXrResult(getSpaceSemanticLabels(space, &labels));
325
326 return QString::fromLocal8Bit(labelData);
327}
328
330 XrSpaceQueryInfoFB queryInfo = {
331 XR_TYPE_SPACE_QUERY_INFO_FB,
332 nullptr,
333 XR_SPACE_QUERY_ACTION_LOAD_FB,
335 0,
336 nullptr,
337 nullptr};
338
339 XrAsyncRequestIdFB requestId;
340 return checkXrResult(querySpaces((XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
341}
342
343const QList<QOpenXRSpatialAnchor *> &QOpenXRSpaceExtension::anchors() const
344{
345 return m_anchors;
346}
347
348void QOpenXRSpaceExtension::updateAnchors(XrTime predictedDisplayTime, XrSpace appSpace)
349{
350 // basically for each anchor, we need to call xrLocateSpace
351 for (auto &anchor : m_anchors) {
352 XrSpaceLocation spaceLocation{};
353 spaceLocation.type = XR_TYPE_SPACE_LOCATION;
354 XrResult res = xrLocateSpace(anchor->space(), appSpace, predictedDisplayTime, &spaceLocation);
355 checkXrResult(res);
356 if (XR_UNQUALIFIED_SUCCESS(res)) {
357 if ((spaceLocation.locationFlags & XR_SPACE_LOCATION_POSITION_VALID_BIT) != 0 &&
358 (spaceLocation.locationFlags & XR_SPACE_LOCATION_ORIENTATION_VALID_BIT) != 0) {
359
360 // Update transform
361 anchor->setPosition(QVector3D(spaceLocation.pose.position.x,
362 spaceLocation.pose.position.y,
363 spaceLocation.pose.position.z) * 100.0f);
364 anchor->setRotation(QQuaternion(spaceLocation.pose.orientation.w,
365 spaceLocation.pose.orientation.x,
366 spaceLocation.pose.orientation.y,
367 spaceLocation.pose.orientation.z));
368 }
369 }
370 }
371}
372
373bool QOpenXRSpaceExtension::queryAllAnchorsWithSpecificComponentEnabled(const XrSpaceComponentTypeFB componentType) {
374 XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
375 XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
376 nullptr,
377 XR_SPACE_STORAGE_LOCATION_LOCAL_FB
378 };
379
380 XrSpaceComponentFilterInfoFB componentFilterInfo = {
381 XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB,
382 &storageLocationFilterInfo,
383 componentType
384 };
385
386 XrSpaceQueryInfoFB queryInfo = {
387 XR_TYPE_SPACE_QUERY_INFO_FB,
388 nullptr,
389 XR_SPACE_QUERY_ACTION_LOAD_FB,
391 0,
392 (XrSpaceFilterInfoBaseHeaderFB*)&componentFilterInfo,
393 nullptr
394 };
395
396 XrAsyncRequestIdFB requestId;
397 checkXrResult(querySpaces((XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
398 return true;
399}
400
401bool QOpenXRSpaceExtension::queryAnchorsByUuids(const QSet<QUuid>& uuidSet) {
402 if (uuidSet.isEmpty())
403 return false;
404
405 QVector<XrUuidEXT> uuidsToQuery;
406
407 for (const auto &uuid : uuidSet) {
408 XrUuidEXT xrUuid = fromQUuid(uuid);
409 uuidsToQuery.append(xrUuid);
410 }
411
412 XrSpaceStorageLocationFilterInfoFB storageLocationFilterInfo = {
413 XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB,
414 nullptr,
415 XR_SPACE_STORAGE_LOCATION_LOCAL_FB
416 };
417
418 XrSpaceUuidFilterInfoFB uuidFilterInfo = {
419 XR_TYPE_SPACE_UUID_FILTER_INFO_FB,
420 &storageLocationFilterInfo,
421 (uint32_t)uuidsToQuery.size(),
422 uuidsToQuery.data()
423 };
424
425 XrSpaceQueryInfoFB queryInfo = {
426 XR_TYPE_SPACE_QUERY_INFO_FB,
427 nullptr,
428 XR_SPACE_QUERY_ACTION_LOAD_FB,
430 0,
431 (XrSpaceFilterInfoBaseHeaderFB*)&uuidFilterInfo,
432 nullptr
433 };
434
435 XrAsyncRequestIdFB requestId;
436 checkXrResult(querySpaces((XrSpaceQueryInfoBaseHeaderFB*)&queryInfo, &requestId));
437 return true;
438}
439
440void QOpenXRSpaceExtension::addAnchor(XrSpace space, XrUuidEXT uuid)
441{
442 auto quuid = fromXrUuidExt(uuid);
443 // Check if we already have this anchor
444 if (m_anchorsByUuid.contains(quuid))
445 return;
446
447 auto anchor = new QOpenXRSpatialAnchor(space, quuid, this);
448 m_anchorsByUuid.insert(quuid, anchor);
449 m_anchors.append(anchor);
450 Q_EMIT anchorAdded(anchor);
451}
452
453
454XrResult QOpenXRSpaceExtension::enumerateSpaceSupportedComponents(XrSpace space, uint32_t componentTypeCapacityInput, uint32_t *componentTypeCountOutput, XrSpaceComponentTypeFB *componentTypes)
455{
456 return xrEnumerateSpaceSupportedComponentsFB(space, componentTypeCapacityInput, componentTypeCountOutput, componentTypes);
457}
458
459XrResult QOpenXRSpaceExtension::getSpaceComponentStatus(XrSpace space, XrSpaceComponentTypeFB componentType, XrSpaceComponentStatusFB *status)
460{
461 return xrGetSpaceComponentStatusFB(space, componentType, status);
462}
463
464XrResult QOpenXRSpaceExtension::setSpaceComponentStatus(XrSpace space, const XrSpaceComponentStatusSetInfoFB *info, XrAsyncRequestIdFB *requestId)
465{
466 return xrSetSpaceComponentStatusFB(space, info, requestId);
467}
468
469XrResult QOpenXRSpaceExtension::getSpaceUuid(XrSpace space, XrUuidEXT *uuid)
470{
471 return xrGetSpaceUuidFB(space, uuid);
472}
473
474XrResult QOpenXRSpaceExtension::querySpaces(const XrSpaceQueryInfoBaseHeaderFB *info, XrAsyncRequestIdFB *requestId)
475{
476 return xrQuerySpacesFB(m_session, info, requestId);
477}
478
479XrResult QOpenXRSpaceExtension::retrieveSpaceQueryResults(XrAsyncRequestIdFB requestId, XrSpaceQueryResultsFB *results)
480{
481 return xrRetrieveSpaceQueryResultsFB(m_session, requestId, results);
482}
483
484XrResult QOpenXRSpaceExtension::getSpaceBoundingBox2D(XrSpace space, XrRect2Df *boundingBox2DOutput)
485{
486 return xrGetSpaceBoundingBox2DFB(m_session, space, boundingBox2DOutput);
487}
488
489XrResult QOpenXRSpaceExtension::getSpaceBoundingBox3D(XrSpace space, XrRect3DfFB *boundingBox3DOutput)
490{
491 return xrGetSpaceBoundingBox3DFB(m_session, space, boundingBox3DOutput);
492}
493
494XrResult QOpenXRSpaceExtension::getSpaceSemanticLabels(XrSpace space, XrSemanticLabelsFB *semanticLabelsOutput)
495{
496 return xrGetSpaceSemanticLabelsFB(m_session, space, semanticLabelsOutput);
497}
498
499XrResult QOpenXRSpaceExtension::getSpaceBoundary2D(XrSpace space, XrBoundary2DFB *boundary2DOutput)
500{
501 return xrGetSpaceBoundary2DFB(m_session, space, boundary2DOutput);
502}
503
504XrResult QOpenXRSpaceExtension::getSpaceRoomLayout(XrSpace space, XrRoomLayoutFB *roomLayoutOutput)
505{
506 return xrGetSpaceRoomLayoutFB(m_session, space, roomLayoutOutput);
507}
508
509XrResult QOpenXRSpaceExtension::getSpaceContainer(XrSpace space, XrSpaceContainerFB *spaceContainerOutput)
510{
511 return xrGetSpaceContainerFB(m_session, space, spaceContainerOutput);
512}
513
514XrResult QOpenXRSpaceExtension::requestSceneCapture(const XrSceneCaptureRequestInfoFB *info, XrAsyncRequestIdFB *requestId)
515{
516 if (xrRequestSceneCaptureFB)
517 return xrRequestSceneCaptureFB(m_session, info, requestId);
518 else
519 return XR_ERROR_FUNCTION_UNSUPPORTED;
520}
521
522bool QOpenXRSpaceExtension::checkXrResult(const XrResult &result)
523{
524 return OpenXRHelpers::checkXrResult(result, m_instance);
525}
526
\inmodule QtCore
Definition qbytearray.h:57
bool contains(const Key &key) const noexcept
Returns true if the hash contains an item with the key; otherwise returns false.
Definition qhash.h:1007
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1303
qsizetype size() const noexcept
Definition qlist.h:397
pointer data()
Definition qlist.h:431
void append(parameter_type t)
Definition qlist.h:458
QSet< QUuid > collectSpaceContainerUuids(XrSpace space)
QList< const char * > requiredExtensions() const
bool getBoundingBox2D(XrSpace space, QVector2D &offset, QVector2D &extent)
bool isComponentSupported(XrSpace space, XrSpaceComponentTypeFB type)
void updateAnchors(XrTime predictedDisplayTime, XrSpace appSpace)
QString getSemanticLabels(const XrSpace space)
void handleEvent(const XrEventDataBaseHeader *event)
const QList< QOpenXRSpatialAnchor * > & anchors() const
bool getBoundingBox3D(XrSpace space, QVector3D &offset, QVector3D &extent)
void initialize(XrInstance instance, XrSession session)
QSet< QUuid > collectRoomLayoutUuids(XrSpace space)
static QOpenXRSpaceExtension * instance()
void anchorAdded(QOpenXRSpatialAnchor *anchor)
bool isComponentEnabled(XrSpace space, XrSpaceComponentTypeFB type)
The QQuaternion class represents a quaternion consisting of a vector and scalar.
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
static QString fromLocal8Bit(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5949
\inmodule QtCore
Definition quuid.h:31
static QUuid fromBytes(const void *bytes, QSysInfo::Endian order=QSysInfo::BigEndian)
Definition quuid.h:244
Id128Bytes toBytes(QSysInfo::Endian order=QSysInfo::BigEndian) const noexcept
Definition quuid.h:232
The QVector2D class represents a vector or vertex in 2D space.
Definition qvectornd.h:31
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
bool checkXrResult(XrResult result, XrInstance instance)
Combined button and popup list for selecting options.
constexpr Initialization Uninitialized
QNearFieldTarget::RequestId requestId
#define qDebug
[1]
Definition qlogging.h:164
GLint GLenum GLint components
GLenum type
GLenum GLuint GLintptr offset
struct _cl_event * event
GLuint res
GLuint64EXT * result
[6]
static QT_BEGIN_NAMESPACE const uint32_t MAX_PERSISTENT_SPACES
static qreal component(const QPointF &point, unsigned int i)
#define Q_EMIT
QNetworkRequest request(url)
QHostInfo info
[0]