From 4467ee266d1bed0a58ddf1dfc037ac39be7308ee Mon Sep 17 00:00:00 2001 From: Atlante45 Date: Tue, 17 Jun 2014 17:19:16 -0700 Subject: [PATCH] Added snapped/smoothed rotation for models + tooltip --- examples/editModels.js | 148 +++++++++++++++++++++++++++++++++++------ 1 file changed, 127 insertions(+), 21 deletions(-) diff --git a/examples/editModels.js b/examples/editModels.js index 53633d3c0c..3cd727570c 100644 --- a/examples/editModels.js +++ b/examples/editModels.js @@ -5,6 +5,19 @@ // Created by Clément Brisset on 4/24/14. // Copyright 2014 High Fidelity, Inc. // +// This script allows you to edit models either with the razor hydras or with your mouse +// +// If using the hydras : +// grab grab models with the triggers, you can then move the models around or scale them with both hands. +// You can switch mode using the bumpers so that you can move models roud more easily. +// +// If using the mouse : +// - left click lets you move the model in the plane facing you. +// If pressing shift, it will move on the horizontale plane it's in. +// - right click lets you rotate the model. z and x give you access to more axix of rotation while shift allows for finer control. +// - left + right click lets you scale the model. +// - you can press r while holding the model to reset its rotation +// // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // @@ -653,16 +666,18 @@ function initToolBar() { } function moveOverlays() { + var newViewPort = Controller.getViewportDimensions(); + if (typeof(toolBar) === 'undefined') { initToolBar(); - } else if (windowDimensions.x == Controller.getViewportDimensions().x && - windowDimensions.y == Controller.getViewportDimensions().y) { + } else if (windowDimensions.x == newViewPort.x && + windowDimensions.y == newViewPort.y) { return; } - windowDimensions = Controller.getViewportDimensions(); + windowDimensions = newViewPort; var toolsX = windowDimensions.x - 8 - toolBar.width; var toolsY = (windowDimensions.y - toolBar.height) / 2; @@ -680,8 +695,6 @@ var intersection; var SCALE_FACTOR = 200.0; -var TRANSLATION_FACTOR = 100.0; -var ROTATION_FACTOR = 100.0; function rayPlaneIntersection(pickRay, point, normal) { var d = -Vec3.dot(point, normal); @@ -690,8 +703,50 @@ function rayPlaneIntersection(pickRay, point, normal) { return Vec3.sum(pickRay.origin, Vec3.multiply(pickRay.direction, t)); } +function Tooltip() { + this.x = 285; + this.y = 115; + this.width = 110; + this.height = 115 ; + this.margin = 5; + this.decimals = 3; + + this.textOverlay = Overlays.addOverlay("text", { + x: this.x, + y: this.y, + width: this.width, + height: this.height, + margin: this.margin, + text: "", + color: { red: 128, green: 128, blue: 128 }, + alpha: 0.2, + visible: false + }); + this.show = function(doShow) { + Overlays.editOverlay(this.textOverlay, { visible: doShow }); + } + this.updateText = function(properties) { + var angles = Quat.safeEulerAngles(properties.modelRotation); + var text = "Model Properties:\n" + text += "x: " + properties.position.x.toFixed(this.decimals) + "\n" + text += "y: " + properties.position.y.toFixed(this.decimals) + "\n" + text += "z: " + properties.position.z.toFixed(this.decimals) + "\n" + text += "pitch: " + angles.x.toFixed(this.decimals) + "\n" + text += "yaw: " + angles.y.toFixed(this.decimals) + "\n" + text += "roll: " + angles.z.toFixed(this.decimals) + "\n" + text += "Scale: " + 2 * properties.radius.toFixed(this.decimals) + "\n" + + Overlays.editOverlay(this.textOverlay, { text: text }); + } + + this.cleanup = function() { + Overlays.deleteOverlay(this.textOverlay); + } +} +var tooltip = new Tooltip(); + function mousePressEvent(event) { - if (altIsPressed) { + if (event.isAlt) { return; } @@ -786,6 +841,8 @@ function mousePressEvent(event) { selectedModelProperties.glowLevel = 0.0; print("Clicked on " + selectedModelID.id + " " + modelSelected); + tooltip.updateText(selectedModelProperties); + tooltip.show(true); } } @@ -794,7 +851,7 @@ var oldModifier = 0; var modifier = 0; var wasShifted = false; function mouseMoveEvent(event) { - if (altIsPressed) { + if (event.isAlt) { return; } @@ -886,26 +943,54 @@ function mouseMoveEvent(event) { break; case 3: // Let's rotate - var rotation = Quat.fromVec3Degrees({ x: event.y - mouseLastPosition.y, y: event.x - mouseLastPosition.x, z: 0 }); - if (event.isShifted) { - rotation = Quat.fromVec3Degrees({ x: event.y - mouseLastPosition.y, y: 0, z: mouseLastPosition.x - event.x }); + if (somethingChanged) { + selectedModelProperties.oldRotation.x = selectedModelProperties.modelRotation.x; + selectedModelProperties.oldRotation.y = selectedModelProperties.modelRotation.y; + selectedModelProperties.oldRotation.z = selectedModelProperties.modelRotation.z; + selectedModelProperties.oldRotation.w = selectedModelProperties.modelRotation.w; + mouseLastPosition.x = event.x; + mouseLastPosition.y = event.y; + somethingChanged = false; } - var newRotation = Quat.multiply(orientation, rotation); - newRotation = Quat.multiply(newRotation, Quat.inverse(orientation)); - selectedModelProperties.modelRotation = Quat.multiply(newRotation, selectedModelProperties.oldRotation); + var pixelPerDegrees = windowDimensions.y / (1 * 360); // the entire height of the window allow you to make 2 full rotations + + var STEP = 15; + var delta = Math.floor((event.x - mouseLastPosition.x) / pixelPerDegrees); + + if (!event.isShifted) { + delta = Math.floor(delta / STEP) * STEP; + } + + var rotation = Quat.fromVec3Degrees({ + x: (!zIsPressed && xIsPressed) ? delta : 0, // z is pressed + y: (!zIsPressed && !xIsPressed) ? delta : 0, // x is pressed + z: (zIsPressed && !xIsPressed) ? delta : 0 // neither is pressed + }); + rotation = Quat.multiply(selectedModelProperties.oldRotation, rotation); + + selectedModelProperties.modelRotation.x = rotation.x; + selectedModelProperties.modelRotation.y = rotation.y; + selectedModelProperties.modelRotation.z = rotation.z; + selectedModelProperties.modelRotation.w = rotation.w; break; } Models.editModel(selectedModelID, selectedModelProperties); + tooltip.updateText(selectedModelProperties); } + function mouseReleaseEvent(event) { - if (altIsPressed) { + if (event.isAlt) { return; } + if (modelSelected) { + tooltip.show(false); + } + modelSelected = false; glowedModelID.id = -1; @@ -943,6 +1028,7 @@ function scriptEnding() { rightController.cleanup(); toolBar.cleanup(); cleanupModelMenus(); + tooltip.cleanup(); } Script.scriptEnding.connect(scriptEnding); @@ -974,16 +1060,36 @@ Menu.menuItemEvent.connect(function(menuItem){ } }); + // handling of inspect.js concurrence -altIsPressed = false; +var zIsPressed = false; +var xIsPressed = false; +var somethingChanged = false; Controller.keyPressEvent.connect(function(event) { - if (event.text == "ALT") { - altIsPressed = true; + if ((event.text == "z" || event.text == "Z") && !zIsPressed) { + zIsPressed = true; + somethingChanged = true; + } + if ((event.text == "x" || event.text == "X") && !xIsPressed) { + xIsPressed = true; + somethingChanged = true; + } + + // resets model orientation when holding with mouse + if (event.text == "r" && modelSelected) { + selectedModelProperties.modelRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 0 }); + Models.editModel(selectedModelID, selectedModelProperties); + tooltip.updateText(selectedModelProperties); + somethingChanged = true; } }); Controller.keyReleaseEvent.connect(function(event) { - if (event.text == "ALT") { - altIsPressed = false; + if (event.text == "z" || event.text == "Z") { + zIsPressed = false; + somethingChanged = true; } -}); - + if (event.text == "x" || event.text == "X") { + xIsPressed = false; + somethingChanged = true; + } +}); \ No newline at end of file