From 23fea1f2217df45a90a93ca81b9eb8953f29f797 Mon Sep 17 00:00:00 2001 From: SamGondelman Date: Fri, 7 Aug 2015 16:59:50 -0700 Subject: [PATCH] working on toybox script, squeezeHands, and default mappings --- .../{squeezeHands2.js => squeezeHands.js} | 0 .../controllers/{handGrab.js => toybox.js} | 128 +++++++++++++----- .../src/input-plugins/SixenseManager.cpp | 4 +- .../input-plugins/ViveControllerManager.cpp | 4 +- 4 files changed, 101 insertions(+), 35 deletions(-) rename examples/controllers/{squeezeHands2.js => squeezeHands.js} (100%) rename examples/controllers/{handGrab.js => toybox.js} (72%) diff --git a/examples/controllers/squeezeHands2.js b/examples/controllers/squeezeHands.js similarity index 100% rename from examples/controllers/squeezeHands2.js rename to examples/controllers/squeezeHands.js diff --git a/examples/controllers/handGrab.js b/examples/controllers/toybox.js similarity index 72% rename from examples/controllers/handGrab.js rename to examples/controllers/toybox.js index 224e66e323..bf7bd87795 100644 --- a/examples/controllers/handGrab.js +++ b/examples/controllers/toybox.js @@ -11,6 +11,8 @@ // Script.include("http://s3.amazonaws.com/hifi-public/scripts/libraries/toolBars.js"); +HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; + var nullActionID = "00000000-0000-0000-0000-000000000000"; var controllerID; var controllerActive; @@ -20,7 +22,7 @@ var leftHandActionID = nullActionID; var rightHandActionID = nullActionID; var TRIGGER_THRESHOLD = 0.2; -var GRAB_RADIUS = 0.25; +var GRAB_RADIUS = 0.15; var LEFT_HAND_CLICK = Controller.findAction("LEFT_HAND_CLICK"); var RIGHT_HAND_CLICK = Controller.findAction("RIGHT_HAND_CLICK"); @@ -32,7 +34,7 @@ var leftHandGrabAction = LEFT_HAND_CLICK; var rightHandGrabValue = 0; var leftHandGrabValue = 0; -var prevRightHandGrabValue = 0; +var prevRightHandGrabValue = 0 var prevLeftHandGrabValue = 0; var grabColor = { red: 0, green: 255, blue: 0}; @@ -46,8 +48,8 @@ var toolBar = new ToolBar(0, 0, ToolBar.vertical, "highfidelity.toybox.toolbar", }); var BUTTON_SIZE = 32; -var SWORD_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/sword.svg"; // replace this with a table icon -var CLEANUP_IMAGE = "http://s3.amazonaws.com/hifi-public/images/delete.png"; // cleanup table +var SWORD_IMAGE = "https://hifi-public.s3.amazonaws.com/images/sword/sword.svg"; // TODO: replace this with a table icon +var CLEANUP_IMAGE = "http://s3.amazonaws.com/hifi-public/images/delete.png"; var tableButton = toolBar.addOverlay("image", { width: BUTTON_SIZE, height: BUTTON_SIZE, @@ -61,20 +63,25 @@ var cleanupButton = toolBar.addOverlay("image", { alpha: 1 }); -var leftHandOverlay = Overlays.addOverlay("sphere", { +var overlays = true; +var leftHandOverlay; +var rightHandOverlay; +if (overlays) { + leftHandOverlay = Overlays.addOverlay("sphere", { position: MyAvatar.getLeftPalmPosition(), size: GRAB_RADIUS, color: releaseColor, alpha: 0.5, solid: false }); -var rightHandOverlay = Overlays.addOverlay("sphere", { + rightHandOverlay = Overlays.addOverlay("sphere", { position: MyAvatar.getRightPalmPosition(), size: GRAB_RADIUS, color: releaseColor, alpha: 0.5, solid: false }); +} var OBJECT_HEIGHT_OFFSET = 0.5; var MIN_OBJECT_SIZE = 0.05; @@ -86,9 +93,9 @@ var TABLE_DIMENSIONS = { }; var GRAVITY = { - x: 0, - y: -2, - z: 0 + x: 0.0, + y: -2.0, + z: 0.0 } var LEFT = 0; @@ -101,6 +108,8 @@ var tableEntities = Array(NUM_OBJECTS + 1); // Also includes table var VELOCITY_MAG = 0.3; +var entitiesToResize = []; + var MODELS = Array( { modelURL: "https://hifi-public.s3.amazonaws.com/ozan/props/sword/sword.fbx" }, { modelURL: "https://s3.amazonaws.com/hifi-public/marketplace/hificontent/Vehicles/clara/spaceshuttle.fbx" }, @@ -113,11 +122,20 @@ var MODELS = Array( { modelURL: "https://hifi-public.s3.amazonaws.com/marketplace/contents/029db3d4-da2c-4cb2-9c08-b9612ba576f5/02949063e7c4aed42ad9d1a58461f56d.fst?1427169842" }, { modelURL: "https://hifi-public.s3.amazonaws.com/models/props/MidCenturyModernLivingRoom/Interior/Bar.fbx" }, { modelURL: "https://hifi-public.s3.amazonaws.com/marketplace/contents/96124d04-d603-4707-a5b3-e03bf47a53b2/1431770eba362c1c25c524126f2970fb.fst?1436924721" } + // Complex models: // { modelURL: "https://s3.amazonaws.com/hifi-public/marketplace/hificontent/Architecture/sketchfab/cudillero.fbx" }, // { modelURL: "https://hifi-public.s3.amazonaws.com/ozan/sets/musicality/musicality.fbx" }, // { modelURL: "https://hifi-public.s3.amazonaws.com/ozan/sets/statelyHome/statelyHome.fbx" } ); +var COLLISION_SOUNDS = Array( + "http://public.highfidelity.io/sounds/Collisions-ballhitsandcatches/pingpong_TableBounceMono.wav", + "http://public.highfidelity.io/sounds/Collisions-ballhitsandcatches/billiards/collision1.wav" + ); + +var RESIZE_TIMER = 0.0; +var RESIZE_WAIT = 0.05; // 50 milliseconds + function letGo(hand) { var actionIDToRemove = (hand == LEFT) ? leftHandActionID : rightHandActionID; var entityIDToEdit = (hand == LEFT) ? leftHandObjectID : rightHandObjectID; @@ -126,6 +144,7 @@ function letGo(hand) { MyAvatar.getRightPalmAngularVelocity(); if (actionIDToRemove != nullActionID && entityIDToEdit != null) { Entities.deleteAction(entityIDToEdit, actionIDToRemove); + // TODO: upon successful letGo, restore collision groups if (hand == LEFT) { leftHandObjectID = null; leftHandActionID = nullActionID; @@ -143,11 +162,11 @@ function setGrabbedObject(hand) { var minDistance = GRAB_RADIUS; for (var i = 0; i < entities.length; i++) { if ((hand == LEFT && entities[i] == rightHandObjectID) || - (hand == RIGHT) && entities[i] == leftHandObjectID) { + (hand == RIGHT && entities[i] == leftHandObjectID)) { continue; } else { var distance = Vec3.distance(Entities.getEntityProperties(entities[i]).position, handPosition); - if (distance < minDistance) { + if (distance <= minDistance) { objectID = entities[i]; minDistance = distance; } @@ -170,15 +189,17 @@ function grab(hand) { } var objectID = (hand == LEFT) ? leftHandObjectID : rightHandObjectID; var handRotation = (hand == LEFT) ? MyAvatar.getLeftPalmRotation() : MyAvatar.getRightPalmRotation(); + var handPosition = (hand == LEFT) ? MyAvatar.getLeftPalmPosition() : MyAvatar.getRightPalmPosition(); var objectRotation = Entities.getEntityProperties(objectID).rotation; var offsetRotation = Quat.multiply(Quat.inverse(handRotation), objectRotation); + + var objectPosition = Entities.getEntityProperties(objectID).position; + var offset = Vec3.subtract(objectPosition, handPosition); + var offsetPosition = Vec3.multiplyQbyV(Quat.inverse(Quat.multiply(handRotation, offsetRotation)), offset); + // print(JSON.stringify(offsetPosition)); var actionID = Entities.addAction("hold", objectID, { - relativePosition: { - x: 0.0, - y: 0.0, - z: 0.0 - }, + relativePosition: { x: 0, y: 0, z: 0 }, relativeRotation: offsetRotation, hand: (hand == LEFT) ? "left" : "right", timeScale: 0.05 @@ -190,7 +211,7 @@ function grab(hand) { rightHandObjectID = null; } } else { - // Entities.editEntity(objectID, { ignore}); + // TODO: upon successful grab, add to collision group so object doesn't collide with immovable entities if (hand == LEFT) { leftHandActionID = actionID; } else { @@ -199,28 +220,65 @@ function grab(hand) { } } -function update() { - Overlays.editOverlay(leftHandOverlay, { position: MyAvatar.getLeftPalmPosition() }); - Overlays.editOverlay(rightHandOverlay, { position: MyAvatar.getRightPalmPosition() }); +function resizeModels() { + var newEntitiesToResize = []; + for (var i = 0; i < entitiesToResize.length; i++) { + var naturalDimensions = Entities.getEntityProperties(entitiesToResize[i]).naturalDimensions; + if (naturalDimensions.x != 1.0 || naturalDimensions.y != 1.0 || naturalDimensions.z != 1.0) { + // bigger range of sizes for models + var dimensions = Vec3.multiply(randFloat(MIN_OBJECT_SIZE, 3.0*MAX_OBJECT_SIZE), Vec3.normalize(naturalDimensions)); + Entities.editEntity(entitiesToResize[i], { + dimensions: dimensions, + shapeType: "box" + }); + } else { + newEntitiesToResize.push(entitiesToResize[i]); + } + + } + entitiesToResize = newEntitiesToResize; +} + +function update(deltaTime) { + if (overlays) { + Overlays.editOverlay(leftHandOverlay, { position: MyAvatar.getLeftPalmPosition() }); + Overlays.editOverlay(rightHandOverlay, { position: MyAvatar.getRightPalmPosition() }); + } + + // if (tableCreated && RESIZE_TIMER < RESIZE_WAIT) { + // RESIZE_TIMER += deltaTime; + // } else if (tableCreated) { + // resizeModels(); + // } rightHandGrabValue = Controller.getActionValue(rightHandGrabAction); leftHandGrabValue = Controller.getActionValue(leftHandGrabAction); - if (rightHandGrabValue > TRIGGER_THRESHOLD && rightHandObjectID == null) { - Overlays.editOverlay(rightHandOverlay, { color: grabColor }); + if (rightHandGrabValue > TRIGGER_THRESHOLD && + prevRightHandGrabValue < TRIGGER_THRESHOLD) { + if (overlays) { + Overlays.editOverlay(rightHandOverlay, { color: grabColor }); + } grab(RIGHT); } else if (rightHandGrabValue < TRIGGER_THRESHOLD && prevRightHandGrabValue > TRIGGER_THRESHOLD) { - Overlays.editOverlay(rightHandOverlay, { color: releaseColor }); + if (overlays) { + Overlays.editOverlay(rightHandOverlay, { color: releaseColor }); + } letGo(RIGHT); } - if (leftHandGrabValue > TRIGGER_THRESHOLD && leftHandObjectID == null) { - Overlays.editOverlay(leftHandOverlay, { color: grabColor }); + if (leftHandGrabValue > TRIGGER_THRESHOLD && + prevLeftHandGrabValue < TRIGGER_THRESHOLD) { + if (overlays) { + Overlays.editOverlay(leftHandOverlay, { color: grabColor }); + } grab(LEFT); } else if (leftHandGrabValue < TRIGGER_THRESHOLD && prevLeftHandGrabValue > TRIGGER_THRESHOLD) { - Overlays.editOverlay(leftHandOverlay, { color: releaseColor }); + if (overlays) { + Overlays.editOverlay(leftHandOverlay, { color: releaseColor }); + } letGo(LEFT); } @@ -231,8 +289,10 @@ function update() { function cleanUp() { letGo(RIGHT); letGo(LEFT); - Overlays.deleteOverlay(leftHandOverlay); - Overlays.deleteOverlay(rightHandOverlay); + if (overlays) { + Overlays.deleteOverlay(leftHandOverlay); + Overlays.deleteOverlay(rightHandOverlay); + } removeTable(); toolBar.cleanup(); } @@ -268,11 +328,14 @@ randInt = function(low, high) { function createTable() { var tablePosition = Vec3.sum(MyAvatar.position, Vec3.multiply(3, Quat.getFront(MyAvatar.orientation))); tableEntities[0] = Entities.addEntity( { - type: "Box", + type: "Model", + shapeType: 'box', position: tablePosition, dimensions: TABLE_DIMENSIONS, rotation: MyAvatar.orientation, - color: { red: 255, green: 0, blue: 0 } + // color: { red: 102, green: 51, blue: 0 }, + modelURL: HIFI_PUBLIC_BUCKET + 'eric/models/woodFloor.fbx', + collisionSoundURL: "http://public.highfidelity.io/sounds/dice/diceCollide.wav" }); for (var i = 1; i < NUM_OBJECTS + 1; i++) { @@ -308,7 +371,8 @@ function createTable() { restitution: 0.01, density: 0.5, collisionsWillMove: true, - color: { red: randInt(0, 255), green: randInt(0, 255), blue: randInt(0, 255) } + color: { red: randInt(0, 255), green: randInt(0, 255), blue: randInt(0, 255) }, + // collisionSoundURL: COLLISION_SOUNDS[randInt(0, COLLISION_SOUNDS.length)] }); if (type == "Model") { var randModel = randInt(0, MODELS.length); @@ -316,11 +380,13 @@ function createTable() { shapeType: "box", modelURL: MODELS[randModel].modelURL }); + entitiesToResize.push(tableEntities[i]); } } } function removeTable() { + RESIZE_TIMER = 0.0; for (var i = 0; i < tableEntities.length; i++) { Entities.deleteEntity(tableEntities[i]); } diff --git a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp index 8283847918..e47521111c 100644 --- a/libraries/input-plugins/src/input-plugins/SixenseManager.cpp +++ b/libraries/input-plugins/src/input-plugins/SixenseManager.cpp @@ -535,8 +535,8 @@ void SixenseManager::assignDefaultInputMapping(UserInputMapper& mapper) { mapper.addInputChannel(UserInputMapper::LEFT_HAND, makeInput(LEFT_HAND)); mapper.addInputChannel(UserInputMapper::RIGHT_HAND, makeInput(RIGHT_HAND)); - mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(BUTTON_FWD, 0)); - mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(BUTTON_FWD, 1)); + mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(BACK_TRIGGER, 0)); + mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(BACK_TRIGGER, 1)); } diff --git a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp index 6455b312e0..d871b8262f 100644 --- a/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp +++ b/libraries/input-plugins/src/input-plugins/ViveControllerManager.cpp @@ -394,8 +394,8 @@ void ViveControllerManager::assignDefaultInputMapping(UserInputMapper& mapper) { mapper.addInputChannel(UserInputMapper::ACTION1, makeInput(GRIP_BUTTON, 0)); mapper.addInputChannel(UserInputMapper::ACTION2, makeInput(GRIP_BUTTON, 1)); - mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(TRIGGER_BUTTON, 0)); - mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(TRIGGER_BUTTON, 1)); + mapper.addInputChannel(UserInputMapper::LEFT_HAND_CLICK, makeInput(BACK_TRIGGER, 0)); + mapper.addInputChannel(UserInputMapper::RIGHT_HAND_CLICK, makeInput(BACK_TRIGGER, 1)); // Hands mapper.addInputChannel(UserInputMapper::LEFT_HAND, makeInput(LEFT_HAND));