diff --git a/indra/newview/fsvirtualtrackpad.cpp b/indra/newview/fsvirtualtrackpad.cpp index 772c2dc4c6..f065a0d1ac 100644 --- a/indra/newview/fsvirtualtrackpad.cpp +++ b/indra/newview/fsvirtualtrackpad.cpp @@ -306,26 +306,29 @@ bool FSVirtualTrackpad::handleHover(S32 x, S32 y, MASK mask) if (!hasMouseCapture()) return true; - S32 deltaX, deltaY; - getHoverMovementDeltas(x, y, mask, &deltaX, &deltaY); + S32 deltaX, deltaY, deltaZ; + getHoverMovementDeltas(x, y, mask, &deltaX, &deltaY, &deltaZ); applyHoverMovementDeltas(deltaX, deltaY, mask); applyDeltasToValues(deltaX, deltaY, mask); - applyDeltasToDeltaValues(deltaX, deltaY, mask); + applyDeltasToDeltaValues(deltaX, deltaY, deltaZ, mask); onCommit(); return true; } -void FSVirtualTrackpad::getHoverMovementDeltas(S32 x, S32 y, MASK mask, S32* deltaX, S32* deltaY) +void FSVirtualTrackpad::getHoverMovementDeltas(S32 x, S32 y, MASK mask, S32* deltaX, S32* deltaY, S32* deltaZ) { - if (!deltaX || !deltaY) + if (!deltaX || !deltaY || !deltaZ) return; S32 fromX, fromY; fromX = mDoingPinchMode ? mPinchCursorValueX : mCursorValueX; fromY = mDoingPinchMode ? mPinchCursorValueY : mCursorValueY; + *deltaZ = mWheelClicksSinceLastDelta; + mWheelClicksSinceLastDelta = 0; + if (mask & MASK_CONTROL) { if (!mHeldDownControlBefore) @@ -427,48 +430,48 @@ void FSVirtualTrackpad::applyDeltasToValues(S32 deltaX, S32 deltaY, MASK mask) } } -void FSVirtualTrackpad::applyDeltasToDeltaValues(S32 deltaX, S32 deltaY, MASK mask) +void FSVirtualTrackpad::applyDeltasToDeltaValues(S32 deltaX, S32 deltaY, S32 deltaZ, MASK mask) { if (mDoingPinchMode) { if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_ALT) { - mPinchValueDeltaX = 0; + mPinchValueDeltaX = deltaZ; mPinchValueDeltaY = deltaY; mPinchValueDeltaZ = deltaX; } else if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_SHIFT) { mPinchValueDeltaX = deltaX; - mPinchValueDeltaY = 0; + mPinchValueDeltaY = deltaZ; mPinchValueDeltaZ = deltaY; } else { mPinchValueDeltaX = deltaX; mPinchValueDeltaY = deltaY; - mPinchValueDeltaZ = 0; + mPinchValueDeltaZ = deltaZ; } } else { if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_ALT) { - mValueDeltaX = 0; + mValueDeltaX = deltaZ; mValueDeltaY = deltaY; mValueDeltaZ = deltaX; } else if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_SHIFT) { mValueDeltaX = deltaX; - mValueDeltaY = 0; + mValueDeltaY = deltaZ; mValueDeltaZ = deltaY; } else { mValueDeltaX = deltaX; mValueDeltaY = deltaY; - mValueDeltaZ = 0; + mValueDeltaZ = deltaZ; } } } @@ -602,23 +605,43 @@ bool FSVirtualTrackpad::handleScrollWheel(S32 x, S32 y, S32 clicks) if (mask & MASK_CONTROL) changeAmount /= 5; + mWheelClicksSinceLastDelta = -1 * clicks * changeAmount; + if (mDoingPinchMode) { if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_ALT) - mPinchValueX -= clicks * changeAmount; + { + mPinchValueX += mWheelClicksSinceLastDelta; + mPinchValueDeltaX = mWheelClicksSinceLastDelta; + } else if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_SHIFT) - mPinchValueY -= clicks * changeAmount; + { + mPinchValueY += mWheelClicksSinceLastDelta; + mPinchValueDeltaY = mWheelClicksSinceLastDelta; + } else - mPinchValueZ -= clicks * changeAmount; + { + mPinchValueZ += mWheelClicksSinceLastDelta; + mPinchValueDeltaZ = mWheelClicksSinceLastDelta; + } } else { if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_ALT) - mValueX -= clicks * changeAmount; + { + mValueX += mWheelClicksSinceLastDelta; + mValueDeltaX = mWheelClicksSinceLastDelta; + } else if ((mask & (MASK_SHIFT | MASK_ALT)) == MASK_SHIFT) - mValueY -= clicks * changeAmount; + { + mValueY += mWheelClicksSinceLastDelta; + mValueDeltaY = mWheelClicksSinceLastDelta; + } else - mValueZ -= clicks * changeAmount; + { + mValueZ += mWheelClicksSinceLastDelta; + mValueDeltaZ = mWheelClicksSinceLastDelta; + } } if (!hasMouseCapture()) diff --git a/indra/newview/fsvirtualtrackpad.h b/indra/newview/fsvirtualtrackpad.h index 79703a14db..6eb7bd782b 100644 --- a/indra/newview/fsvirtualtrackpad.h +++ b/indra/newview/fsvirtualtrackpad.h @@ -119,10 +119,10 @@ private: LLVector3 normalizePixelPos(S32 x, S32 y, S32 z) const; LLVector3 normalizeDelta(S32 x, S32 y, S32 z) const; - void getHoverMovementDeltas(S32 x, S32 y, MASK mask, S32* deltaX, S32* deltaY); + void getHoverMovementDeltas(S32 x, S32 y, MASK mask, S32* deltaX, S32* deltaY, S32* deltaZ); void applyHoverMovementDeltas(S32 deltaX, S32 deltaY, MASK mask); void applyDeltasToValues(S32 deltaX, S32 deltaY, MASK mask); - void applyDeltasToDeltaValues(S32 deltaX, S32 deltaY, MASK mask); + void applyDeltasToDeltaValues(S32 deltaX, S32 deltaY, S32 deltaZ, MASK mask); LLUIImage* mImgMoonBack{ nullptr }; LLUIImage* mImgMoonFront{ nullptr }; @@ -152,6 +152,11 @@ private: bool mHeldDownControlBefore{ false }; + /// + /// The values the owner will get and set. + /// + S32 mWheelClicksSinceLastDelta{ 0 }; + /// /// The values the owner will get and set. ///