cemu-DS4Windows/DS4Windows/DS4Control/MouseCursor.cs
Jays2Kings 8d9f69db44 Version 1.4.3
Complete rehaul of the profile settings, bigger workspace to edit
controls, and all the settings are on the side now
Added option to change the lightbar color, regardless of the profile's
lightbar setting (useful for using one profile on the same controller).
to change click the colored button beside edit in the main tab
Can now set the Gyro as an 1:1 absolute mouse, in this mode the mouse
now moves as the controller is moved
Removed the experimental exclusive connection button if on the newest
Windows 10 build (1511/TH2)
Finally updated all the translations and added some new ones (such as
Chinese and Polish, the translations sheets have been merged to one so
it's easier for me to update
2015-11-28 00:47:26 -05:00

195 lines
7.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace DS4Windows
{
class MouseCursor
{
private readonly int deviceNumber;
public MouseCursor(int deviceNum)
{
deviceNumber = deviceNum;
}
// Keep track of remainders when performing moves or we lose fractional parts.
private double horizontalRemainder = 0.0, verticalRemainder = 0.0;
private double hRemainder = 0.0, vRemainder = 0.0;
/** Indicate x/y direction for doing jitter compensation, etc. */
public enum Direction { Negative, Neutral, Positive }
// Track direction vector separately and very trivially for now.
private Direction horizontalDirection = Direction.Neutral, verticalDirection = Direction.Neutral;
private Direction hDirection = Direction.Neutral, vDirection = Direction.Neutral;
public virtual void sixaxisMoved(SixAxisEventArgs arg)
{
int deltaX = 0, deltaY = 0;
deltaX = -arg.sixAxis.accelX;
deltaY = -arg.sixAxis.accelY;
double coefficient = Global.GyroSensitivity[deviceNumber] / 100f;
// Collect rounding errors instead of losing motion.
double xMotion = coefficient * deltaX;
if (xMotion > 0.0)
{
if (horizontalRemainder > 0.0)
xMotion += horizontalRemainder;
}
else if (xMotion < 0.0)
{
if (horizontalRemainder < 0.0)
xMotion += horizontalRemainder;
}
int xAction = (int)xMotion;
hRemainder = xMotion - xAction;
double yMotion = coefficient * deltaY;
if (yMotion > 0.0)
{
if (verticalRemainder > 0.0)
yMotion += verticalRemainder;
}
else if (yMotion < 0.0)
{
if (verticalRemainder < 0.0)
yMotion += verticalRemainder;
}
int yAction = (int)yMotion;
vRemainder = yMotion - yAction;
if (Global.GyroInvert[deviceNumber] == 2 || Global.GyroInvert[deviceNumber] == 3)
xAction *= -1;
if (Global.GyroInvert[deviceNumber] == 1 || Global.GyroInvert[deviceNumber] == 3)
yAction *= -1;
if (yAction != 0 || xAction != 0)
InputMethods.MoveCursorBy(xAction, yAction);
hDirection = xMotion > 0.0 ? Direction.Positive : xMotion < 0.0 ? Direction.Negative : Direction.Neutral;
vDirection = yMotion > 0.0 ? Direction.Positive : yMotion < 0.0 ? Direction.Negative : Direction.Neutral;
}
public void touchesBegan(TouchpadEventArgs arg)
{
if (arg.touches.Length == 1)
{
horizontalRemainder = verticalRemainder = 0.0;
horizontalDirection = verticalDirection = Direction.Neutral;
}
}
private byte lastTouchID;
public void touchesMoved(TouchpadEventArgs arg, bool dragging)
{
if ((!dragging && arg.touches.Length != 1) || (dragging && arg.touches.Length < 1))
return;
int deltaX, deltaY;
if (arg.touches[0].touchID != lastTouchID)
{
deltaX = deltaY = 0;
horizontalRemainder = verticalRemainder = 0.0;
horizontalDirection = verticalDirection = Direction.Neutral;
lastTouchID = arg.touches[0].touchID;
}
else if (Global.TouchpadJitterCompensation[deviceNumber])
{
// Often the DS4's internal jitter compensation kicks in and starts hiding changes, ironically creating jitter...
if (dragging && arg.touches.Length > 1)
{
deltaX = arg.touches[1].deltaX;
deltaY = arg.touches[1].deltaY;
}
else
{
deltaX = arg.touches[0].deltaX;
deltaY = arg.touches[0].deltaY;
}
// allow only very fine, slow motions, when changing direction, even from neutral
// TODO maybe just consume it completely?
if (deltaX <= -1)
{
if (horizontalDirection != Direction.Negative)
{
deltaX = -1;
horizontalRemainder = 0.0;
}
}
else if (deltaX >= 1)
{
if (horizontalDirection != Direction.Positive)
{
deltaX = 1;
horizontalRemainder = 0.0;
}
}
if (deltaY <= -1)
{
if (verticalDirection != Direction.Negative)
{
deltaY = -1;
verticalRemainder = 0.0;
}
}
else if (deltaY >= 1)
{
if (verticalDirection != Direction.Positive)
{
deltaY = 1;
verticalRemainder = 0.0;
}
}
}
else
{
if (dragging && arg.touches.Length > 1)
{
deltaX = arg.touches[1].deltaX;
deltaY = arg.touches[1].deltaY;
}
else
{
deltaX = arg.touches[0].deltaX;
deltaY = arg.touches[0].deltaY;
}
}
double coefficient = Global.TouchSensitivity[deviceNumber] / 100.0;
// Collect rounding errors instead of losing motion.
double xMotion = coefficient * deltaX;
if (xMotion > 0.0)
{
if (horizontalRemainder > 0.0)
xMotion += horizontalRemainder;
}
else if (xMotion < 0.0)
{
if (horizontalRemainder < 0.0)
xMotion += horizontalRemainder;
}
int xAction = (int)xMotion;
horizontalRemainder = xMotion - xAction;
double yMotion = coefficient * deltaY;
if (yMotion > 0.0)
{
if (verticalRemainder > 0.0)
yMotion += verticalRemainder;
}
else if (yMotion < 0.0)
{
if (verticalRemainder < 0.0)
yMotion += verticalRemainder;
}
int yAction = (int)yMotion;
verticalRemainder = yMotion - yAction;
if (yAction != 0 || xAction != 0)
InputMethods.MoveCursorBy(xAction, yAction);
horizontalDirection = xMotion > 0.0 ? Direction.Positive : xMotion < 0.0 ? Direction.Negative : Direction.Neutral;
verticalDirection = yMotion > 0.0 ? Direction.Positive : yMotion < 0.0 ? Direction.Negative : Direction.Neutral;
}
}
}