From 151a6edfb42fd530a01f2a608fcee0fe7f66bb52 Mon Sep 17 00:00:00 2001 From: Geenz Date: Thu, 6 Jun 2013 19:31:55 -0400 Subject: [PATCH 1/8] Check if our canvas has focus. If not, then ignore events passed to it. --- interface/src/Application.cpp | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index c85e8ecd96..5329848adc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -104,27 +104,39 @@ void GLCanvas::resizeGL(int width, int height) { } void GLCanvas::keyPressEvent(QKeyEvent* event) { - Application::getInstance()->keyPressEvent(event); + if (hasFocus()) { + Application::getInstance()->keyPressEvent(event); + } } void GLCanvas::keyReleaseEvent(QKeyEvent* event) { - Application::getInstance()->keyReleaseEvent(event); + if (hasFocus()) { + Application::getInstance()->keyReleaseEvent(event); + } } void GLCanvas::mouseMoveEvent(QMouseEvent* event) { - Application::getInstance()->mouseMoveEvent(event); + if (hasFocus()) { + Application::getInstance()->mouseMoveEvent(event); + } } void GLCanvas::mousePressEvent(QMouseEvent* event) { - Application::getInstance()->mousePressEvent(event); + if (hasFocus()) { + Application::getInstance()->mousePressEvent(event); + } } void GLCanvas::mouseReleaseEvent(QMouseEvent* event) { - Application::getInstance()->mouseReleaseEvent(event); + if (hasFocus()) { + Application::getInstance()->mouseReleaseEvent(event); + } } void GLCanvas::wheelEvent(QWheelEvent* event) { - Application::getInstance()->wheelEvent(event); + if (hasFocus()) { + Application::getInstance()->wheelEvent(event); + } } Application::Application(int& argc, char** argv, timeval &startup_time) : From 51340452df140b43eb2e46e67fccf17173d483fc Mon Sep 17 00:00:00 2001 From: Geenz Date: Thu, 6 Jun 2013 19:47:01 -0400 Subject: [PATCH 2/8] Use _mouseX and _mouseY for mouse look instead of the global mouse position when idle (prevents mouse look from accidentally triggering when the window is inactive). --- interface/src/Application.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 5329848adc..3dec30204f 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -104,37 +104,37 @@ void GLCanvas::resizeGL(int width, int height) { } void GLCanvas::keyPressEvent(QKeyEvent* event) { - if (hasFocus()) { + if (Application::activeWindow() != 0) { Application::getInstance()->keyPressEvent(event); } } void GLCanvas::keyReleaseEvent(QKeyEvent* event) { - if (hasFocus()) { + if (Application::activeWindow() != 0) { Application::getInstance()->keyReleaseEvent(event); } } void GLCanvas::mouseMoveEvent(QMouseEvent* event) { - if (hasFocus()) { + if (Application::activeWindow() != 0) { Application::getInstance()->mouseMoveEvent(event); } } void GLCanvas::mousePressEvent(QMouseEvent* event) { - if (hasFocus()) { + if (Application::activeWindow() != 0) { Application::getInstance()->mousePressEvent(event); } } void GLCanvas::mouseReleaseEvent(QMouseEvent* event) { - if (hasFocus()) { + if (Application::activeWindow() != 0) { Application::getInstance()->mouseReleaseEvent(event); } } void GLCanvas::wheelEvent(QWheelEvent* event) { - if (hasFocus()) { + if (Application::activeWindow() != 0) { Application::getInstance()->wheelEvent(event); } } @@ -888,7 +888,7 @@ void Application::idle() { // Update from Mouse if (_mouseLook->isChecked()) { - QPoint mouse = QCursor::pos(); + QPoint mouse = QPoint(_mouseX, _mouseY); _myAvatar.updateFromMouse(_glWidget->mapFromGlobal(mouse).x(), _glWidget->mapFromGlobal(mouse).y(), _glWidget->width(), From 7cefa3fe7b691f8f8416f697ecb9b42e0a58c2b9 Mon Sep 17 00:00:00 2001 From: Geenz Date: Thu, 6 Jun 2013 19:58:33 -0400 Subject: [PATCH 3/8] Check if our main window is our application window within Application's event handling functions. --- interface/src/Application.cpp | 602 +++++++++++++++++----------------- 1 file changed, 301 insertions(+), 301 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 3dec30204f..12cf003f82 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -104,39 +104,27 @@ void GLCanvas::resizeGL(int width, int height) { } void GLCanvas::keyPressEvent(QKeyEvent* event) { - if (Application::activeWindow() != 0) { - Application::getInstance()->keyPressEvent(event); - } + Application::getInstance()->keyPressEvent(event); } void GLCanvas::keyReleaseEvent(QKeyEvent* event) { - if (Application::activeWindow() != 0) { - Application::getInstance()->keyReleaseEvent(event); - } + Application::getInstance()->keyReleaseEvent(event); } void GLCanvas::mouseMoveEvent(QMouseEvent* event) { - if (Application::activeWindow() != 0) { - Application::getInstance()->mouseMoveEvent(event); - } + Application::getInstance()->mouseMoveEvent(event); } void GLCanvas::mousePressEvent(QMouseEvent* event) { - if (Application::activeWindow() != 0) { - Application::getInstance()->mousePressEvent(event); - } + Application::getInstance()->mousePressEvent(event); } void GLCanvas::mouseReleaseEvent(QMouseEvent* event) { - if (Application::activeWindow() != 0) { - Application::getInstance()->mouseReleaseEvent(event); - } + Application::getInstance()->mouseReleaseEvent(event); } void GLCanvas::wheelEvent(QWheelEvent* event) { - if (Application::activeWindow() != 0) { - Application::getInstance()->wheelEvent(event); - } + Application::getInstance()->wheelEvent(event); } Application::Application(int& argc, char** argv, timeval &startup_time) : @@ -433,314 +421,326 @@ static void sendVoxelServerAddScene() { } void Application::keyPressEvent(QKeyEvent* event) { - if (_chatEntryOn) { - if (_chatEntry.keyPressEvent(event)) { - _myAvatar.setKeyState(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete ? - DELETE_KEY_DOWN : INSERT_KEY_DOWN); - _myAvatar.setChatMessage(string(_chatEntry.getContents().size(), SOLID_BLOCK_CHAR)); - - } else { - _myAvatar.setChatMessage(_chatEntry.getContents()); - _chatEntry.clear(); - _chatEntryOn = false; - setMenuShortcutsEnabled(true); + if (activeWindow() == _window) { + if (_chatEntryOn) { + if (_chatEntry.keyPressEvent(event)) { + _myAvatar.setKeyState(event->key() == Qt::Key_Backspace || event->key() == Qt::Key_Delete ? + DELETE_KEY_DOWN : INSERT_KEY_DOWN); + _myAvatar.setChatMessage(string(_chatEntry.getContents().size(), SOLID_BLOCK_CHAR)); + + } else { + _myAvatar.setChatMessage(_chatEntry.getContents()); + _chatEntry.clear(); + _chatEntryOn = false; + setMenuShortcutsEnabled(true); + } + return; } - return; - } - - bool shifted = event->modifiers().testFlag(Qt::ShiftModifier); - switch (event->key()) { - case Qt::Key_BracketLeft: - _viewFrustumOffsetYaw -= 0.5; - break; - - case Qt::Key_BracketRight: - _viewFrustumOffsetYaw += 0.5; - break; - case Qt::Key_BraceLeft: - _viewFrustumOffsetPitch -= 0.5; - break; - - case Qt::Key_BraceRight: - _viewFrustumOffsetPitch += 0.5; - break; - - case Qt::Key_ParenLeft: - _viewFrustumOffsetRoll -= 0.5; - break; - - case Qt::Key_ParenRight: - _viewFrustumOffsetRoll += 0.5; - break; - - case Qt::Key_Less: - _viewFrustumOffsetDistance -= 0.5; - break; - - case Qt::Key_Greater: - _viewFrustumOffsetDistance += 0.5; - break; - - case Qt::Key_Comma: - _viewFrustumOffsetUp -= 0.05; - break; - - case Qt::Key_Period: - _viewFrustumOffsetUp += 0.05; - break; - - case Qt::Key_Ampersand: - _paintOn = !_paintOn; - setupPaintingVoxel(); - break; - - case Qt::Key_AsciiCircum: - shiftPaintingColor(); - break; - - case Qt::Key_Percent: - sendVoxelServerAddScene(); - break; - - case Qt::Key_Semicolon: - _audio.startEchoTest(); - break; - - case Qt::Key_L: - _displayLevels = !_displayLevels; - break; - - case Qt::Key_E: - _myAvatar.setDriveKeys(UP, 1); - break; - - case Qt::Key_C: - _myAvatar.setDriveKeys(DOWN, 1); - break; - - case Qt::Key_W: - _myAvatar.setDriveKeys(FWD, 1); - break; - - case Qt::Key_S: - _myAvatar.setDriveKeys(BACK, 1); - break; - - case Qt::Key_Space: - resetSensors(); - break; - - case Qt::Key_G: - goHome(); - break; - - case Qt::Key_A: - _myAvatar.setDriveKeys(ROT_LEFT, 1); - break; - - case Qt::Key_D: - _myAvatar.setDriveKeys(ROT_RIGHT, 1); - break; - - case Qt::Key_Return: - case Qt::Key_Enter: - _chatEntryOn = true; - _myAvatar.setKeyState(NO_KEY_DOWN); - _myAvatar.setChatMessage(string()); - setMenuShortcutsEnabled(false); - break; - - case Qt::Key_Up: - _myAvatar.setDriveKeys(shifted ? UP : FWD, 1); - break; - - case Qt::Key_Down: - _myAvatar.setDriveKeys(shifted ? DOWN : BACK, 1); - break; - - case Qt::Key_Left: - _myAvatar.setDriveKeys(shifted ? LEFT : ROT_LEFT, 1); - break; - - case Qt::Key_Right: - _myAvatar.setDriveKeys(shifted ? RIGHT : ROT_RIGHT, 1); - break; - - case Qt::Key_I: - if (shifted) { - _myCamera.setEyeOffsetOrientation(glm::normalize( - glm::quat(glm::vec3(0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); - } else { - _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0.001, 0)); - } - resizeGL(_glWidget->width(), _glWidget->height()); - break; - - case Qt::Key_K: - if (shifted) { - _myCamera.setEyeOffsetOrientation(glm::normalize( - glm::quat(glm::vec3(-0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); - } else { - _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, -0.001, 0)); - } - resizeGL(_glWidget->width(), _glWidget->height()); - break; - - case Qt::Key_J: - if (shifted) { - _myCamera.setEyeOffsetOrientation(glm::normalize( - glm::quat(glm::vec3(0, 0.002f, 0)) * _myCamera.getEyeOffsetOrientation())); - } else { - _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0)); - } - resizeGL(_glWidget->width(), _glWidget->height()); - break; - - case Qt::Key_M: - if (shifted) { - _myCamera.setEyeOffsetOrientation(glm::normalize( - glm::quat(glm::vec3(0, -0.002f, 0)) * _myCamera.getEyeOffsetOrientation())); - } else { - _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0)); - } - resizeGL(_glWidget->width(), _glWidget->height()); - break; - - case Qt::Key_U: - if (shifted) { - _myCamera.setEyeOffsetOrientation(glm::normalize( - glm::quat(glm::vec3(0, 0, -0.002f)) * _myCamera.getEyeOffsetOrientation())); - } else { - _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, -0.001)); - } - resizeGL(_glWidget->width(), _glWidget->height()); - break; - - case Qt::Key_Y: - if (shifted) { - _myCamera.setEyeOffsetOrientation(glm::normalize( - glm::quat(glm::vec3(0, 0, 0.002f)) * _myCamera.getEyeOffsetOrientation())); - } else { - _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, 0.001)); - } - resizeGL(_glWidget->width(), _glWidget->height()); - break; - case Qt::Key_Backspace: - case Qt::Key_Delete: - if (_selectVoxelMode->isChecked()) { - deleteVoxelUnderCursor(); - } - break; - - default: - event->ignore(); - break; + bool shifted = event->modifiers().testFlag(Qt::ShiftModifier); + switch (event->key()) { + case Qt::Key_BracketLeft: + _viewFrustumOffsetYaw -= 0.5; + break; + + case Qt::Key_BracketRight: + _viewFrustumOffsetYaw += 0.5; + break; + + case Qt::Key_BraceLeft: + _viewFrustumOffsetPitch -= 0.5; + break; + + case Qt::Key_BraceRight: + _viewFrustumOffsetPitch += 0.5; + break; + + case Qt::Key_ParenLeft: + _viewFrustumOffsetRoll -= 0.5; + break; + + case Qt::Key_ParenRight: + _viewFrustumOffsetRoll += 0.5; + break; + + case Qt::Key_Less: + _viewFrustumOffsetDistance -= 0.5; + break; + + case Qt::Key_Greater: + _viewFrustumOffsetDistance += 0.5; + break; + + case Qt::Key_Comma: + _viewFrustumOffsetUp -= 0.05; + break; + + case Qt::Key_Period: + _viewFrustumOffsetUp += 0.05; + break; + + case Qt::Key_Ampersand: + _paintOn = !_paintOn; + setupPaintingVoxel(); + break; + + case Qt::Key_AsciiCircum: + shiftPaintingColor(); + break; + + case Qt::Key_Percent: + sendVoxelServerAddScene(); + break; + + case Qt::Key_Semicolon: + _audio.startEchoTest(); + break; + + case Qt::Key_L: + _displayLevels = !_displayLevels; + break; + + case Qt::Key_E: + _myAvatar.setDriveKeys(UP, 1); + break; + + case Qt::Key_C: + _myAvatar.setDriveKeys(DOWN, 1); + break; + + case Qt::Key_W: + _myAvatar.setDriveKeys(FWD, 1); + break; + + case Qt::Key_S: + _myAvatar.setDriveKeys(BACK, 1); + break; + + case Qt::Key_Space: + resetSensors(); + break; + + case Qt::Key_G: + goHome(); + break; + + case Qt::Key_A: + _myAvatar.setDriveKeys(ROT_LEFT, 1); + break; + + case Qt::Key_D: + _myAvatar.setDriveKeys(ROT_RIGHT, 1); + break; + + case Qt::Key_Return: + case Qt::Key_Enter: + _chatEntryOn = true; + _myAvatar.setKeyState(NO_KEY_DOWN); + _myAvatar.setChatMessage(string()); + setMenuShortcutsEnabled(false); + break; + + case Qt::Key_Up: + _myAvatar.setDriveKeys(shifted ? UP : FWD, 1); + break; + + case Qt::Key_Down: + _myAvatar.setDriveKeys(shifted ? DOWN : BACK, 1); + break; + + case Qt::Key_Left: + _myAvatar.setDriveKeys(shifted ? LEFT : ROT_LEFT, 1); + break; + + case Qt::Key_Right: + _myAvatar.setDriveKeys(shifted ? RIGHT : ROT_RIGHT, 1); + break; + + case Qt::Key_I: + if (shifted) { + _myCamera.setEyeOffsetOrientation(glm::normalize( + glm::quat(glm::vec3(0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); + } else { + _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0.001, 0)); + } + resizeGL(_glWidget->width(), _glWidget->height()); + break; + + case Qt::Key_K: + if (shifted) { + _myCamera.setEyeOffsetOrientation(glm::normalize( + glm::quat(glm::vec3(-0.002f, 0, 0)) * _myCamera.getEyeOffsetOrientation())); + } else { + _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, -0.001, 0)); + } + resizeGL(_glWidget->width(), _glWidget->height()); + break; + + case Qt::Key_J: + if (shifted) { + _myCamera.setEyeOffsetOrientation(glm::normalize( + glm::quat(glm::vec3(0, 0.002f, 0)) * _myCamera.getEyeOffsetOrientation())); + } else { + _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(-0.001, 0, 0)); + } + resizeGL(_glWidget->width(), _glWidget->height()); + break; + + case Qt::Key_M: + if (shifted) { + _myCamera.setEyeOffsetOrientation(glm::normalize( + glm::quat(glm::vec3(0, -0.002f, 0)) * _myCamera.getEyeOffsetOrientation())); + } else { + _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0.001, 0, 0)); + } + resizeGL(_glWidget->width(), _glWidget->height()); + break; + + case Qt::Key_U: + if (shifted) { + _myCamera.setEyeOffsetOrientation(glm::normalize( + glm::quat(glm::vec3(0, 0, -0.002f)) * _myCamera.getEyeOffsetOrientation())); + } else { + _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, -0.001)); + } + resizeGL(_glWidget->width(), _glWidget->height()); + break; + + case Qt::Key_Y: + if (shifted) { + _myCamera.setEyeOffsetOrientation(glm::normalize( + glm::quat(glm::vec3(0, 0, 0.002f)) * _myCamera.getEyeOffsetOrientation())); + } else { + _myCamera.setEyeOffsetPosition(_myCamera.getEyeOffsetPosition() + glm::vec3(0, 0, 0.001)); + } + resizeGL(_glWidget->width(), _glWidget->height()); + break; + case Qt::Key_Backspace: + case Qt::Key_Delete: + if (_selectVoxelMode->isChecked()) { + deleteVoxelUnderCursor(); + } + break; + + default: + event->ignore(); + break; + } } } void Application::keyReleaseEvent(QKeyEvent* event) { - if (_chatEntryOn) { - _myAvatar.setKeyState(NO_KEY_DOWN); - return; - } - - switch (event->key()) { - case Qt::Key_E: - _myAvatar.setDriveKeys(UP, 0); - break; + if (activeWindow() == _window) { + if (_chatEntryOn) { + _myAvatar.setKeyState(NO_KEY_DOWN); + return; + } - case Qt::Key_C: - _myAvatar.setDriveKeys(DOWN, 0); - break; - - case Qt::Key_W: - _myAvatar.setDriveKeys(FWD, 0); - break; - - case Qt::Key_S: - _myAvatar.setDriveKeys(BACK, 0); - break; - - case Qt::Key_A: - _myAvatar.setDriveKeys(ROT_LEFT, 0); - break; + switch (event->key()) { + case Qt::Key_E: + _myAvatar.setDriveKeys(UP, 0); + break; - case Qt::Key_D: - _myAvatar.setDriveKeys(ROT_RIGHT, 0); - break; - - case Qt::Key_Up: - _myAvatar.setDriveKeys(FWD, 0); - _myAvatar.setDriveKeys(UP, 0); - break; - - case Qt::Key_Down: - _myAvatar.setDriveKeys(BACK, 0); - _myAvatar.setDriveKeys(DOWN, 0); - break; - - case Qt::Key_Left: - _myAvatar.setDriveKeys(LEFT, 0); - _myAvatar.setDriveKeys(ROT_LEFT, 0); - break; - - case Qt::Key_Right: - _myAvatar.setDriveKeys(RIGHT, 0); - _myAvatar.setDriveKeys(ROT_RIGHT, 0); - break; - - default: - event->ignore(); - break; + case Qt::Key_C: + _myAvatar.setDriveKeys(DOWN, 0); + break; + + case Qt::Key_W: + _myAvatar.setDriveKeys(FWD, 0); + break; + + case Qt::Key_S: + _myAvatar.setDriveKeys(BACK, 0); + break; + + case Qt::Key_A: + _myAvatar.setDriveKeys(ROT_LEFT, 0); + break; + + case Qt::Key_D: + _myAvatar.setDriveKeys(ROT_RIGHT, 0); + break; + + case Qt::Key_Up: + _myAvatar.setDriveKeys(FWD, 0); + _myAvatar.setDriveKeys(UP, 0); + break; + + case Qt::Key_Down: + _myAvatar.setDriveKeys(BACK, 0); + _myAvatar.setDriveKeys(DOWN, 0); + break; + + case Qt::Key_Left: + _myAvatar.setDriveKeys(LEFT, 0); + _myAvatar.setDriveKeys(ROT_LEFT, 0); + break; + + case Qt::Key_Right: + _myAvatar.setDriveKeys(RIGHT, 0); + _myAvatar.setDriveKeys(ROT_RIGHT, 0); + break; + + default: + event->ignore(); + break; + } } } void Application::mouseMoveEvent(QMouseEvent* event) { - _mouseX = event->x(); - _mouseY = event->y(); - - // detect drag - glm::vec3 mouseVoxelPos(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); - if (!_justEditedVoxel && mouseVoxelPos != _lastMouseVoxelPos) { - if (event->buttons().testFlag(Qt::LeftButton)) { - maybeEditVoxelUnderCursor(); + if (activeWindow() == _window) { + _mouseX = event->x(); + _mouseY = event->y(); + + // detect drag + glm::vec3 mouseVoxelPos(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); + if (!_justEditedVoxel && mouseVoxelPos != _lastMouseVoxelPos) { + if (event->buttons().testFlag(Qt::LeftButton)) { + maybeEditVoxelUnderCursor(); - } else if (event->buttons().testFlag(Qt::RightButton) && checkedVoxelModeAction() != 0) { - deleteVoxelUnderCursor(); + } else if (event->buttons().testFlag(Qt::RightButton) && checkedVoxelModeAction() != 0) { + deleteVoxelUnderCursor(); + } } } } void Application::mousePressEvent(QMouseEvent* event) { - if (event->button() == Qt::LeftButton) { - _mouseX = event->x(); - _mouseY = event->y(); - _mousePressed = true; - maybeEditVoxelUnderCursor(); - - } else if (event->button() == Qt::RightButton && checkedVoxelModeAction() != 0) { - deleteVoxelUnderCursor(); + if (activeWindow() == _window) { + if (event->button() == Qt::LeftButton) { + _mouseX = event->x(); + _mouseY = event->y(); + _mousePressed = true; + maybeEditVoxelUnderCursor(); + + } else if (event->button() == Qt::RightButton && checkedVoxelModeAction() != 0) { + deleteVoxelUnderCursor(); + } } } void Application::mouseReleaseEvent(QMouseEvent* event) { - if (event->button() == Qt::LeftButton) { - _mouseX = event->x(); - _mouseY = event->y(); - _mousePressed = false; + if (activeWindow() == _window) { + if (event->button() == Qt::LeftButton) { + _mouseX = event->x(); + _mouseY = event->y(); + _mousePressed = false; + } } } void Application::wheelEvent(QWheelEvent* event) { - if (checkedVoxelModeAction() == 0) { - event->ignore(); - return; - } - if (event->delta() > 0) { - increaseVoxelSize(); - } else { - decreaseVoxelSize(); + if (activeWindow() == _window) { + if (checkedVoxelModeAction() == 0) { + event->ignore(); + return; + } + if (event->delta() > 0) { + increaseVoxelSize(); + } else { + decreaseVoxelSize(); + } } } @@ -888,7 +888,7 @@ void Application::idle() { // Update from Mouse if (_mouseLook->isChecked()) { - QPoint mouse = QPoint(_mouseX, _mouseY); + QPoint mouse(_mouseX, _mouseY); _myAvatar.updateFromMouse(_glWidget->mapFromGlobal(mouse).x(), _glWidget->mapFromGlobal(mouse).y(), _glWidget->width(), From 86316bc674241c53985ab5909422ebe42d308a00 Mon Sep 17 00:00:00 2001 From: Geenz Date: Fri, 7 Jun 2013 16:00:13 -0400 Subject: [PATCH 4/8] Don't render the voxel selection when we're moving over a maximum velocity. --- interface/src/Application.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 12cf003f82..0d3c5284a6 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -694,6 +694,7 @@ void Application::mouseMoveEvent(QMouseEvent* event) { _mouseY = event->y(); // detect drag + printLog("Avatar velocity x, y, z: %f, %f, %f\n", _myAvatar.getVelocity().x, _myAvatar.getVelocity().y, _myAvatar.getVelocity().z); glm::vec3 mouseVoxelPos(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); if (!_justEditedVoxel && mouseVoxelPos != _lastMouseVoxelPos) { if (event->buttons().testFlag(Qt::LeftButton)) { @@ -2283,6 +2284,9 @@ void Application::shiftPaintingColor() { void Application::maybeEditVoxelUnderCursor() { + if (_myAvatar.getVelocity().x > 0.5) { + printLog("We're going faster than 1 m/s!\n"); + } if (_addVoxelMode->isChecked() || _colorVoxelMode->isChecked()) { if (_mouseVoxel.s != 0) { PACKET_HEADER message = (_destructiveAddVoxel->isChecked() ? From 82db3885520bd71cd1568b4cfee8dad26e04f968 Mon Sep 17 00:00:00 2001 From: Geenz Date: Fri, 7 Jun 2013 16:08:27 -0400 Subject: [PATCH 5/8] Real max velocity stuff. --- interface/src/Application.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 9b59ff045b..d8a9d8f7a0 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -695,7 +695,6 @@ void Application::mouseMoveEvent(QMouseEvent* event) { _mouseY = event->y(); // detect drag - printLog("Avatar velocity x, y, z: %f, %f, %f\n", _myAvatar.getVelocity().x, _myAvatar.getVelocity().y, _myAvatar.getVelocity().z); glm::vec3 mouseVoxelPos(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z); if (!_justEditedVoxel && mouseVoxelPos != _lastMouseVoxelPos) { if (event->buttons().testFlag(Qt::LeftButton)) { @@ -786,6 +785,8 @@ static glm::vec3 getFaceVector(BoxFace face) { } } +const float MAX_AVATAR_EDIT_VELOCITY = 1.0f; + void Application::idle() { timeval check; gettimeofday(&check, NULL); @@ -821,7 +822,10 @@ void Application::idle() { _myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection); _mouseVoxel.s = 0.0f; - if (checkedVoxelModeAction() != 0) { + if (checkedVoxelModeAction() != 0 && + _myAvatar.getVelocity().x < MAX_AVATAR_EDIT_VELOCITY && + _myAvatar.getVelocity().y < MAX_AVATAR_EDIT_VELOCITY && + _myAvatar.getVelocity().z < MAX_AVATAR_EDIT_VELOCITY) { float distance; BoxFace face; if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) { @@ -2276,9 +2280,6 @@ void Application::shiftPaintingColor() { void Application::maybeEditVoxelUnderCursor() { - if (_myAvatar.getVelocity().x > 0.5) { - printLog("We're going faster than 1 m/s!\n"); - } if (_addVoxelMode->isChecked() || _colorVoxelMode->isChecked()) { if (_mouseVoxel.s != 0) { PACKET_HEADER message = (_destructiveAddVoxel->isChecked() ? From 1c8d4f7717adaf4c39f0e74babb9239a2334f908 Mon Sep 17 00:00:00 2001 From: Geenz Date: Fri, 7 Jun 2013 16:20:51 -0400 Subject: [PATCH 6/8] Get the average velocity of the avatar. --- interface/src/Application.cpp | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index d8a9d8f7a0..95b2d3824e 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -820,12 +820,13 @@ void Application::idle() { // tell my avatar the posiion and direction of the ray projected ino the world based on the mouse position _myAvatar.setMouseRay(mouseRayOrigin, mouseRayDirection); - + _mouseVoxel.s = 0.0f; if (checkedVoxelModeAction() != 0 && - _myAvatar.getVelocity().x < MAX_AVATAR_EDIT_VELOCITY && - _myAvatar.getVelocity().y < MAX_AVATAR_EDIT_VELOCITY && - _myAvatar.getVelocity().z < MAX_AVATAR_EDIT_VELOCITY) { + (fabs(_myAvatar.getVelocity().x) + + fabs(_myAvatar.getVelocity().y) + + fabs(_myAvatar.getVelocity().z)) / 3 < MAX_AVATAR_EDIT_VELOCITY) { + float distance; BoxFace face; if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) { From 65ec02044ef7911f095bde9f76e346be1c19b65a Mon Sep 17 00:00:00 2001 From: Geenz Date: Fri, 7 Jun 2013 16:34:10 -0400 Subject: [PATCH 7/8] Add a distance check for selected voxels. --- interface/src/Application.cpp | 53 ++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 23 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 95b2d3824e..a9b76084cc 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -786,6 +786,7 @@ static glm::vec3 getFaceVector(BoxFace face) { } const float MAX_AVATAR_EDIT_VELOCITY = 1.0f; +const float MAX_VOXEL_EDIT_DISTANCE = 20.0f; void Application::idle() { timeval check; @@ -829,32 +830,38 @@ void Application::idle() { float distance; BoxFace face; - if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) { - // find the nearest voxel with the desired scale - if (_mouseVoxelScale > _mouseVoxel.s) { - // choose the larger voxel that encompasses the one selected - _mouseVoxel.x = _mouseVoxelScale * floorf(_mouseVoxel.x / _mouseVoxelScale); - _mouseVoxel.y = _mouseVoxelScale * floorf(_mouseVoxel.y / _mouseVoxelScale); - _mouseVoxel.z = _mouseVoxelScale * floorf(_mouseVoxel.z / _mouseVoxelScale); - _mouseVoxel.s = _mouseVoxelScale; + if (_voxels.findRayIntersection(mouseRayOrigin, mouseRayDirection, _mouseVoxel, distance, face)) { - } else { - glm::vec3 faceVector = getFaceVector(face); - if (_mouseVoxelScale < _mouseVoxel.s) { - // find the closest contained voxel - glm::vec3 pt = (mouseRayOrigin + mouseRayDirection * distance) / (float)TREE_SCALE - - faceVector * (_mouseVoxelScale * 0.5f); - _mouseVoxel.x = _mouseVoxelScale * floorf(pt.x / _mouseVoxelScale); - _mouseVoxel.y = _mouseVoxelScale * floorf(pt.y / _mouseVoxelScale); - _mouseVoxel.z = _mouseVoxelScale * floorf(pt.z / _mouseVoxelScale); + if (distance < MAX_VOXEL_EDIT_DISTANCE) { + // find the nearest voxel with the desired scale + if (_mouseVoxelScale > _mouseVoxel.s) { + // choose the larger voxel that encompasses the one selected + _mouseVoxel.x = _mouseVoxelScale * floorf(_mouseVoxel.x / _mouseVoxelScale); + _mouseVoxel.y = _mouseVoxelScale * floorf(_mouseVoxel.y / _mouseVoxelScale); + _mouseVoxel.z = _mouseVoxelScale * floorf(_mouseVoxel.z / _mouseVoxelScale); _mouseVoxel.s = _mouseVoxelScale; + + } else { + glm::vec3 faceVector = getFaceVector(face); + if (_mouseVoxelScale < _mouseVoxel.s) { + // find the closest contained voxel + glm::vec3 pt = (mouseRayOrigin + mouseRayDirection * distance) / (float)TREE_SCALE - + faceVector * (_mouseVoxelScale * 0.5f); + _mouseVoxel.x = _mouseVoxelScale * floorf(pt.x / _mouseVoxelScale); + _mouseVoxel.y = _mouseVoxelScale * floorf(pt.y / _mouseVoxelScale); + _mouseVoxel.z = _mouseVoxelScale * floorf(pt.z / _mouseVoxelScale); + _mouseVoxel.s = _mouseVoxelScale; + } + if (_addVoxelMode->isChecked()) { + // use the face to determine the side on which to create a neighbor + _mouseVoxel.x += faceVector.x * _mouseVoxel.s; + _mouseVoxel.y += faceVector.y * _mouseVoxel.s; + _mouseVoxel.z += faceVector.z * _mouseVoxel.s; + } } - if (_addVoxelMode->isChecked()) { - // use the face to determine the side on which to create a neighbor - _mouseVoxel.x += faceVector.x * _mouseVoxel.s; - _mouseVoxel.y += faceVector.y * _mouseVoxel.s; - _mouseVoxel.z += faceVector.z * _mouseVoxel.s; - } + } else { + // We're not within range. Don't render the selection. + _mouseVoxel.s = 0; } } else if (_addVoxelMode->isChecked() || _selectVoxelMode->isChecked()) { // place the voxel a fixed distance away From 89ef026ce8ee6411ae4fae38bd5aadd9962594fc Mon Sep 17 00:00:00 2001 From: Geenz Date: Fri, 7 Jun 2013 16:42:22 -0400 Subject: [PATCH 8/8] Remove seemingly unnecessary coordinate space conversion. --- interface/src/Application.cpp | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index a9b76084cc..4a4e59f6b5 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -902,9 +902,8 @@ void Application::idle() { // Update from Mouse if (_mouseLook->isChecked()) { - QPoint mouse(_mouseX, _mouseY); - _myAvatar.updateFromMouse(_glWidget->mapFromGlobal(mouse).x(), - _glWidget->mapFromGlobal(mouse).y(), + _myAvatar.updateFromMouse(_mouseX, + _mouseY, _glWidget->width(), _glWidget->height()); }