6#include <QtCore/QCoreApplication>
7#include <QtCore/QDebug>
8#include <QtCore/qjsonobject.h>
9#include <QtCore/qjsonarray.h>
13#include <QtQuick/private/qquickwindow_p.h>
14#include <QtQuick/QQuickRenderControl>
15#include <QtQuick/QQuickRenderTarget>
16#include <QtQuick/QQuickItem>
18#include <QtQuick3D/private/qquick3dnode_p.h>
19#include <QtQuick3D/private/qquick3dviewport_p.h>
25#if defined(Q_OS_VISIONOS)
26# include <QtQuick3DXr/private/qquick3dxrmanager_visionos_p.h>
28# include "openxr/qquick3dxrmanager_openxr_p.h"
36Q_DECLARE_LOGGING_CATEGORY(lcQuick3DXr);
41 , d_ptr(
new QQuick3DXrManagerPrivate(*
this))
52 delete m_renderControl;
53 delete m_animationDriver;
58 Q_D(
const QQuick3DXrManager);
64 Q_D(QQuick3DXrManager);
66 QString m_errorString;
69 if (!d->initialize()) {
71 m_errorString = QStringLiteral(
"Waiting for the renderer to start.");
73 m_errorString = QStringLiteral(
"Failed to initialize the XR manager.");
79 return setupGraphics();
84 Q_D(QQuick3DXrManager);
90 Q_D(
const QQuick3DXrManager);
96 Q_D(QQuick3DXrManager);
98 return d->setPassthroughEnabled(enabled);
103 Q_D(
const QQuick3DXrManager);
104 return d->isPassthroughEnabled();
109 Q_D(QQuick3DXrManager);
110 d->setMultiViewRenderingEnabled(enable);
115 Q_D(
const QQuick3DXrManager);
116 return d->isMultiViewRenderingEnabled();
121 QRhi *rhi = m_renderControl->rhi();
122 return rhi ? rhi->isFeatureSupported(QRhi::MultiView) :
false;
133 Q_D(
const QQuick3DXrManager);
134 d->getDefaultClipDistances(nearClip, farClip);
139#if defined(Q_OS_VISIONOS)
141 return QtQuick3DXr::FoveationLevel::HighFoveation;
143 Q_D(
const QQuick3DXrManager);
144 return QtQuick3DXr::FoveationLevel(d->m_foveationLevel);
150#if defined(Q_OS_VISIONOS)
154 Q_D(QQuick3DXrManager);
155 const XrFoveationLevelFB xrLevel = XrFoveationLevelFB(level);
156 if (d->m_foveationLevel == xrLevel)
159 d->m_foveationLevel = xrLevel;
160 d->setupMetaQuestFoveation();
166 Q_D(
const QQuick3DXrManager);
167 return d->getReferenceSpace();
172 Q_D(QQuick3DXrManager);
174 d->setReferenceSpace(newReferenceSpace);
179 Q_D(
const QQuick3DXrManager);
180 return d->isDepthSubmissionEnabled();
185 Q_D(QQuick3DXrManager);
186 d->setDepthSubmissionEnabled(enable);
191 Q_D(
const QQuick3DXrManager);
192 return d->errorString();
197 Q_D(QQuick3DXrManager);
198 d->setSamples(samples);
203 Q_D(QQuick3DXrManager);
209 Q_D(QQuick3DXrManager);
211 if (e->type() == QEvent::UpdateRequest) {
212 d->processXrEvents();
216 return QObject::event(e);
221 static bool disabled = qEnvironmentVariableIntValue(
"QT_QUICK3D_XR_DISABLE_MULTIVIEW") != 0;
227 Q_D(
const QQuick3DXrManager);
228 return d->m_inputManager.data();
233 Q_D(QQuick3DXrManager);
237 if (d->isGraphicsInitialized())
240 preSetupQuickScene();
242 if (!d->setupGraphics(m_quickWindow))
245 if (!setupQuickScene())
248 QRhi *rhi = m_quickWindow->rhi();
249 QSSG_ASSERT_X(rhi !=
nullptr,
"No RHI handle!",
return false);
251 if (!d->isMultiViewRenderingEnabled())
252 emit multiViewRenderingEnabledChanged();
254 return d->finalizeGraphics(rhi);
259 Q_D(QQuick3DXrManager);
262 if (!m_xrOriginWarningShown) {
263 qWarning() <<
"No XrOrigin found!";
264 m_xrOriginWarningShown =
true;
274 if (!m_renderControl)
275 m_renderControl =
new QQuickRenderControl;
277 m_quickWindow =
new QQuickWindow(m_renderControl);
282 Q_D(QQuick3DXrManager);
284 d->setupWindow(m_quickWindow);
286 if (!m_animationDriver) {
287 m_animationDriver =
new QQuick3DXrAnimationDriver;
288 m_animationDriver->install();
291 const bool initSuccess = m_renderControl->initialize();
293 qWarning(
"Quick 3D XR: Failed to create renderControl (failed to initialize RHI?)");
297 QRhi *rhi = m_renderControl->rhi();
299 qWarning(
"Quick3D XR: No QRhi from renderControl. This should not happen.");
303 qCDebug(lcQuick3DXr,
"Quick 3D XR: QRhi initialized with backend %s", rhi->backendName());
310 Q_D(
const QQuick3DXrManager);
311 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()
Q_LOGGING_CATEGORY(lcEventDispatcher, "qt.eventdispatcher")