From 991ceb643c6ad06bac9f3fbdd1a9e948eecc7893 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Tue, 25 Sep 2018 10:18:52 +1200 Subject: [PATCH] Fix teleport not working after script reload in HMD mode --- .../controllers/controllerModules/teleport.js | 110 +++++++++--------- 1 file changed, 55 insertions(+), 55 deletions(-) diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index b377c9823f..b1fa8e2dc0 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -189,6 +189,61 @@ Script.include("/~/system/libraries/controllers.js"); this.TELEPORTED_TARGET_ROTATION = Quat.fromVec3Degrees({ x: 0, y: 180, z: 0 }); this.teleportedTargetOverlay = null; + this.setPlayAreaDimensions = function () { + var avatarScale = MyAvatar.scale; + + var playAreaOverlayProperties = { + dimensions: + Vec3.multiply(this.teleportScaleFactor * avatarScale, { + x: this.playArea.width, + y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y, + z: this.playArea.height + }) + }; + + if (this.teleportScaleFactor < 1) { + // Adjust position of playAreOverlay so that its base is at correct height. + // Always parenting to teleport target is good enough for this. + var sensorToWorldMatrix = MyAvatar.sensorToWorldMatrix; + var sensorToWorldRotation = Mat4.extractRotation(MyAvatar.sensorToWorldMatrix); + var worldToSensorMatrix = Mat4.inverse(sensorToWorldMatrix); + var avatarSensorPosition = Mat4.transformPoint(worldToSensorMatrix, MyAvatar.position); + avatarSensorPosition.y = 0; + + var targetRotation = Overlays.getProperty(this.targetOverlayID, "rotation"); + var relativePlayAreaCenterOffset = + Vec3.sum(this.playAreaCenterOffset, { x: 0, y: -TARGET_MODEL_DIMENSIONS.y / 2, z: 0 }); + var localPosition = Vec3.multiplyQbyV(Quat.inverse(targetRotation), + Vec3.multiplyQbyV(sensorToWorldRotation, + Vec3.multiply(MyAvatar.scale, Vec3.subtract(relativePlayAreaCenterOffset, avatarSensorPosition)))); + localPosition.y = this.teleportScaleFactor * localPosition.y; + + playAreaOverlayProperties.parentID = this.targetOverlayID; + playAreaOverlayProperties.localPosition = localPosition; + } + + Overlays.editOverlay(this.playAreaOverlay, playAreaOverlayProperties); + + for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { + localPosition = this.playAreaSensorPositions[i]; + localPosition = Vec3.multiply(avatarScale, localPosition); + // Position relative to the play area. + localPosition.y = avatarScale * (this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 + - this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2); + Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { + dimensions: Vec3.multiply(this.teleportScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), + parentID: this.playAreaOverlay, + localPosition: localPosition + }); + } + }; + + this.updatePlayAreaScale = function () { + if (this.isPlayAreaAvailable) { + this.setPlayAreaDimensions(); + } + }; + this.teleporterSelectionName = "teleporterSelection" + hand.toString(); this.TELEPORTER_SELECTION_STYLE = { @@ -387,61 +442,6 @@ Script.include("/~/system/libraries/controllers.js"); _this.initPointers(); - this.setPlayAreaDimensions = function () { - var avatarScale = MyAvatar.scale; - - var playAreaOverlayProperties = { - dimensions: - Vec3.multiply(this.teleportScaleFactor * avatarScale, { - x: this.playArea.width, - y: this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y, - z: this.playArea.height - }) - }; - - if (this.teleportScaleFactor < 1) { - // Adjust position of playAreOverlay so that its base is at correct height. - // Always parenting to teleport target is good enough for this. - var sensorToWorldMatrix = MyAvatar.sensorToWorldMatrix; - var sensorToWorldRotation = Mat4.extractRotation(MyAvatar.sensorToWorldMatrix); - var worldToSensorMatrix = Mat4.inverse(sensorToWorldMatrix); - var avatarSensorPosition = Mat4.transformPoint(worldToSensorMatrix, MyAvatar.position); - avatarSensorPosition.y = 0; - - var targetRotation = Overlays.getProperty(this.targetOverlayID, "rotation"); - var relativePlayAreaCenterOffset = - Vec3.sum(this.playAreaCenterOffset, { x: 0, y: -TARGET_MODEL_DIMENSIONS.y / 2, z: 0 }); - var localPosition = Vec3.multiplyQbyV(Quat.inverse(targetRotation), - Vec3.multiplyQbyV(sensorToWorldRotation, - Vec3.multiply(MyAvatar.scale, Vec3.subtract(relativePlayAreaCenterOffset, avatarSensorPosition)))); - localPosition.y = this.teleportScaleFactor * localPosition.y; - - playAreaOverlayProperties.parentID = this.targetOverlayID; - playAreaOverlayProperties.localPosition = localPosition; - } - - Overlays.editOverlay(this.playAreaOverlay, playAreaOverlayProperties); - - for (var i = 0; i < this.playAreaSensorPositionOverlays.length; i++) { - localPosition = this.playAreaSensorPositions[i]; - localPosition = Vec3.multiply(avatarScale, localPosition); - // Position relative to the play area. - localPosition.y = avatarScale * (this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS.y / 2 - - this.PLAY_AREA_OVERLAY_MODEL_DIMENSIONS.y / 2); - Overlays.editOverlay(this.playAreaSensorPositionOverlays[i], { - dimensions: Vec3.multiply(this.teleportScaleFactor * avatarScale, this.PLAY_AREA_SENSOR_OVERLAY_DIMENSIONS), - parentID: this.playAreaOverlay, - localPosition: localPosition - }); - } - }; - - this.updatePlayAreaScale = function () { - if (this.isPlayAreaAvailable) { - this.setPlayAreaDimensions(); - } - }; - this.playAreaFadeTimer = null; this.PlayAreaFadeFactor = 1.0;