Esempio n. 1
0
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;
}
Esempio n. 3
0
Mouse* getMouse() {
	if (!mouse)
		newMouse();
	return mouse;
}