summaryrefslogtreecommitdiffstats
path: root/src/render/picking
diff options
context:
space:
mode:
authorMike Krus <mike.krus@kdab.com>2015-12-08 12:06:12 +0000
committerMike Krus <mike.krus@kdab.com>2016-01-25 09:03:41 +0000
commit4ad00b344bc79e34f2ba2f8355e65c7948791389 (patch)
tree277ff0f997b962ccb6034728e780cbf77f60c643 /src/render/picking
parentd798eb52ae1b22fa38d398cdae0012a34cb51922 (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.cpp10
-rw-r--r--src/render/picking/objectpicker_p.h9
-rw-r--r--src/render/picking/qobjectpicker.cpp12
-rw-r--r--src/render/picking/qobjectpicker.h6
-rw-r--r--src/render/picking/qpickevent.cpp31
-rw-r--r--src/render/picking/qpickevent.h14
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