diff --git a/interface/src/Application.cpp b/interface/src/Application.cpp index 13dd81b28a..298eddcec9 100644 --- a/interface/src/Application.cpp +++ b/interface/src/Application.cpp @@ -111,6 +111,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _isHoverVoxelSounding(false), _mouseVoxelScale(1.0f / 1024.0f), _justEditedVoxel(false), + _nudgeStarted(false), _isLookingAtOtherAvatar(false), _lookatIndicatorScale(1.0f), _perfStatsOn(false), @@ -128,8 +129,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) : _bytesPerSecond(0), _bytesCount(0), _swatch(NULL), - _pasteMode(false), - _finishedNudge(true) + _pasteMode(false) { _applicationStartupTime = startup_time; _window->setWindowTitle("Interface"); @@ -684,6 +684,7 @@ void Application::keyPressEvent(QKeyEvent* event) { Menu::getInstance()->triggerOption(MenuOption::Voxels); } else { Menu::getInstance()->triggerOption(MenuOption::VoxelAddMode); + _nudgeStarted = false; } break; case Qt::Key_P: @@ -694,23 +695,24 @@ void Application::keyPressEvent(QKeyEvent* event) { Menu::getInstance()->triggerOption(MenuOption::FrustumRenderMode); } else { Menu::getInstance()->triggerOption(MenuOption::VoxelDeleteMode); + _nudgeStarted = false; } break; case Qt::Key_B: Menu::getInstance()->triggerOption(MenuOption::VoxelColorMode); + _nudgeStarted = false; break; case Qt::Key_O: Menu::getInstance()->triggerOption(MenuOption::VoxelSelectMode); - break; - case Qt::Key_N: - Menu::getInstance()->triggerOption(MenuOption::VoxelNudgeMode); + _nudgeStarted = false; break; case Qt::Key_Slash: Menu::getInstance()->triggerOption(MenuOption::Stats); break; case Qt::Key_Backspace: case Qt::Key_Delete: - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelDeleteMode)) { + if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelDeleteMode) || + Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { deleteVoxelUnderCursor(); } break; @@ -845,14 +847,6 @@ void Application::mousePressEvent(QMouseEvent* event) { pasteVoxels(); } - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { - VoxelNode* clickedNode = _voxels.getVoxelAt(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); - if (clickedNode) { - _nudgeVoxel = _mouseVoxel; - _finishedNudge = false; - } - } - if (MAKE_SOUND_ON_VOXEL_CLICK && _isHoverVoxel && !_isHoverVoxelSounding) { _hoverVoxelOriginalColor[0] = _hoverVoxel.red; _hoverVoxelOriginalColor[1] = _hoverVoxel.green; @@ -1160,11 +1154,11 @@ const glm::vec3 Application::getMouseVoxelWorldCoordinates(const VoxelDetail _mo (_mouseVoxel.z + _mouseVoxel.s / 2.f) * TREE_SCALE); } -const float NUDGE_PRECISION_LIMIT = 1 / pow(2.0, 12.0); +const float NUDGE_PRECISION_MIN = 1 / pow(2.0, 12.0); void Application::decreaseVoxelSize() { - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { - if (_mouseVoxelScale >= NUDGE_PRECISION_LIMIT) { + if (_nudgeStarted) { + if (_mouseVoxelScale >= NUDGE_PRECISION_MIN) { _mouseVoxelScale /= 2; } } else { @@ -1173,7 +1167,13 @@ void Application::decreaseVoxelSize() { } void Application::increaseVoxelSize() { - _mouseVoxelScale *= 2; + if (_nudgeStarted) { + if (_mouseVoxelScale < _nudgeVoxel.s) { + _mouseVoxelScale *= 2; + } + } else { + _mouseVoxelScale *= 2; + } } const int MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE = 1500; @@ -1300,19 +1300,28 @@ void Application::pasteVoxels() { } void Application::nudgeVoxels() { - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { - // calculate nudgeVec - glm::vec3 nudgeVec(_mouseVoxel.x - _nudgeVoxel.x, _mouseVoxel.y - _nudgeVoxel.y, _mouseVoxel.z - _nudgeVoxel.z); + if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { + if (!_nudgeStarted) { + _nudgeVoxel = _mouseVoxel; + _nudgeStarted = true; + } else { + // calculate nudgeVec + glm::vec3 nudgeVec(_mouseVoxel.x - _nudgeVoxel.x, _mouseVoxel.y - _nudgeVoxel.y, _mouseVoxel.z - _nudgeVoxel.z); - VoxelNode* nodeToNudge = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); + VoxelNode* nodeToNudge = _voxels.getVoxelAt(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s); - if (nodeToNudge) { - _voxels.getTree()->nudgeSubTree(nodeToNudge, nudgeVec, _voxelEditSender); - _finishedNudge = true; + if (nodeToNudge) { + _voxels.getTree()->nudgeSubTree(nodeToNudge, nudgeVec, _voxelEditSender); + _nudgeStarted = false; + } } } } +void Application::deleteVoxels() { + deleteVoxelUnderCursor(); +} + void Application::setListenModeNormal() { _audio.setListenMode(AudioRingBuffer::NORMAL); } @@ -1409,7 +1418,6 @@ void Application::init() { _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelColorMode), 0, 2); _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelGetColorMode), 0, 3); _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelSelectMode), 0, 4); - _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelNudgeMode), 0, 5); _pieMenu.init("./resources/images/hifi-interface-tools-v2-pie.svg", _glWidget->width(), @@ -1685,8 +1693,7 @@ void Application::update(float deltaTime) { _mouseVoxel.s = 0.0f; } } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelAddMode) - || Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode) - || Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { + || Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { // place the voxel a fixed distance away float worldMouseVoxelScale = _mouseVoxelScale * TREE_SCALE; glm::vec3 pt = mouseRayOrigin + mouseRayDirection * (2.0f + worldMouseVoxelScale * 0.5f); @@ -1701,11 +1708,13 @@ void Application::update(float deltaTime) { _mouseVoxel.red = 255; _mouseVoxel.green = _mouseVoxel.blue = 0; } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { - // yellow indicates selection - _mouseVoxel.red = _mouseVoxel.green = 255; - _mouseVoxel.blue = 0; - } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { - _mouseVoxel.red = _mouseVoxel.green = _mouseVoxel.blue = 255; + if (_nudgeStarted) { + _mouseVoxel.red = _mouseVoxel.green = _mouseVoxel.blue = 255; + } else { + // yellow indicates selection + _mouseVoxel.red = _mouseVoxel.green = 255; + _mouseVoxel.blue = 0; + } } else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked() QColor paintColor = Menu::getInstance()->getActionForOption(MenuOption::VoxelPaintColor)->data().value(); _mouseVoxel.red = paintColor.red(); @@ -2300,19 +2309,17 @@ void Application::displaySide(Camera& whichCamera) { glDisable(GL_LIGHTING); glPushMatrix(); glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { - if (!_finishedNudge) { - renderNudgeGuide(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _nudgeVoxel.s); - renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s, _mouseVoxel.s); - glPushMatrix(); - glTranslatef(_nudgeVoxel.x + _nudgeVoxel.s * 0.5f, - _nudgeVoxel.y + _nudgeVoxel.s * 0.5f, - _nudgeVoxel.z + _nudgeVoxel.s * 0.5f); - glColor3ub(255, 255, 255); - glLineWidth(4.0f); - glutWireCube(_nudgeVoxel.s); - glPopMatrix(); - } + if (_nudgeStarted) { + renderNudgeGuide(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _nudgeVoxel.s); + renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s, _mouseVoxel.s); + glPushMatrix(); + glTranslatef(_nudgeVoxel.x + _nudgeVoxel.s * 0.5f, + _nudgeVoxel.y + _nudgeVoxel.s * 0.5f, + _nudgeVoxel.z + _nudgeVoxel.s * 0.5f); + glColor3ub(255, 255, 255); + glLineWidth(4.0f); + glutWireCube(_nudgeVoxel.s); + glPopMatrix(); } else { renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); } @@ -2324,7 +2331,7 @@ void Application::displaySide(Camera& whichCamera) { glColor3ub(_mouseVoxel.red, _mouseVoxel.green, _mouseVoxel.blue); } - if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { + if (_nudgeStarted) { glTranslatef(_mouseVoxel.x + _nudgeVoxel.s*0.5f, _mouseVoxel.y + _nudgeVoxel.s*0.5f, _mouseVoxel.z + _nudgeVoxel.s*0.5f); diff --git a/interface/src/Application.h b/interface/src/Application.h index 6c9f2cf66d..6bbece0305 100644 --- a/interface/src/Application.h +++ b/interface/src/Application.h @@ -151,6 +151,7 @@ public slots: void copyVoxels(); void pasteVoxels(); void nudgeVoxels(); + void deleteVoxels(); void setRenderVoxels(bool renderVoxels); void doKillLocalVoxels(); @@ -308,6 +309,7 @@ private: bool _justEditedVoxel; // set when we've just added/deleted/colored a voxel VoxelDetail _nudgeVoxel; // details of the voxel to be nudged + bool _nudgeStarted; bool _isLookingAtOtherAvatar; glm::vec3 _lookatOtherPosition; @@ -361,7 +363,6 @@ private: Swatch _swatch; bool _pasteMode; - bool _finishedNudge; PieMenu _pieMenu; diff --git a/interface/src/Menu.cpp b/interface/src/Menu.cpp index 7e9dfe2355..b459b3e623 100644 --- a/interface/src/Menu.cpp +++ b/interface/src/Menu.cpp @@ -110,6 +110,12 @@ Menu::Menu() : addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); + #ifdef __APPLE__ + addActionToQMenuAndActionHash(editMenu, MenuOption::DeleteVoxels, Qt::Key_Backspace, appInstance, SLOT(deleteVoxels())); + #else + addActionToQMenuAndActionHash(editMenu, MenuOption::DeleteVoxels, Qt::Key_Delete, appInstance, SLOT(deleteVoxels())); + #endif + addDisabledActionAndSeparator(editMenu, "Physics"); addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); addCheckableActionToQMenuAndActionHash(editMenu, @@ -132,9 +138,6 @@ Menu::Menu() : QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); _voxelModeActionsGroup->addAction(colorVoxelMode); - - QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelNudgeMode, Qt::Key_N); - _voxelModeActionsGroup->addAction(nudgeVoxelMode); QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); _voxelModeActionsGroup->addAction(selectVoxelMode); diff --git a/interface/src/Menu.h b/interface/src/Menu.h index 2f486da031..dbd717a24f 100644 --- a/interface/src/Menu.h +++ b/interface/src/Menu.h @@ -130,6 +130,7 @@ namespace MenuOption { const QString CutVoxels = "Cut"; const QString DecreaseAvatarSize = "Decrease Avatar Size"; const QString DecreaseVoxelSize = "Decrease Voxel Size"; + const QString DeleteVoxels = "Delete"; const QString DestructiveAddVoxel = "Create Voxel is Destructive"; const QString DeltaSending = "Delta Sending"; const QString DisplayFrustum = "Display Frustum"; @@ -169,7 +170,7 @@ namespace MenuOption { const QString LookAtVectors = "Look-at Vectors"; const QString LowRes = "Lower Resolution While Moving"; const QString Mirror = "Mirror"; - const QString NudgeVoxels = "Nudge Voxels"; + const QString NudgeVoxels = "Nudge"; const QString OcclusionCulling = "Occlusion Culling"; const QString OffAxisProjection = "Off-Axis Projection"; const QString Oscilloscope = "Audio Oscilloscope"; @@ -205,7 +206,6 @@ namespace MenuOption { const QString VoxelGetColorMode = "Get Color Mode"; const QString VoxelMode = "Cycle Voxel Mode"; const QString VoxelPaintColor = "Voxel Paint Color"; - const QString VoxelNudgeMode = "Nudge Voxel Mode"; const QString VoxelSelectMode = "Select Voxel Mode"; const QString VoxelStats = "Voxel Stats"; const QString VoxelTextures = "Voxel Textures";