From 5ca14b528bf7e5260e819517b0c24468e83d0da2 Mon Sep 17 00:00:00 2001 From: "James B. Pollack" Date: Fri, 8 Jul 2016 15:08:44 -0700 Subject: [PATCH] remove prints and format --- scripts/defaultScripts.js | 1 + .../{teleportDestination.fbx => teleport.fbx} | Bin 188700 -> 189244 bytes scripts/system/assets/models/teleportBeam.fbx | Bin 40172 -> 0 bytes .../system/controllers/handControllerGrab.js | 221 ++++++++++++------ scripts/system/controllers/teleport.js | 6 +- 5 files changed, 147 insertions(+), 81 deletions(-) rename scripts/system/assets/models/{teleportDestination.fbx => teleport.fbx} (94%) delete mode 100644 scripts/system/assets/models/teleportBeam.fbx diff --git a/scripts/defaultScripts.js b/scripts/defaultScripts.js index 2bf908ab57..711e64f938 100644 --- a/scripts/defaultScripts.js +++ b/scripts/defaultScripts.js @@ -23,5 +23,6 @@ Script.load("system/controllers/handControllerGrab.js"); Script.load("system/controllers/handControllerPointer.js"); Script.load("system/controllers/squeezeHands.js"); Script.load("system/controllers/grab.js"); +Script.load("system/controllers/teleport.js"); Script.load("system/dialTone.js"); Script.load("system/firstPersonHMD.js"); diff --git a/scripts/system/assets/models/teleportDestination.fbx b/scripts/system/assets/models/teleport.fbx similarity index 94% rename from scripts/system/assets/models/teleportDestination.fbx rename to scripts/system/assets/models/teleport.fbx index c850982f563417e960d9079dbc0da29408ed01c9..831f152add043dcdb04c4a567037167ba434eb97 100644 GIT binary patch delta 4084 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 diff --git a/scripts/system/assets/models/teleportBeam.fbx b/scripts/system/assets/models/teleportBeam.fbx deleted file mode 100644 index 21b63d5843ac14a12ea7601d1bf8475c696cac93..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 40172 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 bNQV9Ysr(37w%}RY!{p|7QjO6owI%;QsNJ!J diff --git a/scripts/system/controllers/handControllerGrab.js b/scripts/system/controllers/handControllerGrab.js index 00e9b2c699..a2738396b6 100644 --- a/scripts/system/controllers/handControllerGrab.js +++ b/scripts/system/controllers/handControllerGrab.js @@ -49,8 +49,8 @@ var DROP_WITHOUT_SHAKE = false; var DISTANCE_HOLDING_RADIUS_FACTOR = 3.5; // multiplied by distance between hand and object var DISTANCE_HOLDING_ACTION_TIMEFRAME = 0.1; // how quickly objects move to their new position -var DISTANCE_HOLDING_UNITY_MASS = 1200; // The mass at which the distance holding action timeframe is unmodified -var DISTANCE_HOLDING_UNITY_DISTANCE = 6; // The distance at which the distance holding action timeframe is unmodified +var DISTANCE_HOLDING_UNITY_MASS = 1200; // The mass at which the distance holding action timeframe is unmodified +var DISTANCE_HOLDING_UNITY_DISTANCE = 6; // The distance at which the distance holding action timeframe is unmodified var MOVE_WITH_HEAD = true; // experimental head-control of distantly held objects var NO_INTERSECT_COLOR = { @@ -81,7 +81,7 @@ var EQUIP_RADIUS = 0.1; // radius used for palm vs equip-hotspot for equipping. var NEAR_GRABBING_ACTION_TIMEFRAME = 0.05; // how quickly objects move to their new position var NEAR_GRAB_RADIUS = 0.15; // radius used for palm vs object for near grabbing. -var NEAR_GRAB_MAX_DISTANCE = 1.0; // you cannot grab objects that are this far away from your hand +var NEAR_GRAB_MAX_DISTANCE = 1.0; // you cannot grab objects that are this far away from your hand var NEAR_GRAB_PICK_RADIUS = 0.25; // radius used for search ray vs object for near grabbing. @@ -251,13 +251,15 @@ function propsArePhysical(props) { // If another script is managing the reticle (as is done by HandControllerPointer), we should not be setting it here, // and we should not be showing lasers when someone else is using the Reticle to indicate a 2D minor mode. var EXTERNALLY_MANAGED_2D_MINOR_MODE = true; + function isIn2DMode() { // In this version, we make our own determination of whether we're aimed a HUD element, // because other scripts (such as handControllerPointer) might be using some other visualization // instead of setting Reticle.visible. return (EXTERNALLY_MANAGED_2D_MINOR_MODE && - (Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(Reticle.position))); + (Reticle.pointingAtSystemOverlay || Overlays.getOverlayAtPoint(Reticle.position))); } + function restore2DMode() { if (!EXTERNALLY_MANAGED_2D_MINOR_MODE) { Reticle.setVisible(true); @@ -399,7 +401,6 @@ function MyController(hand) { this.updateSmoothedTrigger(); if (this.ignoreInput()) { - // print('in ignore input turn off') this.turnOffVisualizations(); return; } @@ -520,7 +521,7 @@ function MyController(hand) { visible: true }; this.searchSphere = Overlays.addOverlay("sphere", sphereProperties); - print('CREATED SEARCH OVERLAY : '+ this.searchSphere) + } else { Overlays.editOverlay(this.searchSphere, { @@ -529,7 +530,7 @@ function MyController(hand) { color: color, visible: true }); - print('EDITED SEARCH OVERLAY : '+ this.searchSphere) + } }; @@ -547,7 +548,6 @@ function MyController(hand) { alpha: 1 }; this.overlayLine = Overlays.addOverlay("line3d", lineProperties); - print('CREATED OVERLAY IT IS ' + this.overlayLine ) } else { Overlays.editOverlay(this.overlayLine, { @@ -560,9 +560,8 @@ function MyController(hand) { drawInFront: true, // Even when burried inside of something, show it. alpha: 1 }); - print('edited overlay line ' + this.overlayLine ) } - + }; this.searchIndicatorOn = function(distantPickRay) { @@ -577,12 +576,12 @@ function MyController(hand) { } var searchSphereLocation = Vec3.sum(distantPickRay.origin, - Vec3.multiply(distantPickRay.direction, this.searchSphereDistance)); + Vec3.multiply(distantPickRay.direction, this.searchSphereDistance)); this.searchSphereOn(searchSphereLocation, SEARCH_SPHERE_SIZE * this.searchSphereDistance, - (this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR); + (this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR); if ((USE_OVERLAY_LINES_FOR_SEARCHING === true) && PICK_WITH_HAND_RAY) { this.overlayLineOn(handPosition, searchSphereLocation, - (this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR); + (this.triggerSmoothedGrab() || this.secondarySqueezed()) ? INTERSECT_COLOR : NO_INTERSECT_COLOR); } }; @@ -766,13 +765,9 @@ function MyController(hand) { this.overlayLineOff = function() { if (_this.overlayLine !== null) { - Overlays.deleteOverlay(this.overlayLine); - print('REMOVING OVERLAY LINE' + this.overlayLine) - _this.overlayLine = null; + Overlays.deleteOverlay(this.overlayLine); + _this.overlayLine = null; } - - // print('overlay shoudl be null and is line is ' + this.overlayLine) - }; this.searchSphereOff = function() { @@ -805,27 +800,21 @@ function MyController(hand) { }; this.turnOffVisualizations = function(hand) { - // print('TURN OFF VISUALIZATIONS: ' + hand) if (USE_ENTITY_LINES_FOR_SEARCHING === true || USE_ENTITY_LINES_FOR_MOVING === true) { this.lineOff(); - // print('after line off') } if (USE_OVERLAY_LINES_FOR_SEARCHING === true || USE_OVERLAY_LINES_FOR_MOVING === true) { this.overlayLineOff(); - // print('after overlay line off') } if (USE_PARTICLE_BEAM_FOR_MOVING === true) { this.particleBeamOff(); - // print('after particle beam off') } this.searchSphereOff(); restore2DMode(); - // print('after all turn off calls') - }; this.triggerPress = function(value) { @@ -901,18 +890,34 @@ function MyController(hand) { this.createHotspots = function() { var _this = this; - var HAND_EQUIP_SPHERE_COLOR = { red: 90, green: 255, blue: 90 }; + var HAND_EQUIP_SPHERE_COLOR = { + red: 90, + green: 255, + blue: 90 + }; var HAND_EQUIP_SPHERE_ALPHA = 0.7; var HAND_EQUIP_SPHERE_RADIUS = 0.01; - var HAND_GRAB_SPHERE_COLOR = { red: 90, green: 90, blue: 255 }; + var HAND_GRAB_SPHERE_COLOR = { + red: 90, + green: 90, + blue: 255 + }; var HAND_GRAB_SPHERE_ALPHA = 0.3; var HAND_GRAB_SPHERE_RADIUS = NEAR_GRAB_RADIUS; - var EQUIP_SPHERE_COLOR = { red: 90, green: 255, blue: 90 }; + var EQUIP_SPHERE_COLOR = { + red: 90, + green: 255, + blue: 90 + }; var EQUIP_SPHERE_ALPHA = 0.3; - var GRAB_BOX_COLOR = { red: 90, green: 90, blue: 255 }; + var GRAB_BOX_COLOR = { + red: 90, + green: 90, + blue: 255 + }; var GRAB_BOX_ALPHA = 0.1; this.hotspotOverlays = []; @@ -936,7 +941,6 @@ function MyController(hand) { overlay: overlay, type: "hand" }); - print('ADDED HAND SPHERE OVERLAY : '+overlay) // add larger blue sphere around the palm. overlay = Overlays.addOverlay("sphere", { @@ -949,13 +953,16 @@ function MyController(hand) { ignoreRayIntersection: true, drawInFront: false }); - print('ADDED HAND SPHERE OVERLAY : '+overlay) this.hotspotOverlays.push({ entityID: undefined, overlay: overlay, type: "hand", - localPosition: {x: 0, y: 0, z: 0} + localPosition: { + x: 0, + y: 0, + z: 0 + } }); } @@ -979,13 +986,16 @@ function MyController(hand) { ignoreRayIntersection: true, drawInFront: false }); - print('ADDED GRAB BOX OVERLAY : '+ overlay) _this.hotspotOverlays.push({ entityID: entityID, overlay: overlay, type: "near", - localPosition: {x: 0, y: 0, z: 0} + localPosition: { + x: 0, + y: 0, + z: 0 + } }); } }); @@ -1007,7 +1017,6 @@ function MyController(hand) { ignoreRayIntersection: true, drawInFront: false }); - print('ADDED SPHERE HOTSTPOT OVERLAY : '+ overlay) _this.hotspotOverlays.push({ entityID: hotspot.entityID, @@ -1023,7 +1032,9 @@ function MyController(hand) { var props; this.hotspotOverlays.forEach(function(overlayInfo) { if (overlayInfo.type === "hand") { - Overlays.editOverlay(overlayInfo.overlay, { position: _this.getHandPosition() }); + Overlays.editOverlay(overlayInfo.overlay, { + position: _this.getHandPosition() + }); } else if (overlayInfo.type === "equip") { _this.entityPropertyCache.updateEntity(overlayInfo.entityID); props = _this.entityPropertyCache.getProps(overlayInfo.entityID); @@ -1035,15 +1046,16 @@ function MyController(hand) { } else if (overlayInfo.type === "near") { _this.entityPropertyCache.updateEntity(overlayInfo.entityID); props = _this.entityPropertyCache.getProps(overlayInfo.entityID); - Overlays.editOverlay(overlayInfo.overlay, { position: props.position, rotation: props.rotation }); + Overlays.editOverlay(overlayInfo.overlay, { + position: props.position, + rotation: props.rotation + }); } }); }; this.destroyHotspots = function() { this.hotspotOverlays.forEach(function(overlayInfo) { - print('deleting overlay hotspot ' + overlayInfo.overlay) - Overlays.deleteOverlay(overlayInfo.overlay); }); this.hotspotOverlays = []; @@ -1071,8 +1083,8 @@ function MyController(hand) { var pickRay = { origin: PICK_WITH_HAND_RAY ? worldHandPosition : Camera.position, direction: PICK_WITH_HAND_RAY ? Quat.getUp(worldHandRotation) : Vec3.mix(Quat.getUp(worldHandRotation), - Quat.getFront(Camera.orientation), - HAND_HEAD_MIX_RATIO), + Quat.getFront(Camera.orientation), + HAND_HEAD_MIX_RATIO), length: PICK_MAX_DISTANCE }; @@ -1157,7 +1169,11 @@ function MyController(hand) { if (wearableProps && wearableProps.joints) { result.push({ entityID: entityID, - localPosition: {x: 0, y: 0, z: 0}, + localPosition: { + x: 0, + y: 0, + z: 0 + }, worldPosition: entityXform.pos, radius: EQUIP_RADIUS, joints: wearableProps.joints @@ -1174,8 +1190,8 @@ function MyController(hand) { var refCount = ("refCount" in grabProps) ? grabProps.refCount : 0; var okToEquipFromOtherHand = ((this.getOtherHandController().state == STATE_NEAR_GRABBING || - this.getOtherHandController().state == STATE_DISTANCE_HOLDING) && - this.getOtherHandController().grabbedEntity == hotspot.entityID); + this.getOtherHandController().state == STATE_DISTANCE_HOLDING) && + this.getOtherHandController().grabbedEntity == hotspot.entityID); if (refCount > 0 && !okToEquipFromOtherHand) { if (debug) { print("equip is skipping '" + props.name + "': grabbed by someone else"); @@ -1423,8 +1439,8 @@ function MyController(hand) { // search line visualizations if (USE_ENTITY_LINES_FOR_SEARCHING === true) { this.lineOn(rayPickInfo.searchRay.origin, - Vec3.multiply(rayPickInfo.searchRay.direction, LINE_LENGTH), - NO_INTERSECT_COLOR); + Vec3.multiply(rayPickInfo.searchRay.direction, LINE_LENGTH), + NO_INTERSECT_COLOR); } this.searchIndicatorOn(rayPickInfo.searchRay); @@ -1515,7 +1531,7 @@ function MyController(hand) { // controller pose is in avatar frame var avatarControllerPose = Controller.getPoseValue((this.hand === RIGHT_HAND) ? - Controller.Standard.RightHand : Controller.Standard.LeftHand); + Controller.Standard.RightHand : Controller.Standard.LeftHand); // transform it into world frame var controllerPositionVSAvatar = Vec3.multiplyQbyV(MyAvatar.orientation, avatarControllerPose.translation); @@ -1537,7 +1553,7 @@ function MyController(hand) { // scale delta controller hand movement by radius. var handMoved = Vec3.multiply(Vec3.subtract(controllerPositionVSAvatar, this.previousControllerPositionVSAvatar), - radius); + radius); /// double delta controller rotation // var DISTANCE_HOLDING_ROTATION_EXAGGERATION_FACTOR = 2.0; // object rotates this much more than hand did @@ -1562,7 +1578,7 @@ function MyController(hand) { var lastVelocity = Vec3.subtract(controllerPositionVSAvatar, this.previousControllerPositionVSAvatar); lastVelocity = Vec3.multiply(lastVelocity, 1.0 / deltaObjectTime); var newRadialVelocity = Vec3.dot(lastVelocity, - Vec3.normalize(Vec3.subtract(grabbedProperties.position, controllerPosition))); + Vec3.normalize(Vec3.subtract(grabbedProperties.position, controllerPosition))); var VELOCITY_AVERAGING_TIME = 0.016; this.grabRadialVelocity = (deltaObjectTime / VELOCITY_AVERAGING_TIME) * newRadialVelocity + @@ -1571,7 +1587,7 @@ function MyController(hand) { var RADIAL_GRAB_AMPLIFIER = 10.0; if (Math.abs(this.grabRadialVelocity) > 0.0) { this.grabRadius = this.grabRadius + (this.grabRadialVelocity * deltaObjectTime * - this.grabRadius * RADIAL_GRAB_AMPLIFIER); + this.grabRadius * RADIAL_GRAB_AMPLIFIER); } var newTargetPosition = Vec3.multiply(this.grabRadius, Quat.getUp(controllerRotation)); @@ -1689,16 +1705,28 @@ function MyController(hand) { if (this.fastHandMoveTimer < 0) { this.fastHandMoveDetected = false; } - var FAST_HAND_SPEED_REST_TIME = 1; // sec + var FAST_HAND_SPEED_REST_TIME = 1; // sec var FAST_HAND_SPEED_THRESHOLD = 0.4; // m/sec if (Vec3.length(worldHandVelocity) > FAST_HAND_SPEED_THRESHOLD) { this.fastHandMoveDetected = true; this.fastHandMoveTimer = FAST_HAND_SPEED_REST_TIME; } - var localHandUpAxis = this.hand === RIGHT_HAND ? {x: 1, y: 0, z: 0} : {x: -1, y: 0, z: 0}; + var localHandUpAxis = this.hand === RIGHT_HAND ? { + x: 1, + y: 0, + z: 0 + } : { + x: -1, + y: 0, + z: 0 + }; var worldHandUpAxis = Vec3.multiplyQbyV(worldHandRotation, localHandUpAxis); - var DOWN = {x: 0, y: -1, z: 0}; + var DOWN = { + x: 0, + y: -1, + z: 0 + }; var ROTATION_THRESHOLD = Math.cos(Math.PI / 8); var handIsUpsideDown = false; @@ -1800,8 +1828,16 @@ function MyController(hand) { } Entities.editEntity(this.grabbedEntity, { - velocity: {x: 0, y: 0, z: 0}, - angularVelocity: {x: 0, y: 0, z: 0}, + velocity: { + x: 0, + y: 0, + z: 0 + }, + angularVelocity: { + x: 0, + y: 0, + z: 0 + }, dynamic: false }); @@ -1868,7 +1904,7 @@ function MyController(hand) { if (nearPickedCandidateEntities.indexOf(this.grabbedEntity) == -1) { // for whatever reason, the held/equipped entity has been pulled away. ungrab or unequip. print("handControllerGrab -- autoreleasing held or equipped item because it is far from hand." + - props.parentID + " " + vec3toStr(props.position)); + props.parentID + " " + vec3toStr(props.position)); if (this.state == STATE_NEAR_GRABBING) { this.callEntityMethodOnGrabbed("releaseGrab"); @@ -2110,7 +2146,9 @@ function MyController(hand) { // people are holding something and one of them will be able (if the other releases at the right time) to // bootstrap themselves with the held object. This happens because the meaning of "otherAvatar" in // the collision mask hinges on who the physics simulation owner is. - Entities.editEntity(entityID, {"collidesWith": COLLIDES_WITH_WHILE_MULTI_GRABBED}); + Entities.editEntity(entityID, { + "collidesWith": COLLIDES_WITH_WHILE_MULTI_GRABBED + }); } } setEntityCustomData(GRAB_USER_DATA_KEY, entityID, data); @@ -2124,7 +2162,9 @@ function MyController(hand) { var children = Entities.getChildrenIDsOfJoint(MyAvatar.sessionUUID, handJointIndex); children.forEach(function(childID) { print("disconnecting stray child of hand: (" + _this.hand + ") " + childID); - Entities.editEntity(childID, {parentID: NULL_UUID}); + Entities.editEntity(childID, { + parentID: NULL_UUID + }); }); }; @@ -2170,12 +2210,24 @@ function MyController(hand) { data["dynamic"] && data["parentID"] == NULL_UUID && !data["collisionless"]) { - deactiveProps["velocity"] = {x: 0.0, y: 0.1, z: 0.0}; + deactiveProps["velocity"] = { + x: 0.0, + y: 0.1, + z: 0.0 + }; doSetVelocity = false; } if (noVelocity) { - deactiveProps["velocity"] = {x: 0.0, y: 0.0, z: 0.0}; - deactiveProps["angularVelocity"] = {x: 0.0, y: 0.0, z: 0.0}; + deactiveProps["velocity"] = { + x: 0.0, + y: 0.0, + z: 0.0 + }; + deactiveProps["angularVelocity"] = { + x: 0.0, + y: 0.0, + z: 0.0 + }; doSetVelocity = false; } @@ -2188,7 +2240,7 @@ function MyController(hand) { // be fixed. Entities.editEntity(entityID, { velocity: this.currentVelocity - // angularVelocity: this.currentAngularVelocity + // angularVelocity: this.currentAngularVelocity }); } @@ -2198,14 +2250,32 @@ function MyController(hand) { deactiveProps = { parentID: this.previousParentID, parentJointIndex: this.previousParentJointIndex, - velocity: {x: 0.0, y: 0.0, z: 0.0}, - angularVelocity: {x: 0.0, y: 0.0, z: 0.0} + velocity: { + x: 0.0, + y: 0.0, + z: 0.0 + }, + angularVelocity: { + x: 0.0, + y: 0.0, + z: 0.0 + } }; Entities.editEntity(entityID, deactiveProps); } else if (noVelocity) { - Entities.editEntity(entityID, {velocity: {x: 0.0, y: 0.0, z: 0.0}, - angularVelocity: {x: 0.0, y: 0.0, z: 0.0}, - dynamic: data["dynamic"]}); + Entities.editEntity(entityID, { + velocity: { + x: 0.0, + y: 0.0, + z: 0.0 + }, + angularVelocity: { + x: 0.0, + y: 0.0, + z: 0.0 + }, + dynamic: data["dynamic"] + }); } } else { data = null; @@ -2261,20 +2331,20 @@ var handleHandMessages = function(channel, message, sender) { if (sender === MyAvatar.sessionUUID) { if (channel === 'Hifi-Hand-Disabler') { if (message === 'left') { - leftController.turnOffVisualizations('left'); - handToDisable = LEFT_HAND; + leftController.turnOffVisualizations('left'); + handToDisable = LEFT_HAND; } if (message === 'right') { - rightController.turnOffVisualizations('right'); - handToDisable = RIGHT_HAND; + rightController.turnOffVisualizations('right'); + handToDisable = RIGHT_HAND; } if (message === "both") { print('disable both') - leftController.turnOffVisualizations('left'); - rightController.turnOffVisualizations('right'); + leftController.turnOffVisualizations('left'); + rightController.turnOffVisualizations('right'); } if (message === 'both' || message === 'none') { - // handToDisable = message; + // handToDisable = message; } } else if (channel === 'Hifi-Hand-Grab') { try { @@ -2352,5 +2422,4 @@ function handleMenuItemEvent(menuItem) { } } -Menu.menuItemEvent.connect(handleMenuItemEvent); - +Menu.menuItemEvent.connect(handleMenuItemEvent); \ No newline at end of file diff --git a/scripts/system/controllers/teleport.js b/scripts/system/controllers/teleport.js index 8426780a7a..b92a85aaf4 100644 --- a/scripts/system/controllers/teleport.js +++ b/scripts/system/controllers/teleport.js @@ -39,7 +39,7 @@ var NUMBER_OF_STEPS = 6; // var NUMBER_OF_STEPS = 20; -var TARGET_MODEL_URL = 'http://hifi-content.s3.amazonaws.com/james/teleporter/target.fbx'; +var TARGET_MODEL_URL = Script.resolvePath("../assets/models/teleport.fbx"); var TARGET_MODEL_DIMENSIONS = { x: 1.15, y: 0.5, @@ -584,22 +584,18 @@ function registerMappings() { teleportMapping.from(Controller.Standard.LeftPrimaryThumb).peek().to(leftPad.buttonPress); teleportMapping.from(Controller.Standard.LeftPrimaryThumb).when(leftTrigger.down).to(function(value) { - print('tel 1') teleporter.enterTeleportMode('left') return; }); teleportMapping.from(Controller.Standard.RightPrimaryThumb).when(rightTrigger.down).to(function(value) { - print('tel 2') teleporter.enterTeleportMode('right') return; }); teleportMapping.from(Controller.Standard.RT).when(Controller.Standard.RightPrimaryThumb).to(function(value) { - print('tel 3') teleporter.enterTeleportMode('right') return; }); teleportMapping.from(Controller.Standard.LT).when(Controller.Standard.LeftPrimaryThumb).to(function(value) { - print('tel 4') teleporter.enterTeleportMode('left') return; });