diff --git a/examples/html/gridControls.html b/examples/html/gridControls.html
index 4cb935e600..241fa2406c 100644
--- a/examples/html/gridControls.html
+++ b/examples/html/gridControls.html
@@ -12,14 +12,13 @@
{ red: 0, green: 0, blue: 255 },
];
- posY = document.getElementById("horiz-y");
- minorSpacing = document.getElementById("minor-spacing");
- majorSpacing = document.getElementById("major-spacing");
- gridOn = document.getElementById("grid-on");
- snapToGrid = document.getElementById("snap-to-grid");
- hGridVisible = document.getElementById("horiz-grid-visible");
- bMoveToSelection = document.getElementById("move-to-selection");
- bMoveToAvatar = document.getElementById("move-to-avatar");
+ elPosY = document.getElementById("horiz-y");
+ elMinorSpacing = document.getElementById("minor-spacing");
+ elMajorSpacing = document.getElementById("major-spacing");
+ elSnapToGrid = document.getElementById("snap-to-grid");
+ elHorizontalGridVisible = document.getElementById("horiz-grid-visible");
+ elMoveToSelection = document.getElementById("move-to-selection");
+ elMoveToAvatar = document.getElementById("move-to-avatar");
if (window.EventBridge !== undefined) {
EventBridge.scriptEventReceived.connect(function(data) {
@@ -27,27 +26,27 @@
if (data.origin) {
var origin = data.origin;
- posY.value = origin.y;
+ elPosY.value = origin.y.toFixed(2);
}
if (data.minorGridSpacing) {
- minorSpacing.value = data.minorGridSpacing;
+ elMinorSpacing.value = data.minorGridSpacing;
}
if (data.majorGridEvery) {
- majorSpacing.value = data.majorGridEvery;
+ elMajorSpacing.value = data.majorGridEvery;
}
if (data.gridColor) {
gridColor = data.gridColor;
}
- if (data.snapToGrid !== undefined) {
- snapToGrid.checked = data.snapToGrid == true;
+ if (data.elSnapToGrid !== undefined) {
+ elSnapToGrid.checked = data.snapToGrid == true;
}
if (data.visible !== undefined) {
- hGridVisible.checked = data.visible == true;
+ elHorizontalGridVisible.checked = data.visible == true;
}
});
@@ -55,29 +54,31 @@
EventBridge.emitWebEvent(JSON.stringify({
type: "update",
origin: {
- y: posY.value,
+ y: elPosY.value,
},
- minorGridSpacing: minorSpacing.value,
- majorGridEvery: majorSpacing.value,
+ minorGridSpacing: elMinorSpacing.value,
+ majorGridEvery: elMajorSpacing.value,
gridColor: gridColor,
- snapToGrid: snapToGrid.checked,
- visible: hGridVisible.checked,
+ snapToGrid: elSnapToGrid.checked,
+ visible: elHorizontalGridVisible.checked,
}));
}
}
- document.addEventListener("input", emitUpdate);
- hGridVisible.addEventListener("change", emitUpdate);
- snapToGrid.addEventListener("change", emitUpdate);
+ elPosY.addEventListener("change", emitUpdate);
+ elMinorSpacing.addEventListener("change", emitUpdate);
+ elMajorSpacing.addEventListener("change", emitUpdate);
+ elSnapToGrid.addEventListener("change", emitUpdate);
+ elHorizontalGridVisible.addEventListener("change", emitUpdate);
- bMoveToAvatar.addEventListener("click", function() {
+ elMoveToAvatar.addEventListener("click", function() {
EventBridge.emitWebEvent(JSON.stringify({
type: "action",
action: "moveToAvatar",
}));
});
- bMoveToSelection.addEventListener("click", function() {
+ elMoveToSelection.addEventListener("click", function() {
EventBridge.emitWebEvent(JSON.stringify({
type: "action",
action: "moveToSelection",
diff --git a/examples/libraries/entitySelectionTool.js b/examples/libraries/entitySelectionTool.js
index 6733ccaf39..ada876e9b1 100644
--- a/examples/libraries/entitySelectionTool.js
+++ b/examples/libraries/entitySelectionTool.js
@@ -1403,6 +1403,8 @@ SelectionDisplay = (function () {
vector = vec3Mult(mask, vector);
+ vector = grid.snapToSpacing(vector);
+
var changeInDimensions = Vec3.multiply(-1, vec3Mult(signs, vector));
var newDimensions;
if (proportional) {
diff --git a/examples/libraries/gridTool.js b/examples/libraries/gridTool.js
index d8b84babf9..eb2a227248 100644
--- a/examples/libraries/gridTool.js
+++ b/examples/libraries/gridTool.js
@@ -15,7 +15,7 @@ Grid = function(opts) {
var minorGridWidth = 0.5;
var majorGridWidth = 1.5;
- var snapToGrid = true;
+ var snapToGrid = false;
var gridOverlay = Overlays.addOverlay("grid", {
position: { x: 0 , y: 0, z: 0 },
@@ -69,6 +69,24 @@ Grid = function(opts) {
return Vec3.sum(position, origin);
}
+ that.snapToSpacing = function(delta, majorOnly) {
+ print('snaptogrid? ' + snapToGrid);
+ if (!snapToGrid) {
+ return delta;
+ }
+
+ var spacing = majorOnly ? (minorGridSpacing * majorGridEvery) : minorGridSpacing;
+
+ var snappedDelta = {
+ x: Math.round(delta.x / spacing) * spacing,
+ y: Math.round(delta.y / spacing) * spacing,
+ z: Math.round(delta.z / spacing) * spacing,
+ };
+
+ return snappedDelta;
+ }
+
+
that.setPosition = function(newPosition, noUpdate) {
origin = Vec3.subtract(newPosition, { x: 0, y: yOffset, z: 0 });
origin.x = 0;
diff --git a/interface/src/ui/ToolWindow.cpp b/interface/src/ui/ToolWindow.cpp
index 1375ff1ea5..44ea44c47d 100644
--- a/interface/src/ui/ToolWindow.cpp
+++ b/interface/src/ui/ToolWindow.cpp
@@ -19,6 +19,8 @@ ToolWindow::ToolWindow(QWidget* parent) :
QMainWindow(parent),
_hasShown(false),
_lastGeometry() {
+
+ Application::getInstance()->installEventFilter(this);
}
bool ToolWindow::event(QEvent* event) {
@@ -47,8 +49,37 @@ bool ToolWindow::event(QEvent* event) {
return QMainWindow::event(event);
}
+bool ToolWindow::eventFilter(QObject* sender, QEvent* event) {
+ switch (event->type()) {
+ case QEvent::WindowStateChange:
+ if (Application::getInstance()->getWindow()->isMinimized()) {
+ // If we are already visible, we are self-hiding
+ _selfHidden = isVisible();
+ setVisible(false);
+ } else {
+ if (_selfHidden) {
+ setVisible(true);
+ }
+ }
+ break;
+ case QEvent::ApplicationDeactivate:
+ _selfHidden = isVisible();
+ setVisible(false);
+ break;
+ case QEvent::ApplicationActivate:
+ if (_selfHidden) {
+ setVisible(true);
+ }
+ break;
+ default:
+ break;
+ }
+
+ return false;
+}
+
void ToolWindow::onChildVisibilityUpdated(bool visible) {
- if (visible) {
+ if (!_selfHidden && visible) {
setVisible(true);
} else {
bool hasVisible = false;
@@ -59,7 +90,10 @@ void ToolWindow::onChildVisibilityUpdated(bool visible) {
break;
}
}
- setVisible(hasVisible);
+ // If a child was hidden and we don't have any children still visible, hide ourself.
+ if (!hasVisible) {
+ setVisible(false);
+ }
}
}
diff --git a/interface/src/ui/ToolWindow.h b/interface/src/ui/ToolWindow.h
index 87b94d46df..03ae85a418 100644
--- a/interface/src/ui/ToolWindow.h
+++ b/interface/src/ui/ToolWindow.h
@@ -28,11 +28,15 @@ public:
virtual void addDockWidget(Qt::DockWidgetArea area, QDockWidget* dockWidget, Qt::Orientation orientation);
virtual void removeDockWidget(QDockWidget* dockWidget);
+ virtual bool eventFilter(QObject* sender, QEvent* event);
+
public slots:
void onChildVisibilityUpdated(bool visible);
private:
+ // Indicates whether this window was hidden by itself (because the main window lost focus).
+ bool _selfHidden;
bool _hasShown;
QRect _lastGeometry;
};
diff --git a/interface/src/ui/overlays/Grid3DOverlay.cpp b/interface/src/ui/overlays/Grid3DOverlay.cpp
index 84610d7981..4bf0d9ce93 100644
--- a/interface/src/ui/overlays/Grid3DOverlay.cpp
+++ b/interface/src/ui/overlays/Grid3DOverlay.cpp
@@ -69,9 +69,10 @@ void Grid3DOverlay::render(RenderArgs* args) {
xColor color = getColor();
glm::vec3 position = getPosition();
- const int GRID_DIVISIONS = 300;
+ const int MINOR_GRID_DIVISIONS = 100;
+ const int MAJOR_GRID_DIVISIONS = 50;
const float MAX_COLOR = 255.0f;
- float scale = GRID_DIVISIONS * spacing;
+
glColor4f(color.red / MAX_COLOR, color.green / MAX_COLOR, color.blue / MAX_COLOR, alpha);
@@ -80,12 +81,13 @@ void Grid3DOverlay::render(RenderArgs* args) {
// Minor grid
glPushMatrix();
{
- glTranslatef(_minorGridWidth * (floorf(rotated.x / spacing) - GRID_DIVISIONS / 2),
- spacing * (floorf(rotated.y / spacing) - GRID_DIVISIONS / 2), position.z);
+ glTranslatef(_minorGridWidth * (floorf(rotated.x / spacing) - MINOR_GRID_DIVISIONS / 2),
+ spacing * (floorf(rotated.y / spacing) - MINOR_GRID_DIVISIONS / 2), position.z);
+ float scale = MINOR_GRID_DIVISIONS * spacing;
glScalef(scale, scale, scale);
- Application::getInstance()->getGeometryCache()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS);
+ Application::getInstance()->getGeometryCache()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS);
}
glPopMatrix();
@@ -94,13 +96,13 @@ void Grid3DOverlay::render(RenderArgs* args) {
{
glLineWidth(4.0f);
spacing *= _majorGridEvery;
- glTranslatef(spacing * (floorf(rotated.x / spacing) - GRID_DIVISIONS / 2),
- spacing * (floorf(rotated.y / spacing) - GRID_DIVISIONS / 2), position.z);
+ glTranslatef(spacing * (floorf(rotated.x / spacing) - MAJOR_GRID_DIVISIONS / 2),
+ spacing * (floorf(rotated.y / spacing) - MAJOR_GRID_DIVISIONS / 2), position.z);
- scale *= _majorGridEvery;
+ float scale = MAJOR_GRID_DIVISIONS * spacing;
glScalef(scale, scale, scale);
- Application::getInstance()->getGeometryCache()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS);
+ Application::getInstance()->getGeometryCache()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS);
}
glPopMatrix();