From 8d6b041758a469df13a282a0cf428699a299ed1e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 4 Nov 2014 10:01:25 -0800 Subject: [PATCH] send a pick ray with HFActionEvent, not x,y --- interface/src/Application.cpp | 17 ++++++++++------- interface/src/Application.h | 3 +-- interface/src/Camera.h | 4 +++- .../scripting/JoystickScriptingInterface.cpp | 4 +--- libraries/script-engine/src/HFActionEvent.cpp | 7 +++---- libraries/script-engine/src/HFActionEvent.h | 9 ++++++--- libraries/shared/src/RegisteredMetaTypes.h | 3 ++- 7 files changed, 26 insertions(+), 21 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index b773231b0f..517c899f28 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -177,6 +177,7 @@ Application::Application(int& argc, char** argv, QElapsedTimer &startup_time) : _packetsPerSecond(0), _bytesPerSecond(0), _nodeBoundsDisplay(this), + _cameraScriptableObject(&_myCamera, &_viewFrustum), _previousScriptLocation(), _applicationOverlay(), _runningScriptsWidget(NULL), @@ -1116,7 +1117,9 @@ void Application::keyPressEvent(QKeyEvent* event) { case Qt::Key_Space: { if (!event->isAutoRepeat()) { // this starts an HFActionEvent - HFActionEvent startActionEvent(HFActionEvent::startType(), getViewportCenter()); + PickRay actionRay; + + HFActionEvent startActionEvent(HFActionEvent::startType(), actionRay); sendEvent(this, &startActionEvent); } @@ -1207,7 +1210,7 @@ void Application::keyReleaseEvent(QKeyEvent* event) { case Qt::Key_Space: { if (!event->isAutoRepeat()) { // this ends the HFActionEvent - HFActionEvent endActionEvent(HFActionEvent::endType(), getViewportCenter()); + HFActionEvent endActionEvent(HFActionEvent::endType(), Application::getInstance()->getCamera()->getPickRay()); sendEvent(this, &endActionEvent); } @@ -1301,7 +1304,8 @@ void Application::mousePressEvent(QMouseEvent* event, unsigned int deviceID) { } // nobody handled this - make it an action event on the _window object - HFActionEvent actionEvent(HFActionEvent::startType(), event->localPos()); + HFActionEvent actionEvent(HFActionEvent::startType(), + _cameraScriptableObject.computePickRay(event->x(), event->y())); sendEvent(this, &actionEvent); } else if (event->button() == Qt::RightButton) { @@ -1335,7 +1339,8 @@ void Application::mouseReleaseEvent(QMouseEvent* event, unsigned int deviceID) { } // fire an action end event - HFActionEvent actionEvent(HFActionEvent::endType(), event->localPos()); + HFActionEvent actionEvent(HFActionEvent::endType(), + _cameraScriptableObject.computePickRay(event->x(), event->y())); sendEvent(this, &actionEvent); } } @@ -3846,9 +3851,7 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri scriptEngine->setAvatarData(_myAvatar, "MyAvatar"); // leave it as a MyAvatar class to expose thrust features scriptEngine->setAvatarHashMap(&_avatarManager, "AvatarList"); - CameraScriptableObject* cameraScriptable = new CameraScriptableObject(&_myCamera, &_viewFrustum); - scriptEngine->registerGlobalObject("Camera", cameraScriptable); - connect(scriptEngine, SIGNAL(finished(const QString&)), cameraScriptable, SLOT(deleteLater())); + scriptEngine->registerGlobalObject("Camera", &_cameraScriptableObject); #if defined(Q_OS_MAC) || defined(Q_OS_WIN) scriptEngine->registerGlobalObject("SpeechRecognizer", Menu::getInstance()->getSpeechRecognizer()); diff --git a/interface/src/Application.h b/interface/src/Application.h index 9fcf53cfa9..60d06929d2 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -287,8 +287,6 @@ public: PointShader& getPointShader() { return _pointShader; } FileLogger* getLogger() { return _logger; } - QPointF getViewportCenter() const - { return QPointF(_glWidget->getDeviceWidth() / 2.0f, _glWidget->getDeviceHeight() / 2.0f); } glm::vec2 getViewportDimensions() const { return glm::vec2(_glWidget->getDeviceWidth(), _glWidget->getDeviceHeight()); } NodeToJurisdictionMap& getVoxelServerJurisdictions() { return _voxelServerJurisdictions; } NodeToJurisdictionMap& getEntityServerJurisdictions() { return _entityServerJurisdictions; } @@ -599,6 +597,7 @@ private: std::vector _voxelFades; QReadWriteLock _voxelFadesLock; ControllerScriptingInterface _controllerScriptingInterface; + CameraScriptableObject _cameraScriptableObject; QPointer _logDialog; QPointer _snapshotShareDialog; diff --git a/interface/src/Camera.h b/interface/src/Camera.h index e876f70e3a..3dd3f8a840 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -53,6 +53,8 @@ public: void setEyeOffsetOrientation(const glm::quat& o) { _eyeOffsetOrientation = o; } void setScale(const float s) { _scale = s; } + PickRay getPickRay() const { return PickRay(getPosition(), getRotation() * IDENTITY_FRONT); } + glm::vec3 getPosition() const { return _position + _hmdPosition; } glm::quat getRotation() const { return _rotation * _hmdRotation; } const glm::vec3& getHmdPosition() const { return _hmdPosition; } @@ -66,7 +68,7 @@ public: const glm::vec3& getEyeOffsetPosition() const { return _eyeOffsetPosition; } const glm::quat& getEyeOffsetOrientation() const { return _eyeOffsetOrientation; } float getScale() const { return _scale; } - + signals: void modeUpdated(CameraMode newMode); diff --git a/interface/src/scripting/JoystickScriptingInterface.cpp b/interface/src/scripting/JoystickScriptingInterface.cpp index f2c7ef4579..7fc4e48843 100644 --- a/interface/src/scripting/JoystickScriptingInterface.cpp +++ b/interface/src/scripting/JoystickScriptingInterface.cpp @@ -129,9 +129,7 @@ void JoystickScriptingInterface::update() { : HFActionEvent::endType(); // global action events fire in the center of the screen - QPointF centerPoint = Application::getInstance()->getViewportCenter(); - HFActionEvent actionEvent(actionType, centerPoint); - + HFActionEvent actionEvent(actionType, Application::getInstance()->getCamera()->getPickRay()); qApp->sendEvent(qApp, &actionEvent); } diff --git a/libraries/script-engine/src/HFActionEvent.cpp b/libraries/script-engine/src/HFActionEvent.cpp index 8a966a3fb3..780788cfca 100644 --- a/libraries/script-engine/src/HFActionEvent.cpp +++ b/libraries/script-engine/src/HFActionEvent.cpp @@ -11,9 +11,9 @@ #include "HFActionEvent.h" -HFActionEvent::HFActionEvent(QEvent::Type type, const QPointF& localPosition) : +HFActionEvent::HFActionEvent(QEvent::Type type, const PickRay& actionRay) : HFMetaEvent(type), - localPosition(localPosition) + actionRay(actionRay) { } @@ -30,8 +30,7 @@ QEvent::Type HFActionEvent::endType() { QScriptValue HFActionEvent::toScriptValue(QScriptEngine* engine, const HFActionEvent& event) { QScriptValue obj = engine->newObject(); - obj.setProperty("x", event.localPosition.x()); - obj.setProperty("y", event.localPosition.y()); + obj.setProperty("actionRay", pickRayToScriptValue(engine, event.actionRay)); return obj; } diff --git a/libraries/script-engine/src/HFActionEvent.h b/libraries/script-engine/src/HFActionEvent.h index c094161053..c16b165ae3 100644 --- a/libraries/script-engine/src/HFActionEvent.h +++ b/libraries/script-engine/src/HFActionEvent.h @@ -12,14 +12,17 @@ #ifndef hifi_HFActionEvent_h #define hifi_HFActionEvent_h -#include "HFMetaEvent.h" #include +#include + +#include "HFMetaEvent.h" + class HFActionEvent : public HFMetaEvent { public: HFActionEvent() {}; - HFActionEvent(QEvent::Type type, const QPointF& localPosition); + HFActionEvent(QEvent::Type type, const PickRay& actionRay); static QEvent::Type startType(); static QEvent::Type endType(); @@ -27,7 +30,7 @@ public: static QScriptValue toScriptValue(QScriptEngine* engine, const HFActionEvent& event); static void fromScriptValue(const QScriptValue& object, HFActionEvent& event); - QPointF localPosition; + PickRay actionRay; }; Q_DECLARE_METATYPE(HFActionEvent) diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 7fe662740a..b8884be845 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -53,7 +53,8 @@ void qURLFromScriptValue(const QScriptValue& object, QUrl& url); class PickRay { public: - PickRay() : origin(0.0f), direction(0.0f) { } + PickRay() : origin(0.0f), direction(0.0f) { } + PickRay(const glm::vec3& origin, const glm::vec3 direction) : origin(origin), direction(direction) {} glm::vec3 origin; glm::vec3 direction; };