Merge pull request #936 from LionTurtle/master

Change nudge UI to be more consistent with classic editing UI.
This commit is contained in:
ZappoMan 2013-09-13 14:11:32 -07:00
commit 5e143f17a8
4 changed files with 64 additions and 53 deletions

View file

@ -111,6 +111,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_isHoverVoxelSounding(false), _isHoverVoxelSounding(false),
_mouseVoxelScale(1.0f / 1024.0f), _mouseVoxelScale(1.0f / 1024.0f),
_justEditedVoxel(false), _justEditedVoxel(false),
_nudgeStarted(false),
_isLookingAtOtherAvatar(false), _isLookingAtOtherAvatar(false),
_lookatIndicatorScale(1.0f), _lookatIndicatorScale(1.0f),
_perfStatsOn(false), _perfStatsOn(false),
@ -128,8 +129,7 @@ Application::Application(int& argc, char** argv, timeval &startup_time) :
_bytesPerSecond(0), _bytesPerSecond(0),
_bytesCount(0), _bytesCount(0),
_swatch(NULL), _swatch(NULL),
_pasteMode(false), _pasteMode(false)
_finishedNudge(true)
{ {
_applicationStartupTime = startup_time; _applicationStartupTime = startup_time;
_window->setWindowTitle("Interface"); _window->setWindowTitle("Interface");
@ -684,6 +684,7 @@ void Application::keyPressEvent(QKeyEvent* event) {
Menu::getInstance()->triggerOption(MenuOption::Voxels); Menu::getInstance()->triggerOption(MenuOption::Voxels);
} else { } else {
Menu::getInstance()->triggerOption(MenuOption::VoxelAddMode); Menu::getInstance()->triggerOption(MenuOption::VoxelAddMode);
_nudgeStarted = false;
} }
break; break;
case Qt::Key_P: case Qt::Key_P:
@ -694,23 +695,24 @@ void Application::keyPressEvent(QKeyEvent* event) {
Menu::getInstance()->triggerOption(MenuOption::FrustumRenderMode); Menu::getInstance()->triggerOption(MenuOption::FrustumRenderMode);
} else { } else {
Menu::getInstance()->triggerOption(MenuOption::VoxelDeleteMode); Menu::getInstance()->triggerOption(MenuOption::VoxelDeleteMode);
_nudgeStarted = false;
} }
break; break;
case Qt::Key_B: case Qt::Key_B:
Menu::getInstance()->triggerOption(MenuOption::VoxelColorMode); Menu::getInstance()->triggerOption(MenuOption::VoxelColorMode);
_nudgeStarted = false;
break; break;
case Qt::Key_O: case Qt::Key_O:
Menu::getInstance()->triggerOption(MenuOption::VoxelSelectMode); Menu::getInstance()->triggerOption(MenuOption::VoxelSelectMode);
break; _nudgeStarted = false;
case Qt::Key_N:
Menu::getInstance()->triggerOption(MenuOption::VoxelNudgeMode);
break; break;
case Qt::Key_Slash: case Qt::Key_Slash:
Menu::getInstance()->triggerOption(MenuOption::Stats); Menu::getInstance()->triggerOption(MenuOption::Stats);
break; break;
case Qt::Key_Backspace: case Qt::Key_Backspace:
case Qt::Key_Delete: case Qt::Key_Delete:
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelDeleteMode)) { if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelDeleteMode) ||
Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) {
deleteVoxelUnderCursor(); deleteVoxelUnderCursor();
} }
break; break;
@ -845,14 +847,6 @@ void Application::mousePressEvent(QMouseEvent* event) {
pasteVoxels(); 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) { if (MAKE_SOUND_ON_VOXEL_CLICK && _isHoverVoxel && !_isHoverVoxelSounding) {
_hoverVoxelOriginalColor[0] = _hoverVoxel.red; _hoverVoxelOriginalColor[0] = _hoverVoxel.red;
_hoverVoxelOriginalColor[1] = _hoverVoxel.green; _hoverVoxelOriginalColor[1] = _hoverVoxel.green;
@ -1160,11 +1154,11 @@ const glm::vec3 Application::getMouseVoxelWorldCoordinates(const VoxelDetail _mo
(_mouseVoxel.z + _mouseVoxel.s / 2.f) * TREE_SCALE); (_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() { void Application::decreaseVoxelSize() {
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { if (_nudgeStarted) {
if (_mouseVoxelScale >= NUDGE_PRECISION_LIMIT) { if (_mouseVoxelScale >= NUDGE_PRECISION_MIN) {
_mouseVoxelScale /= 2; _mouseVoxelScale /= 2;
} }
} else { } else {
@ -1173,7 +1167,13 @@ void Application::decreaseVoxelSize() {
} }
void Application::increaseVoxelSize() { void Application::increaseVoxelSize() {
_mouseVoxelScale *= 2; if (_nudgeStarted) {
if (_mouseVoxelScale < _nudgeVoxel.s) {
_mouseVoxelScale *= 2;
}
} else {
_mouseVoxelScale *= 2;
}
} }
const int MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE = 1500; const int MAXIMUM_EDIT_VOXEL_MESSAGE_SIZE = 1500;
@ -1300,19 +1300,28 @@ void Application::pasteVoxels() {
} }
void Application::nudgeVoxels() { void Application::nudgeVoxels() {
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) {
// calculate nudgeVec if (!_nudgeStarted) {
glm::vec3 nudgeVec(_mouseVoxel.x - _nudgeVoxel.x, _mouseVoxel.y - _nudgeVoxel.y, _mouseVoxel.z - _nudgeVoxel.z); _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) { if (nodeToNudge) {
_voxels.getTree()->nudgeSubTree(nodeToNudge, nudgeVec, _voxelEditSender); _voxels.getTree()->nudgeSubTree(nodeToNudge, nudgeVec, _voxelEditSender);
_finishedNudge = true; _nudgeStarted = false;
}
} }
} }
} }
void Application::deleteVoxels() {
deleteVoxelUnderCursor();
}
void Application::setListenModeNormal() { void Application::setListenModeNormal() {
_audio.setListenMode(AudioRingBuffer::NORMAL); _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::VoxelColorMode), 0, 2);
_palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelGetColorMode), 0, 3); _palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelGetColorMode), 0, 3);
_palette.addAction(Menu::getInstance()->getActionForOption(MenuOption::VoxelSelectMode), 0, 4); _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", _pieMenu.init("./resources/images/hifi-interface-tools-v2-pie.svg",
_glWidget->width(), _glWidget->width(),
@ -1685,8 +1693,7 @@ void Application::update(float deltaTime) {
_mouseVoxel.s = 0.0f; _mouseVoxel.s = 0.0f;
} }
} else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelAddMode) } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelAddMode)
|| Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode) || Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) {
|| Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) {
// place the voxel a fixed distance away // place the voxel a fixed distance away
float worldMouseVoxelScale = _mouseVoxelScale * TREE_SCALE; float worldMouseVoxelScale = _mouseVoxelScale * TREE_SCALE;
glm::vec3 pt = mouseRayOrigin + mouseRayDirection * (2.0f + worldMouseVoxelScale * 0.5f); glm::vec3 pt = mouseRayOrigin + mouseRayDirection * (2.0f + worldMouseVoxelScale * 0.5f);
@ -1701,11 +1708,13 @@ void Application::update(float deltaTime) {
_mouseVoxel.red = 255; _mouseVoxel.red = 255;
_mouseVoxel.green = _mouseVoxel.blue = 0; _mouseVoxel.green = _mouseVoxel.blue = 0;
} else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) { } else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelSelectMode)) {
// yellow indicates selection if (_nudgeStarted) {
_mouseVoxel.red = _mouseVoxel.green = 255; _mouseVoxel.red = _mouseVoxel.green = _mouseVoxel.blue = 255;
_mouseVoxel.blue = 0; } else {
} else if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { // yellow indicates selection
_mouseVoxel.red = _mouseVoxel.green = _mouseVoxel.blue = 255; _mouseVoxel.red = _mouseVoxel.green = 255;
_mouseVoxel.blue = 0;
}
} else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked() } else { // _addVoxelMode->isChecked() || _colorVoxelMode->isChecked()
QColor paintColor = Menu::getInstance()->getActionForOption(MenuOption::VoxelPaintColor)->data().value<QColor>(); QColor paintColor = Menu::getInstance()->getActionForOption(MenuOption::VoxelPaintColor)->data().value<QColor>();
_mouseVoxel.red = paintColor.red(); _mouseVoxel.red = paintColor.red();
@ -2300,19 +2309,17 @@ void Application::displaySide(Camera& whichCamera) {
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
glPushMatrix(); glPushMatrix();
glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE); glScalef(TREE_SCALE, TREE_SCALE, TREE_SCALE);
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { if (_nudgeStarted) {
if (!_finishedNudge) { renderNudgeGuide(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _nudgeVoxel.s);
renderNudgeGuide(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _nudgeVoxel.s); renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s, _mouseVoxel.s);
renderNudgeGrid(_nudgeVoxel.x, _nudgeVoxel.y, _nudgeVoxel.z, _nudgeVoxel.s, _mouseVoxel.s); glPushMatrix();
glPushMatrix(); glTranslatef(_nudgeVoxel.x + _nudgeVoxel.s * 0.5f,
glTranslatef(_nudgeVoxel.x + _nudgeVoxel.s * 0.5f, _nudgeVoxel.y + _nudgeVoxel.s * 0.5f,
_nudgeVoxel.y + _nudgeVoxel.s * 0.5f, _nudgeVoxel.z + _nudgeVoxel.s * 0.5f);
_nudgeVoxel.z + _nudgeVoxel.s * 0.5f); glColor3ub(255, 255, 255);
glColor3ub(255, 255, 255); glLineWidth(4.0f);
glLineWidth(4.0f); glutWireCube(_nudgeVoxel.s);
glutWireCube(_nudgeVoxel.s); glPopMatrix();
glPopMatrix();
}
} else { } else {
renderMouseVoxelGrid(_mouseVoxel.x, _mouseVoxel.y, _mouseVoxel.z, _mouseVoxel.s); 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); glColor3ub(_mouseVoxel.red, _mouseVoxel.green, _mouseVoxel.blue);
} }
if (Menu::getInstance()->isOptionChecked(MenuOption::VoxelNudgeMode)) { if (_nudgeStarted) {
glTranslatef(_mouseVoxel.x + _nudgeVoxel.s*0.5f, glTranslatef(_mouseVoxel.x + _nudgeVoxel.s*0.5f,
_mouseVoxel.y + _nudgeVoxel.s*0.5f, _mouseVoxel.y + _nudgeVoxel.s*0.5f,
_mouseVoxel.z + _nudgeVoxel.s*0.5f); _mouseVoxel.z + _nudgeVoxel.s*0.5f);

View file

@ -151,6 +151,7 @@ public slots:
void copyVoxels(); void copyVoxels();
void pasteVoxels(); void pasteVoxels();
void nudgeVoxels(); void nudgeVoxels();
void deleteVoxels();
void setRenderVoxels(bool renderVoxels); void setRenderVoxels(bool renderVoxels);
void doKillLocalVoxels(); void doKillLocalVoxels();
@ -308,6 +309,7 @@ private:
bool _justEditedVoxel; // set when we've just added/deleted/colored a voxel bool _justEditedVoxel; // set when we've just added/deleted/colored a voxel
VoxelDetail _nudgeVoxel; // details of the voxel to be nudged VoxelDetail _nudgeVoxel; // details of the voxel to be nudged
bool _nudgeStarted;
bool _isLookingAtOtherAvatar; bool _isLookingAtOtherAvatar;
glm::vec3 _lookatOtherPosition; glm::vec3 _lookatOtherPosition;
@ -361,7 +363,6 @@ private:
Swatch _swatch; Swatch _swatch;
bool _pasteMode; bool _pasteMode;
bool _finishedNudge;
PieMenu _pieMenu; PieMenu _pieMenu;

View file

@ -110,6 +110,12 @@ Menu::Menu() :
addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels())); addActionToQMenuAndActionHash(editMenu, MenuOption::PasteVoxels, Qt::CTRL | Qt::Key_V, appInstance, SLOT(pasteVoxels()));
addActionToQMenuAndActionHash(editMenu, MenuOption::NudgeVoxels, Qt::CTRL | Qt::Key_N, appInstance, SLOT(nudgeVoxels())); 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"); addDisabledActionAndSeparator(editMenu, "Physics");
addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true); addCheckableActionToQMenuAndActionHash(editMenu, MenuOption::Gravity, Qt::SHIFT | Qt::Key_G, true);
addCheckableActionToQMenuAndActionHash(editMenu, addCheckableActionToQMenuAndActionHash(editMenu,
@ -132,9 +138,6 @@ Menu::Menu() :
QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B); QAction* colorVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelColorMode, Qt::Key_B);
_voxelModeActionsGroup->addAction(colorVoxelMode); _voxelModeActionsGroup->addAction(colorVoxelMode);
QAction* nudgeVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelNudgeMode, Qt::Key_N);
_voxelModeActionsGroup->addAction(nudgeVoxelMode);
QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O); QAction* selectVoxelMode = addCheckableActionToQMenuAndActionHash(toolsMenu, MenuOption::VoxelSelectMode, Qt::Key_O);
_voxelModeActionsGroup->addAction(selectVoxelMode); _voxelModeActionsGroup->addAction(selectVoxelMode);

