From 5050171d30b3e74321de840143a2cb6d0cc451f2 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 13 May 2015 11:34:19 -0700 Subject: [PATCH 01/11] Fix face-tracked head disappearing into body Normalize quaternion to ensure that acos(r.w) is valid (r.w <= 1.0) and r.w = 1.0 when r.x = r.y = r.z = 0.0. --- interface/src/devices/DdeFaceTracker.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/devices/DdeFaceTracker.cpp b/interface/src/devices/DdeFaceTracker.cpp index e0b888746f..db90f92f37 100644 --- a/interface/src/devices/DdeFaceTracker.cpp +++ b/interface/src/devices/DdeFaceTracker.cpp @@ -382,7 +382,7 @@ void DdeFaceTracker::decodePacket(const QByteArray& buffer) { // Compute relative rotation rotation = glm::inverse(_referenceRotation) * rotation; if (isFiltering) { - glm::quat r = rotation * glm::inverse(_headRotation); + glm::quat r = glm::normalize(rotation * glm::inverse(_headRotation)); float theta = 2 * acos(r.w); glm::vec3 angularVelocity; if (theta > EPSILON) { From 7319c7b767c01f735eee919c1ef9b769618f4d8b Mon Sep 17 00:00:00 2001 From: David Rowe Date: Wed, 13 May 2015 11:35:04 -0700 Subject: [PATCH 02/11] Fix face-tracked head rotation for Faceshift, also --- interface/src/devices/Faceshift.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/devices/Faceshift.cpp b/interface/src/devices/Faceshift.cpp index 409f359afa..b517f9d67b 100644 --- a/interface/src/devices/Faceshift.cpp +++ b/interface/src/devices/Faceshift.cpp @@ -213,7 +213,7 @@ void Faceshift::receive(const QByteArray& buffer) { glm::quat newRotation = glm::quat(data.m_headRotation.w, -data.m_headRotation.x, data.m_headRotation.y, -data.m_headRotation.z); // Compute angular velocity of the head - glm::quat r = newRotation * glm::inverse(_headRotation); + glm::quat r = glm::normalize(newRotation * glm::inverse(_headRotation)); float theta = 2 * acos(r.w); if (theta > EPSILON) { float rMag = glm::length(glm::vec3(r.x, r.y, r.z)); From d3cb6a9334e7abd1de4b770c9753e6adfc208fb7 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Fri, 15 May 2015 09:40:32 -0700 Subject: [PATCH 03/11] Fix visibility of binary eyelid control menu item --- interface/src/Menu.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 0d7563f27a..95877b92c4 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -393,7 +393,7 @@ Menu::Menu() { #ifdef HAVE_DDE faceTrackingMenu->addSeparator(); QAction* binaryEyelidControl = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::BinaryEyelidControl, 0, true); - binaryEyelidControl->setVisible(false); + binaryEyelidControl->setVisible(true); // DDE face tracking is on by default QAction* useAudioForMouth = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::UseAudioForMouth, 0, true); useAudioForMouth->setVisible(true); // DDE face tracking is on by default QAction* ddeFiltering = addCheckableActionToQMenuAndActionHash(faceTrackingMenu, MenuOption::VelocityFilter, 0, true); From f535bd2a76cb4ce55fa2288722fb6ab4f8392032 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 15 May 2015 13:54:24 -0700 Subject: [PATCH 04/11] more fixes to pointer.js --- examples/pointer.js | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/examples/pointer.js b/examples/pointer.js index d4348e19aa..c41bf277dd 100644 --- a/examples/pointer.js +++ b/examples/pointer.js @@ -17,6 +17,7 @@ function removeLine() { Entities.deleteEntity(lineEntityID); lineEntityID = null; lineIsRezzed = false; + Controller.mouseMoveEvent.disconnect(mouseMoveEvent); } } @@ -43,6 +44,7 @@ function createOrUpdateLine(event) { color: { red: 255, green: 255, blue: 255 }, lifetime: 60 // if someone crashes while pointing, don't leave the line there forever. }); + Controller.mouseMoveEvent.connect(mouseMoveEvent); } } else { removeLine(); @@ -58,9 +60,6 @@ function mousePressEvent(event) { return; } createOrUpdateLine(event); - if (lineIsRezzed) { - Controller.mouseMoveEvent.connect(mouseMoveEvent); - } } @@ -70,9 +69,6 @@ function mouseMoveEvent(event) { function mouseReleaseEvent() { - if (lineIsRezzed) { - Controller.mouseMoveEvent.disconnect(mouseMoveEvent); - } removeLine(); } From 9c6be26290a71cf6a2a7e89baad75ea220c045cf Mon Sep 17 00:00:00 2001 From: Eric Levin Date: Fri, 15 May 2015 13:55:48 -0700 Subject: [PATCH 05/11] changed dice to use collisionSoundURL prop --- examples/dice.js | 180 +++++++++++++++++++++++++---------------------- 1 file changed, 94 insertions(+), 86 deletions(-) diff --git a/examples/dice.js b/examples/dice.js index f313e606b8..515019e740 100644 --- a/examples/dice.js +++ b/examples/dice.js @@ -12,17 +12,17 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -var isDice = false; -var NUMBER_OF_DICE = 4; -var LIFETIME = 10000; // Dice will live for about 3 hours +var isDice = false; +var NUMBER_OF_DICE = 4; +var LIFETIME = 10000; // Dice will live for about 3 hours var dice = []; var DIE_SIZE = 0.20; -var madeSound = true; // Set false at start of throw to look for collision +var madeSound = true; // Set false at start of throw to look for collision HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; +SoundCache.getSound("http://s3.amazonaws.com/hifi-public/sounds/dice/diceCollide.wav"); -var rollSound = SoundCache.getSound(HIFI_PUBLIC_BUCKET + "sounds/dice/diceRoll.wav"); var INSUFFICIENT_PERMISSIONS_ERROR_MSG = "You do not have the necessary permissions to create new objects." @@ -32,34 +32,46 @@ var BUTTON_SIZE = 32; var PADDING = 3; var offButton = Overlays.addOverlay("image", { - x: screenSize.x / 2 - BUTTON_SIZE * 2 + PADDING, - y: screenSize.y- (BUTTON_SIZE + PADDING), - width: BUTTON_SIZE, - height: BUTTON_SIZE, - imageURL: HIFI_PUBLIC_BUCKET + "images/close.png", - color: { red: 255, green: 255, blue: 255}, - alpha: 1 - }); + x: screenSize.x / 2 - BUTTON_SIZE * 2 + PADDING, + y: screenSize.y - (BUTTON_SIZE + PADDING), + width: BUTTON_SIZE, + height: BUTTON_SIZE, + imageURL: HIFI_PUBLIC_BUCKET + "images/close.png", + color: { + red: 255, + green: 255, + blue: 255 + }, + alpha: 1 +}); var deleteButton = Overlays.addOverlay("image", { - x: screenSize.x / 2 - BUTTON_SIZE, - y: screenSize.y- (BUTTON_SIZE + PADDING), - width: BUTTON_SIZE, - height: BUTTON_SIZE, - imageURL: HIFI_PUBLIC_BUCKET + "images/delete.png", - color: { red: 255, green: 255, blue: 255}, - alpha: 1 - }); + x: screenSize.x / 2 - BUTTON_SIZE, + y: screenSize.y - (BUTTON_SIZE + PADDING), + width: BUTTON_SIZE, + height: BUTTON_SIZE, + imageURL: HIFI_PUBLIC_BUCKET + "images/delete.png", + color: { + red: 255, + green: 255, + blue: 255 + }, + alpha: 1 +}); var diceButton = Overlays.addOverlay("image", { - x: screenSize.x / 2 + PADDING, - y: screenSize.y - (BUTTON_SIZE + PADDING), - width: BUTTON_SIZE, - height: BUTTON_SIZE, - imageURL: HIFI_PUBLIC_BUCKET + "images/die.png", - color: { red: 255, green: 255, blue: 255}, - alpha: 1 - }); + x: screenSize.x / 2 + PADDING, + y: screenSize.y - (BUTTON_SIZE + PADDING), + width: BUTTON_SIZE, + height: BUTTON_SIZE, + imageURL: HIFI_PUBLIC_BUCKET + "images/die.png", + color: { + red: 255, + green: 255, + blue: 255 + }, + alpha: 1 +}); var GRAVITY = -3.5; @@ -68,74 +80,70 @@ var MAX_ANGULAR_SPEED = Math.PI; function shootDice(position, velocity) { - if (!Entities.canRez()) { - Window.alert(INSUFFICIENT_PERMISSIONS_ERROR_MSG); - } else { - for (var i = 0; i < NUMBER_OF_DICE; i++) { - dice.push(Entities.addEntity( - { type: "Model", - modelURL: HIFI_PUBLIC_BUCKET + "models/props/Dice/goldDie.fbx", - position: position, - velocity: velocity, - rotation: Quat.fromPitchYawRollDegrees(Math.random() * 360, Math.random() * 360, Math.random() * 360), - angularVelocity: { x: Math.random() * MAX_ANGULAR_SPEED, - y: Math.random() * MAX_ANGULAR_SPEED, - z: Math.random() * MAX_ANGULAR_SPEED }, - lifetime: LIFETIME, - gravity: { x: 0, y: GRAVITY, z: 0 }, - shapeType: "box", - collisionsWillMove: true - })); - position = Vec3.sum(position, Vec3.multiply(DIE_SIZE, Vec3.normalize(Quat.getRight(Camera.getOrientation())))); - } + if (!Entities.canRez()) { + Window.alert(INSUFFICIENT_PERMISSIONS_ERROR_MSG); + } else { + for (var i = 0; i < NUMBER_OF_DICE; i++) { + dice.push(Entities.addEntity( + { + type: "Model", + modelURL: HIFI_PUBLIC_BUCKET + "models/props/Dice/goldDie.fbx", + position: position, + velocity: velocity, + rotation: Quat.fromPitchYawRollDegrees(Math.random() * 360, Math.random() * 360, Math.random() * 360), + angularVelocity: { + x: Math.random() * MAX_ANGULAR_SPEED, + y: Math.random() * MAX_ANGULAR_SPEED, + z: Math.random() * MAX_ANGULAR_SPEED + }, + gravity: { + x: 0, + y: GRAVITY, + z: 0 + }, + lifetime: LIFETIME, + shapeType: "box", + collisionsWillMove: true, + collisionSoundURL: "http://s3.amazonaws.com/hifi-public/sounds/dice/diceCollide.wav" + })); + position = Vec3.sum(position, Vec3.multiply(DIE_SIZE, Vec3.normalize(Quat.getRight(Camera.getOrientation())))); } + } } function deleteDice() { - while(dice.length > 0) { - Entities.deleteEntity(dice.pop()); - } + while (dice.length > 0) { + Entities.deleteEntity(dice.pop()); + } } -function entityCollisionWithEntity(entity1, entity2, collision) { - if (!madeSound) { - // Is it one of our dice? - for (var i = 0; i < dice.length; i++) { - if (!dice[i].isKnownID) { - dice[i] = Entities.identifyEntity(dice[i]); - } - if ((entity1.id == dice[i].id) || (entity2.id == dice[i].id)) { - madeSound = true; - Audio.playSound(rollSound, { position: collision.contactPoint, localOnly: true }); - } - } - - } -} + function mousePressEvent(event) { - var clickedText = false; - var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); - if (clickedOverlay == offButton) { - deleteDice(); - Script.stop(); - } else if (clickedOverlay == deleteButton) { - deleteDice(); - } else if (clickedOverlay == diceButton) { - var HOW_HARD = 2.0; - var position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); - var velocity = Vec3.multiply(HOW_HARD, Quat.getFront(Camera.getOrientation())); - shootDice(position, velocity); - madeSound = false; - } + var clickedText = false; + var clickedOverlay = Overlays.getOverlayAtPoint({ + x: event.x, + y: event.y + }); + if (clickedOverlay == offButton) { + deleteDice(); + Script.stop(); + } else if (clickedOverlay == deleteButton) { + deleteDice(); + } else if (clickedOverlay == diceButton) { + var HOW_HARD = 2.0; + var position = Vec3.sum(Camera.getPosition(), Quat.getFront(Camera.getOrientation())); + var velocity = Vec3.multiply(HOW_HARD, Quat.getFront(Camera.getOrientation())); + shootDice(position, velocity); + madeSound = false; + } } function scriptEnding() { - Overlays.deleteOverlay(offButton); - Overlays.deleteOverlay(diceButton); - Overlays.deleteOverlay(deleteButton); + Overlays.deleteOverlay(offButton); + Overlays.deleteOverlay(diceButton); + Overlays.deleteOverlay(deleteButton); } -Entities.entityCollisionWithEntity.connect(entityCollisionWithEntity); Controller.mousePressEvent.connect(mousePressEvent); -Script.scriptEnding.connect(scriptEnding); +Script.scriptEnding.connect(scriptEnding); \ No newline at end of file From aeb5cead65f19d38b73e456f905821281f5cb146 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 15 May 2015 14:02:25 -0700 Subject: [PATCH 06/11] more fixes to pointer.js --- examples/pointer.js | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/examples/pointer.js b/examples/pointer.js index c41bf277dd..ef35e13f7b 100644 --- a/examples/pointer.js +++ b/examples/pointer.js @@ -17,7 +17,6 @@ function removeLine() { Entities.deleteEntity(lineEntityID); lineEntityID = null; lineIsRezzed = false; - Controller.mouseMoveEvent.disconnect(mouseMoveEvent); } } @@ -44,7 +43,6 @@ function createOrUpdateLine(event) { color: { red: 255, green: 255, blue: 255 }, lifetime: 60 // if someone crashes while pointing, don't leave the line there forever. }); - Controller.mouseMoveEvent.connect(mouseMoveEvent); } } else { removeLine(); @@ -56,9 +54,7 @@ function mousePressEvent(event) { if (!event.isLeftButton) { return; } - if (lineIsRezzed) { - return; - } + Controller.mouseMoveEvent.connect(mouseMoveEvent); createOrUpdateLine(event); } @@ -69,6 +65,7 @@ function mouseMoveEvent(event) { function mouseReleaseEvent() { + Controller.mouseMoveEvent.disconnect(mouseMoveEvent); removeLine(); } From 0d3add85968ec0ee90512ce28bfa32253723df53 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 15 May 2015 14:16:06 -0700 Subject: [PATCH 07/11] left mouse button only --- examples/pointer.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/examples/pointer.js b/examples/pointer.js index ef35e13f7b..6c26a28ed8 100644 --- a/examples/pointer.js +++ b/examples/pointer.js @@ -64,7 +64,10 @@ function mouseMoveEvent(event) { } -function mouseReleaseEvent() { +function mouseReleaseEvent(event) { + if (!event.isLeftButton) { + return; + } Controller.mouseMoveEvent.disconnect(mouseMoveEvent); removeLine(); } From 60bd345e577ec94035fb744974462e84066f58d8 Mon Sep 17 00:00:00 2001 From: Seth Alves Date: Fri, 15 May 2015 14:20:29 -0700 Subject: [PATCH 08/11] shorter timeout --- examples/pointer.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/pointer.js b/examples/pointer.js index 6c26a28ed8..dfb79569f7 100644 --- a/examples/pointer.js +++ b/examples/pointer.js @@ -32,7 +32,7 @@ function createOrUpdateLine(event) { Entities.editEntity(lineEntityID, { position: nearLinePoint(intersection.intersection), dimensions: dim, - lifetime: 60 + props.lifespan // renew lifetime + lifetime: 15 + props.lifespan // renew lifetime }); } else { lineIsRezzed = true; @@ -41,7 +41,7 @@ function createOrUpdateLine(event) { position: nearLinePoint(intersection.intersection), dimensions: dim, color: { red: 255, green: 255, blue: 255 }, - lifetime: 60 // if someone crashes while pointing, don't leave the line there forever. + lifetime: 15 // if someone crashes while pointing, don't leave the line there forever. }); } } else { From 6e1c5d704ca3f6b7ab76ab700ac553647ae0ae01 Mon Sep 17 00:00:00 2001 From: Eric Levin Date: Fri, 15 May 2015 15:24:10 -0700 Subject: [PATCH 09/11] 'modified airHockey script to be able to spawn and delete using buttons, added light flashing on score, and puck now respawns on player's side who just got scored on --- examples/example/games/airHockey.js | 732 ++++++++++++++++++++-------- 1 file changed, 538 insertions(+), 194 deletions(-) diff --git a/examples/example/games/airHockey.js b/examples/example/games/airHockey.js index 98bab1d57e..0bcfa8f2c4 100644 --- a/examples/example/games/airHockey.js +++ b/examples/example/games/airHockey.js @@ -10,29 +10,43 @@ // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // -var debugVisible = false; +var debugVisible = false; var FIELD_WIDTH = 1.21; var FIELD_LENGTH = 1.92; var FLOOR_THICKNESS = 0.20; var EDGE_THICKESS = 0.10; var EDGE_HEIGHT = 0.10; -var DROP_HEIGHT = 0.3; +var DROP_HEIGHT = 0.3; var PUCK_SIZE = 0.15; var PUCK_THICKNESS = 0.05; var PADDLE_SIZE = 0.15; var PADDLE_THICKNESS = 0.05; +var ENTITY_SEARCH_RANGE = 500; + var GOAL_WIDTH = 0.35; var GRAVITY = -9.8; -var LIFETIME = 6000; +var LIFETIME = 6000; var PUCK_DAMPING = 0.02; var PADDLE_DAMPING = 0.35; var ANGULAR_DAMPING = 0.4; var PADDLE_ANGULAR_DAMPING = 0.75; var MODEL_SCALE = 1.52; -var MODEL_OFFSET = { x: 0, y: -0.19, z: 0 }; +var MODEL_OFFSET = { + x: 0, + y: -0.19, + z: 0 +}; + +var LIGHT_OFFSET = { + x: 0, + y: 0.2, + z: 0 +}; + +var LIGHT_FLASH_TIME = 700; var scoreSound = SoundCache.getSound("https://s3.amazonaws.com/hifi-public/sounds/Collisions-hitsandslaps/airhockey_score.wav"); @@ -46,221 +60,551 @@ var puckCollisionModel = "http://headache.hungry.com/~seth/hifi/airHockeyPuck-hu var paddleModel = "https://hifi-public.s3.amazonaws.com/ozan/props/airHockeyTable/airHockeyPaddle.obj" var paddleCollisionModel = "http://headache.hungry.com/~seth/hifi/paddle-hull.obj" -var center = Vec3.sum(MyAvatar.position, Vec3.multiply((FIELD_WIDTH + FIELD_LENGTH) * 0.60, Quat.getFront(Camera.getOrientation()))); +HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; +var screenSize = Controller.getViewportDimensions(); +var BUTTON_SIZE = 32; +var PADDING = 3; + +var center; var edgeRestitution = 0.9; var floorFriction = 0.01; -var floor = Entities.addEntity( - { type: "Box", - position: Vec3.subtract(center, { x: 0, y: 0, z: 0 }), - dimensions: { x: FIELD_WIDTH, y: FLOOR_THICKNESS, z: FIELD_LENGTH }, - color: { red: 128, green: 128, blue: 128 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - locked: true, - friction: floorFriction, - visible: debugVisible, - lifetime: LIFETIME }); +var paddle1Pos, paddle2Pos; +var names = ['floor', 'table', 'paddle', 'edge', 'puck', 'hockeyLight']; -var edge1 = Entities.addEntity( - { type: "Box", - collisionSoundURL: hitSideSound, - position: Vec3.sum(center, { x: FIELD_WIDTH / 2.0, y: FLOOR_THICKNESS / 2.0, z: 0 }), - dimensions: { x: EDGE_THICKESS, y: EDGE_HEIGHT, z: FIELD_LENGTH + EDGE_THICKESS }, - color: { red: 100, green: 100, blue: 100 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - visible: debugVisible, - restitution: edgeRestitution, - locked: true, - lifetime: LIFETIME }); +var deleteButton = Overlays.addOverlay("image", { + x: screenSize.x / 2 - BUTTON_SIZE, + y: screenSize.y - (BUTTON_SIZE + PADDING), + width: BUTTON_SIZE, + height: BUTTON_SIZE, + imageURL: HIFI_PUBLIC_BUCKET + "images/delete.png", + color: { + red: 255, + green: 255, + blue: 255 + }, + alpha: 1 +}); -var edge2 = Entities.addEntity( - { type: "Box", - collisionSoundURL: hitSideSound, - position: Vec3.sum(center, { x: -FIELD_WIDTH / 2.0, y: FLOOR_THICKNESS / 2.0, z: 0 }), - dimensions: { x: EDGE_THICKESS, y: EDGE_HEIGHT, z: FIELD_LENGTH + EDGE_THICKESS }, - color: { red: 100, green: 100, blue: 100 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - visible: debugVisible, - restitution: edgeRestitution, - locked: true, - lifetime: LIFETIME }); +var spawnButton = Overlays.addOverlay("image", { + x: screenSize.x / 2 + PADDING, + y: screenSize.y - (BUTTON_SIZE + PADDING), + width: BUTTON_SIZE, + height: BUTTON_SIZE, + imageURL: HIFI_PUBLIC_BUCKET + "images/die.png", + color: { + red: 255, + green: 255, + blue: 255 + }, + alpha: 1 +}); -var edge3a = Entities.addEntity( - { type: "Box", - collisionSoundURL: hitSideSound, - position: Vec3.sum(center, { x: FIELD_WIDTH / 4.0 + (GOAL_WIDTH / 4.0), y: FLOOR_THICKNESS / 2.0, z: -FIELD_LENGTH / 2.0 }), - dimensions: { x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, y: EDGE_HEIGHT, z: EDGE_THICKESS }, - color: { red: 100, green: 100, blue: 100 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - visible: debugVisible, - restitution: edgeRestitution, - locked: true, - lifetime: LIFETIME }); -var edge3b = Entities.addEntity( - { type: "Box", - collisionSoundURL: hitSideSound, - position: Vec3.sum(center, { x: -FIELD_WIDTH / 4.0 - (GOAL_WIDTH / 4.0), y: FLOOR_THICKNESS / 2.0, z: -FIELD_LENGTH / 2.0 }), - dimensions: { x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, y: EDGE_HEIGHT, z: EDGE_THICKESS }, - color: { red: 100, green: 100, blue: 100 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - visible: debugVisible, - restitution: edgeRestitution, - locked: true, - lifetime: LIFETIME }); - -var edge4a = Entities.addEntity( - { type: "Box", - collisionSoundURL: hitSideSound, - position: Vec3.sum(center, { x: FIELD_WIDTH / 4.0 + (GOAL_WIDTH / 4.0), y: FLOOR_THICKNESS / 2.0, z: FIELD_LENGTH / 2.0 }), - dimensions: { x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, y: EDGE_HEIGHT, z: EDGE_THICKESS }, - color: { red: 100, green: 100, blue: 100 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - visible: debugVisible, - restitution: edgeRestitution, - locked: true, - lifetime: LIFETIME }); - -var edge4b = Entities.addEntity( - { type: "Box", - collisionSoundURL: hitSideSound, - position: Vec3.sum(center, { x: -FIELD_WIDTH / 4.0 - (GOAL_WIDTH / 4.0), y: FLOOR_THICKNESS / 2.0, z: FIELD_LENGTH / 2.0 }), - dimensions: { x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, y: EDGE_HEIGHT, z: EDGE_THICKESS }, - color: { red: 100, green: 100, blue: 100 }, - gravity: { x: 0, y: 0, z: 0 }, - ignoreCollisions: false, - visible: debugVisible, - restitution: edgeRestitution, - locked: true, - lifetime: LIFETIME }); - -var table = Entities.addEntity( - { type: "Model", - modelURL: polyTable, - dimensions: Vec3.multiply({ x: 0.8, y: 0.45, z: 1.31 }, MODEL_SCALE), - position: Vec3.sum(center, MODEL_OFFSET), - ignoreCollisions: false, - visible: true, - locked: true, - lifetime: LIFETIME }); +var floor, edge1, edge2, edge3a, edge3b, edge4a, edge4b, light; var puck; var paddle1, paddle2; // Create pucks -function makeNewProp(which) { - if (which == "puck") { - return Entities.addEntity( - { type: "Model", - modelURL: puckModel, - compoundShapeURL: puckCollisionModel, - collisionSoundURL: hitSound1, - position: Vec3.sum(center, { x: 0, y: DROP_HEIGHT, z: 0 }), - dimensions: { x: PUCK_SIZE, y: PUCK_THICKNESS, z: PUCK_SIZE }, - gravity: { x: 0, y: GRAVITY, z: 0 }, - velocity: { x: 0, y: 0.05, z: 0 }, - ignoreCollisions: false, - damping: PUCK_DAMPING, - angularDamping: ANGULAR_DAMPING, - lifetime: LIFETIME, - collisionsWillMove: true }); - } - else if (which == "paddle1") { - return Entities.addEntity( - { type: "Model", - modelURL: paddleModel, - compoundShapeURL: paddleCollisionModel, - collisionSoundURL: hitSound2, - position: Vec3.sum(center, { x: 0, y: DROP_HEIGHT * 1.5, z: FIELD_LENGTH * 0.35 }), - dimensions: { x: PADDLE_SIZE, y: PADDLE_THICKNESS, z: PADDLE_SIZE }, - gravity: { x: 0, y: GRAVITY, z: 0 }, - velocity: { x: 0, y: 0.07, z: 0 }, - ignoreCollisions: false, - damping: PADDLE_DAMPING, - angularDamping: PADDLE_ANGULAR_DAMPING, - lifetime: LIFETIME, - collisionsWillMove: true }); - } - else if (which == "paddle2") { - return Entities.addEntity( - { type: "Model", - modelURL: paddleModel, - compoundShapeURL: paddleCollisionModel, - collisionSoundURL: hitSound2, - position: Vec3.sum(center, { x: 0, y: DROP_HEIGHT * 1.5, z: -FIELD_LENGTH * 0.35 }), - dimensions: { x: PADDLE_SIZE, y: PADDLE_THICKNESS, z: PADDLE_SIZE }, - gravity: { x: 0, y: GRAVITY, z: 0 }, - velocity: { x: 0, y: 0.07, z: 0 }, - ignoreCollisions: false, - damping: PADDLE_DAMPING, - angularDamping: PADDLE_ANGULAR_DAMPING, - lifetime: LIFETIME, - collisionsWillMove: true }); - } +function makeNewProp(which, position) { + if (which == "puck") { + return Entities.addEntity({ + name: 'puck', + type: "Model", + modelURL: puckModel, + compoundShapeURL: puckCollisionModel, + collisionSoundURL: hitSound1, + position: Vec3.sum(center, { + x: 0, + y: DROP_HEIGHT, + z: 0 + }), + dimensions: { + x: PUCK_SIZE, + y: PUCK_THICKNESS, + z: PUCK_SIZE + }, + gravity: { + x: 0, + y: GRAVITY, + z: 0 + }, + velocity: { + x: 0, + y: 0.05, + z: 0 + }, + ignoreCollisions: false, + damping: PUCK_DAMPING, + angularDamping: ANGULAR_DAMPING, + lifetime: LIFETIME, + collisionsWillMove: true + }); + } else if (which == "paddle1") { + paddle1Pos = Vec3.sum(center, { + x: 0, + y: DROP_HEIGHT * 1.5, + z: FIELD_LENGTH * 0.35 + }); + return Entities.addEntity({ + name: "paddle", + type: "Model", + modelURL: paddleModel, + compoundShapeURL: paddleCollisionModel, + collisionSoundURL: hitSound2, + position: paddle1Pos, + dimensions: { + x: PADDLE_SIZE, + y: PADDLE_THICKNESS, + z: PADDLE_SIZE + }, + gravity: { + x: 0, + y: GRAVITY, + z: 0 + }, + velocity: { + x: 0, + y: 0.07, + z: 0 + }, + ignoreCollisions: false, + damping: PADDLE_DAMPING, + angularDamping: PADDLE_ANGULAR_DAMPING, + lifetime: LIFETIME, + collisionsWillMove: true + }); + } else if (which == "paddle2") { + paddle2Pos = Vec3.sum(center, { + x: 0, + y: DROP_HEIGHT * 1.5, + z: -FIELD_LENGTH * 0.35 + }); + return Entities.addEntity({ + name: "paddle", + type: "Model", + modelURL: paddleModel, + compoundShapeURL: paddleCollisionModel, + collisionSoundURL: hitSound2, + position: paddle2Pos, + dimensions: { + x: PADDLE_SIZE, + y: PADDLE_THICKNESS, + z: PADDLE_SIZE + }, + gravity: { + x: 0, + y: GRAVITY, + z: 0 + }, + velocity: { + x: 0, + y: 0.07, + z: 0 + }, + ignoreCollisions: false, + damping: PADDLE_DAMPING, + angularDamping: PADDLE_ANGULAR_DAMPING, + lifetime: LIFETIME, + collisionsWillMove: true + }); + } } -puck = makeNewProp("puck"); -paddle1 = makeNewProp("paddle1"); -paddle2 = makeNewProp("paddle2"); function update(deltaTime) { - if (Math.random() < 0.1) { - puckProps = Entities.getEntityProperties(puck); - paddle1Props = Entities.getEntityProperties(paddle1); - paddle2Props = Entities.getEntityProperties(paddle2); - if (puckProps.position.y < (center.y - DROP_HEIGHT)) { - Audio.playSound(scoreSound, { - position: center, - volume: 1.0 - }); - Entities.deleteEntity(puck); - puck = makeNewProp("puck"); - } - - if (paddle1Props.position.y < (center.y - DROP_HEIGHT)) { - Entities.deleteEntity(paddle1); - paddle1 = makeNewProp("paddle1"); - } - if (paddle2Props.position.y < (center.y - DROP_HEIGHT)) { - Entities.deleteEntity(paddle2); - paddle2 = makeNewProp("paddle2"); - } - } + if (Math.random() < 0.1) { + puckProps = Entities.getEntityProperties(puck); + paddle1Props = Entities.getEntityProperties(paddle1); + paddle2Props = Entities.getEntityProperties(paddle2); + if (puckProps.position.y < (center.y - DROP_HEIGHT)) { + score(); + } + + if (paddle1Props.position.y < (center.y - DROP_HEIGHT)) { + Entities.deleteEntity(paddle1); + paddle1 = makeNewProp("paddle1"); + } + if (paddle2Props.position.y < (center.y - DROP_HEIGHT)) { + Entities.deleteEntity(paddle2); + paddle2 = makeNewProp("paddle2"); + } + } +} + +function score() { + Audio.playSound(scoreSound, { + position: center, + volume: 1.0 + }); + puckDropPosition = Entities.getEntityProperties(puck).position; + var newPosition; + if (Vec3.distance(puckDropPosition, paddle1Pos) > Vec3.distance(puckDropPosition, paddle2Pos)) { + newPosition = paddle2Pos; + } else { + newPosition = paddle1Pos; + } + Entities.editEntity(puck, { + position: newPosition, + velocity: { + x: 0, + y: 0.05, + z: 0 + } + }); + + Entities.editEntity(light, { + visible: true + }); + Script.setTimeout(function() { + Entities.editEntity(light, { + visible: false + }); + }, LIGHT_FLASH_TIME); +} + +function mousePressEvent(event) { + var clickedOverlay = Overlays.getOverlayAtPoint({ + x: event.x, + y: event.y + }); + if (clickedOverlay == spawnButton) { + spawnAllTheThings(); + } else if (clickedOverlay == deleteButton) { + deleteAllTheThings(); + } +} + +function spawnAllTheThings() { + center = Vec3.sum(MyAvatar.position, Vec3.multiply((FIELD_WIDTH + FIELD_LENGTH) * 0.60, Quat.getFront(Camera.getOrientation()))); + floor = Entities.addEntity({ + name: "floor", + type: "Box", + position: Vec3.subtract(center, { + x: 0, + y: 0, + z: 0 + }), + dimensions: { + x: FIELD_WIDTH, + y: FLOOR_THICKNESS, + z: FIELD_LENGTH + }, + color: { + red: 128, + green: 128, + blue: 128 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + locked: true, + friction: floorFriction, + visible: debugVisible, + lifetime: LIFETIME + }); + + edge1 = Entities.addEntity({ + name: 'edge', + type: "Box", + collisionSoundURL: hitSideSound, + position: Vec3.sum(center, { + x: FIELD_WIDTH / 2.0, + y: FLOOR_THICKNESS / 2.0, + z: 0 + }), + dimensions: { + x: EDGE_THICKESS, + y: EDGE_HEIGHT, + z: FIELD_LENGTH + EDGE_THICKESS + }, + color: { + red: 100, + green: 100, + blue: 100 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + visible: debugVisible, + restitution: edgeRestitution, + locked: true, + lifetime: LIFETIME + }); + + edge2 = Entities.addEntity({ + name: 'edge', + type: "Box", + collisionSoundURL: hitSideSound, + position: Vec3.sum(center, { + x: -FIELD_WIDTH / 2.0, + y: FLOOR_THICKNESS / 2.0, + z: 0 + }), + dimensions: { + x: EDGE_THICKESS, + y: EDGE_HEIGHT, + z: FIELD_LENGTH + EDGE_THICKESS + }, + color: { + red: 100, + green: 100, + blue: 100 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + visible: debugVisible, + restitution: edgeRestitution, + locked: true, + lifetime: LIFETIME + }); + + edge3a = Entities.addEntity({ + name: 'edge', + type: "Box", + collisionSoundURL: hitSideSound, + position: Vec3.sum(center, { + x: FIELD_WIDTH / 4.0 + (GOAL_WIDTH / 4.0), + y: FLOOR_THICKNESS / 2.0, + z: -FIELD_LENGTH / 2.0 + }), + dimensions: { + x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, + y: EDGE_HEIGHT, + z: EDGE_THICKESS + }, + color: { + red: 100, + green: 100, + blue: 100 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + visible: debugVisible, + restitution: edgeRestitution, + locked: true, + lifetime: LIFETIME + }); + + edge3b = Entities.addEntity({ + name: 'edge', + type: "Box", + collisionSoundURL: hitSideSound, + position: Vec3.sum(center, { + x: -FIELD_WIDTH / 4.0 - (GOAL_WIDTH / 4.0), + y: FLOOR_THICKNESS / 2.0, + z: -FIELD_LENGTH / 2.0 + }), + dimensions: { + x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, + y: EDGE_HEIGHT, + z: EDGE_THICKESS + }, + color: { + red: 100, + green: 100, + blue: 100 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + visible: debugVisible, + restitution: edgeRestitution, + locked: true, + lifetime: LIFETIME + }); + + edge4a = Entities.addEntity({ + name: 'edge', + type: "Box", + collisionSoundURL: hitSideSound, + position: Vec3.sum(center, { + x: FIELD_WIDTH / 4.0 + (GOAL_WIDTH / 4.0), + y: FLOOR_THICKNESS / 2.0, + z: FIELD_LENGTH / 2.0 + }), + dimensions: { + x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, + y: EDGE_HEIGHT, + z: EDGE_THICKESS + }, + color: { + red: 100, + green: 100, + blue: 100 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + visible: debugVisible, + restitution: edgeRestitution, + locked: true, + lifetime: LIFETIME + }); + + edge4b = Entities.addEntity({ + name: 'edge', + type: "Box", + collisionSoundURL: hitSideSound, + position: Vec3.sum(center, { + x: -FIELD_WIDTH / 4.0 - (GOAL_WIDTH / 4.0), + y: FLOOR_THICKNESS / 2.0, + z: FIELD_LENGTH / 2.0 + }), + dimensions: { + x: FIELD_WIDTH / 2.0 - GOAL_WIDTH / 2.0, + y: EDGE_HEIGHT, + z: EDGE_THICKESS + }, + color: { + red: 100, + green: 100, + blue: 100 + }, + gravity: { + x: 0, + y: 0, + z: 0 + }, + ignoreCollisions: false, + visible: debugVisible, + restitution: edgeRestitution, + locked: true, + lifetime: LIFETIME + }); + + table = Entities.addEntity({ + name: "table", + type: "Model", + modelURL: polyTable, + dimensions: Vec3.multiply({ + x: 0.8, + y: 0.45, + z: 1.31 + }, MODEL_SCALE), + position: Vec3.sum(center, MODEL_OFFSET), + ignoreCollisions: false, + visible: true, + locked: true, + lifetime: LIFETIME + }); + + light = Entities.addEntity({ + name: "hockeyLight", + type: "Light", + dimensions: { + x: 5, + y: 5, + z: 5 + }, + position: Vec3.sum(center, LIGHT_OFFSET), + intensity: 5, + color: { + red: 200, + green: 20, + blue: 200 + }, + visible: false + }); + puck = makeNewProp("puck"); + paddle1 = makeNewProp("paddle1"); + paddle2 = makeNewProp("paddle2"); + + Script.update.connect(update); + +} + +function deleteAllTheThings() { + + Script.update.disconnect(update); + //delete all nearby entitites that are named any the names from our names array + var nearbyEntities = Entities.findEntities(MyAvatar.position, ENTITY_SEARCH_RANGE); + for (var i = 0; i < nearbyEntities.length; i++) { + var entityName = Entities.getEntityProperties(nearbyEntities[i]).name; + for (var j = 0; j < names.length; j++) { + if (names[j] === entityName) { + //We have a mach- delete this entity + Entities.editEntity(nearbyEntities[i], { + locked: false + }); + Entities.deleteEntity(nearbyEntities[i]); + } + } + } + + } function scriptEnding() { - Entities.editEntity(edge1, { locked: false }); - Entities.editEntity(edge2, { locked: false }); - Entities.editEntity(edge3a, { locked: false }); - Entities.editEntity(edge3b, { locked: false }); - Entities.editEntity(edge4a, { locked: false }); - Entities.editEntity(edge4b, { locked: false }); - Entities.editEntity(floor, { locked: false }); - Entities.editEntity(table, { locked: false }); + Overlays.deleteOverlay(spawnButton); + Overlays.deleteOverlay(deleteButton); + + Entities.editEntity(edge1, { + locked: false + }); + Entities.editEntity(edge2, { + locked: false + }); + Entities.editEntity(edge3a, { + locked: false + }); + Entities.editEntity(edge3b, { + locked: false + }); + Entities.editEntity(edge4a, { + locked: false + }); + Entities.editEntity(edge4b, { + locked: false + }); + Entities.editEntity(floor, { + locked: false + }); + Entities.editEntity(table, { + locked: false + }); - Entities.deleteEntity(edge1); - Entities.deleteEntity(edge2); - Entities.deleteEntity(edge3a); - Entities.deleteEntity(edge3b); - Entities.deleteEntity(edge4a); - Entities.deleteEntity(edge4b); - Entities.deleteEntity(floor); - Entities.deleteEntity(puck); - Entities.deleteEntity(paddle1); - Entities.deleteEntity(paddle2); - Entities.deleteEntity(table); + + Entities.deleteEntity(edge1); + Entities.deleteEntity(edge2); + Entities.deleteEntity(edge3a); + Entities.deleteEntity(edge3b); + Entities.deleteEntity(edge4a); + Entities.deleteEntity(edge4b); + Entities.deleteEntity(floor); + Entities.deleteEntity(puck); + Entities.deleteEntity(paddle1); + Entities.deleteEntity(paddle2); + Entities.deleteEntity(table); + Entities.deleteEntity(light); + } -Script.update.connect(update); +Controller.mousePressEvent.connect(mousePressEvent); Script.scriptEnding.connect(scriptEnding); \ No newline at end of file From 9bfca7f54d656d5b00d5fa00669a6a907904e97e Mon Sep 17 00:00:00 2001 From: Eric Levin Date: Fri, 15 May 2015 15:43:23 -0700 Subject: [PATCH 10/11] 'moved icons up so they don't interfere with dice icons and changed spanw icon from dice to puck icon' ' --- examples/example/games/airHockey.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/example/games/airHockey.js b/examples/example/games/airHockey.js index 0bcfa8f2c4..ecef697b3e 100644 --- a/examples/example/games/airHockey.js +++ b/examples/example/games/airHockey.js @@ -75,7 +75,7 @@ var names = ['floor', 'table', 'paddle', 'edge', 'puck', 'hockeyLight']; var deleteButton = Overlays.addOverlay("image", { x: screenSize.x / 2 - BUTTON_SIZE, - y: screenSize.y - (BUTTON_SIZE + PADDING), + y: screenSize.y - (BUTTON_SIZE * 2 + PADDING), width: BUTTON_SIZE, height: BUTTON_SIZE, imageURL: HIFI_PUBLIC_BUCKET + "images/delete.png", @@ -89,10 +89,10 @@ var deleteButton = Overlays.addOverlay("image", { var spawnButton = Overlays.addOverlay("image", { x: screenSize.x / 2 + PADDING, - y: screenSize.y - (BUTTON_SIZE + PADDING), + y: screenSize.y - (BUTTON_SIZE * 2 + PADDING), width: BUTTON_SIZE, height: BUTTON_SIZE, - imageURL: HIFI_PUBLIC_BUCKET + "images/die.png", + imageURL: HIFI_PUBLIC_BUCKET + "images/puck.png", color: { red: 255, green: 255, From a0369d243ae89614723863aa448f44a9d1bf484b Mon Sep 17 00:00:00 2001 From: Ryan Huffman Date: Fri, 15 May 2015 15:58:02 -0700 Subject: [PATCH 11/11] Update web icon --- examples/edit.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/edit.js b/examples/edit.js index e034392df0..e4297a94b3 100644 --- a/examples/edit.js +++ b/examples/edit.js @@ -207,8 +207,8 @@ var toolBar = (function () { }); newWebButton = toolBar.addTool({ - imageURL: "https://s3.amazonaws.com/Oculus/earth17.svg", - subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, + imageURL: "https://hifi-public.s3.amazonaws.com/images/www.svg", + subImage: { x: 0, y: 0, width: 128, height: 128 }, width: toolWidth, height: toolHeight, alpha: 0.9,