From f6c07a5ada8dfc69c35ca74225a06a99f95ae87f Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Thu, 9 Oct 2014 17:37:56 -0700 Subject: [PATCH] first cut at making the rotate handles actually rotate --- examples/libraries/entitySelectionTool.js | 221 +++++++++++++++------- 1 file changed, 154 insertions(+), 67 deletions(-) diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js index d88a8a52eb..281ac07261 100644 --- a/examples/libraries/entitySelectionTool.js +++ b/examples/libraries/entitySelectionTool.js @@ -37,11 +37,22 @@ SelectionDisplay = (function () { var yawCenter; var pitchCenter; var rollCenter; + var yawZero; + var pitchZero; + var rollZero; + var yawNormal; + var pitchNormal; + var rollNormal; + var rotationNormal; + + var originalPitch; + var originalYaw; + var originalRoll; + var rotateHandleColor = { red: 0, green: 0, blue: 0 }; var rotateHandleAlpha = 0.7; - var grabberSizeCorner = 0.025; var grabberSizeEdge = 0.015; var grabberSizeFace = 0.025; @@ -168,6 +179,21 @@ SelectionDisplay = (function () { var rollOverlayAngles = { x: 0, y: 180, z: 0 }; var rollOverlayRotation = Quat.fromVec3Degrees(rollOverlayAngles); + var rotateZeroOverlay = Overlays.addOverlay("line3d", { + visible: false, + lineWidth: 2.0, + start: { x: 0, y: 0, z: 0 }, + end: { x: 0, y: 0, z: 0 }, + color: { red: 255, green: 0, blue: 0 }, + }); + + var rotateCurrentOverlay = Overlays.addOverlay("line3d", { + visible: false, + lineWidth: 2.0, + start: { x: 0, y: 0, z: 0 }, + end: { x: 0, y: 0, z: 0 }, + color: { red: 0, green: 0, blue: 255 }, + }); var rotateOverlayInner = Overlays.addOverlay("circle3d", { position: { x:0, y: 0, z: 0}, @@ -290,7 +316,9 @@ SelectionDisplay = (function () { overlayNames[rotateOverlayOuter] = "rotateOverlayOuter"; overlayNames[rotateOverlayCurrent] = "rotateOverlayCurrent"; - + overlayNames[rotateZeroOverlay] = "rotateZeroOverlay"; + overlayNames[rotateCurrentOverlay] = "rotateCurrentOverlay"; + that.cleanup = function () { Overlays.deleteOverlay(highlightBox); Overlays.deleteOverlay(selectionBox); @@ -333,6 +361,10 @@ SelectionDisplay = (function () { Overlays.deleteOverlay(rotateOverlayOuter); Overlays.deleteOverlay(rotateOverlayCurrent); + Overlays.deleteOverlay(rotateZeroOverlay); + Overlays.deleteOverlay(rotateCurrentOverlay); + + }; that.highlightSelectable = function(entityID) { @@ -439,6 +471,10 @@ SelectionDisplay = (function () { pitchHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 180, z: 180 }); rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 90, z: 180 }); + yawNormal = { x: 0, y: 1, z: 0 }; + pitchNormal = { x: 0, y: 0, z: -1 }; + rollNormal = { x: 1, y: 0, z: 0 }; + yawCorner = { x: right + rotateHandleOffset, y: bottom - rotateHandleOffset, z: near - rotateHandleOffset }; @@ -451,23 +487,19 @@ SelectionDisplay = (function () { y: top + rotateHandleOffset, z: near - rotateHandleOffset}; - yawCenter = { x: center.x, - y: bottom, - z: center.z }; - - pitchCenter = { x: center.x, - y: center.y, - z: far }; - - rollCenter = { x: left, - y: center.y, - z: center.z}; - + yawCenter = { x: center.x, y: bottom, z: center.z }; + pitchCenter = { x: center.x, y: center.y, z: far }; + rollCenter = { x: left, y: center.y, z: center.z}; } else { yawHandleRotation = Quat.fromVec3Degrees({ x: 90, y: 270, z: 0 }); pitchHandleRotation = Quat.fromVec3Degrees({ x: 180, y: 270, z: 0 }); rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 90 }); + yawNormal = { x: 0, y: 1, z: 0 }; + pitchNormal = { x: 1, y: 0, z: 0 }; + rollNormal = { x: 0, y: 0, z: 1 }; + + yawCorner = { x: right + rotateHandleOffset, y: bottom - rotateHandleOffset, z: far + rotateHandleOffset }; @@ -481,18 +513,9 @@ SelectionDisplay = (function () { z: near - rotateHandleOffset}; - yawCenter = { x: center.x, - y: bottom, - z: center.z }; - - pitchCenter = { x: left, - y: center.y, - z: center.z }; - - rollCenter = { x: center.x, - y: center.y, - z: near}; - + yawCenter = { x: center.x, y: bottom, z: center.z }; + pitchCenter = { x: left, y: center.y, z: center.z }; + rollCenter = { x: center.x, y: center.y, z: near}; } } else { // must be BLF or BLN @@ -501,6 +524,10 @@ SelectionDisplay = (function () { pitchHandleRotation = Quat.fromVec3Degrees({ x: 90, y: 0, z: 90 }); rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 180 }); + yawNormal = { x: 0, y: 1, z: 0 }; + pitchNormal = { x: -1, y: 0, z: 0 }; + rollNormal = { x: 0, y: 0, z: -1 }; + yawCorner = { x: left - rotateHandleOffset, y: bottom - rotateHandleOffset, z: near - rotateHandleOffset }; @@ -513,25 +540,20 @@ SelectionDisplay = (function () { y: top + rotateHandleOffset, z: far + rotateHandleOffset}; - yawCenter = { x: center.x, - y: bottom, - z: center.z }; + yawCenter = { x: center.x, y: bottom, z: center.z }; + pitchCenter = { x: right, y: center.y, z: center.z }; + rollCenter = { x: center.x, y: center.y, z: far}; - pitchCenter = { x: right, - y: center.y, - z: center.z }; - - rollCenter = { x: center.x, - y: center.y, - z: far}; - - - } else { yawHandleRotation = Quat.fromVec3Degrees({ x: 90, y: 180, z: 0 }); pitchHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 180 }); rollHandleRotation = Quat.fromVec3Degrees({ x: 180, y: 270, z: 0 }); + // TODO: fix these + yawNormal = { x: 0, y: 1, z: 0 }; + pitchNormal = { x: 0, y: 0, z: 1 }; + rollNormal = { x: -1, y: 0, z: 0 }; + yawCorner = { x: left - rotateHandleOffset, y: bottom - rotateHandleOffset, z: far + rotateHandleOffset }; @@ -544,19 +566,9 @@ SelectionDisplay = (function () { y: top + rotateHandleOffset, z: far + rotateHandleOffset}; - yawCenter = { x: center.x, - y: bottom, - z: center.z }; - - pitchCenter = { x: center.x, - y: center.y, - z: near }; - - rollCenter = { x: right, - y: center.y, - z: center.z}; - - + yawCenter = { x: center.x, y: bottom, z: center.z }; + pitchCenter = { x: center.x, y: center.y, z: near }; + rollCenter = { x: right, y: center.y, z: center.z}; } } @@ -660,6 +672,9 @@ SelectionDisplay = (function () { endAt: 0, innerRadius: 0.9, }); + + Overlays.editOverlay(rotateZeroOverlay, { visible: false }); + Overlays.editOverlay(rotateCurrentOverlay, { visible: false }); // TODO: we have not implemented the rotating handle/controls yet... so for now, these handles are hidden Overlays.editOverlay(yawHandle, { visible: rotateHandlesVisible, position: yawCorner, rotation: yawHandleRotation}); @@ -718,6 +733,9 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayOuter, { visible: false }); Overlays.editOverlay(rotateOverlayCurrent, { visible: false }); + Overlays.editOverlay(rotateZeroOverlay, { visible: false }); + Overlays.editOverlay(rotateCurrentOverlay, { visible: false }); + Entities.editEntity(entityID, { localRenderAlpha: 1.0 }); currentSelection = { id: -1, isKnownID: false }; @@ -1514,11 +1532,26 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayCurrent, { ignoreRayIntersection: false }); var result = Overlays.findRayIntersection(pickRay); - print("result.intersects:" + result.intersects); - print("result.overlayID:" + overlayNames[result.overlayID]); - print("result.distance:" + result.distance); - print("result.face:" + result.face); - Vec3.print("result.intersection:", result.intersection); + if (result.intersects) { + print("ROTATE_YAW"); + var properties = Entities.getEntityProperties(currentSelection); + var center = yawCenter; + var zero = yawZero; + var centerToZero = Vec3.subtract(center, zero); + var centerToIntersect = Vec3.subtract(center, result.intersection); + var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal); + Overlays.editOverlay(rotateCurrentOverlay, + { + visible: true, + start: center, + end: result.intersection + }); + + + var newYaw = originalYaw + angleFromZero; + var newRotation = Quat.fromVec3Degrees({ x: originalPitch, y: newYaw, z: originalRoll }); + Entities.editEntity(currentSelection, { rotation: newRotation }); + } }; that.rotatePitch = function(event) { @@ -1532,11 +1565,27 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayOuter, { ignoreRayIntersection: false }); Overlays.editOverlay(rotateOverlayCurrent, { ignoreRayIntersection: false }); var result = Overlays.findRayIntersection(pickRay); - print("result.intersects:" + result.intersects); - print("result.overlayID:" + overlayNames[result.overlayID]); - print("result.distance:" + result.distance); - print("result.face:" + result.face); - Vec3.print("result.intersection:", result.intersection); + + if (result.intersects) { + print("ROTATE_PITCH"); + + var properties = Entities.getEntityProperties(currentSelection); + var center = pitchCenter; + var zero = pitchZero; + var centerToZero = Vec3.subtract(center, zero); + var centerToIntersect = Vec3.subtract(center, result.intersection); + var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal); + Overlays.editOverlay(rotateCurrentOverlay, + { + visible: true, + start: center, + end: result.intersection + }); + + var newPitch = originalPitch + angleFromZero; + var newRotation = Quat.fromVec3Degrees({ x: newPitch, y: originalYaw, z: originalRoll }); + Entities.editEntity(currentSelection, { rotation: newRotation }); + } }; that.rotateRoll = function(event) { @@ -1550,11 +1599,25 @@ SelectionDisplay = (function () { Overlays.editOverlay(rotateOverlayOuter, { ignoreRayIntersection: false }); Overlays.editOverlay(rotateOverlayCurrent, { ignoreRayIntersection: false }); var result = Overlays.findRayIntersection(pickRay); - print("result.intersects:" + result.intersects); - print("result.overlayID:" + overlayNames[result.overlayID]); - print("result.distance:" + result.distance); - print("result.face:" + result.face); - Vec3.print("result.intersection:", result.intersection); + if (result.intersects) { + print("ROTATE_ROLL"); + var properties = Entities.getEntityProperties(currentSelection); + var center = rollCenter; + var zero = rollZero; + var centerToZero = Vec3.subtract(center, zero); + var centerToIntersect = Vec3.subtract(center, result.intersection); + var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal); + Overlays.editOverlay(rotateCurrentOverlay, + { + visible: true, + start: center, + end: result.intersection + }); + + var newRoll = originalRoll + angleFromZero; + var newRotation = Quat.fromVec3Degrees({ x: originalPitch, y: originalYaw, z: newRoll }); + Entities.editEntity(currentSelection, { rotation: newRotation }); + } }; that.checkMove = function() { @@ -1736,6 +1799,10 @@ SelectionDisplay = (function () { var roll = angles.z; var currentRotation; + originalPitch = pitch; + originalYaw = yaw; + originalRoll = roll; + if (result.intersects) { switch(result.overlayID) { case yawHandle: @@ -1744,6 +1811,8 @@ SelectionDisplay = (function () { overlayOrientation = yawHandleRotation; overlayCenter = yawCenter; currentRotation = yaw; + yawZero = result.intersection; + rotationNormal = yawNormal; break; case pitchHandle: @@ -1752,6 +1821,8 @@ SelectionDisplay = (function () { overlayOrientation = pitchHandleRotation; overlayCenter = pitchCenter; currentRotation = pitch; + pitchZero = result.intersection; + rotationNormal = pitchNormal; break; case rollHandle: @@ -1760,6 +1831,8 @@ SelectionDisplay = (function () { overlayOrientation = rollHandleRotation; overlayCenter = rollCenter; currentRotation = roll; + rollZero = result.intersection; + rotationNormal = rollNormal; break; default: @@ -1807,6 +1880,20 @@ SelectionDisplay = (function () { startAt: 0, endAt: currentRotation }); + + Overlays.editOverlay(rotateZeroOverlay, + { + visible: true, + start: overlayCenter, + end: result.intersection + }); + + Overlays.editOverlay(rotateCurrentOverlay, + { + visible: true, + start: overlayCenter, + end: result.intersection + }); Overlays.editOverlay(yawHandle, { visible: false }); Overlays.editOverlay(pitchHandle, { visible: false });