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
qquick3dxrhandtrackerinput.cpp
Go to the documentation of this file.
1// Copyright (C) 2024 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
7
8#if defined(Q_OS_VISIONOS)
10#else
12#endif
13
15
21
23{
24 return m_isActive;
25}
26
31
33{
35
36 if (m_isActive == isActive)
37 return;
38
39 m_isActive = isActive;
40 emit q->isActiveChanged();
41}
42
44{
46
47 if (poseSpace == m_poseSpace)
48 return;
49
50 m_poseSpace = poseSpace;
51 emit q->poseSpaceChanged();
52}
53
55{
56 return m_posePosition;
57}
58
60{
61 return m_poseRotation;
62}
63
65{
66 return m_jointPositions;
67}
68
69void QQuick3DXrHandTrackerInputPrivate::setJointPositionsAndRotations(const QList<QVector3D> &newJointPositions, const QList<QQuaternion> &newJointRotations)
70{
72
73 m_jointPositions = newJointPositions;
74 emit q->jointPositionsChanged();
75 m_jointRotations = newJointRotations;
76 emit q->jointRotationsChanged();
77 emit q->jointDataUpdated();
78
80 const auto pokeIndex = QQuick3DXrInputManagerPrivate::get(inputMan)->getPokeJointIndex();
81
82 if (pokeIndex >= 0 && pokeIndex < m_jointPositions.size())
83 setPokePosition(m_jointPositions[pokeIndex]);
84}
85
87{
88 return m_jointRotations;
89}
90
92{
93 return m_pokePosition;
94}
95
97{
99
100 if (m_pokePosition == newPokePosition)
101 return;
102 m_pokePosition = newPokePosition;
103 emit q->pokePositionChanged();
104}
105
121
126
133{
135 return d->isActive();
136}
137
155
161
172
174{
176 return d->posePosition();
177}
178
185{
187 return d->jointPositions();
188}
189
191{
193 return d->poseRotation();
194}
195
202{
204 return d->jointRotations();
205}
206
207void QQuick3DXrHandTrackerInput::setJointPositionsAndRotations(const QList<QVector3D> &newJointPositions, const QList<QQuaternion> &newJointRotations)
208{
210 d->setJointPositionsAndRotations(newJointPositions, newJointRotations);
211}
212
214{
216 return d->pokePosition();
217}
218
220{
222 d->setPokePosition(newPokePosition);
223}
224
274
275void QQuick3DXrHandModel::updatePose()
276{
277 if (auto *skin = QQuick3DModel::skin()) {
278 auto jointListProp = skin->joints();
279 int count = jointListProp.count(&jointListProp);
280 const auto positions = m_handTracker->jointPositions();
281 const auto rotations = m_handTracker->jointRotations();
282 for (int i = 0; i < count; ++i) {
283 auto *joint = jointListProp.at(&jointListProp, i);
284 joint->setPosition(positions.at(i));
285 joint->setRotation(rotations.at(i));
286 }
287 } else {
288 static bool warned = false;
289 if (!warned) {
290 qWarning() << "No skin available for hand model";
291 warned = true;
292 }
293 }
294}
295
296void QQuick3DXrHandModel::setupModel()
297{
298 if (!m_handTracker) {
299 return;
300 }
301 if (m_initialized) {
302 qWarning() << "XrHandModel does not support changing hand tracker";
303 return;
304 }
306
307 QQuick3DXrInputManagerPrivate::get(inputMan)->setupHandModel(this);
308
309 connect(m_handTracker, &QQuick3DXrHandTrackerInput::jointDataUpdated, this, &QQuick3DXrHandModel::updatePose);
310 connect(m_handTracker, &QQuick3DXrHandTrackerInput::isActiveChanged, this, [this](){
311 setVisible(m_handTracker->isActive());
312 });
313 setVisible(m_handTracker->isActive());
314 m_initialized = true;
315}
316
322
331{
332 return m_handTracker;
333}
334
336{
337 if (m_handTracker == newHandTracker)
338 return;
339 m_handTracker = newHandTracker;
340 //TODO: setupModel()
342}
343
bool isActive
qsizetype size() const noexcept
Definition qlist.h:398
const_reference at(qsizetype i) const noexcept
Definition qlist.h:447
\inmodule QtCore
Definition qobject.h:103
virtual void componentComplete()=0
Invoked after the root component that caused this instantiation has completed construction.
The QQuaternion class represents a quaternion consisting of a vector and scalar.
QQuick3DSkin * skin
\qmlproperty Skin Model::skin
void setVisible(bool visible)
QQmlListProperty< QQuick3DNode > joints
\qmlproperty List<QtQuick3D::Node> Skin::joints
QQuick3DXrHandTrackerInput * handTracker
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void setHandTracker(QQuick3DXrHandTrackerInput *newHandTracker)
QQuick3DXrHandModel(QQuick3DNode *parent=nullptr)
\qmlsignal XrHandTrackerInput::isActiveChanged() Emitted when the isActive property changes.
void setJointPositionsAndRotations(const QList< QVector3D > &newJointPositions, const QList< QQuaternion > &newJointRotations)
QQuick3DXrHandTrackerInputPrivate(QQuick3DXrHandTrackerInput &handTrackerInput)
void setPokePosition(const QVector3D &newPokePosition)
void setPokePosition(const QVector3D &newPokePosition)
QQuick3DXrHandTrackerInput(QObject *parent=nullptr)
\qmltype XrHandTrackerInput \inqmlmodule QtQuick3D.Xr
void setPoseSpace(HandPoseSpace poseSpace)
\qmlproperty vector3d XrHandTrackerInput::posePosition
void setJointPositionsAndRotations(const QList< QVector3D > &newJointPositions, const QList< QQuaternion > &newJointRotations)
const QQuaternion & poseRotation() const
static QQuick3DXrInputManagerPrivate * get(QQuick3DXrInputManager *inputManager)
static QQuick3DXrInputManager * instance()
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
#define this
Definition dialogs.cpp:9
Combined button and popup list for selecting options.
static const QCssKnownValue positions[NumKnownPositionModes - 1]
#define qWarning
Definition qlogging.h:167
GLenum GLenum GLsizei count
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
#define emit
connect(quitButton, &QPushButton::clicked, &app, &QCoreApplication::quit, Qt::QueuedConnection)