From 478848018607653765acd5e0a9c804fc3c0ac730 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Tue, 6 Oct 2015 16:48:34 -0700 Subject: [PATCH] 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); + }