From 2f0d92c3cde394770e6613ce2e434ad5d45e9908 Mon Sep 17 00:00:00 2001 From: David Back Date: Mon, 29 Jan 2018 18:15:01 -0800 Subject: [PATCH] ctrl 22.5 snapping --- .../system/libraries/entitySelectionTool.js | 62 +++++++++++++++---- 1 file changed, 51 insertions(+), 11 deletions(-) diff --git a/scripts/system/libraries/entitySelectionTool.js b/scripts/system/libraries/entitySelectionTool.js index 3da7d1f083..d843b6282b 100644 --- a/scripts/system/libraries/entitySelectionTool.js +++ b/scripts/system/libraries/entitySelectionTool.js @@ -254,6 +254,10 @@ SelectionDisplay = (function() { var ROTATION_DISPLAY_SIZE_Y_MULTIPLIER = 0.18; var ROTATION_DISPLAY_LINE_HEIGHT_MULTIPLIER = 0.14; + var ROTATION_CTRL_SNAP_ANGLE = 22.5; + var ROTATION_DEFAULT_SNAP_ANGLE = 1; + var ROTATION_DEFAULT_TICK_MARKS_ANGLE = 5; + var TRANSLATE_DIRECTION = { X : 0, Y : 1, @@ -300,6 +304,8 @@ SelectionDisplay = (function() { var worldRotationY; var worldRotationZ; + var ctrlPressed = false; + var activeTool = null; var grabberTools = {}; @@ -335,7 +341,7 @@ SelectionDisplay = (function() { innerRadius: 0.9, startAt: 0, endAt: 360, - majorTickMarksAngle: 5, + majorTickMarksAngle: ROTATION_DEFAULT_TICK_MARKS_ANGLE, majorTickMarksLength: 0.1, visible: false, ignoreRayIntersection: false, @@ -584,6 +590,25 @@ SelectionDisplay = (function() { that.triggerMapping.from(Controller.Standard.RT).peek().to(makeTriggerHandler(Controller.Standard.RightHand)); that.triggerMapping.from(Controller.Standard.LT).peek().to(makeTriggerHandler(Controller.Standard.LeftHand)); + // Control key remains active only while key is held down + function keyReleaseEvent(key) { + if (key.key === 16777249) { + ctrlPressed = false; + that.updateActiveRotateRing(); + } + } + + // Triggers notification on specific key driven events + function keyPressEvent(key) { + if (key.key === 16777249) { + ctrlPressed = true; + that.updateActiveRotateRing(); + } + } + + Controller.keyPressEvent.connect(keyPressEvent); + Controller.keyReleaseEvent.connect(keyReleaseEvent); + function controllerComputePickRay() { var controllerPose = getControllerWorldLocation(activeHand, true); if (controllerPose.valid && that.triggered) { @@ -1227,7 +1252,9 @@ SelectionDisplay = (function() { var centerToIntersect = Vec3.subtract(result, rotCenter); // Note: orientedAngle which wants normalized centerToZero and centerToIntersect // handles that internally, so it's to pass unnormalized vectors here. - var angleFromZero = Math.floor((Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal))); + var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal); + var snapAngle = ctrlPressed ? ROTATION_CTRL_SNAP_ANGLE : ROTATION_DEFAULT_SNAP_ANGLE; + angleFromZero = Math.floor(angleFromZero / snapAngle) * snapAngle; var rotChange = Quat.angleAxis(angleFromZero, rotationNormal); updateSelectionsRotation(rotChange); updateRotationDegreesOverlay(-angleFromZero, direction, rotCenter); @@ -1310,12 +1337,6 @@ SelectionDisplay = (function() { } } - /* - Overlays.editOverlay(highlightBox, { - visible: false - }); - */ - that.updateGrabbers(); }; @@ -1544,24 +1565,28 @@ SelectionDisplay = (function() { Overlays.editOverlay(grabberRotatePitchRing, { position: SelectionManager.worldPosition, rotation: worldRotationY, - dimensions: rotateDimensions + dimensions: rotateDimensions, + majorTickMarksAngle: ROTATION_DEFAULT_TICK_MARKS_ANGLE }); } if (!isActiveTool(grabberRotateYawRing)) { Overlays.editOverlay(grabberRotateYawRing, { position: SelectionManager.worldPosition, rotation: worldRotationZ, - dimensions: rotateDimensions + dimensions: rotateDimensions, + majorTickMarksAngle: ROTATION_DEFAULT_TICK_MARKS_ANGLE }); } if (!isActiveTool(grabberRotateRollRing)) { Overlays.editOverlay(grabberRotateRollRing, { position: SelectionManager.worldPosition, rotation: worldRotationX, - dimensions: rotateDimensions + dimensions: rotateDimensions, + majorTickMarksAngle: ROTATION_DEFAULT_TICK_MARKS_ANGLE }); } Overlays.editOverlay(grabberRotateCurrentRing, { dimensions: rotateDimensions }); + that.updateActiveRotateRing(); var inModeRotate = isActiveTool(grabberRotatePitchRing) || isActiveTool(grabberRotateYawRing) || isActiveTool(grabberRotateRollRing); var inModeTranslate = isActiveTool(grabberTranslateXCone) || isActiveTool(grabberTranslateXCylinder) || @@ -1604,6 +1629,21 @@ SelectionDisplay = (function() { } }; + that.updateActiveRotateRing = function() { + var activeRotateRing = null; + if (isActiveTool(grabberRotatePitchRing)) { + activeRotateRing = grabberRotatePitchRing; + } else if (isActiveTool(grabberRotateYawRing)) { + activeRotateRing = grabberRotateYawRing; + } else if (isActiveTool(grabberRotateRollRing)) { + activeRotateRing = grabberRotateRollRing; + } + if (activeRotateRing != null) { + var tickMarksAngle = ctrlPressed ? ROTATION_CTRL_SNAP_ANGLE : ROTATION_DEFAULT_TICK_MARKS_ANGLE; + Overlays.editOverlay(activeRotateRing, { majorTickMarksAngle: tickMarksAngle }); + } + }; + // FUNCTION: SET OVERLAYS VISIBLE that.setOverlaysVisible = function(isVisible) { for (var i = 0; i < allOverlays.length; i++) {