diff --git a/scripts/vr-edit/modules/handles.js b/scripts/vr-edit/modules/handles.js index a0279ef9a1..8e9c5694fa 100644 --- a/scripts/vr-edit/modules/handles.js +++ b/scripts/vr-edit/modules/handles.js @@ -129,7 +129,7 @@ Handles = function (side) { return FACE_HANDLE_OVERLAY_SCALE_AXES[faceHandleOverlays.indexOf(overlayID)]; } - function display(rootEntityID, boundingBox, isMultipleEntities) { + function display(rootEntityID, boundingBox, isMultipleEntities, isSuppressZAxis) { var boundingBoxCenter, boundingBoxOrientation, cameraPosition, @@ -217,20 +217,22 @@ Handles = function (side) { faceHandleDimensions = Vec3.multiply(distanceMultiplier, FACE_HANDLE_OVERLAY_DIMENSIONS); faceHandleOffsets = Vec3.multiply(distanceMultiplier, FACE_HANDLE_OVERLAY_OFFSETS); for (i = 0; i < NUM_FACE_HANDLES; i += 1) { - faceHandleOverlays[i] = Overlays.addOverlay("shape", { - parentID: rootEntityID, - localPosition: Vec3.sum(boundingBoxLocalCenter, - Vec3.multiplyVbyV(FACE_HANDLE_OVERLAY_AXES[i], Vec3.sum(boundingBoxDimensions, faceHandleOffsets))), - localRotation: FACE_HANDLE_OVERLAY_ROTATIONS[i], - dimensions: faceHandleDimensions, - shape: "Cone", - color: HANDLE_NORMAL_COLOR, - alpha: HANDLE_NORMAL_ALPHA, - solid: true, - drawInFront: true, - ignoreRayIntersection: false, - visible: true - }); + if (!isSuppressZAxis || FACE_HANDLE_OVERLAY_AXES[i].z === 0) { + faceHandleOverlays[i] = Overlays.addOverlay("shape", { + parentID: rootEntityID, + localPosition: Vec3.sum(boundingBoxLocalCenter, + Vec3.multiplyVbyV(FACE_HANDLE_OVERLAY_AXES[i], Vec3.sum(boundingBoxDimensions, faceHandleOffsets))), + localRotation: FACE_HANDLE_OVERLAY_ROTATIONS[i], + dimensions: faceHandleDimensions, + shape: "Cone", + color: HANDLE_NORMAL_COLOR, + alpha: HANDLE_NORMAL_ALPHA, + solid: true, + drawInFront: true, + ignoreRayIntersection: false, + visible: true + }); + } } } else { faceHandleOverlays = []; diff --git a/scripts/vr-edit/modules/selection.js b/scripts/vr-edit/modules/selection.js index 1d7fac9ed8..8023775242 100644 --- a/scripts/vr-edit/modules/selection.js +++ b/scripts/vr-edit/modules/selection.js @@ -29,7 +29,8 @@ Selection = function (side) { scaleRootOffset, scaleRootOrientation, ENTITY_TYPE = "entity", - ENTITY_TYPES_WITH_COLOR = ["Box", "Sphere", "Shape", "PolyLine", "PolyVox"]; + ENTITY_TYPES_WITH_COLOR = ["Box", "Sphere", "Shape", "PolyLine", "PolyVox"], + ENTITY_TYPES_2D = ["Text", "Web"]; if (!this instanceof Selection) { @@ -41,14 +42,15 @@ Selection = function (side) { // The root entity is always the first entry. var children, properties, - SELECTION_PROPERTIES = ["position", "registrationPoint", "rotation", "dimensions", "parentID", "localPosition", - "dynamic", "collisionless", "userData"], + SELECTION_PROPERTIES = ["type", "position", "registrationPoint", "rotation", "dimensions", "parentID", + "localPosition", "dynamic", "collisionless", "userData"], i, length; properties = Entities.getEntityProperties(id, SELECTION_PROPERTIES); result.push({ id: id, + type: properties.type, position: properties.position, parentID: properties.parentID, localPosition: properties.localPosition, @@ -190,6 +192,10 @@ Selection = function (side) { }; } + function is2D() { + return selection.length === 1 && ENTITY_TYPES_2D.indexOf(selection[0].type) !== -1; + } + function doKick(entityID) { var properties, NO_KICK_ENTITY_TYPES = ["Text", "Web"], // These entities don't respond to gravity so don't kick them. @@ -278,6 +284,7 @@ Selection = function (side) { function directScale(factor, rotation, center) { // Scale, position, and rotate selection. + // We can get away with scaling the z size of 2D entities - incongruities are barely noticeable and things recover. var i, length; @@ -308,7 +315,7 @@ Selection = function (side) { // Update selection with final entity properties. var i, length; - // Final scale, position, and orientaation of root. + // Final scale, position, and orientation of root. rootPosition = Vec3.sum(scaleCenter, Vec3.multiply(scaleFactor, Vec3.multiplyQbyV(scaleRotation, scaleRootOffset))); rootOrientation = Quat.multiply(scaleRotation, scaleRootOrientation); selection[0].dimensions = Vec3.multiply(scaleFactor, selection[0].dimensions); @@ -329,6 +336,7 @@ Selection = function (side) { function handleScale(factor, position, orientation) { // Scale and reposition and orient selection. + // We can get away with scaling the z size of 2D entities - incongruities are barely noticeable and things recover. var i, length; @@ -526,6 +534,7 @@ Selection = function (side) { intersectedEntityIndex: getIntersectedEntityIndex, rootEntityID: getRootEntityID, boundingBox: getBoundingBox, + is2D: is2D, getPositionAndOrientation: getPositionAndOrientation, setPositionAndOrientation: setPositionAndOrientation, startEditing: startEditing, diff --git a/scripts/vr-edit/vr-edit.js b/scripts/vr-edit/vr-edit.js index 26fbfd392e..01de12c07c 100644 --- a/scripts/vr-edit/vr-edit.js +++ b/scripts/vr-edit/vr-edit.js @@ -719,7 +719,7 @@ laser.disable(); } if (toolSelected === TOOL_SCALE) { - handles.display(rootEntityID, selection.boundingBox(), selection.count() > 1); + handles.display(rootEntityID, selection.boundingBox(), selection.count() > 1, selection.is2D()); otherEditor.setHandleOverlays(handles.overlays()); } startEditing(); @@ -729,7 +729,7 @@ function updateEditorGrabbing() { selection.select(intersectedEntityID); if (toolSelected === TOOL_SCALE) { - handles.display(rootEntityID, selection.boundingBox(), selection.count() > 1); + handles.display(rootEntityID, selection.boundingBox(), selection.count() > 1, selection.is2D()); otherEditor.setHandleOverlays(handles.overlays()); } else { handles.clear();