View file

@ -130,6 +130,7 @@ namespace MenuOption {
const QString CutVoxels = "Cut"; const QString CutVoxels = "Cut";
const QString DecreaseAvatarSize = "Decrease Avatar Size"; const QString DecreaseAvatarSize = "Decrease Avatar Size";
const QString DecreaseVoxelSize = "Decrease Voxel Size"; const QString DecreaseVoxelSize = "Decrease Voxel Size";
const QString DeleteVoxels = "Delete";
const QString DestructiveAddVoxel = "Create Voxel is Destructive"; const QString DestructiveAddVoxel = "Create Voxel is Destructive";
const QString DeltaSending = "Delta Sending"; const QString DeltaSending = "Delta Sending";
const QString DisplayFrustum = "Display Frustum"; const QString DisplayFrustum = "Display Frustum";
@ -169,7 +170,7 @@ namespace MenuOption {
const QString LookAtVectors = "Look-at Vectors"; const QString LookAtVectors = "Look-at Vectors";
const QString LowRes = "Lower Resolution While Moving"; const QString LowRes = "Lower Resolution While Moving";
const QString Mirror = "Mirror"; const QString Mirror = "Mirror";
const QString NudgeVoxels = "Nudge Voxels"; const QString NudgeVoxels = "Nudge";
const QString OcclusionCulling = "Occlusion Culling"; const QString OcclusionCulling = "Occlusion Culling";
const QString OffAxisProjection = "Off-Axis Projection"; const QString OffAxisProjection = "Off-Axis Projection";
const QString Oscilloscope = "Audio Oscilloscope"; const QString Oscilloscope = "Audio Oscilloscope";
@ -205,7 +206,6 @@ namespace MenuOption {
const QString VoxelGetColorMode = "Get Color Mode"; const QString VoxelGetColorMode = "Get Color Mode";
const QString VoxelMode = "Cycle Voxel Mode"; const QString VoxelMode = "Cycle Voxel Mode";
const QString VoxelPaintColor = "Voxel Paint Color"; const QString VoxelPaintColor = "Voxel Paint Color";
const QString VoxelNudgeMode = "Nudge Voxel Mode";
const QString VoxelSelectMode = "Select Voxel Mode"; const QString VoxelSelectMode = "Select Voxel Mode";
const QString VoxelStats = "Voxel Stats"; const QString VoxelStats = "Voxel Stats";
const QString VoxelTextures = "Voxel Textures"; const QString VoxelTextures = "Voxel Textures";