From 8ed9a3ca02e94bb064a42cb216b9b5c863384cc2 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Thu, 11 Jun 2015 11:04:19 -0700 Subject: [PATCH] add handedness setting to avatar-hold action. update stick.js to allow use of hydra --- examples/stick.js | 58 +++++++++++++++---- interface/src/avatar/AvatarActionHold.cpp | 31 ++++++++-- interface/src/avatar/AvatarActionHold.h | 2 + .../entities/src/EntityActionInterface.cpp | 18 +++++- .../entities/src/EntityActionInterface.h | 3 + 5 files changed, 94 insertions(+), 18 deletions(-) diff --git a/examples/stick.js b/examples/stick.js index 5631f3aa3a..ea1f3439a9 100644 --- a/examples/stick.js +++ b/examples/stick.js @@ -10,8 +10,12 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // +var hand = "left"; +var nullActionID = "00000000-0000-0000-0000-000000000000"; +var controllerID; +var controllerActive; var stickID = null; -var actionID = "00000000-0000-0000-0000-000000000000"; +var actionID = nullActionID; // sometimes if this is run immediately the stick doesn't get created? use a timer. Script.setTimeout(function() { stickID = Entities.addEntity({ @@ -19,12 +23,14 @@ Script.setTimeout(function() { modelURL: "https://hifi-public.s3.amazonaws.com/eric/models/stick.fbx", compoundShapeURL: "https://hifi-public.s3.amazonaws.com/eric/models/stick.obj", dimensions: {x: .11, y: .11, z: .59}, - position: MyAvatar.getRightPalmPosition(), + position: MyAvatar.getRightPalmPosition(), // initial position doesn't matter, as long as it's close rotation: MyAvatar.orientation, damping: .1, collisionsWillMove: true }); - actionID = Entities.addAction("hold", stickID, {relativePosition: {x: 0.0, y: 0.0, z: -0.9}, timeScale: 0.15}); + actionID = Entities.addAction("hold", stickID, {relativePosition: {x: 0.0, y: 0.0, z: -0.9}, + hand: hand, + timeScale: 0.15}); }, 3000); @@ -32,11 +38,20 @@ function cleanUp() { Entities.deleteEntity(stickID); } + +function positionStick(stickOrientation) { + var baseOffset = {x: 0.0, y: 0.0, z: -0.9}; + var offset = Vec3.multiplyQbyV(stickOrientation, baseOffset); + Entities.updateAction(stickID, actionID, {relativePosition: offset, + relativeRotation: stickOrientation}); +} + + function mouseMoveEvent(event) { - if (!stickID || actionID == "00000000-0000-0000-0000-000000000000") { + if (!stickID || actionID == nullActionID) { return; } - var windowCenterX = Window.innerWidth/ 2; + var windowCenterX = Window.innerWidth / 2; var windowCenterY = Window.innerHeight / 2; var mouseXCenterOffset = event.x - windowCenterX; var mouseYCenterOffset = event.y - windowCenterY; @@ -44,13 +59,34 @@ function mouseMoveEvent(event) { var mouseYRatio = mouseYCenterOffset / windowCenterY; var stickOrientation = Quat.fromPitchYawRollDegrees(mouseYRatio * -90, mouseXRatio * -90, 0); - var baseOffset = {x: 0.0, y: 0.0, z: -0.9}; - var offset = Vec3.multiplyQbyV(stickOrientation, baseOffset); - - Entities.updateAction(stickID, actionID, {relativePosition: offset, - relativeRotation: stickOrientation, - timeScale: 0.15}); + positionStick(stickOrientation); } + +function initControls(){ + if (hand == "right") { + controllerID = 3; // right handed + } else { + controllerID = 4; // left handed + } +} + + +function update(deltaTime){ + var palmPosition = Controller.getSpatialControlPosition(controllerID); + controllerActive = (Vec3.length(palmPosition) > 0); + if(!controllerActive){ + return; + } + + stickOrientation = Controller.getSpatialControlRawRotation(controllerID); + var adjustment = Quat.fromPitchYawRollDegrees(180, 0, 0); + stickOrientation = Quat.multiply(stickOrientation, adjustment); + + positionStick(stickOrientation); +} + + Script.scriptEnding.connect(cleanUp); Controller.mouseMoveEvent.connect(mouseMoveEvent); +Script.update.connect(update); diff --git a/interface/src/avatar/AvatarActionHold.cpp b/interface/src/avatar/AvatarActionHold.cpp index 74a583df58..1fbb01beb3 100644 --- a/interface/src/avatar/AvatarActionHold.cpp +++ b/interface/src/avatar/AvatarActionHold.cpp @@ -29,7 +29,12 @@ AvatarActionHold::~AvatarActionHold() { void AvatarActionHold::updateActionWorker(float deltaTimeStep) { auto myAvatar = DependencyManager::get()->getMyAvatar(); - glm::vec3 palmPosition = myAvatar->getRightPalmPosition(); + glm::vec3 palmPosition; + if (_hand == "right") { + palmPosition = myAvatar->getRightPalmPosition(); + } else { + palmPosition = myAvatar->getLeftPalmPosition(); + } auto rotation = myAvatar->getWorldAlignedOrientation(); auto offset = rotation * _relativePosition; @@ -55,28 +60,46 @@ bool AvatarActionHold::updateArguments(QVariantMap arguments) { bool tSOk = true; float timeScale = EntityActionInterface::extractFloatArgument("hold", arguments, "timeScale", tSOk, false); + bool hOk = true; + QString hand = + EntityActionInterface::extractStringArgument("hold", arguments, "hand", hOk, false); lockForWrite(); if (rPOk) { _relativePosition = relativePosition; - } else { + } else if (!_parametersSet) { _relativePosition = glm::vec3(0.0f, 0.0f, 1.0f); } if (rROk) { _relativeRotation = relativeRotation; - } else { + } else if (!_parametersSet) { _relativeRotation = glm::quat(0.0f, 0.0f, 0.0f, 1.0f); } if (tSOk) { _linearTimeScale = timeScale; _angularTimeScale = timeScale; - } else { + } else if (!_parametersSet) { _linearTimeScale = 0.2; _angularTimeScale = 0.2; } + if (hOk) { + hand = hand.toLower(); + if (hand == "left") { + _hand = "left"; + } else if (hand == "right") { + _hand = "right"; + } else { + qDebug() << "hold action -- invalid hand argument:" << hand; + _hand = "right"; + } + } else if (!_parametersSet) { + _hand = "right"; + } + + _parametersSet = true; _positionalTargetSet = true; _rotationalTargetSet = true; _active = true; diff --git a/interface/src/avatar/AvatarActionHold.h b/interface/src/avatar/AvatarActionHold.h index f92ea94aaa..705c751029 100644 --- a/interface/src/avatar/AvatarActionHold.h +++ b/interface/src/avatar/AvatarActionHold.h @@ -28,6 +28,8 @@ public: private: glm::vec3 _relativePosition; glm::quat _relativeRotation; + QString _hand; + bool _parametersSet = false; }; #endif // hifi_AvatarActionHold_h diff --git a/libraries/entities/src/EntityActionInterface.cpp b/libraries/entities/src/EntityActionInterface.cpp index b293d609c2..e97669686c 100644 --- a/libraries/entities/src/EntityActionInterface.cpp +++ b/libraries/entities/src/EntityActionInterface.cpp @@ -91,7 +91,6 @@ glm::vec3 EntityActionInterface::extractVec3Argument(QString objectName, QVarian return glm::vec3(x, y, z); } - glm::quat EntityActionInterface::extractQuatArgument(QString objectName, QVariantMap arguments, QString argumentName, bool& ok, bool required) { if (!arguments.contains(argumentName)) { @@ -139,8 +138,6 @@ glm::quat EntityActionInterface::extractQuatArgument(QString objectName, QVarian return glm::quat(w, x, y, z); } - - float EntityActionInterface::extractFloatArgument(QString objectName, QVariantMap arguments, QString argumentName, bool& ok, bool required) { if (!arguments.contains(argumentName)) { @@ -162,3 +159,18 @@ float EntityActionInterface::extractFloatArgument(QString objectName, QVariantMa return v; } + +QString EntityActionInterface::extractStringArgument(QString objectName, QVariantMap arguments, + QString argumentName, bool& ok, bool required) { + if (!arguments.contains(argumentName)) { + if (required) { + qDebug() << objectName << "requires argument:" << argumentName; + } + ok = false; + return ""; + } + + QVariant vV = arguments[argumentName]; + QString v = vV.toString(); + return v; +} diff --git a/libraries/entities/src/EntityActionInterface.h b/libraries/entities/src/EntityActionInterface.h index 457db8f5c3..486d3f5948 100644 --- a/libraries/entities/src/EntityActionInterface.h +++ b/libraries/entities/src/EntityActionInterface.h @@ -59,6 +59,9 @@ protected: QString argumentName, bool& ok, bool required = true); static float extractFloatArgument(QString objectName, QVariantMap arguments, QString argumentName, bool& ok, bool required = true); + static QString extractStringArgument(QString objectName, QVariantMap arguments, + QString argumentName, bool& ok, bool required = true); + };