Merge pull request #3820 from huffman/grid-updates

Grid tool updates + fixes
This commit is contained in:
Brad Hefta-Gaub 2014-11-18 14:57:08 -08:00
commit ee19a2d5a7
6 changed files with 97 additions and 36 deletions

View file

@ -12,14 +12,13 @@
{ red: 0, green: 0, blue: 255 }, { red: 0, green: 0, blue: 255 },
]; ];
posY = document.getElementById("horiz-y"); elPosY = document.getElementById("horiz-y");
minorSpacing = document.getElementById("minor-spacing"); elMinorSpacing = document.getElementById("minor-spacing");
majorSpacing = document.getElementById("major-spacing"); elMajorSpacing = document.getElementById("major-spacing");
gridOn = document.getElementById("grid-on"); elSnapToGrid = document.getElementById("snap-to-grid");
snapToGrid = document.getElementById("snap-to-grid"); elHorizontalGridVisible = document.getElementById("horiz-grid-visible");
hGridVisible = document.getElementById("horiz-grid-visible"); elMoveToSelection = document.getElementById("move-to-selection");
bMoveToSelection = document.getElementById("move-to-selection"); elMoveToAvatar = document.getElementById("move-to-avatar");
bMoveToAvatar = document.getElementById("move-to-avatar");
if (window.EventBridge !== undefined) { if (window.EventBridge !== undefined) {
EventBridge.scriptEventReceived.connect(function(data) { EventBridge.scriptEventReceived.connect(function(data) {
@ -27,27 +26,27 @@
if (data.origin) { if (data.origin) {
var origin = data.origin; var origin = data.origin;
posY.value = origin.y; elPosY.value = origin.y.toFixed(2);
} }
if (data.minorGridSpacing) { if (data.minorGridSpacing) {
minorSpacing.value = data.minorGridSpacing; elMinorSpacing.value = data.minorGridSpacing;
} }
if (data.majorGridEvery) { if (data.majorGridEvery) {
majorSpacing.value = data.majorGridEvery; elMajorSpacing.value = data.majorGridEvery;
} }
if (data.gridColor) { if (data.gridColor) {
gridColor = data.gridColor; gridColor = data.gridColor;
} }
if (data.snapToGrid !== undefined) { if (data.elSnapToGrid !== undefined) {
snapToGrid.checked = data.snapToGrid == true; elSnapToGrid.checked = data.snapToGrid == true;
} }
if (data.visible !== undefined) { if (data.visible !== undefined) {
hGridVisible.checked = data.visible == true; elHorizontalGridVisible.checked = data.visible == true;
} }
}); });
@ -55,29 +54,31 @@
EventBridge.emitWebEvent(JSON.stringify({ EventBridge.emitWebEvent(JSON.stringify({
type: "update", type: "update",
origin: { origin: {
y: posY.value, y: elPosY.value,
}, },
minorGridSpacing: minorSpacing.value, minorGridSpacing: elMinorSpacing.value,
majorGridEvery: majorSpacing.value, majorGridEvery: elMajorSpacing.value,
gridColor: gridColor, gridColor: gridColor,
snapToGrid: snapToGrid.checked, snapToGrid: elSnapToGrid.checked,
visible: hGridVisible.checked, visible: elHorizontalGridVisible.checked,
})); }));
} }
} }
document.addEventListener("input", emitUpdate); elPosY.addEventListener("change", emitUpdate);
hGridVisible.addEventListener("change", emitUpdate); elMinorSpacing.addEventListener("change", emitUpdate);
snapToGrid.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({ EventBridge.emitWebEvent(JSON.stringify({
type: "action", type: "action",
action: "moveToAvatar", action: "moveToAvatar",
})); }));
}); });
bMoveToSelection.addEventListener("click", function() { elMoveToSelection.addEventListener("click", function() {
EventBridge.emitWebEvent(JSON.stringify({ EventBridge.emitWebEvent(JSON.stringify({
type: "action", type: "action",
action: "moveToSelection", action: "moveToSelection",

View file

@ -1403,6 +1403,8 @@ SelectionDisplay = (function () {
vector = vec3Mult(mask, vector); vector = vec3Mult(mask, vector);
vector = grid.snapToSpacing(vector);
var changeInDimensions = Vec3.multiply(-1, vec3Mult(signs, vector)); var changeInDimensions = Vec3.multiply(-1, vec3Mult(signs, vector));
var newDimensions; var newDimensions;
if (proportional) { if (proportional) {

View file

@ -15,7 +15,7 @@ Grid = function(opts) {
var minorGridWidth = 0.5; var minorGridWidth = 0.5;
var majorGridWidth = 1.5; var majorGridWidth = 1.5;
var snapToGrid = true; var snapToGrid = false;
var gridOverlay = Overlays.addOverlay("grid", { var gridOverlay = Overlays.addOverlay("grid", {
position: { x: 0 , y: 0, z: 0 }, position: { x: 0 , y: 0, z: 0 },
@ -69,6 +69,24 @@ Grid = function(opts) {
return Vec3.sum(position, origin); 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) { that.setPosition = function(newPosition, noUpdate) {
origin = Vec3.subtract(newPosition, { x: 0, y: yOffset, z: 0 }); origin = Vec3.subtract(newPosition, { x: 0, y: yOffset, z: 0 });
origin.x = 0; origin.x = 0;

View file

@ -19,6 +19,8 @@ ToolWindow::ToolWindow(QWidget* parent) :
QMainWindow(parent), QMainWindow(parent),
_hasShown(false), _hasShown(false),
_lastGeometry() { _lastGeometry() {
Application::getInstance()->installEventFilter(this);
} }
bool ToolWindow::event(QEvent* event) { bool ToolWindow::event(QEvent* event) {
@ -47,8 +49,37 @@ bool ToolWindow::event(QEvent* event) {
return QMainWindow::event(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) { void ToolWindow::onChildVisibilityUpdated(bool visible) {
if (visible) { if (!_selfHidden && visible) {
setVisible(true); setVisible(true);
} else { } else {
bool hasVisible = false; bool hasVisible = false;
@ -59,7 +90,10 @@ void ToolWindow::onChildVisibilityUpdated(bool visible) {
break; break;
} }
} }
setVisible(hasVisible); // If a child was hidden and we don't have any children still visible, hide ourself.
if (!hasVisible) {
setVisible(false);
}
} }
} }

View file

@ -28,11 +28,15 @@ public:
virtual void addDockWidget(Qt::DockWidgetArea area, QDockWidget* dockWidget, Qt::Orientation orientation); virtual void addDockWidget(Qt::DockWidgetArea area, QDockWidget* dockWidget, Qt::Orientation orientation);
virtual void removeDockWidget(QDockWidget* dockWidget); virtual void removeDockWidget(QDockWidget* dockWidget);
virtual bool eventFilter(QObject* sender, QEvent* event);
public slots: public slots:
void onChildVisibilityUpdated(bool visible); void onChildVisibilityUpdated(bool visible);
private: private:
// Indicates whether this window was hidden by itself (because the main window lost focus).
bool _selfHidden;
bool _hasShown; bool _hasShown;
QRect _lastGeometry; QRect _lastGeometry;
}; };

View file

@ -69,9 +69,10 @@ void Grid3DOverlay::render(RenderArgs* args) {
xColor color = getColor(); xColor color = getColor();
glm::vec3 position = getPosition(); 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; 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); 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 // Minor grid
glPushMatrix(); glPushMatrix();
{ {
glTranslatef(_minorGridWidth * (floorf(rotated.x / spacing) - GRID_DIVISIONS / 2), glTranslatef(_minorGridWidth * (floorf(rotated.x / spacing) - MINOR_GRID_DIVISIONS / 2),
spacing * (floorf(rotated.y / spacing) - GRID_DIVISIONS / 2), position.z); spacing * (floorf(rotated.y / spacing) - MINOR_GRID_DIVISIONS / 2), position.z);
float scale = MINOR_GRID_DIVISIONS * spacing;
glScalef(scale, scale, scale); glScalef(scale, scale, scale);
Application::getInstance()->getGeometryCache()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); Application::getInstance()->getGeometryCache()->renderGrid(MINOR_GRID_DIVISIONS, MINOR_GRID_DIVISIONS);
} }
glPopMatrix(); glPopMatrix();
@ -94,13 +96,13 @@ void Grid3DOverlay::render(RenderArgs* args) {
{ {
glLineWidth(4.0f); glLineWidth(4.0f);
spacing *= _majorGridEvery; spacing *= _majorGridEvery;
glTranslatef(spacing * (floorf(rotated.x / spacing) - GRID_DIVISIONS / 2), glTranslatef(spacing * (floorf(rotated.x / spacing) - MAJOR_GRID_DIVISIONS / 2),
spacing * (floorf(rotated.y / spacing) - GRID_DIVISIONS / 2), position.z); spacing * (floorf(rotated.y / spacing) - MAJOR_GRID_DIVISIONS / 2), position.z);
scale *= _majorGridEvery; float scale = MAJOR_GRID_DIVISIONS * spacing;
glScalef(scale, scale, scale); glScalef(scale, scale, scale);
Application::getInstance()->getGeometryCache()->renderGrid(GRID_DIVISIONS, GRID_DIVISIONS); Application::getInstance()->getGeometryCache()->renderGrid(MAJOR_GRID_DIVISIONS, MAJOR_GRID_DIVISIONS);
} }
glPopMatrix(); glPopMatrix();