This post explains a mechanism for the mouse to stick translation, that allows to reach a better precision and that is required to perform a 1:1 translation.
If you don’t want to read some math, then skip this post ๐
All values are considered positive so as to simplify the explanation.
Each 10 ms, the sixaxis emulator processes all pending events.
All mouse motion events are merged and as a result, a single mouse event is processed.
This mouse event contains cumulated x and y deltas: (dx1, dy1).
This motion vector is then translated into a stick position according to the following formula:
(1) pos1 = dz1 + mul * pow(mv1, exp)
pos1 = desired stick position (real)
dz1 = deadzone (real, function of dx1, dy1 and the deadzone shape)
mv1 = mouse value (integer), dx1 or dy1
mul = multiplier (real, constant)
exp = exponent (real, constant)
The result pos1 is a real. But the final stick position has to be an integer.
What emuclient was doing previously is rounding pos1 to the nearest integer.
This obviously results into a lower or higher speed than the desired one.
A much more precise solution to tackle this real to integer conversion is to truncate pos1, and compute a mouse vector remainder to be added next iteration.
The mouse event that corresponds to the applied stick position is: (dx2, dy2).
dx2 and dy2 are reals.
(2) pos2 = dz1 + mul * pow(mv2, exp)
pos2 = applied stick position (truncate(pos1), integer)
dz1 = deadzone (same value, the angle is considered to be the same)
mv2 = mouse value (real), dx2 or dy2
mul = multiplier (real, constant)
exp = exponent (real, constant)
Note: norm(mv1) >= norm(mv2)
(3) vrem = mv1 - mv2
vrem = mouse vector remainder
mv1 is known.
mv2 is computed from (2):
(4) mv2 = pow[(pos2 - dz1)/mul, 1/exp]
mv2 can be replaced in (3):
(5) vrem = mv1 - pow[(pos2 - dz1)/mul, 1/exp]
Conclusion:
- (5) gives the mouse vector remainder that has to be added the next iteration
- this emulates a subposition precision
Notes:
- this is useful with 8-bit precision for stick axes as the speed difference between two neighbor stick positions is high
- this is useless with 16-bit precision for stick axes