fix bug related to camera lock for entity orbit and pan

This commit is contained in:
James B. Pollack 2015-10-12 14:55:52 -07:00
parent f8956a853b
commit 84f0c404ad
2 changed files with 622 additions and 179 deletions

View file

@ -39,7 +39,9 @@ var lightOverlayManager = new LightOverlayManager();
var cameraManager = new CameraManager(); var cameraManager = new CameraManager();
var grid = Grid(); var grid = Grid();
gridTool = GridTool({ horizontalGrid: grid }); gridTool = GridTool({
horizontalGrid: grid
});
gridTool.setVisible(false); gridTool.setVisible(false);
var entityListTool = EntityListTool(); var entityListTool = EntityListTool();
@ -93,7 +95,7 @@ var INSUFFICIENT_PERMISSIONS_IMPORT_ERROR_MSG = "You do not have the necessary p
var modelURLs = [ var modelURLs = [
"Insert the URL to your FBX" "Insert the URL to your FBX"
]; ];
var mode = 0; var mode = 0;
var isActive = false; var isActive = false;
@ -109,20 +111,30 @@ var importingSVOImageOverlay = Overlays.addOverlay("image", {
width: 20, width: 20,
height: 20, height: 20,
alpha: 1.0, alpha: 1.0,
color: { red: 255, green: 255, blue: 255 }, color: {
red: 255,
green: 255,
blue: 255
},
x: Window.innerWidth - IMPORTING_SVO_OVERLAY_WIDTH, x: Window.innerWidth - IMPORTING_SVO_OVERLAY_WIDTH,
y: Window.innerHeight - IMPORTING_SVO_OVERLAY_HEIGHT, y: Window.innerHeight - IMPORTING_SVO_OVERLAY_HEIGHT,
visible: false, visible: false,
}); });
var importingSVOTextOverlay = Overlays.addOverlay("text", { var importingSVOTextOverlay = Overlays.addOverlay("text", {
font: { size: 14 }, font: {
size: 14
},
text: "Importing SVO...", text: "Importing SVO...",
leftMargin: IMPORTING_SVO_OVERLAY_LEFT_MARGIN, leftMargin: IMPORTING_SVO_OVERLAY_LEFT_MARGIN,
x: Window.innerWidth - IMPORTING_SVO_OVERLAY_WIDTH - IMPORTING_SVO_OVERLAY_MARGIN, x: Window.innerWidth - IMPORTING_SVO_OVERLAY_WIDTH - IMPORTING_SVO_OVERLAY_MARGIN,
y: Window.innerHeight - IMPORTING_SVO_OVERLAY_HEIGHT - IMPORTING_SVO_OVERLAY_MARGIN, y: Window.innerHeight - IMPORTING_SVO_OVERLAY_HEIGHT - IMPORTING_SVO_OVERLAY_MARGIN,
width: IMPORTING_SVO_OVERLAY_WIDTH, width: IMPORTING_SVO_OVERLAY_WIDTH,
height: IMPORTING_SVO_OVERLAY_HEIGHT, height: IMPORTING_SVO_OVERLAY_HEIGHT,
backgroundColor: { red: 80, green: 80, blue: 80 }, backgroundColor: {
red: 80,
green: 80,
blue: 80
},
backgroundAlpha: 0.7, backgroundAlpha: 0.7,
visible: false, visible: false,
}); });
@ -131,7 +143,7 @@ var MARKETPLACE_URL = "https://metaverse.highfidelity.com/marketplace";
var marketplaceWindow = new WebWindow('Marketplace', MARKETPLACE_URL, 900, 700, false); var marketplaceWindow = new WebWindow('Marketplace', MARKETPLACE_URL, 900, 700, false);
marketplaceWindow.setVisible(false); marketplaceWindow.setVisible(false);
var toolBar = (function () { var toolBar = (function() {
var that = {}, var that = {},
toolBar, toolBar,
activeButton, activeButton,
@ -146,7 +158,7 @@ var toolBar = (function () {
browseMarketplaceButton; browseMarketplaceButton;
function initialize() { function initialize() {
toolBar = new ToolBar(0, 0, ToolBar.VERTICAL, "highfidelity.edit.toolbar", function (windowDimensions, toolbar) { toolBar = new ToolBar(0, 0, ToolBar.VERTICAL, "highfidelity.edit.toolbar", function(windowDimensions, toolbar) {
return { return {
x: windowDimensions.x - 8 - toolbar.width, x: windowDimensions.x - 8 - toolbar.width,
y: (windowDimensions.y - toolbar.height) / 2 y: (windowDimensions.y - toolbar.height) / 2
@ -163,7 +175,12 @@ var toolBar = (function () {
activeButton = toolBar.addTool({ activeButton = toolBar.addTool({
imageURL: toolIconUrl + "edit-status.svg", imageURL: toolIconUrl + "edit-status.svg",
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,
width: Tool.IMAGE_WIDTH,
height: Tool.IMAGE_HEIGHT
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -172,7 +189,12 @@ var toolBar = (function () {
newModelButton = toolBar.addTool({ newModelButton = toolBar.addTool({
imageURL: toolIconUrl + "upload.svg", imageURL: toolIconUrl + "upload.svg",
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,
width: Tool.IMAGE_WIDTH,
height: Tool.IMAGE_HEIGHT
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -181,7 +203,12 @@ var toolBar = (function () {
newCubeButton = toolBar.addTool({ newCubeButton = toolBar.addTool({
imageURL: toolIconUrl + "add-cube.svg", imageURL: toolIconUrl + "add-cube.svg",
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,
width: Tool.IMAGE_WIDTH,
height: Tool.IMAGE_HEIGHT
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -190,7 +217,12 @@ var toolBar = (function () {
newSphereButton = toolBar.addTool({ newSphereButton = toolBar.addTool({
imageURL: toolIconUrl + "add-sphere.svg", imageURL: toolIconUrl + "add-sphere.svg",
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,
width: Tool.IMAGE_WIDTH,
height: Tool.IMAGE_HEIGHT
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -199,7 +231,12 @@ var toolBar = (function () {
newLightButton = toolBar.addTool({ newLightButton = toolBar.addTool({
imageURL: toolIconUrl + "light.svg", imageURL: toolIconUrl + "light.svg",
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,
width: Tool.IMAGE_WIDTH,
height: Tool.IMAGE_HEIGHT
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -208,7 +245,12 @@ var toolBar = (function () {
newTextButton = toolBar.addTool({ newTextButton = toolBar.addTool({
imageURL: toolIconUrl + "add-text.svg", imageURL: toolIconUrl + "add-text.svg",
subImage: { x: 0, y: Tool.IMAGE_WIDTH, width: Tool.IMAGE_WIDTH, height: Tool.IMAGE_HEIGHT }, subImage: {
x: 0,
y: Tool.IMAGE_WIDTH,
width: Tool.IMAGE_WIDTH,
height: Tool.IMAGE_HEIGHT
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -217,7 +259,12 @@ var toolBar = (function () {
newWebButton = toolBar.addTool({ newWebButton = toolBar.addTool({
imageURL: "https://hifi-public.s3.amazonaws.com/images/www.svg", imageURL: "https://hifi-public.s3.amazonaws.com/images/www.svg",
subImage: { x: 0, y: 0, width: 128, height: 128 }, subImage: {
x: 0,
y: 0,
width: 128,
height: 128
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -226,7 +273,12 @@ var toolBar = (function () {
newZoneButton = toolBar.addTool({ newZoneButton = toolBar.addTool({
imageURL: toolIconUrl + "zonecube_text.svg", imageURL: toolIconUrl + "zonecube_text.svg",
subImage: { x: 0, y: 128, width: 128, height: 128 }, subImage: {
x: 0,
y: 128,
width: 128,
height: 128
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -235,7 +287,12 @@ var toolBar = (function () {
newPolyVoxButton = toolBar.addTool({ newPolyVoxButton = toolBar.addTool({
imageURL: toolIconUrl + "polyvox.svg", imageURL: toolIconUrl + "polyvox.svg",
subImage: { x: 0, y: 0, width: 256, height: 256 }, subImage: {
x: 0,
y: 0,
width: 256,
height: 256
},
width: toolWidth, width: toolWidth,
height: toolHeight, height: toolHeight,
alpha: 0.9, alpha: 0.9,
@ -293,6 +350,7 @@ var toolBar = (function () {
var RESIZE_INTERVAL = 50; var RESIZE_INTERVAL = 50;
var RESIZE_TIMEOUT = 120000; // 2 minutes var RESIZE_TIMEOUT = 120000; // 2 minutes
var RESIZE_MAX_CHECKS = RESIZE_TIMEOUT / RESIZE_INTERVAL; var RESIZE_MAX_CHECKS = RESIZE_TIMEOUT / RESIZE_INTERVAL;
function addModel(url) { function addModel(url) {
var entityID = createNewEntity({ var entityID = createNewEntity({
type: "Model", type: "Model",
@ -329,12 +387,15 @@ var toolBar = (function () {
var newModelButtonDown = false; var newModelButtonDown = false;
var browseMarketplaceButtonDown = false; var browseMarketplaceButtonDown = false;
that.mousePressEvent = function (event) { that.mousePressEvent = function(event) {
var clickedOverlay, var clickedOverlay,
url, url,
file; file;
clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); clickedOverlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (activeButton === toolBar.clicked(clickedOverlay)) { if (activeButton === toolBar.clicked(clickedOverlay)) {
that.setActive(!isActive); that.setActive(!isActive);
@ -360,7 +421,11 @@ var toolBar = (function () {
createNewEntity({ createNewEntity({
type: "Box", type: "Box",
dimensions: DEFAULT_DIMENSIONS, dimensions: DEFAULT_DIMENSIONS,
color: { red: 255, green: 0, blue: 0 } color: {
red: 255,
green: 0,
blue: 0
}
}); });
return true; return true;
@ -370,7 +435,11 @@ var toolBar = (function () {
createNewEntity({ createNewEntity({
type: "Sphere", type: "Sphere",
dimensions: DEFAULT_DIMENSIONS, dimensions: DEFAULT_DIMENSIONS,
color: { red: 255, green: 0, blue: 0 } color: {
red: 255,
green: 0,
blue: 0
}
}); });
return true; return true;
@ -381,7 +450,11 @@ var toolBar = (function () {
type: "Light", type: "Light",
dimensions: DEFAULT_LIGHT_DIMENSIONS, dimensions: DEFAULT_LIGHT_DIMENSIONS,
isSpotlight: false, isSpotlight: false,
color: { red: 150, green: 150, blue: 150 }, color: {
red: 150,
green: 150,
blue: 150
},
constantAttenuation: 1, constantAttenuation: 1,
linearAttenuation: 0, linearAttenuation: 0,
@ -396,9 +469,21 @@ var toolBar = (function () {
if (newTextButton === toolBar.clicked(clickedOverlay)) { if (newTextButton === toolBar.clicked(clickedOverlay)) {
createNewEntity({ createNewEntity({
type: "Text", type: "Text",
dimensions: { x: 0.65, y: 0.3, z: 0.01 }, dimensions: {
backgroundColor: { red: 64, green: 64, blue: 64 }, x: 0.65,
textColor: { red: 255, green: 255, blue: 255 }, y: 0.3,
z: 0.01
},
backgroundColor: {
red: 64,
green: 64,
blue: 64
},
textColor: {
red: 255,
green: 255,
blue: 255
},
text: "some text", text: "some text",
lineHeight: 0.06 lineHeight: 0.06
}); });
@ -409,7 +494,11 @@ var toolBar = (function () {
if (newWebButton === toolBar.clicked(clickedOverlay)) { if (newWebButton === toolBar.clicked(clickedOverlay)) {
createNewEntity({ createNewEntity({
type: "Web", type: "Web",
dimensions: { x: 1.6, y: 0.9, z: 0.01 }, dimensions: {
x: 1.6,
y: 0.9,
z: 0.01
},
sourceUrl: "https://highfidelity.com/", sourceUrl: "https://highfidelity.com/",
}); });
@ -419,7 +508,11 @@ var toolBar = (function () {
if (newZoneButton === toolBar.clicked(clickedOverlay)) { if (newZoneButton === toolBar.clicked(clickedOverlay)) {
createNewEntity({ createNewEntity({
type: "Zone", type: "Zone",
dimensions: { x: 10, y: 10, z: 10 }, dimensions: {
x: 10,
y: 10,
z: 10
},
}); });
return true; return true;
@ -428,27 +521,83 @@ var toolBar = (function () {
if (newPolyVoxButton === toolBar.clicked(clickedOverlay)) { if (newPolyVoxButton === toolBar.clicked(clickedOverlay)) {
var polyVoxId = createNewEntity({ var polyVoxId = createNewEntity({
type: "PolyVox", type: "PolyVox",
dimensions: { x: 10, y: 10, z: 10 }, dimensions: {
voxelVolumeSize: {x:16, y:16, z:16}, x: 10,
y: 10,
z: 10
},
voxelVolumeSize: {
x: 16,
y: 16,
z: 16
},
voxelSurfaceStyle: 2 voxelSurfaceStyle: 2
}); });
for (var x = 1; x <= 14; x++) { for (var x = 1; x <= 14; x++) {
Entities.setVoxel(polyVoxId, {x: x, y: 1, z: 1}, 255); Entities.setVoxel(polyVoxId, {
Entities.setVoxel(polyVoxId, {x: x, y: 14, z: 1}, 255); x: x,
Entities.setVoxel(polyVoxId, {x: x, y: 1, z: 14}, 255); y: 1,
Entities.setVoxel(polyVoxId, {x: x, y: 14, z: 14}, 255); z: 1
}, 255);
Entities.setVoxel(polyVoxId, {
x: x,
y: 14,
z: 1
}, 255);
Entities.setVoxel(polyVoxId, {
x: x,
y: 1,
z: 14
}, 255);
Entities.setVoxel(polyVoxId, {
x: x,
y: 14,
z: 14
}, 255);
} }
for (var y = 2; y <= 13; y++) { for (var y = 2; y <= 13; y++) {
Entities.setVoxel(polyVoxId, {x: 1, y: y, z: 1}, 255); Entities.setVoxel(polyVoxId, {
Entities.setVoxel(polyVoxId, {x: 14, y: y, z: 1}, 255); x: 1,
Entities.setVoxel(polyVoxId, {x: 1, y: y, z: 14}, 255); y: y,
Entities.setVoxel(polyVoxId, {x: 14, y: y, z: 14}, 255); z: 1
}, 255);
Entities.setVoxel(polyVoxId, {
x: 14,
y: y,
z: 1
}, 255);
Entities.setVoxel(polyVoxId, {
x: 1,
y: y,
z: 14
}, 255);
Entities.setVoxel(polyVoxId, {
x: 14,
y: y,
z: 14
}, 255);
} }
for (var z = 2; z <= 13; z++) { for (var z = 2; z <= 13; z++) {
Entities.setVoxel(polyVoxId, {x: 1, y: 1, z: z}, 255); Entities.setVoxel(polyVoxId, {
Entities.setVoxel(polyVoxId, {x: 14, y: 1, z: z}, 255); x: 1,
Entities.setVoxel(polyVoxId, {x: 1, y: 14, z: z}, 255); y: 1,
Entities.setVoxel(polyVoxId, {x: 14, y: 14, z: z}, 255); z: z
}, 255);
Entities.setVoxel(polyVoxId, {
x: 14,
y: 1,
z: z
}, 255);
Entities.setVoxel(polyVoxId, {
x: 1,
y: 14,
z: z
}, 255);
Entities.setVoxel(polyVoxId, {
x: 14,
y: 14,
z: z
}, 255);
} }
@ -461,7 +610,10 @@ var toolBar = (function () {
that.mouseReleaseEvent = function(event) { that.mouseReleaseEvent = function(event) {
var handled = false; var handled = false;
if (newModelButtonDown) { if (newModelButtonDown) {
var clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); var clickedOverlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (newModelButton === toolBar.clicked(clickedOverlay)) { if (newModelButton === toolBar.clicked(clickedOverlay)) {
url = Window.prompt("Model URL", modelURLs[Math.floor(Math.random() * modelURLs.length)]); url = Window.prompt("Model URL", modelURLs[Math.floor(Math.random() * modelURLs.length)]);
if (url !== null && url !== "") { if (url !== null && url !== "") {
@ -470,7 +622,10 @@ var toolBar = (function () {
handled = true; handled = true;
} }
} else if (browseMarketplaceButtonDown) { } else if (browseMarketplaceButtonDown) {
var clickedOverlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); var clickedOverlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (browseMarketplaceButton === toolBar.clicked(clickedOverlay)) { if (browseMarketplaceButton === toolBar.clicked(clickedOverlay)) {
url = Window.s3Browse(".*(fbx|FBX|obj|OBJ)"); url = Window.s3Browse(".*(fbx|FBX|obj|OBJ)");
if (url !== null && url !== "") { if (url !== null && url !== "") {
@ -497,7 +652,7 @@ var toolBar = (function () {
} }
}); });
that.cleanup = function () { that.cleanup = function() {
toolBar.cleanup(); toolBar.cleanup();
}; };
@ -568,17 +723,26 @@ function findClickedEntity(event) {
} }
var foundEntity = result.entityID; var foundEntity = result.entityID;
return { pickRay: pickRay, entityID: foundEntity }; return {
pickRay: pickRay,
entityID: foundEntity
};
} }
var mouseHasMovedSincePress = false; var mouseHasMovedSincePress = false;
var mousePressStartTime = 0; var mousePressStartTime = 0;
var mousePressStartPosition = { x: 0, y: 0 }; var mousePressStartPosition = {
x: 0,
y: 0
};
var mouseDown = false; var mouseDown = false;
function mousePressEvent(event) { function mousePressEvent(event) {
mouseDown = true; mouseDown = true;
mousePressStartPosition = { x: event.x, y: event.y }; mousePressStartPosition = {
x: event.x,
y: event.y
};
mousePressStartTime = Date.now(); mousePressStartTime = Date.now();
mouseHasMovedSincePress = false; mouseHasMovedSincePress = false;
mouseCapturedByTool = false; mouseCapturedByTool = false;
@ -605,9 +769,11 @@ var IDLE_MOUSE_TIMEOUT = 200;
var DEFAULT_ENTITY_DRAG_DROP_DISTANCE = 2.0; var DEFAULT_ENTITY_DRAG_DROP_DISTANCE = 2.0;
var lastMouseMoveEvent = null; var lastMouseMoveEvent = null;
function mouseMoveEventBuffered(event) { function mouseMoveEventBuffered(event) {
lastMouseMoveEvent = event; lastMouseMoveEvent = event;
} }
function mouseMove(event) { function mouseMove(event) {
if (mouseDown && !mouseHasMovedSincePress) { if (mouseDown && !mouseHasMovedSincePress) {
var timeSincePressMicro = Date.now() - mousePressStartTime; var timeSincePressMicro = Date.now() - mousePressStartTime;
@ -647,7 +813,10 @@ function mouseMove(event) {
return; return;
} }
lastMousePosition = { x: event.x, y: event.y }; lastMousePosition = {
x: event.x,
y: event.y
};
idleMouseTimerId = Script.setTimeout(handleIdleMouse, IDLE_MOUSE_TIMEOUT); idleMouseTimerId = Script.setTimeout(handleIdleMouse, IDLE_MOUSE_TIMEOUT);
} }
@ -660,9 +829,11 @@ function highlightEntityUnderCursor(position, accurateRay) {
var pickRay = Camera.computePickRay(position.x, position.y); var pickRay = Camera.computePickRay(position.x, position.y);
var entityIntersection = Entities.findRayIntersection(pickRay, accurateRay); var entityIntersection = Entities.findRayIntersection(pickRay, accurateRay);
if (entityIntersection.accurate) { if (entityIntersection.accurate) {
if(highlightedEntityID && highlightedEntityID != entityIntersection.entityID) { if (highlightedEntityID && highlightedEntityID != entityIntersection.entityID) {
selectionDisplay.unhighlightSelectable(highlightedEntityID); selectionDisplay.unhighlightSelectable(highlightedEntityID);
highlightedEntityID = { id: -1 }; highlightedEntityID = {
id: -1
};
} }
var halfDiagonal = Vec3.length(entityIntersection.properties.dimensions) / 2.0; var halfDiagonal = Vec3.length(entityIntersection.properties.dimensions) / 2.0;
@ -670,12 +841,13 @@ function highlightEntityUnderCursor(position, accurateRay) {
var angularSize = 2 * Math.atan(halfDiagonal / Vec3.distance(Camera.getPosition(), var angularSize = 2 * Math.atan(halfDiagonal / Vec3.distance(Camera.getPosition(),
entityIntersection.properties.position)) * 180 / 3.14; entityIntersection.properties.position)) * 180 / 3.14;
var sizeOK = (allowLargeModels || angularSize < MAX_ANGULAR_SIZE) var sizeOK = (allowLargeModels || angularSize < MAX_ANGULAR_SIZE) && (allowSmallModels || angularSize > MIN_ANGULAR_SIZE);
&& (allowSmallModels || angularSize > MIN_ANGULAR_SIZE);
if (entityIntersection.entityID && sizeOK) { if (entityIntersection.entityID && sizeOK) {
if (wantEntityGlow) { if (wantEntityGlow) {
Entities.editEntity(entityIntersection.entityID, { glowLevel: 0.25 }); Entities.editEntity(entityIntersection.entityID, {
glowLevel: 0.25
});
} }
highlightedEntityID = entityIntersection.entityID; highlightedEntityID = entityIntersection.entityID;
selectionDisplay.highlightSelectable(entityIntersection.entityID); selectionDisplay.highlightSelectable(entityIntersection.entityID);
@ -693,18 +865,23 @@ function mouseReleaseEvent(event) {
lastMouseMoveEvent = null; lastMouseMoveEvent = null;
} }
if (propertyMenu.mouseReleaseEvent(event) || toolBar.mouseReleaseEvent(event)) { if (propertyMenu.mouseReleaseEvent(event) || toolBar.mouseReleaseEvent(event)) {
return true; return true;
} }
if (placingEntityID) { if (placingEntityID) {
if (isActive) { if (isActive) {
selectionManager.setSelections([placingEntityID]); selectionManager.setSelections([placingEntityID]);
} }
placingEntityID = null; placingEntityID = null;
} }
if (isActive && selectionManager.hasSelection()) { if (isActive && selectionManager.hasSelection()) {
tooltip.show(false); tooltip.show(false);
} }
if (mouseCapturedByTool) { if (mouseCapturedByTool) {
return; return;
} }
@ -757,8 +934,7 @@ function mouseClickEvent(event) {
var angularSize = 2 * Math.atan(halfDiagonal / Vec3.distance(Camera.getPosition(), properties.position)) * 180 / 3.14; var angularSize = 2 * Math.atan(halfDiagonal / Vec3.distance(Camera.getPosition(), properties.position)) * 180 / 3.14;
var sizeOK = (allowLargeModels || angularSize < MAX_ANGULAR_SIZE) var sizeOK = (allowLargeModels || angularSize < MAX_ANGULAR_SIZE) && (allowSmallModels || angularSize > MIN_ANGULAR_SIZE);
&& (allowSmallModels || angularSize > MIN_ANGULAR_SIZE);
if (0 < x && sizeOK) { if (0 < x && sizeOK) {
entitySelected = true; entitySelected = true;
@ -813,44 +989,125 @@ Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
// added it. // added it.
var modelMenuAddedDelete = false; var modelMenuAddedDelete = false;
var originalLightsArePickable = Entities.getLightsArePickable(); var originalLightsArePickable = Entities.getLightsArePickable();
function setupModelMenus() { function setupModelMenus() {
print("setupModelMenus()"); print("setupModelMenus()");
// adj our menuitems // adj our menuitems
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Models", isSeparator: true, beforeItem: "Physics" }); Menu.addMenuItem({
menuName: "Edit",
menuItemName: "Models",
isSeparator: true,
beforeItem: "Physics"
});
if (!Menu.menuItemExists("Edit", "Delete")) { if (!Menu.menuItemExists("Edit", "Delete")) {
print("no delete... adding ours"); print("no delete... adding ours");
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Delete", Menu.addMenuItem({
shortcutKeyEvent: { text: "backspace" }, afterItem: "Models" }); menuName: "Edit",
menuItemName: "Delete",
shortcutKeyEvent: {
text: "backspace"
},
afterItem: "Models"
});
modelMenuAddedDelete = true; modelMenuAddedDelete = true;
} else { } else {
print("delete exists... don't add ours"); print("delete exists... don't add ours");
} }
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Entity List...", shortcutKey: "CTRL+META+L", afterItem: "Models" }); Menu.addMenuItem({
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Allow Selecting of Large Models", shortcutKey: "CTRL+META+L", menuName: "Edit",
afterItem: "Entity List...", isCheckable: true, isChecked: true }); menuItemName: "Entity List...",
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Allow Selecting of Small Models", shortcutKey: "CTRL+META+S", shortcutKey: "CTRL+META+L",
afterItem: "Allow Selecting of Large Models", isCheckable: true, isChecked: true }); afterItem: "Models"
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Allow Selecting of Lights", shortcutKey: "CTRL+SHIFT+META+L", });
afterItem: "Allow Selecting of Small Models", isCheckable: true }); Menu.addMenuItem({
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Select All Entities In Box", shortcutKey: "CTRL+SHIFT+META+A", menuName: "Edit",
afterItem: "Allow Selecting of Lights" }); menuItemName: "Allow Selecting of Large Models",
Menu.addMenuItem({ menuName: "Edit", menuItemName: "Select All Entities Touching Box", shortcutKey: "CTRL+SHIFT+META+T", shortcutKey: "CTRL+META+L",
afterItem: "Select All Entities In Box" }); afterItem: "Entity List...",
isCheckable: true,
isChecked: true
});
Menu.addMenuItem({
menuName: "Edit",
menuItemName: "Allow Selecting of Small Models",
shortcutKey: "CTRL+META+S",
afterItem: "Allow Selecting of Large Models",
isCheckable: true,
isChecked: true
});
Menu.addMenuItem({
menuName: "Edit",
menuItemName: "Allow Selecting of Lights",
shortcutKey: "CTRL+SHIFT+META+L",
afterItem: "Allow Selecting of Small Models",
isCheckable: true
});
Menu.addMenuItem({
menuName: "Edit",
menuItemName: "Select All Entities In Box",
shortcutKey: "CTRL+SHIFT+META+A",
afterItem: "Allow Selecting of Lights"
});
Menu.addMenuItem({
menuName: "Edit",
menuItemName: "Select All Entities Touching Box",
shortcutKey: "CTRL+SHIFT+META+T",
afterItem: "Select All Entities In Box"
});
Menu.addMenuItem({ menuName: "File", menuItemName: "Models", isSeparator: true, beforeItem: "Settings" }); Menu.addMenuItem({
Menu.addMenuItem({ menuName: "File", menuItemName: "Export Entities", shortcutKey: "CTRL+META+E", afterItem: "Models" }); menuName: "File",
Menu.addMenuItem({ menuName: "File", menuItemName: "Import Entities", shortcutKey: "CTRL+META+I", afterItem: "Export Entities" }); menuItemName: "Models",
Menu.addMenuItem({ menuName: "File", menuItemName: "Import Entities from URL", shortcutKey: "CTRL+META+U", afterItem: "Import Entities" }); isSeparator: true,
beforeItem: "Settings"
});
Menu.addMenuItem({
menuName: "File",
menuItemName: "Export Entities",
shortcutKey: "CTRL+META+E",
afterItem: "Models"
});
Menu.addMenuItem({
menuName: "File",
menuItemName: "Import Entities",
shortcutKey: "CTRL+META+I",
afterItem: "Export Entities"
});
Menu.addMenuItem({
menuName: "File",
menuItemName: "Import Entities from URL",
shortcutKey: "CTRL+META+U",
afterItem: "Import Entities"
});
Menu.addMenuItem({ menuName: "View", menuItemName: MENU_AUTO_FOCUS_ON_SELECT, Menu.addMenuItem({
isCheckable: true, isChecked: Settings.getValue(SETTING_AUTO_FOCUS_ON_SELECT) == "true" }); menuName: "View",
Menu.addMenuItem({ menuName: "View", menuItemName: MENU_EASE_ON_FOCUS, afterItem: MENU_AUTO_FOCUS_ON_SELECT, menuItemName: MENU_AUTO_FOCUS_ON_SELECT,
isCheckable: true, isChecked: Settings.getValue(SETTING_EASE_ON_FOCUS) == "true" }); isCheckable: true,
Menu.addMenuItem({ menuName: "View", menuItemName: MENU_SHOW_LIGHTS_IN_EDIT_MODE, afterItem: MENU_EASE_ON_FOCUS, isChecked: Settings.getValue(SETTING_AUTO_FOCUS_ON_SELECT) == "true"
isCheckable: true, isChecked: Settings.getValue(SETTING_SHOW_LIGHTS_IN_EDIT_MODE) == "true" }); });
Menu.addMenuItem({ menuName: "View", menuItemName: MENU_SHOW_ZONES_IN_EDIT_MODE, afterItem: MENU_SHOW_LIGHTS_IN_EDIT_MODE, Menu.addMenuItem({
isCheckable: true, isChecked: Settings.getValue(SETTING_SHOW_ZONES_IN_EDIT_MODE) == "true" }); menuName: "View",
menuItemName: MENU_EASE_ON_FOCUS,
afterItem: MENU_AUTO_FOCUS_ON_SELECT,
isCheckable: true,
isChecked: Settings.getValue(SETTING_EASE_ON_FOCUS) == "true"
});
Menu.addMenuItem({
menuName: "View",
menuItemName: MENU_SHOW_LIGHTS_IN_EDIT_MODE,
afterItem: MENU_EASE_ON_FOCUS,
isCheckable: true,
isChecked: Settings.getValue(SETTING_SHOW_LIGHTS_IN_EDIT_MODE) == "true"
});
Menu.addMenuItem({
menuName: "View",
menuItemName: MENU_SHOW_ZONES_IN_EDIT_MODE,
afterItem: MENU_SHOW_LIGHTS_IN_EDIT_MODE,
isCheckable: true,
isChecked: Settings.getValue(SETTING_SHOW_ZONES_IN_EDIT_MODE) == "true"
});
Entities.setLightsArePickable(false); Entities.setLightsArePickable(false);
} }
@ -903,7 +1160,7 @@ var lastOrientation = null;
var lastPosition = null; var lastPosition = null;
// Do some stuff regularly, like check for placement of various overlays // Do some stuff regularly, like check for placement of various overlays
Script.update.connect(function (deltaTime) { Script.update.connect(function(deltaTime) {
progressDialog.move(); progressDialog.move();
selectionDisplay.checkMove(); selectionDisplay.checkMove();
var dOrientation = Math.abs(Quat.dot(Camera.orientation, lastOrientation) - 1); var dOrientation = Math.abs(Quat.dot(Camera.orientation, lastOrientation) - 1);
@ -920,9 +1177,7 @@ Script.update.connect(function (deltaTime) {
}); });
function insideBox(center, dimensions, point) { function insideBox(center, dimensions, point) {
return (Math.abs(point.x - center.x) <= (dimensions.x / 2.0)) return (Math.abs(point.x - center.x) <= (dimensions.x / 2.0)) && (Math.abs(point.y - center.y) <= (dimensions.y / 2.0)) && (Math.abs(point.z - center.z) <= (dimensions.z / 2.0));
&& (Math.abs(point.y - center.y) <= (dimensions.y / 2.0))
&& (Math.abs(point.z - center.z) <= (dimensions.z / 2.0));
} }
function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) { function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) {
@ -943,7 +1198,11 @@ function selectAllEtitiesInCurrentSelectionBox(keepIfTouching) {
var localPosition = Vec3.multiplyQbyV(Quat.inverse(selectionManager.localRotation), var localPosition = Vec3.multiplyQbyV(Quat.inverse(selectionManager.localRotation),
Vec3.subtract(position, Vec3.subtract(position,
selectionManager.localPosition)); selectionManager.localPosition));
return insideBox({ x: 0, y: 0, z: 0 }, selectionManager.localDimensions, localPosition); return insideBox({
x: 0,
y: 0,
z: 0
}, selectionManager.localDimensions, localPosition);
} }
} }
for (var i = 0; i < entities.length; ++i) { for (var i = 0; i < entities.length; ++i) {
@ -1041,12 +1300,8 @@ function getPositionToCreateEntity() {
var HALF_TREE_SCALE = 16384; var HALF_TREE_SCALE = 16384;
var cameraOutOfBounds = Math.abs(cameraPosition.x) > HALF_TREE_SCALE var cameraOutOfBounds = Math.abs(cameraPosition.x) > HALF_TREE_SCALE || Math.abs(cameraPosition.y) > HALF_TREE_SCALE || Math.abs(cameraPosition.z) > HALF_TREE_SCALE;
|| Math.abs(cameraPosition.y) > HALF_TREE_SCALE var placementOutOfBounds = Math.abs(placementPosition.x) > HALF_TREE_SCALE || Math.abs(placementPosition.y) > HALF_TREE_SCALE || Math.abs(placementPosition.z) > HALF_TREE_SCALE;
|| Math.abs(cameraPosition.z) > HALF_TREE_SCALE;
var placementOutOfBounds = Math.abs(placementPosition.x) > HALF_TREE_SCALE
|| Math.abs(placementPosition.y) > HALF_TREE_SCALE
|| Math.abs(placementPosition.z) > HALF_TREE_SCALE;
if (cameraOutOfBounds && placementOutOfBounds) { if (cameraOutOfBounds && placementOutOfBounds) {
return null; return null;
@ -1065,14 +1320,22 @@ function importSVO(importURL) {
return; return;
} }
Overlays.editOverlay(importingSVOTextOverlay, { visible: true }); Overlays.editOverlay(importingSVOTextOverlay, {
Overlays.editOverlay(importingSVOImageOverlay, { visible: true }); visible: true
});
Overlays.editOverlay(importingSVOImageOverlay, {
visible: true
});
var success = Clipboard.importEntities(importURL); var success = Clipboard.importEntities(importURL);
if (success) { if (success) {
var VERY_LARGE = 10000; var VERY_LARGE = 10000;
var position = { x: 0, y: 0, z: 0 }; var position = {
x: 0,
y: 0,
z: 0
};
if (Clipboard.getClipboardContentsLargestDimension() < VERY_LARGE) { if (Clipboard.getClipboardContentsLargestDimension() < VERY_LARGE) {
position = getPositionToCreateEntity(); position = getPositionToCreateEntity();
} }
@ -1091,8 +1354,12 @@ function importSVO(importURL) {
Window.alert("There was an error importing the entity file."); Window.alert("There was an error importing the entity file.");
} }
Overlays.editOverlay(importingSVOTextOverlay, { visible: false }); Overlays.editOverlay(importingSVOTextOverlay, {
Overlays.editOverlay(importingSVOImageOverlay, { visible: false }); visible: false
});
Overlays.editOverlay(importingSVOImageOverlay, {
visible: false
});
} }
Window.svoImportRequested.connect(importSVO); Window.svoImportRequested.connect(importSVO);
@ -1104,7 +1371,7 @@ Controller.keyPressEvent.connect(function(event) {
} }
}); });
Controller.keyReleaseEvent.connect(function (event) { Controller.keyReleaseEvent.connect(function(event) {
if (isActive) { if (isActive) {
cameraManager.keyReleaseEvent(event); cameraManager.keyReleaseEvent(event);
} }
@ -1131,7 +1398,11 @@ Controller.keyReleaseEvent.connect(function (event) {
} else if (event.text == 'g') { } else if (event.text == 'g') {
if (isActive && selectionManager.hasSelection()) { if (isActive && selectionManager.hasSelection()) {
var newPosition = selectionManager.worldPosition; var newPosition = selectionManager.worldPosition;
newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 }); newPosition = Vec3.subtract(newPosition, {
x: 0,
y: selectionManager.worldDimensions.y * 0.5,
z: 0
});
grid.setPosition(newPosition); grid.setPosition(newPosition);
} }
} }
@ -1140,8 +1411,7 @@ Controller.keyReleaseEvent.connect(function (event) {
// When an entity has been deleted we need a way to "undo" this deletion. Because it's not currently // When an entity has been deleted we need a way to "undo" this deletion. Because it's not currently
// possible to create an entity with a specific id, earlier undo commands to the deleted entity // possible to create an entity with a specific id, earlier undo commands to the deleted entity
// will fail if there isn't a way to find the new entity id. // will fail if there isn't a way to find the new entity id.
DELETED_ENTITY_MAP = { DELETED_ENTITY_MAP = {}
}
function applyEntityProperties(data) { function applyEntityProperties(data) {
var properties = data.setProperties; var properties = data.setProperties;
@ -1293,7 +1563,11 @@ PropertiesTool = function(opts) {
if (selectionManager.hasSelection()) { if (selectionManager.hasSelection()) {
selectionManager.saveProperties(); selectionManager.saveProperties();
var dY = grid.getOrigin().y - (selectionManager.worldPosition.y - selectionManager.worldDimensions.y / 2); var dY = grid.getOrigin().y - (selectionManager.worldPosition.y - selectionManager.worldDimensions.y / 2);
var diff = { x: 0, y: dY, z: 0 }; var diff = {
x: 0,
y: dY,
z: 0
};
for (var i = 0; i < selectionManager.selections.length; i++) { for (var i = 0; i < selectionManager.selections.length; i++) {
var properties = selectionManager.savedProperties[selectionManager.selections[i]]; var properties = selectionManager.savedProperties[selectionManager.selections[i]];
var newPosition = Vec3.sum(properties.position, diff); var newPosition = Vec3.sum(properties.position, diff);
@ -1311,7 +1585,11 @@ PropertiesTool = function(opts) {
var properties = selectionManager.savedProperties[selectionManager.selections[i]]; var properties = selectionManager.savedProperties[selectionManager.selections[i]];
var bottomY = properties.boundingBox.center.y - properties.boundingBox.dimensions.y / 2; var bottomY = properties.boundingBox.center.y - properties.boundingBox.dimensions.y / 2;
var dY = grid.getOrigin().y - bottomY; var dY = grid.getOrigin().y - bottomY;
var diff = { x: 0, y: dY, z: 0 }; var diff = {
x: 0,
y: dY,
z: 0
};
var newPosition = Vec3.sum(properties.position, diff); var newPosition = Vec3.sum(properties.position, diff);
Entities.editEntity(selectionManager.selections[i], { Entities.editEntity(selectionManager.selections[i], {
position: newPosition, position: newPosition,
@ -1328,10 +1606,8 @@ PropertiesTool = function(opts) {
var naturalDimensions = properties.naturalDimensions; var naturalDimensions = properties.naturalDimensions;
// If any of the natural dimensions are not 0, resize // If any of the natural dimensions are not 0, resize
if (properties.type == "Model" && naturalDimensions.x == 0 if (properties.type == "Model" && naturalDimensions.x == 0 && naturalDimensions.y == 0 && naturalDimensions.z == 0) {
&& naturalDimensions.y == 0 && naturalDimensions.z == 0) { Window.alert("Cannot reset entity to its natural dimensions: Model URL" + " is invalid or the model has not yet been loaded.");
Window.alert("Cannot reset entity to its natural dimensions: Model URL"
+ " is invalid or the model has not yet been loaded.");
} else { } else {
Entities.editEntity(selectionManager.selections[i], { Entities.editEntity(selectionManager.selections[i], {
dimensions: properties.naturalDimensions, dimensions: properties.naturalDimensions,
@ -1370,12 +1646,16 @@ PropertiesTool = function(opts) {
var properties = selectionManager.savedProperties[selectionManager.selections[i]]; var properties = selectionManager.savedProperties[selectionManager.selections[i]];
if (properties.type == "Zone") { if (properties.type == "Zone") {
var centerOfZone = properties.boundingBox.center; var centerOfZone = properties.boundingBox.center;
var atmosphereCenter = { x: centerOfZone.x, var atmosphereCenter = {
x: centerOfZone.x,
y: centerOfZone.y - properties.atmosphere.innerRadius, y: centerOfZone.y - properties.atmosphere.innerRadius,
z: centerOfZone.z }; z: centerOfZone.z
};
Entities.editEntity(selectionManager.selections[i], { Entities.editEntity(selectionManager.selections[i], {
atmosphere: { center: atmosphereCenter }, atmosphere: {
center: atmosphereCenter
},
}); });
} }
} }
@ -1399,11 +1679,23 @@ PopupMenu = function() {
var overlays = []; var overlays = [];
var overlayInfo = {}; var overlayInfo = {};
var upColor = { red: 0, green: 0, blue: 0 }; var upColor = {
var downColor = { red: 192, green: 192, blue: 192 }; red: 0,
var overColor = { red: 128, green: 128, blue: 128 }; green: 0,
blue: 0
};
var downColor = {
red: 192,
green: 192,
blue: 192
};
var overColor = {
red: 128,
green: 128,
blue: 128
};
self.onSelectMenuItem = function() { }; self.onSelectMenuItem = function() {};
self.addMenuItem = function(name) { self.addMenuItem = function(name) {
var id = Overlays.addOverlay("text", { var id = Overlays.addOverlay("text", {
@ -1414,16 +1706,22 @@ PopupMenu = function() {
leftMargin: TEXT_MARGIN, leftMargin: TEXT_MARGIN,
width: 210, width: 210,
height: MENU_ITEM_HEIGHT, height: MENU_ITEM_HEIGHT,
font: { size: 12 }, font: {
size: 12
},
visible: false, visible: false,
}); });
overlays.push(id); overlays.push(id);
overlayInfo[id] = { name: name }; overlayInfo[id] = {
name: name
};
return id; return id;
}; };
self.updateMenuItemText = function(id, newText) { self.updateMenuItemText = function(id, newText) {
Overlays.editOverlay(id, { text: newText }); Overlays.editOverlay(id, {
text: newText
});
}; };
self.setPosition = function(x, y) { self.setPosition = function(x, y) {
@ -1436,17 +1734,22 @@ PopupMenu = function() {
} }
}; };
self.onSelected = function() { }; self.onSelected = function() {};
var pressingOverlay = null; var pressingOverlay = null;
var hoveringOverlay = null; var hoveringOverlay = null;
self.mousePressEvent = function(event) { self.mousePressEvent = function(event) {
if (event.isLeftButton) { if (event.isLeftButton) {
var overlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); var overlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (overlay in overlayInfo) { if (overlay in overlayInfo) {
pressingOverlay = overlay; pressingOverlay = overlay;
Overlays.editOverlay(pressingOverlay, { backgroundColor: downColor }); Overlays.editOverlay(pressingOverlay, {
backgroundColor: downColor
});
} else { } else {
self.hide(); self.hide();
} }
@ -1455,14 +1758,21 @@ PopupMenu = function() {
}; };
self.mouseMoveEvent = function(event) { self.mouseMoveEvent = function(event) {
if (visible) { if (visible) {
var overlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); var overlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (!pressingOverlay) { if (!pressingOverlay) {
if (hoveringOverlay != null && overlay != hoveringOverlay) { if (hoveringOverlay != null && overlay != hoveringOverlay) {
Overlays.editOverlay(hoveringOverlay, { backgroundColor: upColor}); Overlays.editOverlay(hoveringOverlay, {
backgroundColor: upColor
});
hoveringOverlay = null; hoveringOverlay = null;
} }
if (overlay != hoveringOverlay && overlay in overlayInfo) { if (overlay != hoveringOverlay && overlay in overlayInfo) {
Overlays.editOverlay(overlay, { backgroundColor: overColor }); Overlays.editOverlay(overlay, {
backgroundColor: overColor
});
hoveringOverlay = overlay; hoveringOverlay = overlay;
} }
} }
@ -1470,12 +1780,17 @@ PopupMenu = function() {
return false; return false;
}; };
self.mouseReleaseEvent = function(event) { self.mouseReleaseEvent = function(event) {
var overlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y }); var overlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (pressingOverlay != null) { if (pressingOverlay != null) {
if (overlay == pressingOverlay) { if (overlay == pressingOverlay) {
self.onSelectMenuItem(overlayInfo[overlay].name); self.onSelectMenuItem(overlayInfo[overlay].name);
} }
Overlays.editOverlay(pressingOverlay, { backgroundColor: upColor }); Overlays.editOverlay(pressingOverlay, {
backgroundColor: upColor
});
pressingOverlay = null; pressingOverlay = null;
self.hide(); self.hide();
} }
@ -1487,7 +1802,9 @@ PopupMenu = function() {
if (newVisible != visible) { if (newVisible != visible) {
visible = newVisible; visible = newVisible;
for (var key in overlayInfo) { for (var key in overlayInfo) {
Overlays.editOverlay(key, { visible: newVisible }); Overlays.editOverlay(key, {
visible: newVisible
});
} }
} }
} }

View file

@ -118,8 +118,16 @@ CameraManager = function() {
that.targetYaw = 0; that.targetYaw = 0;
that.targetPitch = 0; that.targetPitch = 0;
that.focalPoint = { x: 0, y: 0, z: 0 }; that.focalPoint = {
that.targetFocalPoint = { x: 0, y: 0, z: 0 }; x: 0,
y: 0,
z: 0
};
that.targetFocalPoint = {
x: 0,
y: 0,
z: 0
};
easing = false; easing = false;
easingTime = 0; easingTime = 0;
@ -127,13 +135,18 @@ CameraManager = function() {
that.previousCameraMode = null; that.previousCameraMode = null;
that.lastMousePosition = { x: 0, y: 0 }; that.lastMousePosition = {
x: 0,
y: 0
};
that.enable = function() { that.enable = function() {
if (Camera.mode == "independent" || that.enabled) return; if (Camera.mode == "independent" || that.enabled) return;
for (var i = 0; i < CAPTURED_KEYS.length; i++) { for (var i = 0; i < CAPTURED_KEYS.length; i++) {
Controller.captureKeyEvents({ text: CAPTURED_KEYS[i] }); Controller.captureKeyEvents({
text: CAPTURED_KEYS[i]
});
} }
that.enabled = true; that.enabled = true;
@ -169,7 +182,9 @@ CameraManager = function() {
if (!that.enabled) return; if (!that.enabled) return;
for (var i = 0; i < CAPTURED_KEYS.length; i++) { for (var i = 0; i < CAPTURED_KEYS.length; i++) {
Controller.releaseKeyEvents({ text: CAPTURED_KEYS[i] }); Controller.releaseKeyEvents({
text: CAPTURED_KEYS[i]
});
} }
that.enabled = false; that.enabled = false;
@ -335,19 +350,27 @@ CameraManager = function() {
var hasDragged = false; var hasDragged = false;
that.mousePressEvent = function(event) { that.mousePressEvent = function(event) {
if (cameraTool.mousePressEvent(event)) { if (cameraTool.mousePressEvent(event)) {
return true; return true;
} }
if (!that.enabled) return; if (!that.enabled) return;
if (event.isRightButton || (event.isLeftButton && event.isControl && !event.isShifted)) { if (event.isRightButton || (event.isLeftButton && event.isControl && !event.isShifted)) {
that.mode = MODE_ORBIT; that.mode = MODE_ORBIT;
} else if (event.isMiddleButton || (event.isLeftButton && event.isControl && event.isShifted)) { } else if (event.isMiddleButton || (event.isLeftButton && event.isControl && event.isShifted)) {
that.mode = MODE_PAN; that.mode = MODE_PAN;
} }
if (that.mode != MODE_INACTIVE) { if (that.mode !== MODE_INACTIVE) {
hasDragged = false; hasDragged = false;
return true; return true;
@ -357,10 +380,12 @@ CameraManager = function() {
} }
that.mouseReleaseEvent = function(event) { that.mouseReleaseEvent = function(event) {
if (!that.enabled) return; if (!that.enabled) return;
Window.setCursorVisible(true);
that.mode = MODE_INACTIVE; that.mode = MODE_INACTIVE;
Window.setCursorVisible(true);
} }
that.keyPressEvent = function(event) { that.keyPressEvent = function(event) {
@ -396,15 +421,31 @@ CameraManager = function() {
return; return;
} }
var yRot = Quat.angleAxis(that.yaw, { x: 0, y: 1, z: 0 }); var yRot = Quat.angleAxis(that.yaw, {
var xRot = Quat.angleAxis(that.pitch, { x: 1, y: 0, z: 0 }); x: 0,
y: 1,
z: 0
});
var xRot = Quat.angleAxis(that.pitch, {
x: 1,
y: 0,
z: 0
});
var q = Quat.multiply(yRot, xRot); var q = Quat.multiply(yRot, xRot);
var pos = Vec3.multiply(Quat.getFront(q), that.zoomDistance); var pos = Vec3.multiply(Quat.getFront(q), that.zoomDistance);
Camera.setPosition(Vec3.sum(that.focalPoint, pos)); Camera.setPosition(Vec3.sum(that.focalPoint, pos));
yRot = Quat.angleAxis(that.yaw - 180, { x: 0, y: 1, z: 0 }); yRot = Quat.angleAxis(that.yaw - 180, {
xRot = Quat.angleAxis(-that.pitch, { x: 1, y: 0, z: 0 }); x: 0,
y: 1,
z: 0
});
xRot = Quat.angleAxis(-that.pitch, {
x: 1,
y: 0,
z: 0
});
q = Quat.multiply(yRot, xRot); q = Quat.multiply(yRot, xRot);
if (easing) { if (easing) {
@ -483,7 +524,7 @@ CameraManager = function() {
} }
}); });
Controller.keyReleaseEvent.connect(function (event) { Controller.keyReleaseEvent.connect(function(event) {
if (event.text == "ESC" && that.enabled) { if (event.text == "ESC" && that.enabled) {
Camera.mode = lastAvatarCameraMode; Camera.mode = lastAvatarCameraMode;
cameraManager.disable(true); cameraManager.disable(true);
@ -503,9 +544,21 @@ CameraManager = function() {
CameraTool = function(cameraManager) { CameraTool = function(cameraManager) {
var that = {}; var that = {};
var RED = { red: 191, green: 78, blue: 38 }; var RED = {
var GREEN = { red: 26, green: 193, blue: 105 }; red: 191,
var BLUE = { red: 0, green: 131, blue: 204 }; green: 78,
blue: 38
};
var GREEN = {
red: 26,
green: 193,
blue: 105
};
var BLUE = {
red: 0,
green: 131,
blue: 204
};
var BORDER_WIDTH = 1; var BORDER_WIDTH = 1;
@ -536,7 +589,11 @@ CameraTool = function(cameraManager) {
height: UI_HEIGHT + BORDER_WIDTH * 2, height: UI_HEIGHT + BORDER_WIDTH * 2,
alpha: 0, alpha: 0,
text: "", text: "",
backgroundColor: { red: 101, green: 101, blue: 101 }, backgroundColor: {
red: 101,
green: 101,
blue: 101
},
backgroundAlpha: 1.0, backgroundAlpha: 1.0,
visible: false, visible: false,
}); });
@ -548,7 +605,11 @@ CameraTool = function(cameraManager) {
height: UI_HEIGHT, height: UI_HEIGHT,
alpha: 0, alpha: 0,
text: "", text: "",
backgroundColor: { red: 51, green: 51, blue: 51 }, backgroundColor: {
red: 51,
green: 51,
blue: 51
},
backgroundAlpha: 1.0, backgroundAlpha: 1.0,
visible: false, visible: false,
}); });
@ -556,7 +617,11 @@ CameraTool = function(cameraManager) {
var defaultCubeProps = { var defaultCubeProps = {
size: ORIENTATION_OVERLAY_CUBE_SIZE, size: ORIENTATION_OVERLAY_CUBE_SIZE,
alpha: 1, alpha: 1,
color: { red: 255, green: 0, blue: 0 }, color: {
red: 255,
green: 0,
blue: 0
},
solid: true, solid: true,
visible: true, visible: true,
drawOnHUD: true, drawOnHUD: true,
@ -564,10 +629,26 @@ CameraTool = function(cameraManager) {
var defaultLineProps = { var defaultLineProps = {
lineWidth: 1.5, lineWidth: 1.5,
alpha: 1, alpha: 1,
position: { x: 0, y: 0, z: 0 }, position: {
start: { x: 0, y: 0, z: 0 }, x: 0,
end: { x: 0, y: 0, z: 0 }, y: 0,
color: { red: 255, green: 0, blue: 0 }, z: 0
},
start: {
x: 0,
y: 0,
z: 0
},
end: {
x: 0,
y: 0,
z: 0
},
color: {
red: 255,
green: 0,
blue: 0
},
visible: false, visible: false,
drawOnHUD: true, drawOnHUD: true,
}; };
@ -582,30 +663,66 @@ CameraTool = function(cameraManager) {
var OOHS = ORIENTATION_OVERLAY_HALF_SIZE; var OOHS = ORIENTATION_OVERLAY_HALF_SIZE;
var cubeX = orientationOverlay.createOverlay("cube", mergeObjects(defaultCubeProps, { var cubeX = orientationOverlay.createOverlay("cube", mergeObjects(defaultCubeProps, {
position: { x: -OOHS, y: OOHS, z: OOHS }, position: {
x: -OOHS,
y: OOHS,
z: OOHS
},
color: RED, color: RED,
})); }));
var cubeY = orientationOverlay.createOverlay("cube", mergeObjects(defaultCubeProps, { var cubeY = orientationOverlay.createOverlay("cube", mergeObjects(defaultCubeProps, {
position: { x: OOHS, y: -OOHS, z: OOHS }, position: {
x: OOHS,
y: -OOHS,
z: OOHS
},
color: GREEN, color: GREEN,
})); }));
var cubeZ = orientationOverlay.createOverlay("cube", mergeObjects(defaultCubeProps, { var cubeZ = orientationOverlay.createOverlay("cube", mergeObjects(defaultCubeProps, {
position: { x: OOHS, y: OOHS, z: -OOHS }, position: {
x: OOHS,
y: OOHS,
z: -OOHS
},
color: BLUE, color: BLUE,
})); }));
orientationOverlay.createOverlay("line3d", mergeObjects(defaultLineProps, { orientationOverlay.createOverlay("line3d", mergeObjects(defaultLineProps, {
start: { x: -OOHS, y: OOHS, z: OOHS }, start: {
end: { x: OOHS, y: OOHS, z: OOHS }, x: -OOHS,
y: OOHS,
z: OOHS
},
end: {
x: OOHS,
y: OOHS,
z: OOHS
},
color: RED, color: RED,
})); }));
orientationOverlay.createOverlay("line3d", mergeObjects(defaultLineProps, { orientationOverlay.createOverlay("line3d", mergeObjects(defaultLineProps, {
start: { x: OOHS, y: -OOHS, z: OOHS }, start: {
end: { x: OOHS, y: OOHS, z: OOHS }, x: OOHS,
y: -OOHS,
z: OOHS
},
end: {
x: OOHS,
y: OOHS,
z: OOHS
},
color: GREEN, color: GREEN,
})); }));
orientationOverlay.createOverlay("line3d", mergeObjects(defaultLineProps, { orientationOverlay.createOverlay("line3d", mergeObjects(defaultLineProps, {
start: { x: OOHS, y: OOHS, z: -OOHS }, start: {
end: { x: OOHS, y: OOHS, z: OOHS }, x: OOHS,
y: OOHS,
z: -OOHS
},
end: {
x: OOHS,
y: OOHS,
z: OOHS
},
color: BLUE, color: BLUE,
})); }));
@ -645,7 +762,10 @@ CameraTool = function(cameraManager) {
} }
that.mousePressEvent = function(event) { that.mousePressEvent = function(event) {
var clickedOverlay = Overlays.getOverlayAtPoint({x: event.x, y: event.y}); var clickedOverlay = Overlays.getOverlayAtPoint({
x: event.x,
y: event.y
});
if (clickedOverlay == cubeX) { if (clickedOverlay == cubeX) {
targetPitch = 0; targetPitch = 0;
@ -666,9 +786,15 @@ CameraTool = function(cameraManager) {
}; };
that.setVisible = function(visible) { that.setVisible = function(visible) {
orientationOverlay.setProperties({ visible: visible }); orientationOverlay.setProperties({
Overlays.editOverlay(background, { visible: visible }); visible: visible
Overlays.editOverlay(backgroundBorder, { visible: visible }); });
Overlays.editOverlay(background, {
visible: visible
});
Overlays.editOverlay(backgroundBorder, {
visible: visible
});
}; };
that.setVisible(false); that.setVisible(false);