From a6e6205a57fc79d6c26d595f460d15e2d4578b23 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 17 Dec 2013 15:23:09 -0800 Subject: [PATCH] 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);