From 39252a833943685766f161eeabccdc9c1d0a5199 Mon Sep 17 00:00:00 2001 From: Andrew Meadows Date: Fri, 25 Apr 2014 14:17:39 -0700 Subject: [PATCH] swissArmyJetpack.js now toggles "obey gravity" --- examples/swissArmyJetpack.js | 82 ++++++++++++++++++++++++++++-------- 1 file changed, 65 insertions(+), 17 deletions(-) diff --git a/examples/swissArmyJetpack.js b/examples/swissArmyJetpack.js index 9bb5bea267..719a6f620c 100644 --- a/examples/swissArmyJetpack.js +++ b/examples/swissArmyJetpack.js @@ -13,6 +13,9 @@ // var numberOfButtons = 3; +var DOWN = { x: 0.0, y: -1.0, z: 0.0 }; +var MAX_VOXEL_SCAN_DISTANCE = 20.0; +var MIN_FLYING_SPEED = 1.0; var enabledColors = new Array(); enabledColors[0] = { red: 255, green: 0, blue: 0}; @@ -35,26 +38,42 @@ var groupBits = 0; var buttonStates = new Array(); -var disabledOffsetT = 0; -var enabledOffsetT = 55; +var disabledOffsetT = 12; +var enabledOffsetT = 55 + 12; -var buttonX = 50; -var buttonY = 200; -var buttonWidth = 30; -var buttonHeight = 54; -var textX = buttonX + buttonWidth + 10; +var UI_BUFFER = 1; +var OFFSET_X = UI_BUFFER; +var OFFSET_Y = 200; +var BUTTON_WIDTH = 30; +var BUTTON_HEIGHT = 30; +var textX = OFFSET_X + BUTTON_WIDTH + UI_BUFFER; +var TEXT_HEIGHT = BUTTON_HEIGHT; +var TEXT_WIDTH = 210; + +var speedometer = Overlays.addOverlay("text", { + x: OFFSET_X, + y: OFFSET_Y - BUTTON_HEIGHT, + width: BUTTON_WIDTH + UI_BUFFER + TEXT_WIDTH, + height: TEXT_HEIGHT, + color: { red: 0, green: 0, blue: 0 }, + textColor: { red: 255, green: 0, blue: 0}, + topMargin: 4, + leftMargin: 4, + text: "Speed: 0.0" + }); +var speed = 0.0; +var lastPosition = MyAvatar.position; for (i = 0; i < numberOfButtons; i++) { var offsetS = 12 var offsetT = disabledOffsetT; buttons[i] = Overlays.addOverlay("image", { - //x: buttonX + (buttonWidth * i), - x: buttonX, - y: buttonY + (buttonHeight * i), - width: buttonWidth, - height: buttonHeight, - subImage: { x: offsetS, y: offsetT, width: buttonWidth, height: buttonHeight }, + x: OFFSET_X, + y: OFFSET_Y + (BUTTON_HEIGHT * i), + width: BUTTON_WIDTH, + height: BUTTON_HEIGHT, + subImage: { x: offsetS, y: offsetT, width: BUTTON_WIDTH, height: BUTTON_HEIGHT }, imageURL: "http://highfidelity-public.s3-us-west-1.amazonaws.com/images/testing-swatches.svg", color: disabledColors[i], alpha: 1, @@ -62,9 +81,9 @@ for (i = 0; i < numberOfButtons; i++) { labels[i] = Overlays.addOverlay("text", { x: textX, - y: buttonY + (buttonHeight * i) + 12, - width: 150, - height: 50, + y: OFFSET_Y + (BUTTON_HEIGHT * i), + width: TEXT_WIDTH, + height: TEXT_HEIGHT, color: { red: 0, green: 0, blue: 0}, textColor: { red: 255, green: 0, blue: 0}, topMargin: 4, @@ -75,6 +94,10 @@ for (i = 0; i < numberOfButtons; i++) { buttonStates[i] = false; } +// avatar state +var velocity = { x: 0.0, y: 0.0, z: 0.0 }; +var standing = false; + function updateButton(i, enabled) { var offsetY = disabledOffsetT; var buttonColor = disabledColors[i]; @@ -108,13 +131,18 @@ function updateButton(i, enabled) { // When our script shuts down, we should clean up all of our overlays function scriptEnding() { for (i = 0; i < numberOfButtons; i++) { - print("adebug deleting overlay " + i); Overlays.deleteOverlay(buttons[i]); Overlays.deleteOverlay(labels[i]); } + Overlays.deleteOverlay(speedometer); } Script.scriptEnding.connect(scriptEnding); +function updateSpeedometerDisplay() { + Overlays.editOverlay(speedometer, { text: "Speed: " + speed.toFixed(2) }); +} + +var multiple_timer = Script.setInterval(updateSpeedometerDisplay, 100); // Our update() function is called at approximately 60fps, and we will use it to animate our various overlays function update(deltaTime) { @@ -124,6 +152,26 @@ function update(deltaTime) { updateButton(1, groupBits & COLLISION_GROUP_VOXELS); updateButton(2, groupBits & COLLISION_GROUP_PARTICLES); } + + // measure speed + var distance = Vec3.distance(MyAvatar.position, lastPosition); + speed = 0.9 * speed + 0.1 * distance / deltaTime; + lastPosition = MyAvatar.position; + + // scan for landing platform + if (speed < MIN_FLYING_SPEED && !(MyAvatar.motionBehaviors & AVATAR_MOTION_OBEY_GRAVITY)) { + ray = { origin: MyAvatar.position, direction: DOWN }; + var intersection = Voxels.findRayIntersection(ray); + if (intersection.intersects) { + var v = intersection.voxel; + var maxCorner = Vec3.sum({ x: v.x, y: v.y, z: v.z }, {x: v.s, y: v.s, z: v.s }); + var distance = lastPosition.y - maxCorner.y; + if (distance < MAX_VOXEL_SCAN_DISTANCE) { + MyAvatar.motionBehaviors = AVATAR_MOTION_OBEY_GRAVITY; + } + //print("voxel corner = <" + v.x + ", " + v.y + ", " + v.z + "> " + " scale = " + v.s + " dt = " + deltaTime); + } + } } Script.update.connect(update);