Revision control
Copy as Markdown
// Copyright (C) 2024 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QQUICK3DXRACTIONMAPPER_H
#define QQUICK3DXRACTIONMAPPER_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QObject>
#include <QQmlEngine>
#include <QQuick3DObject>
#include <QMultiHash>
#include <QPointer>
#include "qquick3dxrabstracthapticeffect_p.h"
#include <QtQuick3DXr/private/qtquick3dxrglobal_p.h>
QT_BEGIN_NAMESPACE
class QQuick3DXrController;
class QQuick3DXrInputAction;
class QQuick3DXrActionMapper;
class QQuick3DXrInputAction : public QObject, public QQmlParserStatus
{
Q_OBJECT
Q_INTERFACES(QQmlParserStatus)
QML_NAMED_ELEMENT(XrInputAction)
QML_ADDED_IN_VERSION(6, 8)
Q_PROPERTY(float value READ value NOTIFY valueChanged FINAL)
Q_PROPERTY(bool pressed READ pressed NOTIFY pressedChanged FINAL)
Q_PROPERTY(QString actionName READ actionName WRITE setActionName NOTIFY actionNameChanged FINAL)
Q_PROPERTY(QList<Action> actionId READ actionId WRITE setActionId NOTIFY actionIdChanged FINAL)
Q_PROPERTY(bool enabled READ enabled WRITE setEnabled NOTIFY enabledChanged FINAL REVISION(6, 9))
Q_PROPERTY(Controller hand READ hand WRITE setHand NOTIFY handChanged FINAL)
Q_PROPERTY(Controller controller READ controller WRITE setController NOTIFY controllerChanged FINAL REVISION(6, 10))
public:
enum class Controller {
LeftController = uint(QtQuick3DXr::Controller::LeftController),
RightController = uint(QtQuick3DXr::Controller::RightController),
UnknownController = uint(QtQuick3DXr::Controller::UnknownController),
LeftHand = uint(QtQuick3DXr::Controller::LeftHand),
RightHand = uint(QtQuick3DXr::Controller::RightHand),
ControllerLeft = LeftController,
ControllerRight = RightController,
ControllerNone = UnknownController,
};
Q_ENUM(Controller)
enum Action : qint16 {
CustomAction = -1,
Button1Pressed,
Button1Touched,
Button2Pressed,
Button2Touched,
ButtonMenuPressed,
ButtonMenuTouched,
ButtonSystemPressed,
ButtonSystemTouched,
SqueezeValue,
SqueezeForce,
SqueezePressed,
TriggerValue,
TriggerPressed,
TriggerTouched,
ThumbstickX,
ThumbstickY,
ThumbstickPressed,
ThumbstickTouched,
ThumbrestTouched,
TrackpadX,
TrackpadY,
TrackpadForce,
TrackpadTouched,
TrackpadPressed,
IndexFingerPinch,
MiddleFingerPinch,
RingFingerPinch,
LittleFingerPinch,
HandTrackingMenuPress,
NumHandActions,
NumActions
};
Q_ENUM(Action)
explicit QQuick3DXrInputAction(QObject *parent = nullptr);
~QQuick3DXrInputAction() override;
float value() const;
void setValue(float newValue);
bool pressed() const;
void setPressed(bool newPressed);
QString actionName() const;
void setActionName(const QString &newActionName);
QList<Action> actionId() const;
void setActionId(const QList<Action> &newActionId);
void classBegin() override;
void componentComplete() override;
Controller hand() const;
void setHand(Controller newHand);
bool enabled() const;
void setEnabled(bool newEnabled);
Controller controller() const;
void setController(Controller newController);
Q_SIGNALS:
void valueChanged();
void pressedChanged();
void triggered();
void actionNameChanged();
void actionIdChanged();
void handChanged();
void enabledChanged();
void controllerChanged();
private:
QString m_actionName;
float m_value = 0;
bool m_pressed = false;
bool m_componentComplete = false;
bool m_enabled = true;
Controller m_controller;
QList<Action> m_actionIds;
};
class QQuick3DXrHapticFeedback : public QObject, public QQmlParserStatus
{
Q_OBJECT
Q_INTERFACES(QQmlParserStatus)
QML_NAMED_ELEMENT(XrHapticFeedback)
QML_ADDED_IN_VERSION(6, 9)
Q_PROPERTY(Controller controller READ controller WRITE setController NOTIFY controllerChanged FINAL)
Q_PROPERTY(QQuick3DXrAbstractHapticEffect *hapticEffect READ hapticEffect WRITE setHapticEffect NOTIFY hapticEffectChanged FINAL)
Q_PROPERTY(bool trigger READ trigger WRITE setTrigger NOTIFY triggerChanged FINAL)
Q_PROPERTY(Condition condition READ condition WRITE setCondition NOTIFY conditionChanged FINAL)
public:
// Values here must match the QtQuick3DXr::Controller enum
enum class Controller {
LeftController = uint(QtQuick3DXr::Controller::LeftController),
RightController = uint(QtQuick3DXr::Controller::RightController),
UnknownController = uint(QtQuick3DXr::Controller::UnknownController),
LeftHand = uint(QtQuick3DXr::Controller::LeftHand),
RightHand = uint(QtQuick3DXr::Controller::RightHand),
ControllerLeft = LeftController,
ControllerRight = RightController,
ControllerNone = UnknownController,
};
Q_ENUM(Controller)
enum class Condition : quint8 {
RisingEdge = 0,
TrailingEdge,
};
Q_ENUM(Condition)
explicit QQuick3DXrHapticFeedback(QObject *parent = nullptr);
~QQuick3DXrHapticFeedback() override;
void classBegin() override;
void componentComplete() override;
QQuick3DXrAbstractHapticEffect *hapticEffect() const;
void setHapticEffect(QQuick3DXrAbstractHapticEffect *newHapticEffect);
Controller controller() const;
void setController(Controller newController);
bool trigger();
void setTrigger(bool newTrigger);
enum Condition condition() const;
void setCondition(enum Condition newCondition);
bool testAndClear();
Q_SIGNALS:
void controllerChanged();
void hapticEffectChanged();
void triggerChanged();
void conditionChanged();
public Q_SLOTS:
void start();
void stop();
private:
QMetaObject::Connection m_triggerConnection;
Controller m_controller = Controller::UnknownController;
Condition m_condition = Condition::RisingEdge;
QPointer<QQuick3DXrAbstractHapticEffect> m_hapticEffect;
bool m_trigger = false;
bool m_componentComplete = false;
bool m_pending = false;
};
class QQuick3DXrActionMapper : public QObject
{
Q_OBJECT
public:
static QQuick3DXrActionMapper *instance();
static QList<QPointer<QQuick3DXrHapticFeedback>> getHapticEffects(QtQuick3DXr::Controller controller);
static void handleInput(QQuick3DXrInputAction::Action id, QtQuick3DXr::Controller controller, const char *shortName, float value);
static void registerAction(QQuick3DXrInputAction *action);
static void registerHapticEffect(QPointer<QQuick3DXrHapticFeedback>);
static void removeAction(QQuick3DXrInputAction *action);
static void removeHapticEffect(QQuick3DXrHapticFeedback *action);
private:
explicit QQuick3DXrActionMapper(QObject *parent = nullptr);
struct HapticData
{
QList<QPointer<QQuick3DXrHapticFeedback>> m_hapticEffects;
} m_hapticData[2];
QMultiHash<quint32, QQuick3DXrInputAction *> m_actions;
QMultiHash<QString, QQuick3DXrInputAction *> m_customActions;
};
QT_END_NAMESPACE
#endif // QQUICK3DXRACTIONMAPPER_H