void ZirkLeap::onFrame(const Leap::Controller& controller) { if(controller.hasFocus()) { Leap::Frame frame = controller.frame(); if (mPointableId >= 0) { ourProcessor->setSelectedSource(mEditor->getCBSelectedSource()-1); Leap::Pointable p = frame.pointable(mPointableId); if (!p.isValid() || !p.isExtended()) { mPointableId = -1; mLastPositionValid = false; } else { Leap::Vector pos = p.tipPosition(); const float zPlane1 = 50; // 5 cm const float zPlane2 = 100; // 10 cm if (pos.z < zPlane2) { if (mLastPositionValid) { //Leap Motion mouvement are calculated from the last position in order to have something dynamic and ergonomic Leap::Vector delta = pos- mLastPosition; float scale = 3; if (pos.z > zPlane1) { float s = 1 - (pos.z - zPlane1) / (zPlane2 - zPlane1); scale *= s; } int src = ourProcessor->getSelectedSource(); float fX, fY; ourProcessor->getSources()[src].getXY(fX, fY); fX += delta.x * scale; fY -= delta.y * scale; //clamp coordinates to circle float fCurR = hypotf(fX, fY); if ( fCurR > ZirkOscAudioProcessor::s_iDomeRadius){ float fExtraRatio = ZirkOscAudioProcessor::s_iDomeRadius / fCurR; fX *= fExtraRatio; fY *= fExtraRatio; } mEditor->move(src, fX, fY); } else { //std::cout << "pointable last pos not valid" << std::endl; } mLastPosition = pos; mLastPositionValid = true; } else { //std::cout << "pointable not touching plane" << std::endl; mLastPositionValid = false; } } } if (mPointableId < 0) { Leap::PointableList pl = frame.pointables().extended(); if (pl.count() > 0) { mPointableId = pl[0].id(); //std::cout << "got new pointable: " << mPointableId << std::endl; } } } }
void DefaultQtLeapMouseHandler::onFrame(const Leap::Frame &frame) { /////// MOUSE EVENTS ///////// // MOUSE BUTTON PRESSED // MOUSE BUTTON RELEASED // MOUSE MOVE if (this->listeners.empty()) return ; Leap::Pointable pointer = frame.pointable(this->savedMousePointableId); if (!pointer.isValid()) { pointer = frame.pointables().frontmost(); this->savedMousePointableId = pointer.id(); } bool forceRelease = (frame.pointables().count() == 0 && this->mousePressed); QMouseEvent::Type frameMouseEvent = QMouseEvent::None; QPointF globalPointerPos = QtLeapUtils::convertPointablePosToScreenPos(frame.interactionBox(), pointer); Qt::MouseButton button = Qt::NoButton; Qt::MouseButtons buttons = Qt::NoButton; // FINGER TOUCHING AND NO PREVIOUS PRESS -> SETTING BUTTON PRESS if (pointer.touchDistance() <= 0 && pointer.touchZone() == Leap::Pointable::ZONE_TOUCHING && !this->mousePressed) { this->mousePressed = true; frameMouseEvent = QMouseEvent::MouseButtonPress; button = Qt::LeftButton; } else if (this->mousePressed && (pointer.touchDistance() > 0 || pointer.touchZone() == Leap::Pointable::ZONE_NONE || forceRelease)) // FINGER NOT TOUCHING AND PREVIOUS PRESS -> RELEASING BUTTON PRESS { frameMouseEvent = QMouseEvent::MouseButtonRelease; this->mousePressed = false; button = Qt::LeftButton; } else if (frameMouseEvent == QMouseEvent::None && // FINGER IN TOUCHING OR HOVERING ZONE AND NO BUTTON PRESS / RELEASE CHANGE -> MouseMove pointer.touchZone() != Leap::Pointable::ZONE_NONE && globalPointerPos.toPoint() != this->previousPos) { frameMouseEvent = QMouseEvent::MouseMove; this->previousPos = globalPointerPos.toPoint(); QCursor::setPos(this->previousPos); } if (this->mousePressed) buttons |= Qt::LeftButton; if (frameMouseEvent != QMouseEvent::None) foreach (QObject *listener, this->listeners) QCoreApplication::postEvent(listener, new QMouseEvent(frameMouseEvent, QtLeapUtils::convertGlobalPosToLocalPos(listener, globalPointerPos), globalPointerPos, button, buttons, Qt::NoModifier)); }