void Viewer::mouseMoveEvent(QMouseEvent* event) { // So, while moving... update the top of the stack. int dx = event->x() - lastMouseX; // Y coordinates on screen are upside down int dy = lastMouseY - event->y(); auto buttons = event->buttons(); if (currentMode == Viewer::Mode::POSITION) { // Position mode // Left mouse button drags puppet if (buttons & Qt::LeftButton) { puppetPosition.translate(TRANSLATE_FACTOR * dx, TRANSLATE_FACTOR * dy, 0); } // Middle button translates puppet in Z if (buttons & Qt::MiddleButton) { puppetPosition.translate(0, 0, TRANSLATE_FACTOR * -dy); } // Right button rotates puppet according to some horrible trackball stuff if (buttons & Qt::RightButton) { QVector2D lastMouse(lastMouseX, lastMouseY); QVector2D newMouse(event->x(), event->y()); trackballRotate(lastMouse, newMouse, &puppetRotation); } update(); } // Joints mode // Take action if we are holdin' it down and have picked something else if ((buttons & (Qt::MiddleButton|Qt::RightButton)) && pickedIds.size()) { // Middle button is for x-axis rotation (most limbs) auto xAngle = (buttons & Qt::MiddleButton) ? -dy * ROTATE_FACTOR : 0; // Right button is for y-axis rotation (head turning) auto yAngle = (buttons & Qt::RightButton) ? dx * ROTATE_FACTOR : 0; auto& stackEntry = opStack[opStackPosition]; for (int id : pickedIds) { // X: Enforce limits auto& xJoint = jointMap[id]->xJoint; auto newAngle = stackEntry[id].xAngle + xAngle; newAngle = std::min(xJoint.max, std::max(xJoint.min, newAngle)); stackEntry[id].xAngle = newAngle; // Y: Enforce limits auto& yJoint = jointMap[id]->yJoint; newAngle = stackEntry[id].yAngle + yAngle; newAngle = std::min(yJoint.max, std::max(yJoint.min, newAngle)); stackEntry[id].yAngle = newAngle; } updateFromStackTop(); update(); } // Store mouse location again lastMouseX = event->x(); lastMouseY = event->y(); }
void Z3DTrackballInteractionHandler::mouseMoveEvent(QMouseEvent *e, int w, int h) { e->ignore(); glm::ivec2 newMouse(e->x(), h- e->y()); if (m_state == ROTATE) { rotate(m_lastMousePosition, newMouse, w, h); e->accept(); } else if (m_state == SHIFT) { shift(m_lastMousePosition, newMouse, w, h); e->accept(); } else if (m_state == ROLL) { roll(m_lastMousePosition, newMouse, w, h); e->accept(); } m_lastMousePosition = newMouse; }
Mouse* getMouse() { if (!mouse) newMouse(); return mouse; }