From 77e7f336d5a5b35730969364cdf11ec9702b2240 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Feb 2014 20:03:57 -0800 Subject: [PATCH 1/6] scriptable camera --- interface/src/Application.cpp | 48 +++++++----- interface/src/Application.h | 1 + interface/src/Camera.cpp | 121 +++++++++++++++++++++-------- interface/src/Camera.h | 142 ++++++++++++++++++++-------------- interface/src/Menu.cpp | 10 ++- interface/src/Menu.h | 1 + 6 files changed, 208 insertions(+), 115 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 84ece357a7..73e58d79e2 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -434,9 +434,9 @@ void Application::paintGL() { glEnable(GL_LINE_SMOOTH); if (OculusManager::isConnected()) { - _myCamera.setUpShift (0.0f); - _myCamera.setDistance (0.0f); - _myCamera.setTightness (0.0f); // Camera is directly connected to head without smoothing + _myCamera.setUpShift(0.0f); + _myCamera.setDistance(0.0f); + _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing _myCamera.setTargetPosition(_myAvatar->getHead().calculateAverageEyePosition()); _myCamera.setTargetRotation(_myAvatar->getHead().getOrientation()); @@ -446,7 +446,7 @@ void Application::paintGL() { _myCamera.setTargetRotation(_myAvatar->getHead().getCameraOrientation()); } else if (_myCamera.getMode() == CAMERA_MODE_THIRD_PERSON) { - _myCamera.setTightness (0.0f); // Camera is directly connected to head without smoothing + _myCamera.setTightness(0.0f); // Camera is directly connected to head without smoothing _myCamera.setTargetPosition(_myAvatar->getUprightHeadPosition()); _myCamera.setTargetRotation(_myAvatar->getHead().getCameraOrientation()); @@ -2220,28 +2220,30 @@ void Application::updateMetavoxels(float deltaTime) { } } +void Application::cameraMenuChanged() { + if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { + if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { + _myCamera.setMode(CAMERA_MODE_MIRROR); + _myCamera.setModeShiftRate(100.0f); + } + } else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { + if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) { + _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); + _myCamera.setModeShiftRate(1.0f); + } + } else { + if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) { + _myCamera.setMode(CAMERA_MODE_THIRD_PERSON); + _myCamera.setModeShiftRate(1.0f); + } + } +} + void Application::updateCamera(float deltaTime) { bool showWarnings = Menu::getInstance()->isOptionChecked(MenuOption::PipelineWarnings); PerformanceWarning warn(showWarnings, "Application::updateCamera()"); if (!OculusManager::isConnected() && !TV3DManager::isConnected()) { - if (Menu::getInstance()->isOptionChecked(MenuOption::FullscreenMirror)) { - if (_myCamera.getMode() != CAMERA_MODE_MIRROR) { - _myCamera.setMode(CAMERA_MODE_MIRROR); - _myCamera.setModeShiftRate(100.0f); - } - } else if (Menu::getInstance()->isOptionChecked(MenuOption::FirstPerson)) { - if (_myCamera.getMode() != CAMERA_MODE_FIRST_PERSON) { - _myCamera.setMode(CAMERA_MODE_FIRST_PERSON); - _myCamera.setModeShiftRate(1.0f); - } - } else { - if (_myCamera.getMode() != CAMERA_MODE_THIRD_PERSON) { - _myCamera.setMode(CAMERA_MODE_THIRD_PERSON); - _myCamera.setModeShiftRate(1.0f); - } - } - if (Menu::getInstance()->isOptionChecked(MenuOption::OffAxisProjection)) { float xSign = _myCamera.getMode() == CAMERA_MODE_MIRROR ? 1.0f : -1.0f; if (_faceshift.isActive()) { @@ -4095,6 +4097,10 @@ void Application::loadScript(const QString& fileNameString) { // hook our avatar object into this script engine scriptEngine->setAvatarData( static_cast(_myAvatar), "MyAvatar"); + CameraScriptableObject* cameraScriptable = new CameraScriptableObject(&_myCamera); + scriptEngine->registerGlobalObject("Camera", cameraScriptable); + connect(scriptEngine, SIGNAL(finished(const QString&)), cameraScriptable, SLOT(deleteLater())); + QThread* workerThread = new QThread(this); // when the worker thread is started, call our engine's run.. diff --git a/interface/src/Application.h b/interface/src/Application.h index e82eaf1d6c..16173b809c 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -238,6 +238,7 @@ private slots: void setFullscreen(bool fullscreen); void setEnable3DTVMode(bool enable3DTVMode); + void cameraMenuChanged(); void renderThrustAtVoxel(const glm::vec3& thrust); diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 7ec4f90eef..4cd7059457 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -10,6 +10,7 @@ #include #include "Camera.h" +#include "Menu.h" #include "Util.h" const float CAMERA_MINIMUM_MODE_SHIFT_RATE = 0.5f; @@ -18,6 +19,10 @@ const float CAMERA_FIRST_PERSON_MODE_UP_SHIFT = 0.0f; const float CAMERA_FIRST_PERSON_MODE_DISTANCE = 0.0f; const float CAMERA_FIRST_PERSON_MODE_TIGHTNESS = 100.0f; +const float CAMERA_INDEPENDENT_MODE_UP_SHIFT = 0.0f; +const float CAMERA_INDEPENDENT_MODE_DISTANCE = 0.0f; +const float CAMERA_INDEPENDENT_MODE_TIGHTNESS = 100.0f; + const float CAMERA_THIRD_PERSON_MODE_UP_SHIFT = -0.2f; const float CAMERA_THIRD_PERSON_MODE_DISTANCE = 1.5f; const float CAMERA_THIRD_PERSON_MODE_TIGHTNESS = 8.0f; @@ -27,33 +32,33 @@ const float CAMERA_MIRROR_MODE_DISTANCE = 0.17f; const float CAMERA_MIRROR_MODE_TIGHTNESS = 100.0f; -Camera::Camera() { - - _needsToInitialize = true; - _frustumNeedsReshape = true; - - _modeShift = 1.0f; - _modeShiftRate = 1.0f; - _linearModeShift = 0.0f; - _mode = CAMERA_MODE_THIRD_PERSON; - _prevMode = CAMERA_MODE_THIRD_PERSON; - _tightness = 10.0f; // default - _fieldOfView = DEFAULT_FIELD_OF_VIEW_DEGREES; - _aspectRatio = 16.f/9.f; - _nearClip = 0.08f; // default - _farClip = 50.0f * TREE_SCALE; // default - _upShift = 0.0f; - _distance = 0.0f; - _previousUpShift = 0.0f; - _previousDistance = 0.0f; - _previousTightness = 0.0f; - _newUpShift = 0.0f; - _newDistance = 0.0f; - _newTightness = 0.0f; - _targetPosition = glm::vec3(0.0f, 0.0f, 0.0f); - _position = glm::vec3(0.0f, 0.0f, 0.0f); - _idealPosition = glm::vec3(0.0f, 0.0f, 0.0f); - _scale = 1.0f; +Camera::Camera() : + _needsToInitialize(true), + _mode(CAMERA_MODE_THIRD_PERSON), + _prevMode(CAMERA_MODE_THIRD_PERSON), + _frustumNeedsReshape(true), + _position(0.0f, 0.0f, 0.0f), + _idealPosition(0.0f, 0.0f, 0.0f), + _targetPosition(0.0f, 0.0f, 0.0f), + _fieldOfView(DEFAULT_FIELD_OF_VIEW_DEGREES), + _aspectRatio(16.f/9.f), + _nearClip(0.08f), // default + _farClip(50.0f * TREE_SCALE), // default + _upShift(0.0f), + _distance(0.0f), + _tightness(10.0f), // default + _previousUpShift(0.0f), + _previousDistance(0.0f), + _previousTightness(0.0f), + _newUpShift(0.0f), + _newDistance(0.0f), + _newTightness(0.0f), + _modeShift(1.0f), + _linearModeShift(0.0f), + _modeShiftRate(1.0f), + _scale(1.0f) + //,_wantsAutoFollow(true) +{ } void Camera::update(float deltaTime) { @@ -66,12 +71,9 @@ void Camera::update(float deltaTime) { // use iterative forces to keep the camera at the desired position and angle void Camera::updateFollowMode(float deltaTime) { - if (_linearModeShift < 1.0f) { _linearModeShift += _modeShiftRate * deltaTime; - _modeShift = ONE_HALF - ONE_HALF * cosf(_linearModeShift * PIE ); - _upShift = _previousUpShift * (1.0f - _modeShift) + _newUpShift * _modeShift; _distance = _previousDistance * (1.0f - _modeShift) + _newDistance * _modeShift; _tightness = _previousTightness * (1.0f - _modeShift) + _newTightness * _modeShift; @@ -98,7 +100,6 @@ void Camera::updateFollowMode(float deltaTime) { _idealPosition = _targetPosition + _scale * (_rotation * glm::vec3(0.0f, _upShift, _distance)); _position = _idealPosition; _needsToInitialize = false; - } else { // pull rotation towards ideal _rotation = safeMix(_rotation, _targetRotation, t); @@ -137,16 +138,19 @@ void Camera::setMode(CameraMode m) { _newUpShift = CAMERA_THIRD_PERSON_MODE_UP_SHIFT; _newDistance = CAMERA_THIRD_PERSON_MODE_DISTANCE; _newTightness = CAMERA_THIRD_PERSON_MODE_TIGHTNESS; - } else if (_mode == CAMERA_MODE_FIRST_PERSON) { _newUpShift = CAMERA_FIRST_PERSON_MODE_UP_SHIFT; _newDistance = CAMERA_FIRST_PERSON_MODE_DISTANCE; _newTightness = CAMERA_FIRST_PERSON_MODE_TIGHTNESS; - } else if (_mode == CAMERA_MODE_MIRROR) { _newUpShift = CAMERA_MIRROR_MODE_UP_SHIFT; _newDistance = CAMERA_MIRROR_MODE_DISTANCE; _newTightness = CAMERA_MIRROR_MODE_TIGHTNESS; + } else if (_mode == CAMERA_MODE_INDEPENDENT) { + _newUpShift = CAMERA_INDEPENDENT_MODE_UP_SHIFT; + _newDistance = CAMERA_INDEPENDENT_MODE_DISTANCE; + _newTightness = CAMERA_INDEPENDENT_MODE_TIGHTNESS; + } } @@ -218,4 +222,55 @@ void Camera::setFrustumWasReshaped() { } +QString CameraScriptableObject::getMode() const { + QString mode("unknown"); + switch(_camera->getMode()) { + case CAMERA_MODE_THIRD_PERSON: + mode = "third person"; + break; + case CAMERA_MODE_FIRST_PERSON: + mode = "first person"; + break; + case CAMERA_MODE_MIRROR: + mode = "mirror"; + break; + case CAMERA_MODE_INDEPENDENT: + mode = "independent"; + break; + default: + break; + } + return mode; +} + +void CameraScriptableObject::setMode(const QString& mode) { + CameraMode currentMode = _camera->getMode(); + CameraMode targetMode = currentMode; + if (mode == "third person") { + targetMode = CAMERA_MODE_THIRD_PERSON; + Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, false); + Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, false); + } else if (mode == "first person") { + targetMode = CAMERA_MODE_FIRST_PERSON; + Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, false); + Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, true); + } else if (mode == "mirror") { + targetMode = CAMERA_MODE_MIRROR; + Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, true); + Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, false); + } else if (mode == "independent") { + targetMode = CAMERA_MODE_INDEPENDENT; + Menu::getInstance()->setIsOptionChecked(MenuOption::FullscreenMirror, false); + Menu::getInstance()->setIsOptionChecked(MenuOption::FirstPerson, false); + } + if (currentMode != targetMode) { + _camera->setMode(targetMode); + _camera->setModeShiftRate(10.0f); + } +} + +void CameraScriptableObject::setPosition(const glm::vec3& p) { + _camera->setTargetPosition(p); +} + diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 7fc9b47634..65109492fd 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -11,7 +11,7 @@ #include #include -const float DEFAULT_FIELD_OF_VIEW_DEGREES = 90.0f; +const float DEFAULT_FIELD_OF_VIEW_DEGREES = 90.0f; enum CameraMode { @@ -19,11 +19,12 @@ enum CameraMode CAMERA_MODE_THIRD_PERSON, CAMERA_MODE_FIRST_PERSON, CAMERA_MODE_MIRROR, + CAMERA_MODE_INDEPENDENT, NUM_CAMERA_MODES }; -class Camera -{ +class Camera { + public: Camera(); @@ -31,73 +32,96 @@ public: void update( float deltaTime ); - void setUpShift ( float u ) { _upShift = u; } - void setDistance ( float d ) { _distance = d; } - void setTargetPosition( const glm::vec3& t ) { _targetPosition = t; } - void setPosition ( const glm::vec3& p ) { _position = p; } - void setTightness ( float t ) { _tightness = t; } - void setTargetRotation( const glm::quat& rotation ); + void setUpShift(float u) { _upShift = u; } + void setDistance(float d) { _distance = d; } + void setPosition(const glm::vec3& p) { _position = p; } + void setTargetPosition(const glm::vec3& t) { _targetPosition = t; } + void setTightness(float t) { _tightness = t; } + void setTargetRotation(const glm::quat& rotation); - void setMode ( CameraMode m ); - void setModeShiftRate ( float r ); - void setFieldOfView ( float f ); - void setAspectRatio ( float a ); - void setNearClip ( float n ); - void setFarClip ( float f ); - void setEyeOffsetPosition ( const glm::vec3& p ); - void setEyeOffsetOrientation( const glm::quat& o ); - void setScale ( const float s ); + void setMode(CameraMode m); + void setModeShiftRate(float r); + void setFieldOfView(float f); + void setAspectRatio(float a); + void setNearClip(float n); + void setFarClip(float f); + void setEyeOffsetPosition(const glm::vec3& p); + void setEyeOffsetOrientation(const glm::quat& o); + void setScale(const float s); - const glm::vec3& getTargetPosition () const { return _targetPosition; } - const glm::vec3& getPosition () const { return _position; } - const glm::quat& getTargetRotation () const { return _targetRotation; } - const glm::quat& getRotation () const { return _rotation; } - CameraMode getMode () const { return _mode; } - float getFieldOfView () const { return _fieldOfView; } - float getAspectRatio () const { return _aspectRatio; } - float getNearClip () const { return _scale * _nearClip; } - float getFarClip () const; - const glm::vec3& getEyeOffsetPosition () const { return _eyeOffsetPosition; } - const glm::quat& getEyeOffsetOrientation () const { return _eyeOffsetOrientation; } - float getScale () const { return _scale; } + const glm::vec3& getPosition() const { return _position; } + const glm::quat& getRotation() const { return _rotation; } + CameraMode getMode() const { return _mode; } + const glm::vec3& getTargetPosition() const { return _targetPosition; } + const glm::quat& getTargetRotation() const { return _targetRotation; } + float getFieldOfView() const { return _fieldOfView; } + float getAspectRatio() const { return _aspectRatio; } + float getNearClip() const { return _scale * _nearClip; } + float getFarClip() const; + const glm::vec3& getEyeOffsetPosition() const { return _eyeOffsetPosition; } + const glm::quat& getEyeOffsetOrientation() const { return _eyeOffsetOrientation; } + float getScale() const { return _scale; } CameraMode getInterpolatedMode() const; bool getFrustumNeedsReshape() const; // call to find out if the view frustum needs to be reshaped void setFrustumWasReshaped(); // call this after reshaping the view frustum. + + bool getWantsAutoFollow() const { return _wantsAutoFollow; } + void setWantsAutoFollow(bool value) { _wantsAutoFollow = value; } private: - bool _needsToInitialize; - CameraMode _mode; - CameraMode _prevMode; - bool _frustumNeedsReshape; - glm::vec3 _position; - glm::vec3 _idealPosition; - glm::vec3 _targetPosition; - float _fieldOfView; - float _aspectRatio; - float _nearClip; - float _farClip; - glm::vec3 _eyeOffsetPosition; - glm::quat _eyeOffsetOrientation; - glm::quat _rotation; - glm::quat _targetRotation; - float _upShift; - float _distance; - float _tightness; - float _previousUpShift; - float _previousDistance; - float _previousTightness; - float _newUpShift; - float _newDistance; - float _newTightness; - float _modeShift; - float _linearModeShift; - float _modeShiftRate; - float _scale; + bool _needsToInitialize; + CameraMode _mode; + CameraMode _prevMode; + bool _frustumNeedsReshape; + glm::vec3 _position; + glm::vec3 _idealPosition; + glm::vec3 _targetPosition; + float _fieldOfView; + float _aspectRatio; + float _nearClip; + float _farClip; + glm::vec3 _eyeOffsetPosition; + glm::quat _eyeOffsetOrientation; + glm::quat _rotation; + glm::quat _targetRotation; + float _upShift; + float _distance; + float _tightness; + float _previousUpShift; + float _previousDistance; + float _previousTightness; + float _newUpShift; + float _newDistance; + float _newTightness; + float _modeShift; + float _linearModeShift; + float _modeShiftRate; + float _scale; + + bool _wantsAutoFollow; - void updateFollowMode( float deltaTime ); + void updateFollowMode(float deltaTime); }; + +class CameraScriptableObject : public QObject { + Q_OBJECT +public: + CameraScriptableObject(Camera* camera) { _camera = camera; } + +public slots: + QString getMode() const; + void setMode(const QString& mode); + void setPosition(const glm::vec3& p); + glm::vec3 getPosition() const { return _camera->getPosition(); } + + //bool getWantsAutoFollow() const { return _camera->getWantsAutoFollow(); } + //void setWantsAutoFollow(bool value) { _camera->setWantsAutoFollow(value); } + +private: + Camera* _camera; +}; #endif diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 709f848a2f..6ea1247049 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -232,9 +232,12 @@ Menu::Menu() : false, appInstance, SLOT(setFullscreen(bool))); - addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FirstPerson, Qt::Key_P, true, + appInstance,SLOT(cameraMenuChanged())); addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Mirror, Qt::SHIFT | Qt::Key_H); - addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FullscreenMirror, Qt::Key_H); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::FullscreenMirror, Qt::Key_H,false, + appInstance,SLOT(cameraMenuChanged())); + addCheckableActionToQMenuAndActionHash(viewMenu, MenuOption::Enable3DTVMode, 0, false, appInstance, @@ -690,6 +693,9 @@ void Menu::removeAction(QMenu* menu, const QString& actionName) { menu->removeAction(_actionHash.value(actionName)); } +void Menu::setIsOptionChecked(const QString& menuOption, bool isChecked) { + return _actionHash.value(menuOption)->setChecked(isChecked); +} bool Menu::isOptionChecked(const QString& menuOption) { return _actionHash.value(menuOption)->isChecked(); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 6f7986fcc3..fcd2d74940 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -48,6 +48,7 @@ public: ~Menu(); bool isOptionChecked(const QString& menuOption); + void setIsOptionChecked(const QString& menuOption, bool isChecked); void triggerOption(const QString& menuOption); QAction* getActionForOption(const QString& menuOption); bool isVoxelModeActionChecked(); From 666393fdadb51d5541aa8e40deeb74434673bc4d Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Feb 2014 20:05:48 -0800 Subject: [PATCH 2/6] removed dead code --- interface/src/Camera.cpp | 1 - interface/src/Camera.h | 8 -------- 2 files changed, 9 deletions(-) diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 4cd7059457..3dcc7a7089 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -57,7 +57,6 @@ Camera::Camera() : _linearModeShift(0.0f), _modeShiftRate(1.0f), _scale(1.0f) - //,_wantsAutoFollow(true) { } diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 65109492fd..7ad3a0e626 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -67,9 +67,6 @@ public: bool getFrustumNeedsReshape() const; // call to find out if the view frustum needs to be reshaped void setFrustumWasReshaped(); // call this after reshaping the view frustum. - bool getWantsAutoFollow() const { return _wantsAutoFollow; } - void setWantsAutoFollow(bool value) { _wantsAutoFollow = value; } - private: bool _needsToInitialize; @@ -101,8 +98,6 @@ private: float _modeShiftRate; float _scale; - bool _wantsAutoFollow; - void updateFollowMode(float deltaTime); }; @@ -118,9 +113,6 @@ public slots: void setPosition(const glm::vec3& p); glm::vec3 getPosition() const { return _camera->getPosition(); } - //bool getWantsAutoFollow() const { return _camera->getWantsAutoFollow(); } - //void setWantsAutoFollow(bool value) { _camera->setWantsAutoFollow(value); } - private: Camera* _camera; }; From 7379f9c92304133c4d750757a9137af0ca1f70b3 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 6 Feb 2014 23:59:46 -0800 Subject: [PATCH 3/6] tweaks to scriptable camera --- interface/src/Camera.cpp | 3 --- interface/src/Camera.h | 6 +++++- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index 3dcc7a7089..cc53f29373 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -268,8 +268,5 @@ void CameraScriptableObject::setMode(const QString& mode) { } } -void CameraScriptableObject::setPosition(const glm::vec3& p) { - _camera->setTargetPosition(p); -} diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 7ad3a0e626..3d44b875f5 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -110,9 +110,13 @@ public: public slots: QString getMode() const; void setMode(const QString& mode); - void setPosition(const glm::vec3& p); + void setPosition(const glm::vec3& value) { _camera->setTargetPosition(value);} + glm::vec3 getPosition() const { return _camera->getPosition(); } + void setOrientation(const glm::quat& value) { _camera->setTargetRotation(value); } + glm::quat getOrientation() const { return _camera->getRotation(); } + private: Camera* _camera; }; From e50f6389ca9db47f6919d62ee7f241229e6d9a43 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 7 Feb 2014 00:00:30 -0800 Subject: [PATCH 4/6] add more JS Quat features --- libraries/script-engine/src/Quat.cpp | 4 ++++ libraries/script-engine/src/Quat.h | 1 + 2 files changed, 5 insertions(+) diff --git a/libraries/script-engine/src/Quat.cpp b/libraries/script-engine/src/Quat.cpp index 12900c29c7..41dafcf40a 100644 --- a/libraries/script-engine/src/Quat.cpp +++ b/libraries/script-engine/src/Quat.cpp @@ -18,3 +18,7 @@ glm::quat Quat::multiply(const glm::quat& q1, const glm::quat& q2) { glm::quat Quat::fromVec3(const glm::vec3& vec3) { return glm::quat(vec3); } + +glm::quat Quat::fromPitchYawRoll(float pitch, float yaw, float roll) { + return glm::quat(glm::radians(glm::vec3(pitch, yaw, roll))); +} diff --git a/libraries/script-engine/src/Quat.h b/libraries/script-engine/src/Quat.h index 6bcd121808..7695fe9daf 100644 --- a/libraries/script-engine/src/Quat.h +++ b/libraries/script-engine/src/Quat.h @@ -22,6 +22,7 @@ class Quat : public QObject { public slots: glm::quat multiply(const glm::quat& q1, const glm::quat& q2); glm::quat fromVec3(const glm::vec3& vec3); + glm::quat fromPitchYawRoll(float pitch, float yaw, float roll); }; From 41f6650b209b213e35c03ae7f0e6dd91fb565bb8 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 7 Feb 2014 01:23:30 -0800 Subject: [PATCH 5/6] implement movable independent camera with hydra --- examples/cameraExample.js | 125 ++++++++++++++++++ interface/src/Application.h | 1 + .../src/ControllerScriptingInterface.cpp | 16 +++ interface/src/ControllerScriptingInterface.h | 6 +- interface/src/avatar/MyAvatar.cpp | 36 ++--- libraries/script-engine/src/Quat.cpp | 13 ++ libraries/script-engine/src/Quat.h | 3 + libraries/script-engine/src/ScriptEngine.cpp | 1 + libraries/script-engine/src/ScriptEngine.h | 2 + libraries/script-engine/src/Vec3.cpp | 24 ++++ libraries/script-engine/src/Vec3.h | 31 +++++ 11 files changed, 241 insertions(+), 17 deletions(-) create mode 100644 examples/cameraExample.js create mode 100644 libraries/script-engine/src/Vec3.cpp create mode 100644 libraries/script-engine/src/Vec3.h diff --git a/examples/cameraExample.js b/examples/cameraExample.js new file mode 100644 index 0000000000..d1d91e6ed5 --- /dev/null +++ b/examples/cameraExample.js @@ -0,0 +1,125 @@ +// +// cameraExample.js +// hifi +// +// Created by Brad Hefta-Gaub on 2/6/14. +// Copyright (c) 2014 HighFidelity, Inc. All rights reserved. +// +// This is an example script that demonstrates use of the Camera class +// +// + +var damping = 0.9; +var yaw = 0.0; +var pitch = 0.0; +var roll = 0.0; +var thrust = { x: 0, y: 0, z: 0 }; +var velocity = { x: 0, y: 0, z: 0 }; +var position = { x: MyAvatar.position.x, y: MyAvatar.position.y + 1, z: MyAvatar.position.z }; +var joysticksCaptured = false; +var THRUST_CONTROLLER = 0; +var VIEW_CONTROLLER = 1; + +function checkCamera() { + if (Camera.getMode() == "independent") { + var deltaTime = 1/60; // approximately our FPS - maybe better to be elapsed time since last call + var THRUST_MAG_UP = 800.0; + var THRUST_MAG_DOWN = 300.0; + var THRUST_MAG_FWD = 500.0; + var THRUST_MAG_BACK = 300.0; + var THRUST_MAG_LATERAL = 250.0; + var THRUST_JUMP = 120.0; + var scale = 1.0; + var thrustMultiplier = 1.0; // maybe increase this as you hold it down? + + var YAW_MAG = 500.0; + var PITCH_MAG = 100.0; + var THRUST_MAG_HAND_JETS = THRUST_MAG_FWD; + var JOYSTICK_YAW_MAG = YAW_MAG; + var JOYSTICK_PITCH_MAG = PITCH_MAG * 0.5; + + var thrustJoystickPosition = Controller.getJoystickPosition(THRUST_CONTROLLER); + + var currentOrientation = Camera.getOrientation(); + + var front = Quat.getFront(currentOrientation); + var right = Quat.getRight(currentOrientation); + var up = Quat.getUp(currentOrientation); + + var thrustFront = Vec3.multiply(front, scale * THRUST_MAG_HAND_JETS * thrustJoystickPosition.y * thrustMultiplier * deltaTime); + var thrustRight = Vec3.multiply(right, scale * THRUST_MAG_HAND_JETS * thrustJoystickPosition.x * thrustMultiplier * deltaTime); + + thrust = Vec3.sum(thrust, thrustFront); + thrust = Vec3.sum(thrust, thrustRight); + + // add thrust to velocity + velocity = Vec3.sum(velocity, Vec3.multiply(thrust, deltaTime)); + + // add velocity to position + position = Vec3.sum(position, Vec3.multiply(velocity, deltaTime)); + Camera.setPosition(position); + + // reset thrust + thrust = { x: 0, y: 0, z: 0 }; + + // damp velocity + velocity = Vec3.multiply(velocity, damping); + + // View Controller + var viewJoystickPosition = Controller.getJoystickPosition(VIEW_CONTROLLER); + yaw -= viewJoystickPosition.x * JOYSTICK_YAW_MAG * deltaTime; + pitch += viewJoystickPosition.y * JOYSTICK_PITCH_MAG * deltaTime; + var orientation = Quat.fromPitchYawRoll(pitch, yaw, roll); + Camera.setOrientation(orientation); + } +} + +Script.willSendVisualDataCallback.connect(checkCamera); + + +function keyPressEvent(event) { + if (joysticksCaptured) { + Controller.releaseJoystick(THRUST_CONTROLLER); + Controller.releaseJoystick(VIEW_CONTROLLER); + joysticksCaptured = false; + } + + if (event.text == "1") { + Camera.setMode("first person"); + } + + if (event.text == "2") { + Camera.setMode("mirror"); + } + + if (event.text == "3") { + Camera.setMode("third person"); + } + + if (event.text == "4") { + Camera.setMode("independent"); + joysticksCaptured = true; + Controller.captureJoystick(THRUST_CONTROLLER); + Controller.captureJoystick(VIEW_CONTROLLER); + position = { x: MyAvatar.position.x, y: MyAvatar.position.y + 1, z: MyAvatar.position.z }; + } +} + + +// Map keyPress and mouse move events to our callbacks +Controller.keyPressEvent.connect(keyPressEvent); +Controller.captureKeyEvents({ text: "1" }); +Controller.captureKeyEvents({ text: "2" }); +Controller.captureKeyEvents({ text: "3" }); +Controller.captureKeyEvents({ text: "4" }); +function scriptEnding() { + // re-enabled the standard application for touch events + Controller.releaseKeyEvents({ text: "1" }); + Controller.releaseKeyEvents({ text: "2" }); + Controller.releaseKeyEvents({ text: "3" }); + Controller.releaseKeyEvents({ text: "4" }); + Controller.releaseJoystick(THRUST_CONTROLLER); + Controller.releaseJoystick(VIEW_CONTROLLER); +} +Script.scriptEnding.connect(scriptEnding); + diff --git a/interface/src/Application.h b/interface/src/Application.h index 16173b809c..1ca34a910a 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -170,6 +170,7 @@ public: GeometryCache* getGeometryCache() { return &_geometryCache; } TextureCache* getTextureCache() { return &_textureCache; } GlowEffect* getGlowEffect() { return &_glowEffect; } + ControllerScriptingInterface* getControllerScriptingInterface() { return &_controllerScriptingInterface; } AvatarManager& getAvatarManager() { return _avatarManager; } Profile* getProfile() { return &_profile; } diff --git a/interface/src/ControllerScriptingInterface.cpp b/interface/src/ControllerScriptingInterface.cpp index 4d7540c06c..8716116877 100644 --- a/interface/src/ControllerScriptingInterface.cpp +++ b/interface/src/ControllerScriptingInterface.cpp @@ -219,3 +219,19 @@ void ControllerScriptingInterface::releaseKeyEvents(const KeyEvent& event) { } } +bool ControllerScriptingInterface::isJoystickCaptured(int joystickIndex) const { + return _capturedJoysticks.contains(joystickIndex); +} + +void ControllerScriptingInterface::captureJoystick(int joystickIndex) { + if (!isJoystickCaptured(joystickIndex)) { + _capturedJoysticks.insert(joystickIndex); + } +} + +void ControllerScriptingInterface::releaseJoystick(int joystickIndex) { + if (isJoystickCaptured(joystickIndex)) { + _capturedJoysticks.remove(joystickIndex); + } +} + diff --git a/interface/src/ControllerScriptingInterface.h b/interface/src/ControllerScriptingInterface.h index e84039bcb0..1446809a13 100644 --- a/interface/src/ControllerScriptingInterface.h +++ b/interface/src/ControllerScriptingInterface.h @@ -38,7 +38,7 @@ public: bool isMouseCaptured() const { return _mouseCaptured; } bool isTouchCaptured() const { return _touchCaptured; } bool isWheelCaptured() const { return _wheelCaptured; } - + bool isJoystickCaptured(int joystickIndex) const; public slots: virtual bool isPrimaryButtonPressed() const; @@ -70,6 +70,9 @@ public slots: virtual void captureWheelEvents() { _wheelCaptured = true; } virtual void releaseWheelEvents() { _wheelCaptured = false; } + virtual void captureJoystick(int joystickIndex); + virtual void releaseJoystick(int joystickIndex); + private: const PalmData* getPrimaryPalm() const; const PalmData* getPalm(int palmIndex) const; @@ -80,6 +83,7 @@ private: bool _touchCaptured; bool _wheelCaptured; QMultiMap _capturedKeys; + QSet _capturedJoysticks; }; const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 2; // the hand and the tip diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index 0bdc5e9748..ba0c98123c 100644 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -792,23 +792,27 @@ void MyAvatar::updateThrust(float deltaTime) { const int VIEW_CONTROLLER = 1; for (size_t i = 0; i < getHand().getPalms().size(); ++i) { PalmData& palm = getHand().getPalms()[i]; - if (palm.isActive() && (palm.getSixenseID() == THRUST_CONTROLLER)) { - if (palm.getJoystickY() != 0.f) { - FingerData& finger = palm.getFingers()[0]; - if (finger.isActive()) { + + // If the script hasn't captured this joystick, then let the default behavior work + if (!Application::getInstance()->getControllerScriptingInterface()->isJoystickCaptured(palm.getSixenseID())) { + if (palm.isActive() && (palm.getSixenseID() == THRUST_CONTROLLER)) { + if (palm.getJoystickY() != 0.f) { + FingerData& finger = palm.getFingers()[0]; + if (finger.isActive()) { + } + _thrust += front * _scale * THRUST_MAG_HAND_JETS * palm.getJoystickY() * _thrustMultiplier * deltaTime; + } + if (palm.getJoystickX() != 0.f) { + _thrust += right * _scale * THRUST_MAG_HAND_JETS * palm.getJoystickX() * _thrustMultiplier * deltaTime; + } + } else if (palm.isActive() && (palm.getSixenseID() == VIEW_CONTROLLER)) { + if (palm.getJoystickX() != 0.f) { + _bodyYawDelta -= palm.getJoystickX() * JOYSTICK_YAW_MAG * deltaTime; + } + if (palm.getJoystickY() != 0.f) { + getHand().setPitchUpdate(getHand().getPitchUpdate() + + (palm.getJoystickY() * JOYSTICK_PITCH_MAG * deltaTime)); } - _thrust += front * _scale * THRUST_MAG_HAND_JETS * palm.getJoystickY() * _thrustMultiplier * deltaTime; - } - if (palm.getJoystickX() != 0.f) { - _thrust += right * _scale * THRUST_MAG_HAND_JETS * palm.getJoystickX() * _thrustMultiplier * deltaTime; - } - } else if (palm.isActive() && (palm.getSixenseID() == VIEW_CONTROLLER)) { - if (palm.getJoystickX() != 0.f) { - _bodyYawDelta -= palm.getJoystickX() * JOYSTICK_YAW_MAG * deltaTime; - } - if (palm.getJoystickY() != 0.f) { - getHand().setPitchUpdate(getHand().getPitchUpdate() + - (palm.getJoystickY() * JOYSTICK_PITCH_MAG * deltaTime)); } } diff --git a/libraries/script-engine/src/Quat.cpp b/libraries/script-engine/src/Quat.cpp index 41dafcf40a..a197d59aeb 100644 --- a/libraries/script-engine/src/Quat.cpp +++ b/libraries/script-engine/src/Quat.cpp @@ -9,6 +9,7 @@ // // +#include #include "Quat.h" glm::quat Quat::multiply(const glm::quat& q1, const glm::quat& q2) { @@ -22,3 +23,15 @@ glm::quat Quat::fromVec3(const glm::vec3& vec3) { glm::quat Quat::fromPitchYawRoll(float pitch, float yaw, float roll) { return glm::quat(glm::radians(glm::vec3(pitch, yaw, roll))); } + +glm::vec3 Quat::getFront(const glm::quat& orientation) { + return orientation * IDENTITY_FRONT; +} + +glm::vec3 Quat::getRight(const glm::quat& orientation) { + return orientation * IDENTITY_RIGHT; +} + +glm::vec3 Quat::getUp(const glm::quat& orientation) { + return orientation * IDENTITY_UP; +} diff --git a/libraries/script-engine/src/Quat.h b/libraries/script-engine/src/Quat.h index 7695fe9daf..72fec6d6dc 100644 --- a/libraries/script-engine/src/Quat.h +++ b/libraries/script-engine/src/Quat.h @@ -23,6 +23,9 @@ public slots: glm::quat multiply(const glm::quat& q1, const glm::quat& q2); glm::quat fromVec3(const glm::vec3& vec3); glm::quat fromPitchYawRoll(float pitch, float yaw, float roll); + glm::vec3 getFront(const glm::quat& orientation); + glm::vec3 getRight(const glm::quat& orientation); + glm::vec3 getUp(const glm::quat& orientation); }; diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index b3b0736114..738896495b 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -140,6 +140,7 @@ void ScriptEngine::init() { registerGlobalObject("Data", &_dataServerScriptingInterface); registerGlobalObject("Particles", &_particlesScriptingInterface); registerGlobalObject("Quat", &_quatLibrary); + registerGlobalObject("Vec3", &_vec3Library); registerGlobalObject("Voxels", &_voxelsScriptingInterface); diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 98d5860332..b9443c5fe5 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -26,6 +26,7 @@ class ParticlesScriptingInterface; #include "AbstractControllerScriptingInterface.h" #include "DataServerScriptingInterface.h" #include "Quat.h" +#include "Vec3.h" const QString NO_SCRIPT(""); @@ -105,6 +106,7 @@ private: AbstractMenuInterface* _menu; static int _scriptNumber; Quat _quatLibrary; + Vec3 _vec3Library; }; #endif /* defined(__hifi__ScriptEngine__) */ diff --git a/libraries/script-engine/src/Vec3.cpp b/libraries/script-engine/src/Vec3.cpp new file mode 100644 index 0000000000..87b1b510a4 --- /dev/null +++ b/libraries/script-engine/src/Vec3.cpp @@ -0,0 +1,24 @@ +// +// Vec3.cpp +// hifi +// +// Created by Brad Hefta-Gaub on 1/29/14 +// Copyright (c) 2014 High Fidelity, Inc. All rights reserved. +// +// Scriptable Vec3 class library. +// +// + +#include "Vec3.h" + +glm::vec3 Vec3::multiply(const glm::vec3& v1, const glm::vec3& v2) { + return v1 * v2; +} + +glm::vec3 Vec3::multiply(const glm::vec3& v1, float f) { + return v1 * f; +} + +glm::vec3 Vec3::sum(const glm::vec3& v1, const glm::vec3& v2) { + return v1 + v2; +} diff --git a/libraries/script-engine/src/Vec3.h b/libraries/script-engine/src/Vec3.h new file mode 100644 index 0000000000..1cc44f3061 --- /dev/null +++ b/libraries/script-engine/src/Vec3.h @@ -0,0 +1,31 @@ +// +// Vec3.h +// hifi +// +// Created by Brad Hefta-Gaub on 1/29/14 +// Copyright (c) 2014 High Fidelity, Inc. All rights reserved. +// +// Scriptable Vec3 class library. +// +// + +#ifndef __hifi__Vec3__ +#define __hifi__Vec3__ + +#include +#include +#include + +/// Scriptable interface a Vec3ernion helper class object. Used exclusively in the JavaScript API +class Vec3 : public QObject { + Q_OBJECT + +public slots: + glm::vec3 multiply(const glm::vec3& v1, const glm::vec3& v2); + glm::vec3 multiply(const glm::vec3& v1, float f); + glm::vec3 sum(const glm::vec3& v1, const glm::vec3& v2); +}; + + + +#endif /* defined(__hifi__Vec3__) */ From 215734980448168837da3c77ab76cf4dc2038c79 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Fri, 7 Feb 2014 09:40:52 -0800 Subject: [PATCH 6/6] added Camera.computePickRay() --- examples/cameraExample.js | 10 ++++++++ interface/src/Application.cpp | 2 +- interface/src/Camera.cpp | 23 ++++++++++++++--- interface/src/Camera.h | 7 +++++- libraries/script-engine/src/EventTypes.cpp | 10 +++++--- libraries/script-engine/src/EventTypes.h | 9 +++---- libraries/shared/src/RegisteredMetaTypes.cpp | 26 ++++++++++++++++++++ libraries/shared/src/RegisteredMetaTypes.h | 12 ++++++++- 8 files changed, 83 insertions(+), 16 deletions(-) diff --git a/examples/cameraExample.js b/examples/cameraExample.js index d1d91e6ed5..d42c3c1b0e 100644 --- a/examples/cameraExample.js +++ b/examples/cameraExample.js @@ -76,6 +76,16 @@ function checkCamera() { Script.willSendVisualDataCallback.connect(checkCamera); +function mouseMoveEvent(event) { + print("mouseMoveEvent event.x,y=" + event.x + ", " + event.y); + var pickRay = Camera.computePickRay(event.x, event.y); + print("called Camera.computePickRay()"); + print("computePickRay origin=" + pickRay.origin.x + ", " + pickRay.origin.y + ", " + pickRay.origin.z); + print("computePickRay direction=" + pickRay.direction.x + ", " + pickRay.direction.y + ", " + pickRay.direction.z); +} + +Controller.mouseMoveEvent.connect(mouseMoveEvent); + function keyPressEvent(event) { if (joysticksCaptured) { diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 73e58d79e2..f3f6321281 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4097,7 +4097,7 @@ void Application::loadScript(const QString& fileNameString) { // hook our avatar object into this script engine scriptEngine->setAvatarData( static_cast(_myAvatar), "MyAvatar"); - CameraScriptableObject* cameraScriptable = new CameraScriptableObject(&_myCamera); + CameraScriptableObject* cameraScriptable = new CameraScriptableObject(&_myCamera, &_viewFrustum); scriptEngine->registerGlobalObject("Camera", cameraScriptable); connect(scriptEngine, SIGNAL(finished(const QString&)), cameraScriptable, SLOT(deleteLater())); diff --git a/interface/src/Camera.cpp b/interface/src/Camera.cpp index cc53f29373..87725967b9 100644 --- a/interface/src/Camera.cpp +++ b/interface/src/Camera.cpp @@ -8,7 +8,9 @@ #include #include +#include +#include "Application.h" #include "Camera.h" #include "Menu.h" #include "Util.h" @@ -168,22 +170,22 @@ void Camera::setAspectRatio(float a) { _frustumNeedsReshape = true; } -void Camera::setNearClip (float n) { +void Camera::setNearClip(float n) { _nearClip = n; _frustumNeedsReshape = true; } -void Camera::setFarClip (float f) { +void Camera::setFarClip(float f) { _farClip = f; _frustumNeedsReshape = true; } -void Camera::setEyeOffsetPosition (const glm::vec3& p) { +void Camera::setEyeOffsetPosition(const glm::vec3& p) { _eyeOffsetPosition = p; _frustumNeedsReshape = true; } -void Camera::setEyeOffsetOrientation (const glm::quat& o) { +void Camera::setEyeOffsetOrientation(const glm::quat& o) { _eyeOffsetOrientation = o; _frustumNeedsReshape = true; } @@ -221,6 +223,19 @@ void Camera::setFrustumWasReshaped() { } +CameraScriptableObject::CameraScriptableObject(Camera* camera, ViewFrustum* viewFrustum) : + _camera(camera), _viewFrustum(viewFrustum) +{ +} + +PickRay CameraScriptableObject::computePickRay(float x, float y) { + float screenWidth = Application::getInstance()->getGLWidget()->width(); + float screenHeight = Application::getInstance()->getGLWidget()->height(); + PickRay result; + _viewFrustum->computePickRay(x / screenWidth, y / screenHeight, result.origin, result.direction); + return result; +} + QString CameraScriptableObject::getMode() const { QString mode("unknown"); switch(_camera->getMode()) { diff --git a/interface/src/Camera.h b/interface/src/Camera.h index 3d44b875f5..075f1a7ed6 100644 --- a/interface/src/Camera.h +++ b/interface/src/Camera.h @@ -10,6 +10,8 @@ #include #include +#include +#include const float DEFAULT_FIELD_OF_VIEW_DEGREES = 90.0f; @@ -105,7 +107,7 @@ private: class CameraScriptableObject : public QObject { Q_OBJECT public: - CameraScriptableObject(Camera* camera) { _camera = camera; } + CameraScriptableObject(Camera* camera, ViewFrustum* viewFrustum); public slots: QString getMode() const; @@ -117,7 +119,10 @@ public slots: void setOrientation(const glm::quat& value) { _camera->setTargetRotation(value); } glm::quat getOrientation() const { return _camera->getRotation(); } + PickRay computePickRay(float x, float y); + private: Camera* _camera; + ViewFrustum* _viewFrustum; }; #endif diff --git a/libraries/script-engine/src/EventTypes.cpp b/libraries/script-engine/src/EventTypes.cpp index ff27282b73..a642183eb4 100644 --- a/libraries/script-engine/src/EventTypes.cpp +++ b/libraries/script-engine/src/EventTypes.cpp @@ -124,7 +124,7 @@ QScriptValue keyEventToScriptValue(QScriptEngine* engine, const KeyEvent& event) return obj; } -void keyEventFromScriptValue(const QScriptValue &object, KeyEvent& event) { +void keyEventFromScriptValue(const QScriptValue& object, KeyEvent& event) { event.isValid = false; // assume the worst event.isMeta = object.property("isMeta").toVariant().toBool(); @@ -231,7 +231,7 @@ QScriptValue mouseEventToScriptValue(QScriptEngine* engine, const MouseEvent& ev return obj; } -void mouseEventFromScriptValue(const QScriptValue &object, MouseEvent& event) { +void mouseEventFromScriptValue(const QScriptValue& object, MouseEvent& event) { // nothing for now... } @@ -242,7 +242,7 @@ QScriptValue touchEventToScriptValue(QScriptEngine* engine, const TouchEvent& ev return obj; } -void touchEventFromScriptValue(const QScriptValue &object, TouchEvent& event) { +void touchEventFromScriptValue(const QScriptValue& object, TouchEvent& event) { // nothing for now... } @@ -253,6 +253,8 @@ QScriptValue wheelEventToScriptValue(QScriptEngine* engine, const WheelEvent& ev return obj; } -void wheelEventFromScriptValue(const QScriptValue &object, WheelEvent& event) { +void wheelEventFromScriptValue(const QScriptValue& object, WheelEvent& event) { // nothing for now... } + + diff --git a/libraries/script-engine/src/EventTypes.h b/libraries/script-engine/src/EventTypes.h index 81cba03cea..ebc85d04d3 100644 --- a/libraries/script-engine/src/EventTypes.h +++ b/libraries/script-engine/src/EventTypes.h @@ -65,7 +65,6 @@ public: int y; }; - Q_DECLARE_METATYPE(KeyEvent) Q_DECLARE_METATYPE(MouseEvent) Q_DECLARE_METATYPE(TouchEvent) @@ -74,15 +73,15 @@ Q_DECLARE_METATYPE(WheelEvent) void registerEventTypes(QScriptEngine* engine); QScriptValue keyEventToScriptValue(QScriptEngine* engine, const KeyEvent& event); -void keyEventFromScriptValue(const QScriptValue &object, KeyEvent& event); +void keyEventFromScriptValue(const QScriptValue& object, KeyEvent& event); QScriptValue mouseEventToScriptValue(QScriptEngine* engine, const MouseEvent& event); -void mouseEventFromScriptValue(const QScriptValue &object, MouseEvent& event); +void mouseEventFromScriptValue(const QScriptValue& object, MouseEvent& event); QScriptValue touchEventToScriptValue(QScriptEngine* engine, const TouchEvent& event); -void touchEventFromScriptValue(const QScriptValue &object, TouchEvent& event); +void touchEventFromScriptValue(const QScriptValue& object, TouchEvent& event); QScriptValue wheelEventToScriptValue(QScriptEngine* engine, const WheelEvent& event); -void wheelEventFromScriptValue(const QScriptValue &object, WheelEvent& event); +void wheelEventFromScriptValue(const QScriptValue& object, WheelEvent& event); #endif // __hifi_EventTypes_h__ diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index 4b0f2c403e..4bfb2a2de1 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -15,6 +15,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, vec2toScriptValue, vec2FromScriptValue); qScriptRegisterMetaType(engine, quatToScriptValue, quatFromScriptValue); qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); + qScriptRegisterMetaType(engine, pickRayToScriptValue, pickRayFromScriptValue); } QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3) { @@ -73,3 +74,28 @@ void xColorFromScriptValue(const QScriptValue &object, xColor& color) { color.blue = object.property("blue").toVariant().toInt(); } +QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay) { + QScriptValue obj = engine->newObject(); + QScriptValue origin = vec3toScriptValue(engine, pickRay.origin); + obj.setProperty("origin", origin); + QScriptValue direction = vec3toScriptValue(engine, pickRay.direction); + obj.setProperty("direction", direction); + return obj; + +} + +void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay) { + QScriptValue originValue = object.property("origin"); + if (originValue.isValid()) { + pickRay.origin.x = originValue.property("x").toVariant().toFloat(); + pickRay.origin.y = originValue.property("y").toVariant().toFloat(); + pickRay.origin.z = originValue.property("z").toVariant().toFloat(); + } + QScriptValue directionValue = object.property("direction"); + if (directionValue.isValid()) { + pickRay.direction.x = directionValue.property("x").toVariant().toFloat(); + pickRay.direction.y = directionValue.property("y").toVariant().toFloat(); + pickRay.direction.z = directionValue.property("z").toVariant().toFloat(); + } +} + diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index b198add7c2..91eb3848c7 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -22,7 +22,6 @@ Q_DECLARE_METATYPE(glm::vec2) Q_DECLARE_METATYPE(glm::quat) Q_DECLARE_METATYPE(xColor) - void registerMetaTypes(QScriptEngine* engine); QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); @@ -37,4 +36,15 @@ void quatFromScriptValue(const QScriptValue &object, glm::quat& quat); QScriptValue xColorToScriptValue(QScriptEngine* engine, const xColor& color); void xColorFromScriptValue(const QScriptValue &object, xColor& color); +class PickRay { +public: + PickRay() : origin(0), direction(0) { }; + glm::vec3 origin; + glm::vec3 direction; +}; +Q_DECLARE_METATYPE(PickRay) +QScriptValue pickRayToScriptValue(QScriptEngine* engine, const PickRay& pickRay); +void pickRayFromScriptValue(const QScriptValue& object, PickRay& pickRay); + + #endif