diff options
author | Mike Krus <mike.krus@kdab.com> | 2015-12-08 12:06:12 +0000 |
---|---|---|
committer | Mike Krus <mike.krus@kdab.com> | 2016-01-25 09:03:41 +0000 |
commit | 4ad00b344bc79e34f2ba2f8355e65c7948791389 (patch) | |
tree | 277ff0f997b962ccb6034728e780cbf77f60c643 /src/render/picking | |
parent | d798eb52ae1b22fa38d398cdae0012a34cb51922 (diff) |
Expose picking details to front end
Intersection (world and local) and distance added to pick event
Modified test so that it includes the event
Change-Id: I8631d626e5108d2e044374ee3425625f5588c38c
Reviewed-by: Sean Harmer <sean.harmer@kdab.com>
Diffstat (limited to 'src/render/picking')
-rw-r--r-- | src/render/picking/objectpicker.cpp | 10 | ||||
-rw-r--r-- | src/render/picking/objectpicker_p.h | 9 | ||||
-rw-r--r-- | src/render/picking/qobjectpicker.cpp | 12 | ||||
-rw-r--r-- | src/render/picking/qobjectpicker.h | 6 | ||||
-rw-r--r-- | src/render/picking/qpickevent.cpp | 31 | ||||
-rw-r--r-- | src/render/picking/qpickevent.h | 14 |
6 files changed, 67 insertions, 15 deletions
diff --git a/src/render/picking/objectpicker.cpp b/src/render/picking/objectpicker.cpp index c2f8a354f..c6f278117 100644 --- a/src/render/picking/objectpicker.cpp +++ b/src/render/picking/objectpicker.cpp @@ -35,6 +35,7 @@ ****************************************************************************/ #include "objectpicker_p.h" +#include "qpickevent.h" #include <Qt3DRender/qobjectpicker.h> #include <Qt3DRender/qattribute.h> #include <Qt3DCore/qscenepropertychange.h> @@ -105,27 +106,30 @@ bool ObjectPicker::hoverEnabled() const return m_hoverEnabled; } -void ObjectPicker::onClicked() +void ObjectPicker::onClicked(QPickEventPtr event) { Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); e->setPropertyName("clicked"); e->setTargetNode(peerUuid()); + e->setValue(QVariant::fromValue(event)); notifyObservers(e); } -void ObjectPicker::onPressed() +void ObjectPicker::onPressed(QPickEventPtr event) { Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); e->setPropertyName("pressed"); e->setTargetNode(peerUuid()); + e->setValue(QVariant::fromValue(event)); notifyObservers(e); } -void ObjectPicker::onReleased() +void ObjectPicker::onReleased(QPickEventPtr event) { Qt3DCore::QBackendScenePropertyChangePtr e(new Qt3DCore::QBackendScenePropertyChange(Qt3DCore::NodeUpdated, peerUuid())); e->setPropertyName("released"); e->setTargetNode(peerUuid()); + e->setValue(QVariant::fromValue(event)); notifyObservers(e); } diff --git a/src/render/picking/objectpicker_p.h b/src/render/picking/objectpicker_p.h index 545c7ff95..3477f0e74 100644 --- a/src/render/picking/objectpicker_p.h +++ b/src/render/picking/objectpicker_p.h @@ -54,6 +54,9 @@ QT_BEGIN_NAMESPACE namespace Qt3DRender { +class QPickEvent; +typedef QSharedPointer<QPickEvent> QPickEventPtr; + namespace Render { class Q_AUTOTEST_EXPORT ObjectPicker : public Qt3DCore::QBackendNode @@ -70,9 +73,9 @@ public: void makeDirty(); bool hoverEnabled() const; - void onClicked(); - void onPressed(); - void onReleased(); + void onClicked(QPickEventPtr event); + void onPressed(QPickEventPtr event); + void onReleased(QPickEventPtr event); void onEntered(); void onExited(); diff --git a/src/render/picking/qobjectpicker.cpp b/src/render/picking/qobjectpicker.cpp index 96b3bb9f6..2db315dd6 100644 --- a/src/render/picking/qobjectpicker.cpp +++ b/src/render/picking/qobjectpicker.cpp @@ -175,14 +175,14 @@ void QObjectPicker::sceneChangeEvent(const Qt3DCore::QSceneChangePtr &change) // to emit the correct signals const QByteArray propertyName = e->propertyName(); if (propertyName == QByteArrayLiteral("pressed")) { - QPickEvent e; - d->pressedEvent(&e); + QPickEventPtr ev = e->value().value<QPickEventPtr>(); + d->pressedEvent(ev.data()); } else if (propertyName == QByteArrayLiteral("released")) { - QPickEvent e; - d->releasedEvent(&e); + QPickEventPtr ev = e->value().value<QPickEventPtr>(); + d->releasedEvent(ev.data()); } else if (propertyName == QByteArrayLiteral("clicked")) { - QPickEvent e; - d->clickedEvent(&e); + QPickEventPtr ev = e->value().value<QPickEventPtr>(); + d->clickedEvent(ev.data()); } else if (propertyName == QByteArrayLiteral("entered")) { emit entered(); setContainsMouse(true); diff --git a/src/render/picking/qobjectpicker.h b/src/render/picking/qobjectpicker.h index b64fb2694..cf8e3e6ff 100644 --- a/src/render/picking/qobjectpicker.h +++ b/src/render/picking/qobjectpicker.h @@ -68,9 +68,9 @@ public Q_SLOTS: void setHoverEnabled(bool hoverEnabled); Q_SIGNALS: - void pressed(Qt3DRender::QPickEvent *event); - void released(Qt3DRender::QPickEvent *event); - void clicked(Qt3DRender::QPickEvent *event); + void pressed(Qt3DRender::QPickEvent *pick); + void released(Qt3DRender::QPickEvent *pick); + void clicked(Qt3DRender::QPickEvent *pick); void entered(); void exited(); void hoverEnabledChanged(bool hoverEnabled); diff --git a/src/render/picking/qpickevent.cpp b/src/render/picking/qpickevent.cpp index e90bc24c0..420bab16f 100644 --- a/src/render/picking/qpickevent.cpp +++ b/src/render/picking/qpickevent.cpp @@ -47,10 +47,14 @@ public: QPickEventPrivate() : QObjectPrivate() , m_accepted(true) + , m_distance(-1.f) { } bool m_accepted; + QVector3D m_worldIntersection; + QVector3D m_localIntersection; + float m_distance; }; QPickEvent::QPickEvent() @@ -58,6 +62,15 @@ QPickEvent::QPickEvent() { } +QPickEvent::QPickEvent(const QVector3D &intersection, const QVector3D &localIntersection, float distance) + : QObject(*new QPickEventPrivate()) +{ + Q_D(QPickEvent); + d->m_distance = distance; + d->m_worldIntersection = intersection; + d->m_localIntersection = localIntersection; +} + QPickEvent::~QPickEvent() { } @@ -77,6 +90,24 @@ void QPickEvent::setAccepted(bool accepted) } } +float QPickEvent::distance() const +{ + Q_D(const QPickEvent); + return d->m_distance; +} + +const QVector3D &QPickEvent::worldIntersection() const +{ + Q_D(const QPickEvent); + return d->m_worldIntersection; +} + +const QVector3D &QPickEvent::localIntersection() const +{ + Q_D(const QPickEvent); + return d->m_localIntersection; +} + } // Qt3DRender QT_END_NAMESPACE diff --git a/src/render/picking/qpickevent.h b/src/render/picking/qpickevent.h index 793377ad8..4734a912d 100644 --- a/src/render/picking/qpickevent.h +++ b/src/render/picking/qpickevent.h @@ -38,6 +38,7 @@ #define QT3DRENDER_QPICKEVENT_H #include <QObject> +#include <QVector3D> #include <Qt3DRender/qt3drender_global.h> QT_BEGIN_NAMESPACE @@ -46,12 +47,19 @@ namespace Qt3DRender { class QPickEventPrivate; +class QPickEvent; +typedef QSharedPointer<QPickEvent> QPickEventPtr; + class QT3DRENDERSHARED_EXPORT QPickEvent : public QObject { Q_OBJECT Q_PROPERTY(bool accepted READ isAccepted WRITE setAccepted NOTIFY acceptedChanged) + Q_PROPERTY(float distance READ distance CONSTANT) + Q_PROPERTY(QVector3D localIntersection READ localIntersection CONSTANT) + Q_PROPERTY(QVector3D worldIntersection READ worldIntersection CONSTANT) public: QPickEvent(); + QPickEvent(const QVector3D& worldIntersection, const QVector3D& localIntersection, float distance); ~QPickEvent(); bool isAccepted() const; @@ -59,6 +67,10 @@ public: public Q_SLOTS: void setAccepted(bool accepted); + float distance() const; + const QVector3D &worldIntersection() const; + const QVector3D &localIntersection() const; + Q_SIGNALS: void acceptedChanged(bool accepted); @@ -70,4 +82,6 @@ private: QT_END_NAMESPACE +Q_DECLARE_METATYPE(Qt3DRender::QPickEvent*) + #endif // QT3DRENDER_QPICKEVENT_H |