From 6ae206677d047748e1fdd142eb0c2d4999755ff6 Mon Sep 17 00:00:00 2001 From: David Rowe Date: Thu, 27 Sep 2018 14:55:53 +1200 Subject: [PATCH] Add Settings > Controls option for displaying play area --- interface/src/avatar/MyAvatar.cpp | 1 + interface/src/avatar/MyAvatar.h | 11 ++++++-- interface/src/ui/PreferencesDialog.cpp | 6 +++++ .../controllers/controllerModules/teleport.js | 27 ++++++++++++------- 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/interface/src/avatar/MyAvatar.cpp b/interface/src/avatar/MyAvatar.cpp index c47cfdb383..e32380336f 100755 --- a/interface/src/avatar/MyAvatar.cpp +++ b/interface/src/avatar/MyAvatar.cpp @@ -104,6 +104,7 @@ MyAvatar::MyAvatar(QThread* thread) : _realWorldFieldOfView("realWorldFieldOfView", DEFAULT_REAL_WORLD_FIELD_OF_VIEW_DEGREES), _useAdvancedMovementControls("advancedMovementForHandControllersIsChecked", true), + _showPlayArea("showPlayArea", true), _smoothOrientationTimer(std::numeric_limits::max()), _smoothOrientationInitial(), _smoothOrientationTarget(), diff --git a/interface/src/avatar/MyAvatar.h b/interface/src/avatar/MyAvatar.h index 139f1f6ea2..ced1f49404 100644 --- a/interface/src/avatar/MyAvatar.h +++ b/interface/src/avatar/MyAvatar.h @@ -122,8 +122,10 @@ class MyAvatar : public Avatar { * zone may disallow collisionless avatars. * @property {boolean} characterControllerEnabled - Synonym of collisionsEnabled. * Deprecated: Use collisionsEnabled instead. - * @property {boolean} useAdvancedMovementControls - Returns the value of the Interface setting, Settings > Advanced - * Movement for Hand Controller. Note: Setting the value has no effect unless Interface is restarted. + * @property {boolean} useAdvancedMovementControls - Returns and sets the value of the Interface setting, Settings > + * Walking and teleporting. Note: Setting the value has no effect unless Interface is restarted. + * @property {boolean} showPlayArea - Returns and sets the value of the Interface setting, Settings > Show room boundaries + * while teleporting. Note: Setting the value has no effect unless Interface is restarted. * @property {number} yawSpeed=75 * @property {number} pitchSpeed=50 * @property {boolean} hmdRollControlEnabled=true - If true, the roll angle of your HMD turns your avatar @@ -223,6 +225,7 @@ class MyAvatar : public Avatar { Q_PROPERTY(bool collisionsEnabled READ getCollisionsEnabled WRITE setCollisionsEnabled) Q_PROPERTY(bool characterControllerEnabled READ getCharacterControllerEnabled WRITE setCharacterControllerEnabled) Q_PROPERTY(bool useAdvancedMovementControls READ useAdvancedMovementControls WRITE setUseAdvancedMovementControls) + Q_PROPERTY(bool showPlayArea READ getShowPlayArea WRITE setShowPlayArea) Q_PROPERTY(float yawSpeed MEMBER _yawSpeed) Q_PROPERTY(float pitchSpeed MEMBER _pitchSpeed) @@ -542,6 +545,9 @@ public: void setUseAdvancedMovementControls(bool useAdvancedMovementControls) { _useAdvancedMovementControls.set(useAdvancedMovementControls); } + bool getShowPlayArea() const { return _showPlayArea.get(); } + void setShowPlayArea(bool showPlayArea) { _showPlayArea.set(showPlayArea); } + void setHMDRollControlEnabled(bool value) { _hmdRollControlEnabled = value; } bool getHMDRollControlEnabled() const { return _hmdRollControlEnabled; } void setHMDRollControlDeadZone(float value) { _hmdRollControlDeadZone = value; } @@ -1628,6 +1634,7 @@ private: Setting::Handle _realWorldFieldOfView; Setting::Handle _useAdvancedMovementControls; + Setting::Handle _showPlayArea; // Smoothing. const float SMOOTH_TIME_ORIENTATION = 0.5f; diff --git a/interface/src/ui/PreferencesDialog.cpp b/interface/src/ui/PreferencesDialog.cpp index 2bc36a3030..95e9b2c0c9 100644 --- a/interface/src/ui/PreferencesDialog.cpp +++ b/interface/src/ui/PreferencesDialog.cpp @@ -253,6 +253,12 @@ void setupPreferences() { preference->setItems(items); preferences->addPreference(preference); } + { + auto getter = [myAvatar]()->bool { return myAvatar->getShowPlayArea(); }; + auto setter = [myAvatar](bool value) { myAvatar->setShowPlayArea(value); }; + auto preference = new CheckPreference(VR_MOVEMENT, "Show room boundaries while teleporting", getter, setter); + preferences->addPreference(preference); + } { auto getter = [=]()->float { return myAvatar->getUserHeight(); }; auto setter = [=](float value) { myAvatar->setUserHeight(value); }; diff --git a/scripts/system/controllers/controllerModules/teleport.js b/scripts/system/controllers/controllerModules/teleport.js index d4ead73fd0..399eb239e7 100644 --- a/scripts/system/controllers/controllerModules/teleport.js +++ b/scripts/system/controllers/controllerModules/teleport.js @@ -164,6 +164,7 @@ Script.include("/~/system/libraries/controllers.js"); this.playArea = { x: 0, y: 0 }; this.playAreaCenterOffset = this.PLAY_AREA_OVERLAY_OFFSET; this.isPlayAreaVisible = false; + this.wasPlayAreaVisible = false; this.isPlayAreaAvailable = false; this.targetOverlayID = null; this.playAreaOverlay = null; @@ -453,6 +454,7 @@ Script.include("/~/system/libraries/controllers.js"); return; } + this.wasPlayAreaVisible = this.isPlayAreaVisible; this.isPlayAreaVisible = visible; this.targetOverlayID = targetOverlayID; @@ -529,7 +531,9 @@ Script.include("/~/system/libraries/controllers.js"); end: { dimensions: Vec3.multiply(_this.teleportScaleFactor, TARGET_MODEL_DIMENSIONS) } } ); - _this.setPlayAreaDimensions(); + if (_this.isPlayAreaVisible) { + _this.setPlayAreaDimensions(); + } if (_this.teleportScaleFactor < 1) { _this.teleportScaleTimer = Script.setTimeout(_this.scaleInTeleport, _this.TELEPORT_SCALE_TIMEOUT); } else { @@ -555,18 +559,22 @@ Script.include("/~/system/libraries/controllers.js"); Overlays.editOverlay(_this.teleportedTargetOverlay, { alpha: _this.teleportedFadeFactor * _this.TELEPORTED_TARGET_ALPHA }); - Overlays.editOverlay(_this.playAreaOverlay, { alpha: _this.teleportedFadeFactor * _this.PLAY_AREA_BOX_ALPHA }); - var sensorAlpha = _this.teleportedFadeFactor * _this.PLAY_AREA_SENSOR_ALPHA; - for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { - Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { alpha: sensorAlpha }); + if (_this.wasPlayAreaVisible) { + Overlays.editOverlay(_this.playAreaOverlay, { alpha: _this.teleportedFadeFactor * _this.PLAY_AREA_BOX_ALPHA }); + var sensorAlpha = _this.teleportedFadeFactor * _this.PLAY_AREA_SENSOR_ALPHA; + for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { + Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { alpha: sensorAlpha }); + } } _this.teleportedFadeTimer = Script.setTimeout(_this.fadeOutTeleport, _this.TELEPORTED_FADE_INTERVAL); } else { // Make invisible. Overlays.editOverlay(_this.teleportedTargetOverlay, { visible: false }); - Overlays.editOverlay(_this.playAreaOverlay, { visible: false }); - for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { - Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { visible: false }); + if (_this.wasPlayAreaVisible) { + Overlays.editOverlay(_this.playAreaOverlay, { visible: false }); + for (i = 0, length = _this.playAreaSensorPositionOverlays.length; i < length; i++) { + Overlays.editOverlay(_this.playAreaSensorPositionOverlays[i], { visible: false }); + } } _this.teleportedFadeTimer = null; } @@ -795,7 +803,8 @@ Script.include("/~/system/libraries/controllers.js"); Pointers.setRenderState(_this.teleportParabolaHandCollisions, invisibleState); pointerID = _this.teleportParabolaHandVisuals; } - this.setPlayAreaVisible(visible, Pointers.getPointerProperties(pointerID).renderStates.teleport.end, false); + this.setPlayAreaVisible(visible && MyAvatar.showPlayArea, + Pointers.getPointerProperties(pointerID).renderStates.teleport.end, false); this.setTeleportVisible(visible, mode, false); };