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.
///