From a6e6205a57fc79d6c26d595f460d15e2d4578b23 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 17 Dec 2013 15:23:09 -0800 Subject: [PATCH 1/8] first cut at scriptable controller --- interface/src/Application.cpp | 3 +- interface/src/Application.h | 4 ++ .../InterfaceControllerScriptingInterface.cpp | 45 +++++++++++++++++++ .../InterfaceControllerScriptingInterface.h | 28 ++++++++++++ libraries/avatars/src/HandData.h | 44 +++++++++--------- libraries/scriptengine/src/ScriptEngine.cpp | 11 ++++- libraries/scriptengine/src/ScriptEngine.h | 7 ++- libraries/shared/src/RegisteredMetaTypes.cpp | 14 ++++++ libraries/shared/src/RegisteredMetaTypes.h | 6 +++ 9 files changed, 137 insertions(+), 25 deletions(-) create mode 100644 interface/src/InterfaceControllerScriptingInterface.cpp create mode 100644 interface/src/InterfaceControllerScriptingInterface.h diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3cb806c7f8..ad27a6e427 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -4432,7 +4432,8 @@ void Application::loadScript() { bool wantMenuItems = true; // tells the ScriptEngine object to add menu items for itself - ScriptEngine* scriptEngine = new ScriptEngine(script, wantMenuItems, fileName, Menu::getInstance()); + ScriptEngine* scriptEngine = new ScriptEngine(script, wantMenuItems, fileName, Menu::getInstance(), + &_controllerScriptingInterface); scriptEngine->setupMenuItems(); // setup the packet senders and jurisdiction listeners of the script engine's scripting interfaces so diff --git a/interface/src/Application.h b/interface/src/Application.h index f9ffc33781..67291c8ba8 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -68,6 +68,8 @@ #include "ui/LodToolsDialog.h" #include "ParticleTreeRenderer.h" #include "ParticleEditHandle.h" +#include "InterfaceControllerScriptingInterface.h" + class QAction; class QActionGroup; @@ -498,6 +500,8 @@ private: std::vector _voxelFades; std::vector _avatarFades; + + InterfaceControllerScriptingInterface _controllerScriptingInterface; }; #endif /* defined(__interface__Application__) */ diff --git a/interface/src/InterfaceControllerScriptingInterface.cpp b/interface/src/InterfaceControllerScriptingInterface.cpp new file mode 100644 index 0000000000..a301120d8c --- /dev/null +++ b/interface/src/InterfaceControllerScriptingInterface.cpp @@ -0,0 +1,45 @@ +// +// InterfaceControllerScriptingInterface.h +// hifi +// +// Created by Brad Hefta-Gaub on 12/17/13 +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#include +#include "Application.h" +#include "InterfaceControllerScriptingInterface.h" + +const PalmData* InterfaceControllerScriptingInterface::getPrimaryPalm() const { + int leftPalmIndex, rightPalmIndex; + + const HandData* handData = Application::getInstance()->getAvatar()->getHandData(); + handData->getLeftRightPalmIndices(leftPalmIndex, rightPalmIndex); + + if (rightPalmIndex != -1) { + return &handData->getPalms()[rightPalmIndex]; + } + + return NULL; +} + +bool InterfaceControllerScriptingInterface::isPrimaryButtonPressed() const { + const PalmData* primaryPalm = getPrimaryPalm(); + if (primaryPalm) { + if (primaryPalm->getControllerButtons() & BUTTON_FWD) { + return true; + } + } + + return false; +} + +glm::vec2 InterfaceControllerScriptingInterface::getPrimaryJoystickPosition() const { + const PalmData* primaryPalm = getPrimaryPalm(); + if (primaryPalm) { + return glm::vec2(primaryPalm->getJoystickX(), primaryPalm->getJoystickY()); + } + + return glm::vec2(0); +} + diff --git a/interface/src/InterfaceControllerScriptingInterface.h b/interface/src/InterfaceControllerScriptingInterface.h new file mode 100644 index 0000000000..1a9f2ea119 --- /dev/null +++ b/interface/src/InterfaceControllerScriptingInterface.h @@ -0,0 +1,28 @@ +// +// InterfaceControllerScriptingInterface.h +// hifi +// +// Created by Brad Hefta-Gaub on 12/17/13 +// Copyright (c) 2013 HighFidelity, Inc. All rights reserved. +// + +#ifndef __hifi__InterfaceControllerScriptingInterface__ +#define __hifi__InterfaceControllerScriptingInterface__ + +#include + +#include + +/// handles scripting of input controller commands from JS +class InterfaceControllerScriptingInterface : public ControllerScriptingInterface { + Q_OBJECT + +public slots: + virtual bool isPrimaryButtonPressed() const; + virtual glm::vec2 getPrimaryJoystickPosition() const; + +private: + const PalmData* getPrimaryPalm() const; +}; + +#endif /* defined(__hifi__InterfaceControllerScriptingInterface__) */ diff --git a/libraries/avatars/src/HandData.h b/libraries/avatars/src/HandData.h index 00797881fe..49bdd3791d 100755 --- a/libraries/avatars/src/HandData.h +++ b/libraries/avatars/src/HandData.h @@ -53,9 +53,10 @@ public: glm::vec3 worldPositionToLeapPosition(const glm::vec3& worldPosition) const; glm::vec3 worldVectorToLeapVector(const glm::vec3& worldVector) const; - std::vector& getPalms() { return _palms; } - size_t getNumPalms() { return _palms.size(); } - PalmData& addNewPalm(); + std::vector& getPalms() { return _palms; } + const std::vector& getPalms() const { return _palms; } + size_t getNumPalms() { return _palms.size(); } + PalmData& addNewPalm(); /// Finds the indices of the left and right palms according to their locations, or -1 if either or /// both is not found. @@ -137,17 +138,18 @@ public: const glm::vec3& getRawPosition() const { return _rawPosition; } const glm::vec3& getRawNormal() const { return _rawNormal; } - bool isActive() const { return _isActive; } - int getLeapID() const { return _leapID; } - int getSixenseID() const { return _sixenseID; } + bool isActive() const { return _isActive; } + int getLeapID() const { return _leapID; } + int getSixenseID() const { return _sixenseID; } - std::vector& getFingers() { return _fingers; } - size_t getNumFingers() { return _fingers.size(); } + std::vector& getFingers() { return _fingers; } + const std::vector& getFingers() const { return _fingers; } + size_t getNumFingers() const { return _fingers.size(); } - void setActive(bool active) { _isActive = active; } - void setLeapID(int id) { _leapID = id; } - void setSixenseID(int id) { _sixenseID = id; } + void setActive(bool active) { _isActive = active; } + void setLeapID(int id) { _leapID = id; } + void setSixenseID(int id) { _sixenseID = id; } void setRawRotation(const glm::quat rawRotation) { _rawRotation = rawRotation; }; glm::quat getRawRotation() const { return _rawRotation; } @@ -162,26 +164,28 @@ public: const glm::vec3& getTipVelocity() const { return _tipVelocity; } void setTipVelocity(const glm::vec3& velocity) { _tipVelocity = velocity; } - void incrementFramesWithoutData() { _numFramesWithoutData++; } - void resetFramesWithoutData() { _numFramesWithoutData = 0; } - int getFramesWithoutData() const { return _numFramesWithoutData; } + void incrementFramesWithoutData() { _numFramesWithoutData++; } + void resetFramesWithoutData() { _numFramesWithoutData = 0; } + int getFramesWithoutData() const { return _numFramesWithoutData; } // Controller buttons void setControllerButtons(int controllerButtons) { _controllerButtons = controllerButtons; } void setLastControllerButtons(int controllerButtons) { _lastControllerButtons = controllerButtons; } - int getControllerButtons() { return _controllerButtons; } - int getLastControllerButtons() { return _lastControllerButtons; } + int getControllerButtons() const { return _controllerButtons; } + int getLastControllerButtons() const { return _lastControllerButtons; } void setTrigger(float trigger) { _trigger = trigger; } - float getTrigger() { return _trigger; } + float getTrigger() const { return _trigger; } void setJoystick(float joystickX, float joystickY) { _joystickX = joystickX; _joystickY = joystickY; } - float getJoystickX() { return _joystickX; } - float getJoystickY() { return _joystickY; } + float getJoystickX() const { return _joystickX; } + float getJoystickY() const { return _joystickY; } - bool getIsCollidingWithVoxel() { return _isCollidingWithVoxel; } + bool getIsCollidingWithVoxel() const { return _isCollidingWithVoxel; } void setIsCollidingWithVoxel(bool isCollidingWithVoxel) { _isCollidingWithVoxel = isCollidingWithVoxel; } + bool getIsCollidingWithPalm() const { return _isCollidingWithPalm; } + void setIsCollidingWithPalm(bool isCollidingWithPalm) { _isCollidingWithPalm = isCollidingWithPalm; } private: std::vector _fingers; glm::quat _rawRotation; diff --git a/libraries/scriptengine/src/ScriptEngine.cpp b/libraries/scriptengine/src/ScriptEngine.cpp index 7e5f414dee..d4f6d5a630 100644 --- a/libraries/scriptengine/src/ScriptEngine.cpp +++ b/libraries/scriptengine/src/ScriptEngine.cpp @@ -24,8 +24,9 @@ int ScriptEngine::_scriptNumber = 1; -ScriptEngine::ScriptEngine(QString scriptContents, bool wantMenuItems, - const char* scriptMenuName, AbstractMenuInterface* menu) { +ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, + const char* scriptMenuName, AbstractMenuInterface* menu, + ControllerScriptingInterface* controllerScriptingInterface) { _scriptContents = scriptContents; _isFinished = false; _wantMenuItems = wantMenuItems; @@ -38,6 +39,7 @@ ScriptEngine::ScriptEngine(QString scriptContents, bool wantMenuItems, _scriptMenuName.append(_scriptNumber); } _menu = menu; + _controllerScriptingInterface = controllerScriptingInterface; } ScriptEngine::~ScriptEngine() { @@ -78,6 +80,11 @@ void ScriptEngine::run() { QScriptValue particleScripterValue = engine.newQObject(&_particleScriptingInterface); engine.globalObject().setProperty("Particles", particleScripterValue); + if (_controllerScriptingInterface) { + QScriptValue controllerScripterValue = engine.newQObject(_controllerScriptingInterface); + engine.globalObject().setProperty("Controller", controllerScripterValue); + } + QScriptValue treeScaleValue = engine.newVariant(QVariant(TREE_SCALE)); engine.globalObject().setProperty("TREE_SCALE", treeScaleValue); diff --git a/libraries/scriptengine/src/ScriptEngine.h b/libraries/scriptengine/src/ScriptEngine.h index 772b0a146f..3001aebeaa 100644 --- a/libraries/scriptengine/src/ScriptEngine.h +++ b/libraries/scriptengine/src/ScriptEngine.h @@ -18,12 +18,14 @@ #include #include #include +#include "ControllerScriptingInterface.h" class ScriptEngine : public QObject { Q_OBJECT public: - ScriptEngine(QString scriptContents, bool wantMenuItems = false, - const char* scriptMenuName = NULL, AbstractMenuInterface* menu = NULL); + ScriptEngine(const QString& scriptContents = NO_SCRIPT, bool wantMenuItems = false, + const char* scriptMenuName = NULL, AbstractMenuInterface* menu = NULL, + ControllerScriptingInterface* controllerScriptingInterface = NULL); ~ScriptEngine(); @@ -52,6 +54,7 @@ protected: private: VoxelScriptingInterface _voxelScriptingInterface; ParticleScriptingInterface _particleScriptingInterface; + ControllerScriptingInterface* _controllerScriptingInterface; bool _wantMenuItems; QString _scriptMenuName; AbstractMenuInterface* _menu; diff --git a/libraries/shared/src/RegisteredMetaTypes.cpp b/libraries/shared/src/RegisteredMetaTypes.cpp index de9fcae781..9a099b4171 100644 --- a/libraries/shared/src/RegisteredMetaTypes.cpp +++ b/libraries/shared/src/RegisteredMetaTypes.cpp @@ -12,6 +12,7 @@ void registerMetaTypes(QScriptEngine* engine) { qScriptRegisterMetaType(engine, vec3toScriptValue, vec3FromScriptValue); + qScriptRegisterMetaType(engine, vec2toScriptValue, vec2FromScriptValue); qScriptRegisterMetaType(engine, xColorToScriptValue, xColorFromScriptValue); } @@ -29,6 +30,19 @@ void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3) { vec3.z = object.property("z").toVariant().toFloat(); } +QScriptValue vec2toScriptValue(QScriptEngine* engine, const glm::vec2 &vec2) { + QScriptValue obj = engine->newObject(); + obj.setProperty("x", vec2.x); + obj.setProperty("y", vec2.y); + return obj; +} + +void vec2FromScriptValue(const QScriptValue &object, glm::vec2 &vec2) { + vec2.x = object.property("x").toVariant().toFloat(); + vec2.y = object.property("y").toVariant().toFloat(); +} + + QScriptValue xColorToScriptValue(QScriptEngine *engine, const xColor& color) { QScriptValue obj = engine->newObject(); obj.setProperty("red", color.red); diff --git a/libraries/shared/src/RegisteredMetaTypes.h b/libraries/shared/src/RegisteredMetaTypes.h index 51a4562c87..b5d3d80e2f 100644 --- a/libraries/shared/src/RegisteredMetaTypes.h +++ b/libraries/shared/src/RegisteredMetaTypes.h @@ -17,11 +17,17 @@ #include "SharedUtil.h" Q_DECLARE_METATYPE(glm::vec3) +Q_DECLARE_METATYPE(glm::vec2) Q_DECLARE_METATYPE(xColor) void registerMetaTypes(QScriptEngine* engine); + QScriptValue vec3toScriptValue(QScriptEngine* engine, const glm::vec3 &vec3); void vec3FromScriptValue(const QScriptValue &object, glm::vec3 &vec3); + +QScriptValue vec2toScriptValue(QScriptEngine* engine, const glm::vec2 &vec2); +void vec2FromScriptValue(const QScriptValue &object, glm::vec2 &vec2); + QScriptValue xColorToScriptValue(QScriptEngine* engine, const xColor& color); void xColorFromScriptValue(const QScriptValue &object, xColor& color); From 4b3fd2166d32042d3c6b86268a95cb391618e900 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 17 Dec 2013 15:28:29 -0800 Subject: [PATCH 2/8] make getNumPalms() const --- libraries/avatars/src/HandData.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/avatars/src/HandData.h b/libraries/avatars/src/HandData.h index 8df286cd44..a0c8fed980 100755 --- a/libraries/avatars/src/HandData.h +++ b/libraries/avatars/src/HandData.h @@ -55,7 +55,7 @@ public: std::vector& getPalms() { return _palms; } const std::vector& getPalms() const { return _palms; } - size_t getNumPalms() { return _palms.size(); } + size_t getNumPalms() const { return _palms.size(); } PalmData& addNewPalm(); /// Finds the indices of the left and right palms according to their locations, or -1 if either or From 70e9781ad9ae7a1bdb49ea3da0b2d8692adcb445 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Dec 2013 08:42:34 -0800 Subject: [PATCH 3/8] CR feedback new class names --- interface/src/Application.h | 4 ++-- ...gInterface.cpp => ControllerScriptingInterface.cpp} | 10 +++++----- ...ptingInterface.h => ControllerScriptingInterface.h} | 6 +++--- ...erface.h => AbstractControllerScriptingInterface.h} | 10 +++++----- libraries/script-engine/src/ScriptEngine.cpp | 2 +- libraries/script-engine/src/ScriptEngine.h | 6 +++--- 6 files changed, 19 insertions(+), 19 deletions(-) rename interface/src/{InterfaceControllerScriptingInterface.cpp => ControllerScriptingInterface.cpp} (72%) rename interface/src/{InterfaceControllerScriptingInterface.h => ControllerScriptingInterface.h} (77%) rename libraries/script-engine/src/{ControllerScriptingInterface.h => AbstractControllerScriptingInterface.h} (57%) diff --git a/interface/src/Application.h b/interface/src/Application.h index 71281659d0..2683d679ed 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -69,7 +69,7 @@ #include "ui/LodToolsDialog.h" #include "ParticleTreeRenderer.h" #include "ParticleEditHandle.h" -#include "InterfaceControllerScriptingInterface.h" +#include "ControllerScriptingInterface.h" class QAction; @@ -506,7 +506,7 @@ private: std::vector _voxelFades; std::vector _avatarFades; - InterfaceControllerScriptingInterface _controllerScriptingInterface; + ControllerScriptingInterface _controllerScriptingInterface; }; #endif /* defined(__interface__Application__) */ diff --git a/interface/src/InterfaceControllerScriptingInterface.cpp b/interface/src/ControllerScriptingInterface.cpp similarity index 72% rename from interface/src/InterfaceControllerScriptingInterface.cpp rename to interface/src/ControllerScriptingInterface.cpp index a301120d8c..774b671899 100644 --- a/interface/src/InterfaceControllerScriptingInterface.cpp +++ b/interface/src/ControllerScriptingInterface.cpp @@ -1,5 +1,5 @@ // -// InterfaceControllerScriptingInterface.h +// ControllerScriptingInterface.h // hifi // // Created by Brad Hefta-Gaub on 12/17/13 @@ -8,9 +8,9 @@ #include #include "Application.h" -#include "InterfaceControllerScriptingInterface.h" +#include "ControllerScriptingInterface.h" -const PalmData* InterfaceControllerScriptingInterface::getPrimaryPalm() const { +const PalmData* ControllerScriptingInterface::getPrimaryPalm() const { int leftPalmIndex, rightPalmIndex; const HandData* handData = Application::getInstance()->getAvatar()->getHandData(); @@ -23,7 +23,7 @@ const PalmData* InterfaceControllerScriptingInterface::getPrimaryPalm() const { return NULL; } -bool InterfaceControllerScriptingInterface::isPrimaryButtonPressed() const { +bool ControllerScriptingInterface::isPrimaryButtonPressed() const { const PalmData* primaryPalm = getPrimaryPalm(); if (primaryPalm) { if (primaryPalm->getControllerButtons() & BUTTON_FWD) { @@ -34,7 +34,7 @@ bool InterfaceControllerScriptingInterface::isPrimaryButtonPressed() const { return false; } -glm::vec2 InterfaceControllerScriptingInterface::getPrimaryJoystickPosition() const { +glm::vec2 ControllerScriptingInterface::getPrimaryJoystickPosition() const { const PalmData* primaryPalm = getPrimaryPalm(); if (primaryPalm) { return glm::vec2(primaryPalm->getJoystickX(), primaryPalm->getJoystickY()); diff --git a/interface/src/InterfaceControllerScriptingInterface.h b/interface/src/ControllerScriptingInterface.h similarity index 77% rename from interface/src/InterfaceControllerScriptingInterface.h rename to interface/src/ControllerScriptingInterface.h index 1a9f2ea119..5657a243a8 100644 --- a/interface/src/InterfaceControllerScriptingInterface.h +++ b/interface/src/ControllerScriptingInterface.h @@ -1,5 +1,5 @@ // -// InterfaceControllerScriptingInterface.h +// ControllerScriptingInterface.h // hifi // // Created by Brad Hefta-Gaub on 12/17/13 @@ -11,10 +11,10 @@ #include -#include +#include /// handles scripting of input controller commands from JS -class InterfaceControllerScriptingInterface : public ControllerScriptingInterface { +class ControllerScriptingInterface : public AbstractControllerScriptingInterface { Q_OBJECT public slots: diff --git a/libraries/script-engine/src/ControllerScriptingInterface.h b/libraries/script-engine/src/AbstractControllerScriptingInterface.h similarity index 57% rename from libraries/script-engine/src/ControllerScriptingInterface.h rename to libraries/script-engine/src/AbstractControllerScriptingInterface.h index 10124e588b..37cea60c72 100644 --- a/libraries/script-engine/src/ControllerScriptingInterface.h +++ b/libraries/script-engine/src/AbstractControllerScriptingInterface.h @@ -1,19 +1,19 @@ // -// ControllerScriptingInterface.h +// AbstractControllerScriptingInterface.h // hifi // // Created by Brad Hefta-Gaub on 12/17/13 // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // -#ifndef __hifi__ControllerScriptingInterface__ -#define __hifi__ControllerScriptingInterface__ +#ifndef __hifi__AbstractControllerScriptingInterface__ +#define __hifi__AbstractControllerScriptingInterface__ #include #include /// handles scripting of input controller commands from JS -class ControllerScriptingInterface : public QObject { +class AbstractControllerScriptingInterface : public QObject { Q_OBJECT public slots: @@ -21,4 +21,4 @@ public slots: virtual glm::vec2 getPrimaryJoystickPosition() const = 0; }; -#endif /* defined(__hifi__ControllerScriptingInterface__) */ +#endif /* defined(__hifi__AbstractControllerScriptingInterface__) */ diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index bae63f1a4c..24c4fcf1d9 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -26,7 +26,7 @@ int ScriptEngine::_scriptNumber = 1; ScriptEngine::ScriptEngine(const QString& scriptContents, bool wantMenuItems, const char* scriptMenuName, AbstractMenuInterface* menu, - ControllerScriptingInterface* controllerScriptingInterface) { + AbstractControllerScriptingInterface* controllerScriptingInterface) { _scriptContents = scriptContents; _isFinished = false; _isRunning = false; diff --git a/libraries/script-engine/src/ScriptEngine.h b/libraries/script-engine/src/ScriptEngine.h index 39ea0d276b..c5172a5772 100644 --- a/libraries/script-engine/src/ScriptEngine.h +++ b/libraries/script-engine/src/ScriptEngine.h @@ -18,7 +18,7 @@ #include #include #include -#include "ControllerScriptingInterface.h" +#include "AbstractControllerScriptingInterface.h" const QString NO_SCRIPT(""); @@ -27,7 +27,7 @@ class ScriptEngine : public QObject { public: ScriptEngine(const QString& scriptContents = NO_SCRIPT, bool wantMenuItems = false, const char* scriptMenuName = NULL, AbstractMenuInterface* menu = NULL, - ControllerScriptingInterface* controllerScriptingInterface = NULL); + AbstractControllerScriptingInterface* controllerScriptingInterface = NULL); ~ScriptEngine(); @@ -60,7 +60,7 @@ protected: private: VoxelScriptingInterface _voxelScriptingInterface; ParticleScriptingInterface _particleScriptingInterface; - ControllerScriptingInterface* _controllerScriptingInterface; + AbstractControllerScriptingInterface* _controllerScriptingInterface; bool _wantMenuItems; QString _scriptMenuName; AbstractMenuInterface* _menu; From efdef1ad358b0c17a1e7d85a6adff85e43dbdfeb Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Dec 2013 09:33:48 -0800 Subject: [PATCH 4/8] added all buttons triggers and joysticks --- .../src/ControllerScriptingInterface.cpp | 97 +++++++++++++++++++ interface/src/ControllerScriptingInterface.h | 26 ++++- .../AbstractControllerScriptingInterface.h | 12 +++ 3 files changed, 132 insertions(+), 3 deletions(-) diff --git a/interface/src/ControllerScriptingInterface.cpp b/interface/src/ControllerScriptingInterface.cpp index 774b671899..0f436a6785 100644 --- a/interface/src/ControllerScriptingInterface.cpp +++ b/interface/src/ControllerScriptingInterface.cpp @@ -23,6 +23,38 @@ const PalmData* ControllerScriptingInterface::getPrimaryPalm() const { return NULL; } +int ControllerScriptingInterface::getNumberOfActivePalms() const { + const HandData* handData = Application::getInstance()->getAvatar()->getHandData(); + int numberOfPalms = handData->getNumPalms(); + int numberOfActivePalms = 0; + for (int i = 0; i < numberOfPalms; i++) { + if (getPalm(i)->isActive()) { + numberOfActivePalms++; + } + } + return numberOfActivePalms; +} + +const PalmData* ControllerScriptingInterface::getPalm(int palmIndex) const { + const HandData* handData = Application::getInstance()->getAvatar()->getHandData(); + return &handData->getPalms()[palmIndex]; +} + +const PalmData* ControllerScriptingInterface::getActivePalm(int palmIndex) const { + const HandData* handData = Application::getInstance()->getAvatar()->getHandData(); + int numberOfPalms = handData->getNumPalms(); + int numberOfActivePalms = 0; + for (int i = 0; i < numberOfPalms; i++) { + if (getPalm(i)->isActive()) { + if (numberOfActivePalms == palmIndex) { + return &handData->getPalms()[i]; + } + numberOfActivePalms++; + } + } + return NULL; +} + bool ControllerScriptingInterface::isPrimaryButtonPressed() const { const PalmData* primaryPalm = getPrimaryPalm(); if (primaryPalm) { @@ -43,3 +75,68 @@ glm::vec2 ControllerScriptingInterface::getPrimaryJoystickPosition() const { return glm::vec2(0); } +int ControllerScriptingInterface::getNumberOfButtons() const { + return getNumberOfActivePalms() * NUMBER_OF_BUTTONS_PER_PALM; +} + +bool ControllerScriptingInterface::isButtonPressed(int buttonIndex) const { + int palmIndex = buttonIndex / NUMBER_OF_BUTTONS_PER_PALM; + int buttonOnPalm = buttonIndex % NUMBER_OF_BUTTONS_PER_PALM; + const PalmData* palmData = getActivePalm(palmIndex); + if (palmData) { + switch (buttonOnPalm) { + case 0: + return palmData->getControllerButtons() & BUTTON_0; + case 1: + return palmData->getControllerButtons() & BUTTON_1; + case 2: + return palmData->getControllerButtons() & BUTTON_2; + case 3: + return palmData->getControllerButtons() & BUTTON_3; + case 4: + return palmData->getControllerButtons() & BUTTON_4; + case 5: + return palmData->getControllerButtons() & BUTTON_FWD; + } + } + return false; +} + +int ControllerScriptingInterface::getNumberOfTriggers() const { + return getNumberOfActivePalms() * NUMBER_OF_TRIGGERS_PER_PALM; +} + +float ControllerScriptingInterface::getTriggerValue(int triggerIndex) const { + // we know there's one trigger per palm, so the triggerIndex is the palm Index + int palmIndex = triggerIndex; + const PalmData* palmData = getActivePalm(palmIndex); + if (palmData) { + return palmData->getTrigger(); + } + return 0.0f; +} + +int ControllerScriptingInterface::getNumberOfJoysticks() const { + return getNumberOfActivePalms() * NUMBER_OF_JOYSTICKS_PER_PALM; +} + +glm::vec2 ControllerScriptingInterface::getJoystickPosition(int joystickIndex) const { + // we know there's one joystick per palm, so the joystickIndex is the palm Index + int palmIndex = joystickIndex; + const PalmData* palmData = getActivePalm(palmIndex); + if (palmData) { + return glm::vec2(palmData->getJoystickX(), palmData->getJoystickY()); + } + return glm::vec2(0); +} + +int ControllerScriptingInterface::getNumberOfSpatialControls() const { + return getNumberOfActivePalms() * NUMBER_OF_SPATIALCONTROLS_PER_PALM; +} + +glm::vec3 ControllerScriptingInterface::getSpatialControlPosition(int controlIndex) const { + return glm::vec3(0); // not yet implemented +} + + + diff --git a/interface/src/ControllerScriptingInterface.h b/interface/src/ControllerScriptingInterface.h index 5657a243a8..f1f763790d 100644 --- a/interface/src/ControllerScriptingInterface.h +++ b/interface/src/ControllerScriptingInterface.h @@ -6,8 +6,8 @@ // Copyright (c) 2013 HighFidelity, Inc. All rights reserved. // -#ifndef __hifi__InterfaceControllerScriptingInterface__ -#define __hifi__InterfaceControllerScriptingInterface__ +#ifndef __hifi__ControllerScriptingInterface__ +#define __hifi__ControllerScriptingInterface__ #include @@ -21,8 +21,28 @@ public slots: virtual bool isPrimaryButtonPressed() const; virtual glm::vec2 getPrimaryJoystickPosition() const; + virtual int getNumberOfButtons() const; + virtual bool isButtonPressed(int buttonIndex) const; + + virtual int getNumberOfTriggers() const; + virtual float getTriggerValue(int triggerIndex) const; + + virtual int getNumberOfJoysticks() const; + virtual glm::vec2 getJoystickPosition(int joystickIndex) const; + + virtual int getNumberOfSpatialControls() const; + virtual glm::vec3 getSpatialControlPosition(int controlIndex) const; + private: const PalmData* getPrimaryPalm() const; + const PalmData* getPalm(int palmIndex) const; + int getNumberOfActivePalms() const; + const PalmData* getActivePalm(int palmIndex) const; + + const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 0; + const int NUMBER_OF_JOYSTICKS_PER_PALM = 1; + const int NUMBER_OF_TRIGGERS_PER_PALM = 1; + const int NUMBER_OF_BUTTONS_PER_PALM = 6; }; -#endif /* defined(__hifi__InterfaceControllerScriptingInterface__) */ +#endif /* defined(__hifi__ControllerScriptingInterface__) */ diff --git a/libraries/script-engine/src/AbstractControllerScriptingInterface.h b/libraries/script-engine/src/AbstractControllerScriptingInterface.h index 37cea60c72..3ad2cc3845 100644 --- a/libraries/script-engine/src/AbstractControllerScriptingInterface.h +++ b/libraries/script-engine/src/AbstractControllerScriptingInterface.h @@ -19,6 +19,18 @@ class AbstractControllerScriptingInterface : public QObject { public slots: virtual bool isPrimaryButtonPressed() const = 0; virtual glm::vec2 getPrimaryJoystickPosition() const = 0; + + virtual int getNumberOfButtons() const = 0; + virtual bool isButtonPressed(int buttonIndex) const = 0; + + virtual int getNumberOfTriggers() const = 0; + virtual float getTriggerValue(int triggerIndex) const = 0; + + virtual int getNumberOfJoysticks() const = 0; + virtual glm::vec2 getJoystickPosition(int joystickIndex) const = 0; + + virtual int getNumberOfSpatialControls() const = 0; + virtual glm::vec3 getSpatialControlPosition(int controlIndex) const = 0; }; #endif /* defined(__hifi__AbstractControllerScriptingInterface__) */ From 8549894ff864104b7a5847bc7fde582aa3d724eb Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Dec 2013 09:53:47 -0800 Subject: [PATCH 5/8] add support for palm and tip spatial data to JS interface --- .../src/ControllerScriptingInterface.cpp | 46 ++++++++++++++++++- interface/src/ControllerScriptingInterface.h | 5 +- .../AbstractControllerScriptingInterface.h | 2 + 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/interface/src/ControllerScriptingInterface.cpp b/interface/src/ControllerScriptingInterface.cpp index 0f436a6785..493892e042 100644 --- a/interface/src/ControllerScriptingInterface.cpp +++ b/interface/src/ControllerScriptingInterface.cpp @@ -134,8 +134,52 @@ int ControllerScriptingInterface::getNumberOfSpatialControls() const { return getNumberOfActivePalms() * NUMBER_OF_SPATIALCONTROLS_PER_PALM; } +const int PALM_SPATIALCONTROL = 0; +const int TIP_SPATIALCONTROL = 1; + glm::vec3 ControllerScriptingInterface::getSpatialControlPosition(int controlIndex) const { - return glm::vec3(0); // not yet implemented + int palmIndex = controlIndex / NUMBER_OF_SPATIALCONTROLS_PER_PALM; + int controlOfPalm = controlIndex % NUMBER_OF_SPATIALCONTROLS_PER_PALM; + const PalmData* palmData = getActivePalm(palmIndex); + if (palmData) { + switch (controlOfPalm) { + case PALM_SPATIALCONTROL: + return palmData->getPosition(); + case TIP_SPATIALCONTROL: + return palmData->getTipPosition(); + } + } + return glm::vec3(0); // bad index +} + +glm::vec3 ControllerScriptingInterface::getSpatialControlVelocity(int controlIndex) const { + int palmIndex = controlIndex / NUMBER_OF_SPATIALCONTROLS_PER_PALM; + int controlOfPalm = controlIndex % NUMBER_OF_SPATIALCONTROLS_PER_PALM; + const PalmData* palmData = getActivePalm(palmIndex); + if (palmData) { + switch (controlOfPalm) { + case PALM_SPATIALCONTROL: + return palmData->getVelocity(); + case TIP_SPATIALCONTROL: + return palmData->getTipVelocity(); + } + } + return glm::vec3(0); // bad index +} + +glm::vec3 ControllerScriptingInterface::getSpatialControlNormal(int controlIndex) const { + int palmIndex = controlIndex / NUMBER_OF_SPATIALCONTROLS_PER_PALM; + int controlOfPalm = controlIndex % NUMBER_OF_SPATIALCONTROLS_PER_PALM; + const PalmData* palmData = getActivePalm(palmIndex); + if (palmData) { + switch (controlOfPalm) { + case PALM_SPATIALCONTROL: + return palmData->getNormal(); + case TIP_SPATIALCONTROL: + return palmData->getNormal(); // currently the tip doesn't have a unique normal, use the palm normal + } + } + return glm::vec3(0); // bad index } diff --git a/interface/src/ControllerScriptingInterface.h b/interface/src/ControllerScriptingInterface.h index f1f763790d..f5b8143032 100644 --- a/interface/src/ControllerScriptingInterface.h +++ b/interface/src/ControllerScriptingInterface.h @@ -32,6 +32,8 @@ public slots: virtual int getNumberOfSpatialControls() const; virtual glm::vec3 getSpatialControlPosition(int controlIndex) const; + virtual glm::vec3 getSpatialControlVelocity(int controlIndex) const; + virtual glm::vec3 getSpatialControlNormal(int controlIndex) const; private: const PalmData* getPrimaryPalm() const; @@ -39,7 +41,8 @@ private: int getNumberOfActivePalms() const; const PalmData* getActivePalm(int palmIndex) const; - const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 0; + const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 2; // the hand and the tip + const int NUMBER_OF_JOYSTICKS_PER_PALM = 1; const int NUMBER_OF_TRIGGERS_PER_PALM = 1; const int NUMBER_OF_BUTTONS_PER_PALM = 6; diff --git a/libraries/script-engine/src/AbstractControllerScriptingInterface.h b/libraries/script-engine/src/AbstractControllerScriptingInterface.h index 3ad2cc3845..5c791af0a4 100644 --- a/libraries/script-engine/src/AbstractControllerScriptingInterface.h +++ b/libraries/script-engine/src/AbstractControllerScriptingInterface.h @@ -31,6 +31,8 @@ public slots: virtual int getNumberOfSpatialControls() const = 0; virtual glm::vec3 getSpatialControlPosition(int controlIndex) const = 0; + virtual glm::vec3 getSpatialControlVelocity(int controlIndex) const = 0; + virtual glm::vec3 getSpatialControlNormal(int controlIndex) const = 0; }; #endif /* defined(__hifi__AbstractControllerScriptingInterface__) */ From 4f3f6c032735557c8895968bc1626bc3a0631988 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Wed, 18 Dec 2013 10:42:35 -0800 Subject: [PATCH 6/8] fixed build buster --- interface/src/ControllerScriptingInterface.cpp | 3 --- interface/src/ControllerScriptingInterface.h | 13 +++++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/interface/src/ControllerScriptingInterface.cpp b/interface/src/ControllerScriptingInterface.cpp index 493892e042..fd27eb2428 100644 --- a/interface/src/ControllerScriptingInterface.cpp +++ b/interface/src/ControllerScriptingInterface.cpp @@ -134,9 +134,6 @@ int ControllerScriptingInterface::getNumberOfSpatialControls() const { return getNumberOfActivePalms() * NUMBER_OF_SPATIALCONTROLS_PER_PALM; } -const int PALM_SPATIALCONTROL = 0; -const int TIP_SPATIALCONTROL = 1; - glm::vec3 ControllerScriptingInterface::getSpatialControlPosition(int controlIndex) const { int palmIndex = controlIndex / NUMBER_OF_SPATIALCONTROLS_PER_PALM; int controlOfPalm = controlIndex % NUMBER_OF_SPATIALCONTROLS_PER_PALM; diff --git a/interface/src/ControllerScriptingInterface.h b/interface/src/ControllerScriptingInterface.h index f5b8143032..d0e032d52f 100644 --- a/interface/src/ControllerScriptingInterface.h +++ b/interface/src/ControllerScriptingInterface.h @@ -40,12 +40,13 @@ private: const PalmData* getPalm(int palmIndex) const; int getNumberOfActivePalms() const; const PalmData* getActivePalm(int palmIndex) const; - - const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 2; // the hand and the tip - - const int NUMBER_OF_JOYSTICKS_PER_PALM = 1; - const int NUMBER_OF_TRIGGERS_PER_PALM = 1; - const int NUMBER_OF_BUTTONS_PER_PALM = 6; }; +const int NUMBER_OF_SPATIALCONTROLS_PER_PALM = 2; // the hand and the tip +const int NUMBER_OF_JOYSTICKS_PER_PALM = 1; +const int NUMBER_OF_TRIGGERS_PER_PALM = 1; +const int NUMBER_OF_BUTTONS_PER_PALM = 6; +const int PALM_SPATIALCONTROL = 0; +const int TIP_SPATIALCONTROL = 1; + #endif /* defined(__hifi__ControllerScriptingInterface__) */ From 17f35ce97ba0c322023ddc241c448ec2d83a44c4 Mon Sep 17 00:00:00 2001 From: Philip Rosedale Date: Wed, 18 Dec 2013 16:37:15 -0800 Subject: [PATCH 7/8] Fix to see other people animate hydra hands --- libraries/avatars/src/HandData.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/libraries/avatars/src/HandData.cpp b/libraries/avatars/src/HandData.cpp index cf91af902a..e8b2c97ff0 100644 --- a/libraries/avatars/src/HandData.cpp +++ b/libraries/avatars/src/HandData.cpp @@ -169,6 +169,9 @@ int HandData::decodeRemoteData(unsigned char* sourceBuffer) { palm.setRawNormal(handNormal); palm.setActive(true); + // For received data, set the sixense controller ID to match the order initialized and sent - 0 Left, 1 Right + palm.setSixenseID(handIndex); + for (unsigned int fingerIndex = 0; fingerIndex < numFingers; ++fingerIndex) { if (fingerIndex < palm.getNumFingers()) { FingerData& finger = palm.getFingers()[fingerIndex]; From f10dccb1b8d6fa462ca0891b0247ff133a00c8b0 Mon Sep 17 00:00:00 2001 From: Andrzej Kapolka Date: Wed, 18 Dec 2013 17:28:21 -0800 Subject: [PATCH 8/8] Fix for menu shortcuts; just include widget library rather than using awkward workaround. --- assignment-client/CMakeLists.txt | 3 ++- interface/src/Menu.cpp | 8 ++++---- interface/src/Menu.h | 4 ++-- libraries/shared/CMakeLists.txt | 3 ++- libraries/shared/src/AbstractMenuInterface.h | 14 +++++--------- 5 files changed, 15 insertions(+), 17 deletions(-) diff --git a/assignment-client/CMakeLists.txt b/assignment-client/CMakeLists.txt index 464728f7e0..c7b8ab5732 100644 --- a/assignment-client/CMakeLists.txt +++ b/assignment-client/CMakeLists.txt @@ -9,11 +9,12 @@ set(MACRO_DIR ${ROOT_DIR}/cmake/macros) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/") find_package(Qt5Network REQUIRED) +find_package(Qt5Widgets REQUIRED) include(${MACRO_DIR}/SetupHifiProject.cmake) setup_hifi_project(${TARGET_NAME} TRUE) -qt5_use_modules(${TARGET_NAME} Network) +qt5_use_modules(${TARGET_NAME} Network Widgets) # include glm include(${MACRO_DIR}/IncludeGLM.cmake) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 38f4ae3bae..98b807fea2 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -690,10 +690,10 @@ void Menu::addDisabledActionAndSeparator(QMenu* destinationMenu, const QString& QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu, const QString actionName, - const QKEYSEQUENCE& shortcut, + const QKeySequence& shortcut, const QObject* receiver, const char* member, - QACTION_MENUROLE role) { + QAction::MenuRole role) { QAction* action; if (receiver && member) { @@ -702,7 +702,7 @@ QAction* Menu::addActionToQMenuAndActionHash(QMenu* destinationMenu, action = destinationMenu->addAction(actionName); action->setShortcut(shortcut); } - action->setMenuRole((QAction::MenuRole)role); + action->setMenuRole(role); _actionHash.insert(actionName, action); @@ -715,7 +715,7 @@ QAction* Menu::addCheckableActionToQMenuAndActionHash(QMenu* destinationMenu, const bool checked, const QObject* receiver, const char* member) { - QAction* action = addActionToQMenuAndActionHash(destinationMenu, actionName, (QKEYSEQUENCE&)shortcut, receiver, member); + QAction* action = addActionToQMenuAndActionHash(destinationMenu, actionName, shortcut, receiver, member); action->setCheckable(true); action->setChecked(checked); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index c5742cc570..73bb0472b4 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -76,10 +76,10 @@ public: virtual QMenu* getActiveScriptsMenu() { return _activeScriptsMenu;} virtual QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, const QString actionName, - const QKEYSEQUENCE& shortcut = 0, + const QKeySequence& shortcut = 0, const QObject* receiver = NULL, const char* member = NULL, - QACTION_MENUROLE role = NO_ROLE); + QAction::MenuRole role = QAction::NoRole); virtual void removeAction(QMenu* menu, const QString& actionName); public slots: diff --git a/libraries/shared/CMakeLists.txt b/libraries/shared/CMakeLists.txt index 8c05b1ff8f..1923d906bb 100644 --- a/libraries/shared/CMakeLists.txt +++ b/libraries/shared/CMakeLists.txt @@ -7,11 +7,12 @@ set(TARGET_NAME shared) project(${TARGET_NAME}) find_package(Qt5Network REQUIRED) +find_package(Qt5Widgets REQUIRED) include(${MACRO_DIR}/SetupHifiLibrary.cmake) setup_hifi_library(${TARGET_NAME}) -qt5_use_modules(${TARGET_NAME} Network) +qt5_use_modules(${TARGET_NAME} Network Widgets) # include GLM include(${MACRO_DIR}/IncludeGLM.cmake) diff --git a/libraries/shared/src/AbstractMenuInterface.h b/libraries/shared/src/AbstractMenuInterface.h index 39c378f40b..66083e4ed4 100644 --- a/libraries/shared/src/AbstractMenuInterface.h +++ b/libraries/shared/src/AbstractMenuInterface.h @@ -10,27 +10,23 @@ #ifndef __hifi__AbstractMenuInterface__ #define __hifi__AbstractMenuInterface__ +#include + class QMenu; class QString; class QObject; class QKeySequence; -class QAction; - -// these are actually class scoped enums, but we don't want to depend on the class for this abstract interface -const int NO_ROLE = 0; -typedef int QACTION_MENUROLE; -typedef int QKEYSEQUENCE; class AbstractMenuInterface { public: virtual QMenu* getActiveScriptsMenu() = 0; virtual QAction* addActionToQMenuAndActionHash(QMenu* destinationMenu, const QString actionName, - const QKEYSEQUENCE& shortcut = 0, + const QKeySequence& shortcut = 0, const QObject* receiver = NULL, const char* member = NULL, - QACTION_MENUROLE role = NO_ROLE) = 0; + QAction::MenuRole role = QAction::NoRole) = 0; virtual void removeAction(QMenu* menu, const QString& actionName) = 0; }; -#endif /* defined(__hifi__AbstractMenuInterface__) */ \ No newline at end of file +#endif /* defined(__hifi__AbstractMenuInterface__) */