diff --git a/examples/editEntities.js b/examples/editEntities.js
index 0b5c089c07..632fed088c 100644
--- a/examples/editEntities.js
+++ b/examples/editEntities.js
@@ -494,8 +494,10 @@ var mouseHasMovedSincePress = false;
function mousePressEvent(event) {
mouseHasMovedSincePress = false;
+ mouseCapturedByTool = false;
- if (toolBar.mousePressEvent(event) || progressDialog.mousePressEvent(event)) {
+ if (toolBar.mousePressEvent(event) || progressDialog.mousePressEvent(event) || gridTool.mousePressEvent(event)) {
+ mouseCapturedByTool = true;
return;
}
if (isActive) {
@@ -519,6 +521,7 @@ function mousePressEvent(event) {
}
var highlightedEntityID = { isKnownID: false };
+var mouseCapturedByTool = false;
function mouseMoveEvent(event) {
mouseHasMovedSincePress = true;
@@ -563,6 +566,9 @@ function mouseReleaseEvent(event) {
if (isActive && selectionManager.hasSelection()) {
tooltip.show(false);
}
+ if (mouseCapturedByTool) {
+ return;
+ }
cameraManager.mouseReleaseEvent(event);
diff --git a/examples/html/gridControls.html b/examples/html/gridControls.html
deleted file mode 100644
index 06090da423..0000000000
--- a/examples/html/gridControls.html
+++ /dev/null
@@ -1,167 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
diff --git a/examples/libraries/gridTool.js b/examples/libraries/gridTool.js
index 7d98befec8..e222ff3adb 100644
--- a/examples/libraries/gridTool.js
+++ b/examples/libraries/gridTool.js
@@ -1,35 +1,35 @@
Grid = function(opts) {
var that = {};
- var color = { red: 100, green: 152, blue: 203 };
- var gridColor = { red: 100, green: 152, blue: 203 };
+ var colors = [
+ { red: 102, green: 180, blue: 126 },
+ { red: 83, green: 210, blue: 83 },
+ { red: 235, green: 173, blue: 0 },
+ { red: 210, green: 115, blue: 0 },
+ { red: 48, green: 116, blue: 119 },
+ ];
+ var colorIndex = 0;
var gridAlpha = 1.0;
var origin = { x: 0, y: 0, z: 0 };
var majorGridEvery = 5;
- var minorGridSpacing = 0.2;
+ var minorGridWidth = 0.2;
var halfSize = 40;
var yOffset = 0.001;
var worldSize = 16384;
- var minorGridWidth = 0.5;
- var majorGridWidth = 1.5;
-
var snapToGrid = false;
var gridOverlay = Overlays.addOverlay("grid", {
position: { x: 0 , y: 0, z: 0 },
visible: true,
- color: { red: 0, green: 0, blue: 128 },
+ color: colors[0],
alpha: 1.0,
rotation: Quat.fromPitchYawRollDegrees(90, 0, 0),
minorGridWidth: 0.1,
majorGridEvery: 2,
});
- that.getMinorIncrement = function() { return minorGridSpacing; };
- that.getMajorIncrement = function() { return minorGridSpacing * majorGridEvery; };
-
that.visible = false;
that.enabled = false;
@@ -37,13 +37,39 @@ Grid = function(opts) {
return origin;
}
+ that.getMinorIncrement = function() { return minorGridWidth; };
+ that.getMajorIncrement = function() { return minorGridWidth * majorGridEvery; };
+
+ that.getMinorGridWidth = function() { return minorGridWidth; };
+ that.setMinorGridWidth = function(value) {
+ minorGridWidth = value;
+ updateGrid();
+ };
+
+ that.getMajorGridEvery = function() { return majorGridEvery; };
+ that.setMajorGridEvery = function(value) {
+ majorGridEvery = value;
+ updateGrid();
+ };
+
+ that.getColorIndex = function() { return colorIndex; };
+ that.setColorIndex = function(value) {
+ colorIndex = value;
+ updateGrid();
+ };
+
that.getSnapToGrid = function() { return snapToGrid; };
+ that.setSnapToGrid = function(value) {
+ snapToGrid = value;
+ that.emitUpdate();
+ };
that.setEnabled = function(enabled) {
that.enabled = enabled;
updateGrid();
}
+ that.getVisible = function() { return that.visible; };
that.setVisible = function(visible, noUpdate) {
that.visible = visible;
updateGrid();
@@ -78,7 +104,7 @@ Grid = function(opts) {
dimensions = { x: 0, y: 0, z: 0 };
}
- var spacing = majorOnly ? (minorGridSpacing * majorGridEvery) : minorGridSpacing;
+ var spacing = majorOnly ? (minorGridWidth * majorGridEvery) : minorGridWidth;
position = Vec3.subtract(position, origin);
@@ -94,7 +120,7 @@ Grid = function(opts) {
return delta;
}
- var spacing = majorOnly ? (minorGridSpacing * majorGridEvery) : minorGridSpacing;
+ var spacing = majorOnly ? (minorGridWidth * majorGridEvery) : minorGridWidth;
var snappedDelta = {
x: Math.round(delta.x / spacing) * spacing,
@@ -121,12 +147,11 @@ Grid = function(opts) {
if (that.onUpdate) {
that.onUpdate({
origin: origin,
- minorGridSpacing: minorGridSpacing,
+ minorGridWidth: minorGridWidth,
majorGridEvery: majorGridEvery,
gridSize: halfSize,
visible: that.visible,
snapToGrid: snapToGrid,
- gridColor: gridColor,
});
}
};
@@ -144,16 +169,16 @@ Grid = function(opts) {
that.setPosition(pos, true);
}
- if (data.minorGridSpacing) {
- minorGridSpacing = data.minorGridSpacing;
+ if (data.minorGridWidth) {
+ minorGridWidth = data.minorGridWidth;
}
if (data.majorGridEvery) {
majorGridEvery = data.majorGridEvery;
}
- if (data.gridColor) {
- gridColor = data.gridColor;
+ if (data.colorIndex !== undefined) {
+ colorIndex = data.colorIndex;
}
if (data.gridSize) {
@@ -171,10 +196,10 @@ Grid = function(opts) {
Overlays.editOverlay(gridOverlay, {
position: { x: origin.y, y: origin.y, z: -origin.y },
visible: that.visible && that.enabled,
- minorGridWidth: minorGridSpacing,
+ minorGridWidth: minorGridWidth,
majorGridEvery: majorGridEvery,
- color: gridColor,
- alpha: gridAlpha,
+ color: colors[colorIndex],
+ alpha: gridAlpha,
});
that.emitUpdate();
@@ -199,46 +224,269 @@ Grid = function(opts) {
GridTool = function(opts) {
var that = {};
+ var UI_URL = HIFI_PUBLIC_BUCKET + "images/tools/grid-toolbar.svg";
+ var UI_WIDTH = 854;
+ var UI_HEIGHT = 37;
+
var horizontalGrid = opts.horizontalGrid;
- var verticalGrid = opts.verticalGrid;
- var listeners = [];
- var url = Script.resolvePath('html/gridControls.html');
- var webView = new WebWindow('Grid', url, 200, 280);
+ var uiOverlays = {};
+ var allOverlays = [];
- horizontalGrid.addListener(function(data) {
- webView.eventBridge.emitScriptEvent(JSON.stringify(data));
- selectionDisplay.updateHandles();
- });
+ function addUIOverlay(key, overlay, x, y, width, height) {
+ uiOverlays[key] = {
+ overlay: overlay,
+ x: x,
+ y: y,
+ width: width,
+ height: height,
+ };
+ allOverlays.push(overlay);
+ }
- webView.eventBridge.webEventReceived.connect(function(data) {
- data = JSON.parse(data);
- if (data.type == "init") {
- horizontalGrid.emitUpdate();
- } else if (data.type == "update") {
- horizontalGrid.update(data);
- for (var i = 0; i < listeners.length; i++) {
- listeners[i](data);
- }
- } else if (data.type == "action") {
- var action = data.action;
- if (action == "moveToAvatar") {
- grid.setPosition(MyAvatar.position);
- } else if (action == "moveToSelection") {
- var newPosition = selectionManager.worldPosition;
- newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 });
- grid.setPosition(newPosition);
- }
+ var lastKnownWindowWidth = null;
+ function repositionUI() {
+ if (lastKnownWindowWidth == Window.innerWidth) {
+ return;
}
- });
- that.addListener = function(callback) {
- listeners.push(callback);
+ lastKnownWindowWidth = Window.innerWidth;
+ var x = Window.innerWidth / 2 - UI_WIDTH / 2;
+ var y = 10;
+
+ for (var key in uiOverlays) {
+ info = uiOverlays[key];
+ Overlays.editOverlay(info.overlay, {
+ x: x + info.x,
+ y: y + info.y,
+ });
+ }
+ }
+
+ // "Spritesheet" is laid out horizontally in this order
+ var UI_SPRITE_LIST = [
+ { name: "gridText", width: 54 },
+ { name: "visibleCheckbox", width: 60 },
+ { name: "snapToGridCheckbox", width: 105 },
+
+ { name: "color0", width: 27 },
+ { name: "color1", width: 27 },
+ { name: "color2", width: 27 },
+ { name: "color3", width: 27 },
+ { name: "color4", width: 27 },
+
+ { name: "minorGridIcon", width: 34 },
+ { name: "minorGridDecrease", width: 25 },
+ { name: "minorGridInput", width: 26 },
+ { name: "minorGridIncrease", width: 25 },
+
+ { name: "majorGridIcon", width: 40 },
+ { name: "majorGridDecrease", width: 25 },
+ { name: "majorGridInput", width: 26 },
+ { name: "majorGridIncrease", width: 25 },
+
+ { name: "yPositionLabel", width: 160 },
+ { name: "moveToLabel", width: 54 },
+ { name: "moveToAvatar", width: 26 },
+ { name: "moveToSelection", width: 34 },
+ ];
+
+ // Add all overlays from spritesheet
+ var baseOverlay = null;
+ var x = 0;
+ for (var i = 0; i < UI_SPRITE_LIST.length; i++) {
+ var info = UI_SPRITE_LIST[i];
+
+ var props = {
+ imageURL: UI_URL,
+ subImage: { x: x, y: 0, width: info.width, height: UI_HEIGHT },
+ width: info.width,
+ height: UI_HEIGHT,
+ alpha: 1.0,
+ visible: false,
+ };
+
+ var overlay;
+ if (baseOverlay == null) {
+ overlay = Overlays.addOverlay("image", {
+ imageURL: UI_URL,
+ });
+ baseOverlay = overlay;
+ } else {
+ overlay = Overlays.cloneOverlay(baseOverlay);
+ }
+
+ Overlays.editOverlay(overlay, props);
+
+ addUIOverlay(info.name, overlay, x, 0, info.width, UI_HEIGHT);
+
+ x += info.width;
+ }
+
+ // Add Text overlays
+ var textProperties = {
+ color: { red: 255, green: 255, blue: 255 },
+ topMargin: 6,
+ leftMargin: 4,
+ alpha: 1,
+ backgroundAlpha: 0,
+ text: "",
+ font: { size: 12 },
+ visible: false,
+ };
+ var minorGridWidthText = Overlays.addOverlay("text", textProperties);
+ var majorGridEveryText = Overlays.addOverlay("text", textProperties);
+ var yPositionText = Overlays.addOverlay("text", textProperties);
+
+ addUIOverlay('minorGridWidthText', minorGridWidthText, 414, 8, 24, 24);
+ addUIOverlay('majorGridEveryText', majorGridEveryText, 530, 8, 24, 24);
+ addUIOverlay('yPositionText', yPositionText, 660, 8, 24, 24);
+
+ var NUM_COLORS = 5;
+ function updateColorIndex(index) {
+ if (index < 0 || index >= NUM_COLORS) {
+ return;
+ }
+
+ for (var i = 0 ; i < NUM_COLORS; i++) {
+ var info = uiOverlays['color' + i];
+ Overlays.editOverlay(info.overlay, {
+ subImage: {
+ x: info.x,
+ y: i == index ? UI_HEIGHT : 0,
+ width: info.width,
+ height: info.height,
+ }
+ });
+ }
+ }
+
+ function updateGridVisible(value) {
+ var info = uiOverlays.visibleCheckbox;
+ Overlays.editOverlay(info.overlay, {
+ subImage: {
+ x: info.x,
+ y: value ? UI_HEIGHT : 0,
+ width: info.width,
+ height: info.height,
+ }
+ });
+ }
+
+ function updateSnapToGrid(value) {
+ var info = uiOverlays.snapToGridCheckbox;
+ Overlays.editOverlay(info.overlay, {
+ subImage: {
+ x: info.x,
+ y: value ? UI_HEIGHT : 0,
+ width: info.width,
+ height: info.height,
+ }
+ });
+ }
+
+ function updateMinorGridWidth(value) {
+ Overlays.editOverlay(minorGridWidthText, {
+ text: value.toFixed(1),
+ });
+ }
+
+ function updateMajorGridEvery(value) {
+ Overlays.editOverlay(majorGridEveryText, {
+ text: value,
+ });
+ }
+
+ function updateYPosition(value) {
+ Overlays.editOverlay(yPositionText, {
+ text: value.toFixed(2),
+ });
+ }
+
+ function updateOverlays() {
+ updateGridVisible(horizontalGrid.getVisible());
+ updateSnapToGrid(horizontalGrid.getSnapToGrid());
+ updateColorIndex(horizontalGrid.getColorIndex());
+
+ updateMinorGridWidth(horizontalGrid.getMinorGridWidth());
+ updateMajorGridEvery(horizontalGrid.getMajorGridEvery());
+
+ updateYPosition(horizontalGrid.getOrigin().y);
}
that.setVisible = function(visible) {
- webView.setVisible(visible);
+ for (var i = 0; i < allOverlays.length; i++) {
+ Overlays.editOverlay(allOverlays[i], { visible: visible });
+ }
}
+ that.mousePressEvent = function(event) {
+ var overlay = Overlays.getOverlayAtPoint({ x: event.x, y: event.y });
+
+ if (allOverlays.indexOf(overlay) >= 0) {
+ if (overlay == uiOverlays.color0.overlay) {
+ horizontalGrid.setColorIndex(0);
+ } else if (overlay == uiOverlays.color1.overlay) {
+ horizontalGrid.setColorIndex(1);
+ } else if (overlay == uiOverlays.color2.overlay) {
+ horizontalGrid.setColorIndex(2);
+ } else if (overlay == uiOverlays.color3.overlay) {
+ horizontalGrid.setColorIndex(3);
+ } else if (overlay == uiOverlays.color4.overlay) {
+ horizontalGrid.setColorIndex(4);
+ } else if (overlay == uiOverlays.visibleCheckbox.overlay) {
+ horizontalGrid.setVisible(!horizontalGrid.getVisible());
+ } else if (overlay == uiOverlays.snapToGridCheckbox.overlay) {
+ horizontalGrid.setSnapToGrid(!horizontalGrid.getSnapToGrid());
+ } else if (overlay == uiOverlays.moveToAvatar.overlay) {
+ horizontalGrid.setPosition(MyAvatar.position);
+ } else if (overlay == uiOverlays.moveToSelection.overlay) {
+ var newPosition = selectionManager.worldPosition;
+ newPosition = Vec3.subtract(newPosition, { x: 0, y: selectionManager.worldDimensions.y * 0.5, z: 0 });
+ horizontalGrid.setPosition(newPosition);
+ } else if (overlay == uiOverlays.minorGridDecrease.overlay) {
+ var newValue = Math.max(0.1, horizontalGrid.getMinorGridWidth() - 0.1);
+ horizontalGrid.setMinorGridWidth(newValue);
+ } else if (overlay == uiOverlays.minorGridIncrease.overlay) {
+ horizontalGrid.setMinorGridWidth(horizontalGrid.getMinorGridWidth() + 0.1);
+ } else if (overlay == uiOverlays.majorGridDecrease.overlay) {
+ var newValue = Math.max(2, horizontalGrid.getMajorGridEvery() - 1);
+ horizontalGrid.setMajorGridEvery(newValue);
+ } else if (overlay == uiOverlays.majorGridIncrease.overlay) {
+ horizontalGrid.setMajorGridEvery(horizontalGrid.getMajorGridEvery() + 1);
+ } else if (overlay == uiOverlays.yPositionLabel.overlay) {
+ var newValue = Window.prompt("Y Position:", horizontalGrid.getOrigin().y.toFixed(4));
+ if (newValue !== null) {
+ var y = parseFloat(newValue)
+ if (isNaN(y)) {
+ Window.alert("Invalid position");
+ } else {
+ horizontalGrid.setPosition({ x: 0, y: y, z: 0 });
+ }
+ }
+ }
+
+ // Clicking anywhere within the toolbar will "consume" this press event
+ return true;
+ }
+
+ return false;
+ };
+
+ Script.scriptEnding.connect(function() {
+ for (var i = 0; i < allOverlays.length; i++) {
+ Overlays.deleteOverlay(allOverlays[i]);
+ }
+ });
+ Script.update.connect(repositionUI);
+
+ horizontalGrid.addListener(function() {
+ selectionDisplay.updateHandles();
+ updateOverlays();
+ });
+
+ updateOverlays();
+ repositionUI();
+
return that;
};