From 41b2f82be57318e8de832f44904b6ed158f0c0f9 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Mon, 5 Oct 2015 17:43:44 -0700 Subject: [PATCH 1/8] midway --- examples/toys/basketball.js | 62 +++++---- examples/toys/basketball_hoop/createHoop.js | 1 - examples/toys/basketball_hoop/createRack.js | 136 ++++++++++++++++++++ 3 files changed, 172 insertions(+), 27 deletions(-) create mode 100644 examples/toys/basketball_hoop/createRack.js diff --git a/examples/toys/basketball.js b/examples/toys/basketball.js index d30dce6e72..96b6218b3d 100644 --- a/examples/toys/basketball.js +++ b/examples/toys/basketball.js @@ -17,34 +17,39 @@ var collisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var basketball = null; var originalPosition = null; -var hasMoved = false; +var hasMoved = false; var GRAVITY = -9.8; var DISTANCE_IN_FRONT_OF_ME = 1.0; var START_MOVE = 0.01; -var DIAMETER = 0.30; +var DIAMETER = 0.30; -function makeBasketball() { +function makeBasketball() { var position = Vec3.sum(MyAvatar.position, - Vec3.multiplyQbyV(MyAvatar.orientation, - { x: 0, y: 0.0, z: -DISTANCE_IN_FRONT_OF_ME })); + Vec3.multiplyQbyV(MyAvatar.orientation, { + x: 0, + y: 0.0, + z: -DISTANCE_IN_FRONT_OF_ME + })); var rotation = Quat.multiply(MyAvatar.orientation, - Quat.fromPitchYawRollDegrees(0, -90, 0)); + Quat.fromPitchYawRollDegrees(0, -90, 0)); basketball = Entities.addEntity({ - type: "Model", - position: position, - rotation: rotation, - dimensions: { x: DIAMETER, - y: DIAMETER, - z: DIAMETER }, - collisionsWillMove: true, - collisionSoundURL: collisionSoundURL, - modelURL: basketballURL, - restitution: 1.0, - linearDamping: 0.00001, - shapeType: "sphere" - }); - originalPosition = position; + type: "Model", + position: position, + rotation: rotation, + dimensions: { + x: DIAMETER, + y: DIAMETER, + z: DIAMETER + }, + collisionsWillMove: true, + collisionSoundURL: collisionSoundURL, + modelURL: basketballURL, + restitution: 1.0, + linearDamping: 0.00001, + shapeType: "sphere" + }); + originalPosition = position; } function update() { @@ -55,28 +60,33 @@ function update() { var moved = Vec3.length(Vec3.subtract(originalPosition, newProperties.position)); if (!hasMoved && (moved > START_MOVE)) { hasMoved = true; - Entities.editEntity(basketball, { gravity: {x: 0, y: GRAVITY, z: 0 }}); + Entities.editEntity(basketball, { + gravity: { + x: 0, + y: GRAVITY, + z: 0 + } + }); } var MAX_DISTANCE = 10.0; var distance = Vec3.length(Vec3.subtract(MyAvatar.position, newProperties.position)); if (distance > MAX_DISTANCE) { deleteStuff(); } - } + } } function scriptEnding() { deleteStuff(); } -function deleteStuff() { +function deleteStuff() { if (basketball != null) { Entities.deleteEntity(basketball); basketball = null; - hasMoved = false; + hasMoved = false; } } Script.update.connect(update); -Script.scriptEnding.connect(scriptEnding); - +Script.scriptEnding.connect(scriptEnding); \ No newline at end of file diff --git a/examples/toys/basketball_hoop/createHoop.js b/examples/toys/basketball_hoop/createHoop.js index 3887e0b421..b0c76b4a53 100644 --- a/examples/toys/basketball_hoop/createHoop.js +++ b/examples/toys/basketball_hoop/createHoop.js @@ -1,6 +1,5 @@ // // createHoop.js -// examples/entityScripts // // Created by James B. Pollack on 9/29/2015 // Copyright 2015 High Fidelity, Inc. diff --git a/examples/toys/basketball_hoop/createRack.js b/examples/toys/basketball_hoop/createRack.js new file mode 100644 index 0000000000..8019aca283 --- /dev/null +++ b/examples/toys/basketball_hoop/createRack.js @@ -0,0 +1,136 @@ +// +// createRack.js +// +// Created by James B. Pollack on10/5/2015 +// Copyright 2015 High Fidelity, Inc. +// +// This is a script that creates a persistent basketball rack. +// +// Distributed under the Apache License, Version 2.0. +// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html +/*global MyAvatar, Entities, AnimationCache, SoundCache, Scene, Camera, Overlays, HMD, AvatarList, AvatarManager, Controller, UndoStack, Window, Account, GlobalServices, Script, ScriptDiscoveryService, LODManager, Menu, Vec3, Quat, AudioDevice, Paths, Clipboard, Settings, XMLHttpRequest, randFloat, randInt */ +var HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; + +var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; +var collisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; +var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; +var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_hoop_collision_hull.obj"; +var DIAMETER = 0.30; + +var rackStartPosition = + Vec3.sum(MyAvatar.position, + Vec3.multiplyQbyV(MyAvatar.orientation, { + x: 0, + y: 0.0, + z: -2 + })); + +var rack = Entities.addEntity({ + type: "Model", + modelURL: rackURL, + position: rackStartPosition, + shapeType: 'compound', + // gravity: { + // x: 0, + // y: -9.8, + // z: 0 + // }, + dimensions: { + x: 0.4, + y: 1.37, + z: 1.73 + }, + collisionsWillMove: false, + ignoreForCollisions: true, + compoundShapeURL: rackCollisionHullURL +}); + +var nonCollidingBalls = []; +var collidingBalls = []; + +function createNonCollidingBalls() { + var i; + var j; + var position = rackStartPosition; + for (i = 0; i < 4; i++) { + var nonCollidingBall = Entities.addEntity({ + type: "Model", + name: 'Static Basketball', + position: { + x: position.x, + y: position.y, + z: position.z + (DIAMETER) - (DIAMETER * i) + }, + dimensions: { + x: DIAMETER, + y: DIAMETER, + z: DIAMETER + }, + collisionsWillMove: true, + ignoreForCollisions: false, + modelURL: basketballURL + }); + nonCollidingBalls.push(nonCollidingBall); + } + for (i = 0; i < 4; i++) { + var nonCollidingBall = Entities.addEntity({ + type: "Model", + name: 'Static Basketball', + position: { + x: position.x, + y: position.y + DIAMETER, + z: position.z + (DIAMETER) - (DIAMETER * i) + }, + dimensions: { + x: DIAMETER, + y: DIAMETER, + z: DIAMETER + }, + collisionsWillMove: true, + ignoreForCollisions: false, + modelURL: basketballURL + }); + nonCollidingBalls.push(nonCollidingBall); + } +} + +function createCollidingBalls() { + var position = rackStartPosition; + for (i = 0; i < 4; i++) { + var collidingBall = Entities.addEntity({ + type: "Model", + name: 'Colliding Basketball', + position: { + x: position.x, + y: position.y + DIAMETER * 2, + z: position.z + (DIAMETER) - (DIAMETER * i) + }, + dimensions: { + x: DIAMETER, + y: DIAMETER, + z: DIAMETER + }, + // restitution: 1.0, + // linearDamping: 0.00001, + gravity: { + x: 0, + y: -9.8, + z: 0 + }, + collisionsWillMove: true, + ignoreForCollisions: false, + modelURL: basketballURL + }); + collidingBalls.push(collidingBall); + } +} + +function adjustBallPositions() { + var i; + for (i = 0; i < nonCollidingBalls.length; i++) { + Entities.editEntity(nonCollidingBalls[i]) + } +} + +createNonCollidingBalls(); +createCollidingBalls(); \ No newline at end of file From 6cc3077d6727bf431348aa80e837ff1e6e84f197 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Mon, 5 Oct 2015 18:29:35 -0700 Subject: [PATCH 2/8] end of day --- examples/toys/basketball_hoop/createRack.js | 36 +++++++++------------ 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/examples/toys/basketball_hoop/createRack.js b/examples/toys/basketball_hoop/createRack.js index 8019aca283..726f25eb33 100644 --- a/examples/toys/basketball_hoop/createRack.js +++ b/examples/toys/basketball_hoop/createRack.js @@ -1,7 +1,7 @@ // // createRack.js // -// Created by James B. Pollack on10/5/2015 +// Created by James B. Pollack @imgntn on 10/5/2015 // Copyright 2015 High Fidelity, Inc. // // This is a script that creates a persistent basketball rack. @@ -15,6 +15,8 @@ var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var collisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_hoop_collision_hull.obj"; +var basketballSwitcherURL= Script.resolvePath('basketballSwitcher.js'); + var DIAMETER = 0.30; var rackStartPosition = @@ -41,7 +43,7 @@ var rack = Entities.addEntity({ z: 1.73 }, collisionsWillMove: false, - ignoreForCollisions: true, + ignoreForCollisions: false, compoundShapeURL: rackCollisionHullURL }); @@ -50,8 +52,8 @@ var collidingBalls = []; function createNonCollidingBalls() { var i; - var j; var position = rackStartPosition; + for (i = 0; i < 4; i++) { var nonCollidingBall = Entities.addEntity({ type: "Model", @@ -66,12 +68,13 @@ function createNonCollidingBalls() { y: DIAMETER, z: DIAMETER }, - collisionsWillMove: true, - ignoreForCollisions: false, + collisionsWillMove: false, + ignoreForCollisions: true, modelURL: basketballURL }); nonCollidingBalls.push(nonCollidingBall); } + for (i = 0; i < 4; i++) { var nonCollidingBall = Entities.addEntity({ type: "Model", @@ -86,7 +89,7 @@ function createNonCollidingBalls() { y: DIAMETER, z: DIAMETER }, - collisionsWillMove: true, + collisionsWillMove: false, ignoreForCollisions: false, modelURL: basketballURL }); @@ -96,10 +99,12 @@ function createNonCollidingBalls() { function createCollidingBalls() { var position = rackStartPosition; + var i; for (i = 0; i < 4; i++) { var collidingBall = Entities.addEntity({ type: "Model", name: 'Colliding Basketball', + shapeType:'Sphere', position: { x: position.x, y: position.y + DIAMETER * 2, @@ -110,27 +115,16 @@ function createCollidingBalls() { y: DIAMETER, z: DIAMETER }, - // restitution: 1.0, - // linearDamping: 0.00001, - gravity: { - x: 0, - y: -9.8, - z: 0 - }, + restitution: 1.0, + linearDamping: 1, collisionsWillMove: true, ignoreForCollisions: false, - modelURL: basketballURL + modelURL: basketballURL, + script:basketballSwitcherURL }); collidingBalls.push(collidingBall); } } -function adjustBallPositions() { - var i; - for (i = 0; i < nonCollidingBalls.length; i++) { - Entities.editEntity(nonCollidingBalls[i]) - } -} - createNonCollidingBalls(); createCollidingBalls(); \ No newline at end of file From 152fdb811212e7d501c70814204da1f669f0a4ae Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 09:44:00 -0700 Subject: [PATCH 3/8] physical rack --- examples/toys/basketball_hoop/createRack.js | 41 ++++++++++++++------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/examples/toys/basketball_hoop/createRack.js b/examples/toys/basketball_hoop/createRack.js index 726f25eb33..a223a1064a 100644 --- a/examples/toys/basketball_hoop/createRack.js +++ b/examples/toys/basketball_hoop/createRack.js @@ -9,16 +9,21 @@ // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html /*global MyAvatar, Entities, AnimationCache, SoundCache, Scene, Camera, Overlays, HMD, AvatarList, AvatarManager, Controller, UndoStack, Window, Account, GlobalServices, Script, ScriptDiscoveryService, LODManager, Menu, Vec3, Quat, AudioDevice, Paths, Clipboard, Settings, XMLHttpRequest, randFloat, randInt */ +Script.include("../../libraries/utils.js"); + var HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var collisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; -var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_hoop_collision_hull.obj"; -var basketballSwitcherURL= Script.resolvePath('basketballSwitcher.js'); +var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/rack_collision_hull.obj"; +var basketballSwitcherURL = Script.resolvePath('basketballSwitcher.js'); +var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; +var GRABBABLE_DATA_KEY = "grabbableKey"; + var rackStartPosition = Vec3.sum(MyAvatar.position, Vec3.multiplyQbyV(MyAvatar.orientation, { @@ -28,25 +33,31 @@ var rackStartPosition = })); var rack = Entities.addEntity({ + name:'Basketball Rack', type: "Model", modelURL: rackURL, position: rackStartPosition, shapeType: 'compound', - // gravity: { - // x: 0, - // y: -9.8, - // z: 0 - // }, + gravity: { + x: 0, + y: -9.8, + z: 0 + }, + linearDamping:1, dimensions: { x: 0.4, y: 1.37, z: 1.73 }, - collisionsWillMove: false, + collisionsWillMove: true, ignoreForCollisions: false, compoundShapeURL: rackCollisionHullURL }); +setEntityCustomData(GRABBABLE_DATA_KEY, rack, { + grabbable: false +}); + var nonCollidingBalls = []; var collidingBalls = []; @@ -100,11 +111,11 @@ function createNonCollidingBalls() { function createCollidingBalls() { var position = rackStartPosition; var i; - for (i = 0; i < 4; i++) { + for (i = 0; i < NUMBER_OF_BALLS; i++) { var collidingBall = Entities.addEntity({ type: "Model", name: 'Colliding Basketball', - shapeType:'Sphere', + shapeType: 'Sphere', position: { x: position.x, y: position.y + DIAMETER * 2, @@ -116,15 +127,19 @@ function createCollidingBalls() { z: DIAMETER }, restitution: 1.0, - linearDamping: 1, + linearDamping: 0.00001, + gravity: { + x: 0, + y: -9.8, + z: 0 + }, collisionsWillMove: true, ignoreForCollisions: false, modelURL: basketballURL, - script:basketballSwitcherURL }); collidingBalls.push(collidingBall); } } -createNonCollidingBalls(); +// createNonCollidingBalls(); createCollidingBalls(); \ No newline at end of file From 5f2112b8a5599f4fec0b4cad07b9957a787f482b Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 11:28:36 -0700 Subject: [PATCH 4/8] finish rack and add to master script, reorganize all bball related scripts --- .../createHoop.js | 1 - .../createRack.js | 6 +- .../createSingleBasketball.js} | 2 +- unpublishedScripts/masterReset.js | 102 +++++++++++++++++- 4 files changed, 104 insertions(+), 7 deletions(-) rename examples/toys/{basketball_hoop => basketball}/createHoop.js (96%) rename examples/toys/{basketball_hoop => basketball}/createRack.js (97%) rename examples/toys/{basketball.js => basketball/createSingleBasketball.js} (98%) diff --git a/examples/toys/basketball_hoop/createHoop.js b/examples/toys/basketball/createHoop.js similarity index 96% rename from examples/toys/basketball_hoop/createHoop.js rename to examples/toys/basketball/createHoop.js index b0c76b4a53..2beb7c9fca 100644 --- a/examples/toys/basketball_hoop/createHoop.js +++ b/examples/toys/basketball/createHoop.js @@ -5,7 +5,6 @@ // Copyright 2015 High Fidelity, Inc. // // This is a script that creates a persistent basketball hoop with a working collision hull. Feel free to move it. -// Run basketball.js to make a basketball. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html diff --git a/examples/toys/basketball_hoop/createRack.js b/examples/toys/basketball/createRack.js similarity index 97% rename from examples/toys/basketball_hoop/createRack.js rename to examples/toys/basketball/createRack.js index a223a1064a..ad0ccb716a 100644 --- a/examples/toys/basketball_hoop/createRack.js +++ b/examples/toys/basketball/createRack.js @@ -17,7 +17,6 @@ var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var collisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/rack_collision_hull.obj"; -var basketballSwitcherURL = Script.resolvePath('basketballSwitcher.js'); var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; @@ -33,7 +32,7 @@ var rackStartPosition = })); var rack = Entities.addEntity({ - name:'Basketball Rack', + name: 'Basketball Rack', type: "Model", modelURL: rackURL, position: rackStartPosition, @@ -43,7 +42,7 @@ var rack = Entities.addEntity({ y: -9.8, z: 0 }, - linearDamping:1, + linearDamping: 1, dimensions: { x: 0.4, y: 1.37, @@ -51,6 +50,7 @@ var rack = Entities.addEntity({ }, collisionsWillMove: true, ignoreForCollisions: false, + collisionSoundURL: collisionSoundURL, compoundShapeURL: rackCollisionHullURL }); diff --git a/examples/toys/basketball.js b/examples/toys/basketball/createSingleBasketball.js similarity index 98% rename from examples/toys/basketball.js rename to examples/toys/basketball/createSingleBasketball.js index 96b6218b3d..162b572bd1 100644 --- a/examples/toys/basketball.js +++ b/examples/toys/basketball/createSingleBasketball.js @@ -1,5 +1,5 @@ // -// basketball.js +// createSingleBasketball.js // examples // // Created by Philip Rosedale on August 20, 2015 diff --git a/unpublishedScripts/masterReset.js b/unpublishedScripts/masterReset.js index d6759e2b48..4f77651209 100644 --- a/unpublishedScripts/masterReset.js +++ b/unpublishedScripts/masterReset.js @@ -85,6 +85,8 @@ function createAllToys() { createBasketballHoop(); + createBasketallRack(); + createGates(); createFire(); @@ -98,7 +100,7 @@ function createAllToys() { function deleteAllToys() { var entities = Entities.findEntities(MyAvatar.position, 100); - entities.forEach(function (entity) { + entities.forEach(function(entity) { //params: customKey, id, defaultValue var shouldReset = getEntityCustomData(resetKey, entity, {}).resetMe; if (shouldReset === true) { @@ -521,6 +523,102 @@ function createBasketballHoop() { }); } +function createBasketallRack() { + var NUMBER_OF_BALLS = 4; + var DIAMETER = 0.30; + + var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; + var basketballCollisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; + var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; + var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/rack_collision_hull.obj"; + + var rackRotation = Quat.fromPitchYawRollDegrees(0, -90, 0); + + var rackStartPosition = { + x: 542.86, + y: 494.84, + z: 475.06 + }; + var rack = Entities.addEntity({ + name: 'Basketball Rack', + type: "Model", + modelURL: rackURL, + position: rackStartPosition, + rotation: rackRotation, + shapeType: 'compound', + gravity: { + x: 0, + y: -9.8, + z: 0 + }, + linearDamping: 1, + dimensions: { + x: 0.4, + y: 1.37, + z: 1.73 + }, + collisionsWillMove: true, + ignoreForCollisions: false, + compoundShapeURL: rackCollisionHullURL + }); + + setEntityCustomData(resetKey, rack, { + resetMe: true + }); + + setEntityCustomData(GRABBABLE_DATA_KEY, rack, { + grabbable: false + }); + + var collidingBalls = []; + + + function createCollidingBalls() { + var position = rackStartPosition; + var i; + + for (i = 0; i < NUMBER_OF_BALLS; i++) { + var collidingBall = Entities.addEntity({ + type: "Model", + name: 'Colliding Basketball', + shapeType: 'Sphere', + position: { + x: position.x + (DIAMETER*2) - (DIAMETER * i), + y: position.y + DIAMETER * 2, + z: position.z + }, + dimensions: { + x: DIAMETER, + y: DIAMETER, + z: DIAMETER + }, + restitution: 1.0, + linearDamping: 0.00001, + gravity: { + x: 0, + y: -9.8, + z: 0 + }, + collisionsWillMove: true, + ignoreForCollisions: false, + collisionSoundURL: basketballCollisionSoundURL, + modelURL: basketballURL, + }); + + collidingBalls.push(collidingBall); + + setEntityCustomData(resetKey, collidingBall, { + resetMe: true + }); + + } + } + + createCollidingBalls(); +} + + + function createWand(position) { var WAND_MODEL = 'http://hifi-public.s3.amazonaws.com/james/bubblewand/models/wand/wand.fbx'; var WAND_COLLISION_SHAPE = 'http://hifi-public.s3.amazonaws.com/james/bubblewand/models/wand/actual_no_top_collision_hull.obj'; @@ -831,4 +929,4 @@ function cleanup() { if (shouldDeleteOnEndScript) { Script.scriptEnding.connect(cleanup); -} +} \ No newline at end of file From cda1b418aefd3f6fd32dfe0c3dc2f32c98ac0490 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 11:29:41 -0700 Subject: [PATCH 5/8] cleanup --- examples/toys/basketball/createRack.js | 49 -------------------------- 1 file changed, 49 deletions(-) diff --git a/examples/toys/basketball/createRack.js b/examples/toys/basketball/createRack.js index ad0ccb716a..f537a9bdd1 100644 --- a/examples/toys/basketball/createRack.js +++ b/examples/toys/basketball/createRack.js @@ -61,53 +61,6 @@ setEntityCustomData(GRABBABLE_DATA_KEY, rack, { var nonCollidingBalls = []; var collidingBalls = []; -function createNonCollidingBalls() { - var i; - var position = rackStartPosition; - - for (i = 0; i < 4; i++) { - var nonCollidingBall = Entities.addEntity({ - type: "Model", - name: 'Static Basketball', - position: { - x: position.x, - y: position.y, - z: position.z + (DIAMETER) - (DIAMETER * i) - }, - dimensions: { - x: DIAMETER, - y: DIAMETER, - z: DIAMETER - }, - collisionsWillMove: false, - ignoreForCollisions: true, - modelURL: basketballURL - }); - nonCollidingBalls.push(nonCollidingBall); - } - - for (i = 0; i < 4; i++) { - var nonCollidingBall = Entities.addEntity({ - type: "Model", - name: 'Static Basketball', - position: { - x: position.x, - y: position.y + DIAMETER, - z: position.z + (DIAMETER) - (DIAMETER * i) - }, - dimensions: { - x: DIAMETER, - y: DIAMETER, - z: DIAMETER - }, - collisionsWillMove: false, - ignoreForCollisions: false, - modelURL: basketballURL - }); - nonCollidingBalls.push(nonCollidingBall); - } -} - function createCollidingBalls() { var position = rackStartPosition; var i; @@ -140,6 +93,4 @@ function createCollidingBalls() { collidingBalls.push(collidingBall); } } - -// createNonCollidingBalls(); createCollidingBalls(); \ No newline at end of file From a37da41253d7b4f364a5d3e3ce675e25deb68200 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 13:15:35 -0700 Subject: [PATCH 6/8] spell basketball rack correctly --- unpublishedScripts/masterReset.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/unpublishedScripts/masterReset.js b/unpublishedScripts/masterReset.js index 4f77651209..23441dff3a 100644 --- a/unpublishedScripts/masterReset.js +++ b/unpublishedScripts/masterReset.js @@ -85,7 +85,7 @@ function createAllToys() { createBasketballHoop(); - createBasketallRack(); + createBasketballRack(); createGates(); @@ -523,7 +523,7 @@ function createBasketballHoop() { }); } -function createBasketallRack() { +function createBasketballRack() { var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; From 478848018607653765acd5e0a9c804fc3c0ac730 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 16:48:34 -0700 Subject: [PATCH 7/8] reset balls if they move too far --- examples/toys/basketball/createRack.js | 74 ++++++++++++++++++++++---- unpublishedScripts/masterReset.js | 60 +++++++++++++++++---- 2 files changed, 116 insertions(+), 18 deletions(-) diff --git a/examples/toys/basketball/createRack.js b/examples/toys/basketball/createRack.js index f537a9bdd1..b0f709d81d 100644 --- a/examples/toys/basketball/createRack.js +++ b/examples/toys/basketball/createRack.js @@ -8,7 +8,7 @@ // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html -/*global MyAvatar, Entities, AnimationCache, SoundCache, Scene, Camera, Overlays, HMD, AvatarList, AvatarManager, Controller, UndoStack, Window, Account, GlobalServices, Script, ScriptDiscoveryService, LODManager, Menu, Vec3, Quat, AudioDevice, Paths, Clipboard, Settings, XMLHttpRequest, randFloat, randInt */ +/*global print, MyAvatar, Entities, AnimationCache, SoundCache, Scene, Camera, Overlays, HMD, AvatarList, AvatarManager, Controller, UndoStack, Window, Account, GlobalServices, Script, ScriptDiscoveryService, LODManager, Menu, Vec3, Quat, AudioDevice, Paths, Clipboard, Settings, XMLHttpRequest, randFloat, randInt */ Script.include("../../libraries/utils.js"); var HIFI_PUBLIC_BUCKET = "http://s3.amazonaws.com/hifi-public/"; @@ -17,9 +17,10 @@ var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var collisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/rack_collision_hull.obj"; - var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; +var RESET_DISTANCE = 1; + var GRABBABLE_DATA_KEY = "grabbableKey"; @@ -51,29 +52,34 @@ var rack = Entities.addEntity({ collisionsWillMove: true, ignoreForCollisions: false, collisionSoundURL: collisionSoundURL, - compoundShapeURL: rackCollisionHullURL + compoundShapeURL: rackCollisionHullURL, + // scriptURL: rackScriptURL }); + setEntityCustomData(GRABBABLE_DATA_KEY, rack, { grabbable: false }); var nonCollidingBalls = []; var collidingBalls = []; +var originalBallPositions = []; function createCollidingBalls() { var position = rackStartPosition; + var i; for (i = 0; i < NUMBER_OF_BALLS; i++) { + var ballPosition = { + x: position.x, + y: position.y + DIAMETER * 2, + z: position.z + (DIAMETER) - (DIAMETER * i) + } var collidingBall = Entities.addEntity({ type: "Model", name: 'Colliding Basketball', shapeType: 'Sphere', - position: { - x: position.x, - y: position.y + DIAMETER * 2, - z: position.z + (DIAMETER) - (DIAMETER * i) - }, + position: ballPosition, dimensions: { x: DIAMETER, y: DIAMETER, @@ -91,6 +97,56 @@ function createCollidingBalls() { modelURL: basketballURL, }); collidingBalls.push(collidingBall); + originalBallPositions.push(position); + } + + +} + +function testBallDistanceFromStart() { + var resetCount = 0; + collidingBalls.forEach(function(ball, index) { + var currentPosition = Entities.getEntityProperties(ball, "position").position; + var originalPosition = originalBallPositions[index]; + var distance = Vec3.subtract(originalPosition, currentPosition); + var length = Vec3.length(distance); + if (length > RESET_DISTANCE) { + Script.setTimeout(function() { + var newPosition = Entities.getEntityProperties(ball, "position").position; + var moving = Vec3.length(Vec3.subtract(currentPosition, newPosition)); + if (moving < 0.05) { + resetCount++; + if (resetCount === NUMBER_OF_BALLS) { + deleteCollidingBalls(); + createCollidingBalls(); + } + } + }, 200) + } + }); +} + +function deleteEntity(entityID) { + if (entityID === rack) { + deleteCollidingBalls(); + Script.clearInterval(distanceCheckInterval); + Entities.deletingEntity.disconnect(deleteEntity); } } -createCollidingBalls(); \ No newline at end of file + +function deleteCollidingBalls() { + while (collidingBalls.length > 0) { + Entities.deleteEntity(collidingBalls.pop()); + } +} + +createCollidingBalls(); +Entities.deletingEntity.connect(deleteEntity); + +var distanceCheckInterval = Script.setInterval(testBallDistanceFromStart, 1000); + +function atEnd() { + Script.clearInterval(distanceCheckInterval); +} + +Script.scriptEnding.connect(atEnd); \ No newline at end of file diff --git a/unpublishedScripts/masterReset.js b/unpublishedScripts/masterReset.js index 23441dff3a..49ff4a62a4 100644 --- a/unpublishedScripts/masterReset.js +++ b/unpublishedScripts/masterReset.js @@ -526,6 +526,7 @@ function createBasketballHoop() { function createBasketballRack() { var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; + var RESET_DISTANCE = 1; var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var basketballCollisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; @@ -571,21 +572,25 @@ function createBasketballRack() { }); var collidingBalls = []; - + var originalBallPositions = []; function createCollidingBalls() { var position = rackStartPosition; var i; - for (i = 0; i < NUMBER_OF_BALLS; i++) { + var ballPosition = { + x: position.x, + y: position.y + DIAMETER * 2, + z: position.z + (DIAMETER) - (DIAMETER * i) + } var collidingBall = Entities.addEntity({ type: "Model", name: 'Colliding Basketball', shapeType: 'Sphere', position: { - x: position.x + (DIAMETER*2) - (DIAMETER * i), + x: position.x + (DIAMETER * 2) - (DIAMETER * i), y: position.y + DIAMETER * 2, - z: position.z + z: position.z }, dimensions: { x: DIAMETER, @@ -601,20 +606,57 @@ function createBasketballRack() { }, collisionsWillMove: true, ignoreForCollisions: false, - collisionSoundURL: basketballCollisionSoundURL, modelURL: basketballURL, }); - collidingBalls.push(collidingBall); + originalBallPositions.push(position); + } - setEntityCustomData(resetKey, collidingBall, { - resetMe: true - }); + } + + function testBallDistanceFromStart() { + var resetCount = 0; + collidingBalls.forEach(function(ball, index) { + var currentPosition = Entities.getEntityProperties(ball, "position").position; + var originalPosition = originalBallPositions[index]; + var distance = Vec3.subtract(originalPosition, currentPosition); + var length = Vec3.length(distance); + if (length > RESET_DISTANCE) { + Script.setTimeout(function() { + var newPosition = Entities.getEntityProperties(ball, "position").position; + var moving = Vec3.length(Vec3.subtract(currentPosition, newPosition)); + if (moving < 0.05) { + resetCount++; + if (resetCount === NUMBER_OF_BALLS) { + deleteCollidingBalls(); + createCollidingBalls(); + } + } + }, 200) + } + }); + } + + function deleteEntity(entityID) { + if (entityID === rack) { + deleteCollidingBalls(); + Script.clearInterval(distanceCheckInterval); + Entities.deletingEntity.disconnect(deleteEntity); + } + } + + function deleteCollidingBalls() { + while (collidingBalls.length > 0) { + Entities.deleteEntity(collidingBalls.pop()); } } createCollidingBalls(); + Entities.deletingEntity.connect(deleteEntity); + + var distanceCheckInterval = Script.setInterval(testBallDistanceFromStart, 1000); + } From 7aab34975f08ee583fac5c8e4a27e3e761b6f49f Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 17:08:51 -0700 Subject: [PATCH 8/8] code quality --- examples/toys/basketball/createRack.js | 10 +++++----- unpublishedScripts/masterReset.js | 15 +++++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/examples/toys/basketball/createRack.js b/examples/toys/basketball/createRack.js index b0f709d81d..f764b2ec03 100644 --- a/examples/toys/basketball/createRack.js +++ b/examples/toys/basketball/createRack.js @@ -20,7 +20,7 @@ var rackCollisionHullURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/rack_col var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; var RESET_DISTANCE = 1; - +var MINIMUM_MOVE_LENGTH = 0.05; var GRABBABLE_DATA_KEY = "grabbableKey"; @@ -74,7 +74,8 @@ function createCollidingBalls() { x: position.x, y: position.y + DIAMETER * 2, z: position.z + (DIAMETER) - (DIAMETER * i) - } + }; + var collidingBall = Entities.addEntity({ type: "Model", name: 'Colliding Basketball', @@ -96,11 +97,10 @@ function createCollidingBalls() { ignoreForCollisions: false, modelURL: basketballURL, }); + collidingBalls.push(collidingBall); originalBallPositions.push(position); } - - } function testBallDistanceFromStart() { @@ -114,7 +114,7 @@ function testBallDistanceFromStart() { Script.setTimeout(function() { var newPosition = Entities.getEntityProperties(ball, "position").position; var moving = Vec3.length(Vec3.subtract(currentPosition, newPosition)); - if (moving < 0.05) { + if (moving < MINIMUM_MOVE_LENGTH) { resetCount++; if (resetCount === NUMBER_OF_BALLS) { deleteCollidingBalls(); diff --git a/unpublishedScripts/masterReset.js b/unpublishedScripts/masterReset.js index 49ff4a62a4..8b57aa32c3 100644 --- a/unpublishedScripts/masterReset.js +++ b/unpublishedScripts/masterReset.js @@ -527,7 +527,7 @@ function createBasketballRack() { var NUMBER_OF_BALLS = 4; var DIAMETER = 0.30; var RESET_DISTANCE = 1; - + var MINIMUM_MOVE_LENGTH = 0.05; var basketballURL = HIFI_PUBLIC_BUCKET + "models/content/basketball2.fbx"; var basketballCollisionSoundURL = HIFI_PUBLIC_BUCKET + "sounds/basketball/basketball.wav"; var rackURL = HIFI_PUBLIC_BUCKET + "models/basketball_hoop/basketball_rack.fbx"; @@ -576,13 +576,15 @@ function createBasketballRack() { function createCollidingBalls() { var position = rackStartPosition; + var i; for (i = 0; i < NUMBER_OF_BALLS; i++) { var ballPosition = { x: position.x, y: position.y + DIAMETER * 2, z: position.z + (DIAMETER) - (DIAMETER * i) - } + }; + var collidingBall = Entities.addEntity({ type: "Model", name: 'Colliding Basketball', @@ -608,32 +610,33 @@ function createBasketballRack() { ignoreForCollisions: false, modelURL: basketballURL, }); + collidingBalls.push(collidingBall); originalBallPositions.push(position); } - - } function testBallDistanceFromStart() { var resetCount = 0; + collidingBalls.forEach(function(ball, index) { var currentPosition = Entities.getEntityProperties(ball, "position").position; var originalPosition = originalBallPositions[index]; var distance = Vec3.subtract(originalPosition, currentPosition); var length = Vec3.length(distance); + if (length > RESET_DISTANCE) { Script.setTimeout(function() { var newPosition = Entities.getEntityProperties(ball, "position").position; var moving = Vec3.length(Vec3.subtract(currentPosition, newPosition)); - if (moving < 0.05) { + if (moving < MINIMUM_MOVE_LENGTH) { resetCount++; if (resetCount === NUMBER_OF_BALLS) { deleteCollidingBalls(); createCollidingBalls(); } } - }, 200) + }, 200); } }); }