mirror of
https://github.com/overte-org/overte.git
synced 2025-08-09 08:21:24 +02:00
Add rotation degrees overlay
This commit is contained in:
parent
fc5adef501
commit
da568c96ce
1 changed files with 113 additions and 18 deletions
|
@ -200,6 +200,12 @@ SelectionManager = (function() {
|
||||||
return that;
|
return that;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
|
function normalizeDegrees(degrees) {
|
||||||
|
while (degrees > 180) degrees -= 360;
|
||||||
|
while (degrees < -180) degrees += 360;
|
||||||
|
return degrees;
|
||||||
|
}
|
||||||
|
|
||||||
SelectionDisplay = (function () {
|
SelectionDisplay = (function () {
|
||||||
var that = {};
|
var that = {};
|
||||||
|
|
||||||
|
@ -207,6 +213,8 @@ SelectionDisplay = (function () {
|
||||||
|
|
||||||
var GRABBER_DISTANCE_TO_SIZE_RATIO = 0.0075;
|
var GRABBER_DISTANCE_TO_SIZE_RATIO = 0.0075;
|
||||||
|
|
||||||
|
var ROTATION_DISPLAY_DISTANCE_MULTIPLIER = 1.2;
|
||||||
|
|
||||||
var showExtendedStretchHandles = false;
|
var showExtendedStretchHandles = false;
|
||||||
|
|
||||||
var spaceMode = SPACE_LOCAL;
|
var spaceMode = SPACE_LOCAL;
|
||||||
|
@ -223,6 +231,9 @@ SelectionDisplay = (function () {
|
||||||
var innerSnapAngle = 22.5; // the angle which we snap to on the inner rotation tool
|
var innerSnapAngle = 22.5; // the angle which we snap to on the inner rotation tool
|
||||||
var innerRadius;
|
var innerRadius;
|
||||||
var outerRadius;
|
var outerRadius;
|
||||||
|
var yawOffset = 0;
|
||||||
|
var pitchOffset = 0;
|
||||||
|
var rollOffset = 0;
|
||||||
var yawHandleRotation;
|
var yawHandleRotation;
|
||||||
var pitchHandleRotation;
|
var pitchHandleRotation;
|
||||||
var rollHandleRotation;
|
var rollHandleRotation;
|
||||||
|
@ -326,6 +337,23 @@ SelectionDisplay = (function () {
|
||||||
lineWidth: 1.0,
|
lineWidth: 1.0,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
var rotationDegreesDisplay = Overlays.addOverlay("text3d", {
|
||||||
|
position: { x:0, y: 0, z: 0},
|
||||||
|
text: "",
|
||||||
|
color: { red: 0, green: 0, blue: 0},
|
||||||
|
backgroundColor: { red: 255, green: 255, blue: 255 },
|
||||||
|
alpha: 0.7,
|
||||||
|
visible: false,
|
||||||
|
isFacingAvatar: true,
|
||||||
|
drawInFront: true,
|
||||||
|
dimensions: { x: 0, y: 0 },
|
||||||
|
lineHeight: 0.0,
|
||||||
|
topMargin: 0,
|
||||||
|
rightMargin: 0,
|
||||||
|
bottomMargin: 0,
|
||||||
|
leftMargin: 0,
|
||||||
|
});
|
||||||
|
|
||||||
var grabberMoveUp = Overlays.addOverlay("billboard", {
|
var grabberMoveUp = Overlays.addOverlay("billboard", {
|
||||||
url: HIFI_PUBLIC_BUCKET + "images/up-arrow.png",
|
url: HIFI_PUBLIC_BUCKET + "images/up-arrow.png",
|
||||||
position: { x:0, y: 0, z: 0},
|
position: { x:0, y: 0, z: 0},
|
||||||
|
@ -585,6 +613,7 @@ SelectionDisplay = (function () {
|
||||||
rotateOverlayCurrent,
|
rotateOverlayCurrent,
|
||||||
rotateZeroOverlay,
|
rotateZeroOverlay,
|
||||||
rotateCurrentOverlay,
|
rotateCurrentOverlay,
|
||||||
|
rotationDegreesDisplay,
|
||||||
xRailOverlay,
|
xRailOverlay,
|
||||||
yRailOverlay,
|
yRailOverlay,
|
||||||
zRailOverlay,
|
zRailOverlay,
|
||||||
|
@ -757,6 +786,10 @@ SelectionDisplay = (function () {
|
||||||
pitchHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 90, z: 0 });
|
pitchHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 90, z: 0 });
|
||||||
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 0 });
|
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 0 });
|
||||||
|
|
||||||
|
yawOffset = 90;
|
||||||
|
pitchOffset = 0;
|
||||||
|
rollOffset = 0;
|
||||||
|
|
||||||
yawNormal = { x: 0, y: 1, z: 0 };
|
yawNormal = { x: 0, y: 1, z: 0 };
|
||||||
pitchNormal = { x: 1, y: 0, z: 0 };
|
pitchNormal = { x: 1, y: 0, z: 0 };
|
||||||
rollNormal = { x: 0, y: 0, z: 1 };
|
rollNormal = { x: 0, y: 0, z: 1 };
|
||||||
|
@ -788,6 +821,10 @@ SelectionDisplay = (function () {
|
||||||
pitchHandleRotation = Quat.fromVec3Degrees({ x: 180, y: 270, z: 0 });
|
pitchHandleRotation = Quat.fromVec3Degrees({ x: 180, y: 270, z: 0 });
|
||||||
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 90 });
|
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 90 });
|
||||||
|
|
||||||
|
yawOffset = 0;
|
||||||
|
pitchOffset = 180;
|
||||||
|
rollOffset = 90;
|
||||||
|
|
||||||
yawNormal = { x: 0, y: 1, z: 0 };
|
yawNormal = { x: 0, y: 1, z: 0 };
|
||||||
pitchNormal = { x: 1, y: 0, z: 0 };
|
pitchNormal = { x: 1, y: 0, z: 0 };
|
||||||
rollNormal = { x: 0, y: 0, z: 1 };
|
rollNormal = { x: 0, y: 0, z: 1 };
|
||||||
|
@ -822,6 +859,10 @@ SelectionDisplay = (function () {
|
||||||
pitchHandleRotation = Quat.fromVec3Degrees({ x: 90, y: 0, z: 90 });
|
pitchHandleRotation = Quat.fromVec3Degrees({ x: 90, y: 0, z: 90 });
|
||||||
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 180 });
|
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 180 });
|
||||||
|
|
||||||
|
yawOffset = 180;
|
||||||
|
pitchOffset = 90;
|
||||||
|
rollOffset = 180;
|
||||||
|
|
||||||
yawNormal = { x: 0, y: 1, z: 0 };
|
yawNormal = { x: 0, y: 1, z: 0 };
|
||||||
pitchNormal = { x: 1, y: 0, z: 0 };
|
pitchNormal = { x: 1, y: 0, z: 0 };
|
||||||
rollNormal = { x: 0, y: 0, z: 1 };
|
rollNormal = { x: 0, y: 0, z: 1 };
|
||||||
|
@ -848,8 +889,12 @@ SelectionDisplay = (function () {
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
yawHandleRotation = Quat.fromVec3Degrees({ x: 270, y: 270, z: 0 });
|
yawHandleRotation = Quat.fromVec3Degrees({ x: 270, y: 270, z: 0 });
|
||||||
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 180 });
|
|
||||||
pitchHandleRotation = Quat.fromVec3Degrees({ x: 180, y: 270, z: 0 });
|
pitchHandleRotation = Quat.fromVec3Degrees({ x: 180, y: 270, z: 0 });
|
||||||
|
rollHandleRotation = Quat.fromVec3Degrees({ x: 0, y: 0, z: 180 });
|
||||||
|
|
||||||
|
yawOffset = 270;
|
||||||
|
pitchOffset = 180;
|
||||||
|
rollOffset = 180;
|
||||||
|
|
||||||
yawNormal = { x: 0, y: 1, z: 0 };
|
yawNormal = { x: 0, y: 1, z: 0 };
|
||||||
rollNormal = { x: 0, y: 0, z: 1 };
|
rollNormal = { x: 0, y: 0, z: 1 };
|
||||||
|
@ -1570,11 +1615,17 @@ SelectionDisplay = (function () {
|
||||||
endAt: 0,
|
endAt: 0,
|
||||||
innerRadius: 0.9,
|
innerRadius: 0.9,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, {
|
||||||
|
visible: true,
|
||||||
|
ignoreRayIntersection: true,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
onEnd: function(event, reason) {
|
onEnd: function(event, reason) {
|
||||||
Overlays.editOverlay(rotateOverlayInner, { visible: false });
|
Overlays.editOverlay(rotateOverlayInner, { visible: false });
|
||||||
Overlays.editOverlay(rotateOverlayOuter, { visible: false });
|
Overlays.editOverlay(rotateOverlayOuter, { visible: false });
|
||||||
Overlays.editOverlay(rotateOverlayCurrent, { visible: false });
|
Overlays.editOverlay(rotateOverlayCurrent, { visible: false });
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, { visible: false });
|
||||||
|
|
||||||
pushCommandForSelections();
|
pushCommandForSelections();
|
||||||
},
|
},
|
||||||
|
@ -1605,12 +1656,9 @@ SelectionDisplay = (function () {
|
||||||
var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal);
|
var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal);
|
||||||
|
|
||||||
var distanceFromCenter = Vec3.distance(center, result.intersection);
|
var distanceFromCenter = Vec3.distance(center, result.intersection);
|
||||||
var snapToInner = false;
|
var snapToInner = distanceFromCenter < innerRadius;
|
||||||
// var innerRadius = (Vec3.length(selectionManager.worldDimensions) / 2) * 1.1;
|
var snapAngle = snapToInner ? innerSnapAngle : 1.0;
|
||||||
if (distanceFromCenter < innerRadius) {
|
angleFromZero = Math.floor(angleFromZero / snapAngle) * snapAngle;
|
||||||
angleFromZero = Math.floor(angleFromZero/innerSnapAngle) * innerSnapAngle;
|
|
||||||
snapToInner = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for debugging
|
// for debugging
|
||||||
if (debug) {
|
if (debug) {
|
||||||
|
@ -1632,7 +1680,20 @@ SelectionDisplay = (function () {
|
||||||
rotation: Quat.multiply(yawChange, initialProperties.rotation),
|
rotation: Quat.multiply(yawChange, initialProperties.rotation),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var angle = (yawOffset + angleFromZero + 180) * (Math.PI / 180);
|
||||||
|
var position = Vec3.sum( selectionManager.worldPosition, {
|
||||||
|
x: -Math.cos(angle) * outerRadius * ROTATION_DISPLAY_DISTANCE_MULTIPLIER,
|
||||||
|
y: -selectionManager.worldDimensions.y / 2,
|
||||||
|
z: Math.sin(angle) * outerRadius * ROTATION_DISPLAY_DISTANCE_MULTIPLIER,
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, {
|
||||||
|
position: position,
|
||||||
|
dimensions: { x: innerRadius / 2, y: innerRadius / 5.6 },
|
||||||
|
lineHeight: innerRadius / 6,
|
||||||
|
text: normalizeDegrees(angleFromZero),
|
||||||
|
});
|
||||||
|
|
||||||
// update the rotation display accordingly...
|
// update the rotation display accordingly...
|
||||||
var startAtCurrent = 0;
|
var startAtCurrent = 0;
|
||||||
var endAtCurrent = angleFromZero;
|
var endAtCurrent = angleFromZero;
|
||||||
|
@ -1701,11 +1762,17 @@ SelectionDisplay = (function () {
|
||||||
endAt: 0,
|
endAt: 0,
|
||||||
innerRadius: 0.9,
|
innerRadius: 0.9,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, {
|
||||||
|
visible: true,
|
||||||
|
ignoreRayIntersection: true,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
onEnd: function(event, reason) {
|
onEnd: function(event, reason) {
|
||||||
Overlays.editOverlay(rotateOverlayInner, { visible: false });
|
Overlays.editOverlay(rotateOverlayInner, { visible: false });
|
||||||
Overlays.editOverlay(rotateOverlayOuter, { visible: false });
|
Overlays.editOverlay(rotateOverlayOuter, { visible: false });
|
||||||
Overlays.editOverlay(rotateOverlayCurrent, { visible: false });
|
Overlays.editOverlay(rotateOverlayCurrent, { visible: false });
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, { visible: false });
|
||||||
|
|
||||||
pushCommandForSelections();
|
pushCommandForSelections();
|
||||||
},
|
},
|
||||||
|
@ -1736,11 +1803,9 @@ SelectionDisplay = (function () {
|
||||||
var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal);
|
var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal);
|
||||||
|
|
||||||
var distanceFromCenter = Vec3.distance(center, result.intersection);
|
var distanceFromCenter = Vec3.distance(center, result.intersection);
|
||||||
var snapToInner = false;
|
var snapToInner = distanceFromCenter < innerRadius;
|
||||||
if (distanceFromCenter < innerRadius) {
|
var snapAngle = snapToInner ? innerSnapAngle : 1.0;
|
||||||
angleFromZero = Math.floor(angleFromZero/innerSnapAngle) * innerSnapAngle;
|
angleFromZero = Math.floor(angleFromZero / snapAngle) * snapAngle;
|
||||||
snapToInner = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for debugging
|
// for debugging
|
||||||
if (debug) {
|
if (debug) {
|
||||||
|
@ -1764,6 +1829,19 @@ SelectionDisplay = (function () {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var angle = (rollOffset + angleFromZero - 90) * (Math.PI / 180);
|
||||||
|
var position = Vec3.sum( selectionManager.worldPosition, {
|
||||||
|
x: selectionManager.worldDimensions.x / 2,
|
||||||
|
y: Math.cos(angle) * outerRadius * ROTATION_DISPLAY_DISTANCE_MULTIPLIER,
|
||||||
|
z: Math.sin(angle) * outerRadius * ROTATION_DISPLAY_DISTANCE_MULTIPLIER,
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, {
|
||||||
|
position: position,
|
||||||
|
dimensions: { x: innerRadius / 2, y: innerRadius / 5.6 },
|
||||||
|
lineHeight: innerRadius / 6,
|
||||||
|
text: normalizeDegrees(angleFromZero),
|
||||||
|
});
|
||||||
|
|
||||||
// update the rotation display accordingly...
|
// update the rotation display accordingly...
|
||||||
var startAtCurrent = 0;
|
var startAtCurrent = 0;
|
||||||
var endAtCurrent = angleFromZero;
|
var endAtCurrent = angleFromZero;
|
||||||
|
@ -1831,11 +1909,17 @@ SelectionDisplay = (function () {
|
||||||
endAt: 0,
|
endAt: 0,
|
||||||
innerRadius: 0.9,
|
innerRadius: 0.9,
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, {
|
||||||
|
visible: true,
|
||||||
|
ignoreRayIntersection: true,
|
||||||
|
});
|
||||||
},
|
},
|
||||||
onEnd: function(event, reason) {
|
onEnd: function(event, reason) {
|
||||||
Overlays.editOverlay(rotateOverlayInner, { visible: false });
|
Overlays.editOverlay(rotateOverlayInner, { visible: false });
|
||||||
Overlays.editOverlay(rotateOverlayOuter, { visible: false });
|
Overlays.editOverlay(rotateOverlayOuter, { visible: false });
|
||||||
Overlays.editOverlay(rotateOverlayCurrent, { visible: false });
|
Overlays.editOverlay(rotateOverlayCurrent, { visible: false });
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, { visible: false });
|
||||||
|
|
||||||
pushCommandForSelections();
|
pushCommandForSelections();
|
||||||
},
|
},
|
||||||
|
@ -1866,11 +1950,9 @@ SelectionDisplay = (function () {
|
||||||
var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal);
|
var angleFromZero = Vec3.orientedAngle(centerToZero, centerToIntersect, rotationNormal);
|
||||||
|
|
||||||
var distanceFromCenter = Vec3.distance(center, result.intersection);
|
var distanceFromCenter = Vec3.distance(center, result.intersection);
|
||||||
var snapToInner = false;
|
var snapToInner = distanceFromCenter < innerRadius;
|
||||||
if (distanceFromCenter < innerRadius) {
|
var snapAngle = snapToInner ? innerSnapAngle : 1.0;
|
||||||
angleFromZero = Math.floor(angleFromZero/innerSnapAngle) * innerSnapAngle;
|
angleFromZero = Math.floor(angleFromZero / snapAngle) * snapAngle;
|
||||||
snapToInner = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// for debugging
|
// for debugging
|
||||||
if (debug) {
|
if (debug) {
|
||||||
|
@ -1893,6 +1975,19 @@ SelectionDisplay = (function () {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var angle = (rollOffset + angleFromZero + 90) * (Math.PI / 180);
|
||||||
|
var position = Vec3.sum( selectionManager.worldPosition, {
|
||||||
|
x: Math.sin(angle) * outerRadius * ROTATION_DISPLAY_DISTANCE_MULTIPLIER,
|
||||||
|
y: -Math.cos(angle) * outerRadius * ROTATION_DISPLAY_DISTANCE_MULTIPLIER,
|
||||||
|
z: -selectionManager.worldDimensions.z / 2,
|
||||||
|
});
|
||||||
|
Overlays.editOverlay(rotationDegreesDisplay, {
|
||||||
|
position: position,
|
||||||
|
dimensions: { x: innerRadius / 2, y: innerRadius / 5.6 },
|
||||||
|
lineHeight: innerRadius / 6,
|
||||||
|
text: normalizeDegrees(angleFromZero),
|
||||||
|
});
|
||||||
|
|
||||||
// update the rotation display accordingly...
|
// update the rotation display accordingly...
|
||||||
var startAtCurrent = 0;
|
var startAtCurrent = 0;
|
||||||
var endAtCurrent = angleFromZero;
|
var endAtCurrent = angleFromZero;
|
||||||
|
|
Loading…
Reference in a new issue