8#include <QtCore/QCoreApplication>
9#include <QtCore/QDebug>
10#include <QtCore/qjsonobject.h>
11#include <QtCore/qjsonarray.h>
15#include <QtQuick/private/qquickwindow_p.h>
16#include <QtQuick/QQuickRenderControl>
17#include <QtQuick/QQuickRenderTarget>
18#include <QtQuick/QQuickItem>
20#include <QtQuick3D/private/qquick3dnode_p.h>
21#include <QtQuick3D/private/qquick3dviewport_p.h>
27#if defined(Q_OS_VISIONOS)
28# include <QtQuick3DXr/private/qquick3dxrmanager_visionos_p.h>
30# include "openxr/qquick3dxrmanager_openxr_p.h"
38Q_DECLARE_LOGGING_CATEGORY(lcQuick3DXr);
43 , d_ptr(
new QQuick3DXrManagerPrivate(*
this))
54 delete m_renderControl;
55 delete m_animationDriver;
60 Q_D(
const QQuick3DXrManager);
66 Q_D(QQuick3DXrManager);
68 QString m_errorString;
71 if (!d->initialize()) {
73 m_errorString = QStringLiteral(
"Waiting for the renderer to start.");
75 m_errorString = QStringLiteral(
"Failed to initialize the XR manager.");
81 return setupGraphics();
86 Q_D(QQuick3DXrManager);
92 Q_D(
const QQuick3DXrManager);
98 Q_D(QQuick3DXrManager);
100 return d->setPassthroughEnabled(enabled);
105 Q_D(
const QQuick3DXrManager);
106 return d->isPassthroughEnabled();
111 Q_D(QQuick3DXrManager);
112 d->setMultiViewRenderingEnabled(enable);
117 Q_D(
const QQuick3DXrManager);
118 return d->isMultiViewRenderingEnabled();
123 QRhi *rhi = m_renderControl->rhi();
124 return rhi ? rhi->isFeatureSupported(QRhi::MultiView) :
false;
135 Q_D(
const QQuick3DXrManager);
136 d->getDefaultClipDistances(nearClip, farClip);
141#if defined(Q_OS_VISIONOS)
143 return QtQuick3DXr::FoveationLevel::HighFoveation;
145 Q_D(
const QQuick3DXrManager);
146 return QtQuick3DXr::FoveationLevel(d->m_foveationLevel);
152#if defined(Q_OS_VISIONOS)
156 Q_D(QQuick3DXrManager);
157 const XrFoveationLevelFB xrLevel = XrFoveationLevelFB(level);
158 if (d->m_foveationLevel == xrLevel)
161 d->m_foveationLevel = xrLevel;
162 d->setupMetaQuestFoveation();
168 Q_D(
const QQuick3DXrManager);
169 return d->getReferenceSpace();
174 Q_D(QQuick3DXrManager);
176 d->setReferenceSpace(newReferenceSpace);
181 Q_D(
const QQuick3DXrManager);
182 return d->isDepthSubmissionEnabled();
187 Q_D(QQuick3DXrManager);
188 d->setDepthSubmissionEnabled(enable);
193 Q_D(
const QQuick3DXrManager);
194 return d->errorString();
199 Q_D(QQuick3DXrManager);
200 d->setSamples(samples);
205 Q_D(QQuick3DXrManager);
211 Q_D(QQuick3DXrManager);
213 if (e->type() == QEvent::UpdateRequest) {
214 d->processXrEvents();
218 return QObject::event(e);
223 static bool disabled = qEnvironmentVariableIntValue(
"QT_QUICK3D_XR_DISABLE_MULTIVIEW") != 0;
229 Q_D(
const QQuick3DXrManager);
230 return d->m_inputManager.data();
235 Q_D(QQuick3DXrManager);
239 if (d->isGraphicsInitialized())
242 preSetupQuickScene();
244 if (!d->setupGraphics(m_quickWindow))
247 if (!setupQuickScene())
250 QRhi *rhi = m_quickWindow->rhi();
251 QSSG_ASSERT_X(rhi !=
nullptr,
"No RHI handle!",
return false);
253 if (!d->isMultiViewRenderingEnabled())
254 emit multiViewRenderingEnabledChanged();
256 return d->finalizeGraphics(rhi);
261 Q_D(QQuick3DXrManager);
264 if (!m_xrOriginWarningShown) {
265 qWarning() <<
"No XrOrigin found!";
266 m_xrOriginWarningShown =
true;
276 if (!m_renderControl)
277 m_renderControl =
new QQuickRenderControl;
279 m_quickWindow =
new QQuickWindow(m_renderControl);
284 Q_D(QQuick3DXrManager);
286 d->setupWindow(m_quickWindow);
288 if (!m_animationDriver) {
289 m_animationDriver =
new QQuick3DXrAnimationDriver;
290 m_animationDriver->install();
293 const bool initSuccess = m_renderControl->initialize();
295 qWarning(
"Quick 3D XR: Failed to create renderControl (failed to initialize RHI?)");
299 QRhi *rhi = m_renderControl->rhi();
301 qWarning(
"Quick3D XR: No QRhi from renderControl. This should not happen.");
305 qCDebug(lcQuick3DXr,
"Quick 3D XR: QRhi initialized with backend %s", rhi->backendName());
312 Q_D(
const QQuick3DXrManager);
313 return d->supportsPassthrough();
void setDepthSubmissionEnabled(bool enable)
bool isPassthroughEnabled() const
void setFixedFoveationLevel(QtQuick3DXr::FoveationLevel level)
bool isMultiViewRenderingSupported() const
QString errorString() const
QtQuick3DXr::FoveationLevel getFixedFoveationLevel() const
bool isDepthSubmissionEnabled() const
void setMultiViewRenderingEnabled(bool enable)
void setSamples(int samples)
void setXROrigin(QQuick3DXrOrigin *origin)
bool isMultiViewRenderingEnabled() const
void getDefaultClipDistances(float &nearClip, float &farClip) const
void setReferenceSpace(QtQuick3DXr::ReferenceSpace newReferenceSpace)
bool setPassthroughEnabled(bool enabled)
bool event(QEvent *e) override
This virtual function receives events to an object and should return true if the event e was recogniz...
QtQuick3DXr::ReferenceSpace getReferenceSpace() const
static bool isMultiviewRenderingDisabled()
Combined button and popup list for selecting options.
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")