diff options
| author | a1xd <[email protected]> | 2020-12-03 20:00:31 -0500 |
|---|---|---|
| committer | a1xd <[email protected]> | 2020-12-03 20:00:31 -0500 |
| commit | 5657d5a54c0a8e980c9b0cac39e2d16e452f302e (patch) | |
| tree | 03c254c41dba5f64a998ac13c38e36943bf8b942 | |
| parent | update writer - use messagebox instead of console (diff) | |
| download | rawaccel-5657d5a54c0a8e980c9b0cac39e2d16e452f302e.tar.xz rawaccel-5657d5a54c0a8e980c9b0cac39e2d16e452f302e.zip | |
add directional multipliers
adds multipliers for movement in negative directions (up & left by default, can be flipped by rot or sens)
avoid division by user input in mousewatcher
| -rw-r--r-- | common/rawaccel-settings.h | 1 | ||||
| -rw-r--r-- | common/rawaccel.hpp | 13 | ||||
| -rw-r--r-- | grapher/Models/AccelGUI.cs | 3 | ||||
| -rw-r--r-- | grapher/Models/AccelGUIFactory.cs | 3 | ||||
| -rw-r--r-- | grapher/Models/Calculations/AccelData.cs | 14 | ||||
| -rw-r--r-- | grapher/Models/Charts/AccelCharts.cs | 4 | ||||
| -rw-r--r-- | grapher/Models/Charts/ChartState/ChartState.cs | 2 | ||||
| -rw-r--r-- | grapher/Models/Charts/ChartState/CombinedState.cs | 4 | ||||
| -rw-r--r-- | grapher/Models/Charts/ChartState/XYOneGraphState.cs | 4 | ||||
| -rw-r--r-- | grapher/Models/Charts/ChartState/XYTwoGraphState.cs | 4 | ||||
| -rw-r--r-- | grapher/Models/Mouse/MouseWatcher.cs | 46 | ||||
| -rw-r--r-- | grapher/Models/Serialized/RawAccelSettings.cs | 2 | ||||
| -rw-r--r-- | grapher/Models/Serialized/SettingsManager.cs | 4 | ||||
| -rw-r--r-- | wrapper/wrapper.cpp | 5 |
14 files changed, 71 insertions, 38 deletions
diff --git a/common/rawaccel-settings.h b/common/rawaccel-settings.h index e9e158c..0f52807 100644 --- a/common/rawaccel-settings.h +++ b/common/rawaccel-settings.h @@ -21,6 +21,7 @@ namespace rawaccel { vec2<accel_mode> modes = { accel_mode::noaccel, accel_mode::noaccel }; vec2<accel_args> argsv; vec2d sens = { 1, 1 }; + vec2d neg_multipliers = {}; milliseconds time_min = DEFAULT_TIME_MIN; }; diff --git a/common/rawaccel.hpp b/common/rawaccel.hpp index b160a42..a7b9144 100644 --- a/common/rawaccel.hpp +++ b/common/rawaccel.hpp @@ -233,6 +233,7 @@ namespace rawaccel { rotator rotate; vec2<accelerator> accels; vec2d sensitivity = { 1, 1 }; + vec2d negative_multipliers = {}; mouse_modifier(const settings& args, vec2<si_pair*> luts = {}) : combine_magnitudes(args.combine_mags) @@ -245,6 +246,9 @@ namespace rawaccel { if (args.sens.x != 0) sensitivity.x = args.sens.x; if (args.sens.y != 0) sensitivity.y = args.sens.y; + negative_multipliers.x = fabs(args.neg_multipliers.x); + negative_multipliers.y = fabs(args.neg_multipliers.y); + if ((combine_magnitudes && args.modes.x == accel_mode::noaccel) || (args.modes.x == accel_mode::noaccel && args.modes.y == accel_mode::noaccel)) { @@ -285,9 +289,16 @@ namespace rawaccel { } } - inline void apply_sensitivity(vec2d& movement) { + inline void apply_sensitivity(vec2d& movement) { movement.x *= sensitivity.x; movement.y *= sensitivity.y; + + if (negative_multipliers.x > 0 && movement.x < 0) { + movement.x *= negative_multipliers.x; + } + if (negative_multipliers.y > 0 && movement.y < 0) { + movement.y *= negative_multipliers.y; + } } mouse_modifier() = default; diff --git a/grapher/Models/AccelGUI.cs b/grapher/Models/AccelGUI.cs index f9291c1..e1cf462 100644 --- a/grapher/Models/AccelGUI.cs +++ b/grapher/Models/AccelGUI.cs @@ -140,7 +140,8 @@ namespace grapher combineMagnitudes = ApplyOptions.IsWhole, modes = ApplyOptions.GetModes(), args = newArgs, - minimumTime = driverSettings.minimumTime + minimumTime = driverSettings.minimumTime, + negativeMultipliers = driverSettings.negativeMultipliers }; ButtonDelay(WriteButton); diff --git a/grapher/Models/AccelGUIFactory.cs b/grapher/Models/AccelGUIFactory.cs index 3dc2a74..d789593 100644 --- a/grapher/Models/AccelGUIFactory.cs +++ b/grapher/Models/AccelGUIFactory.cs @@ -2,6 +2,7 @@ using grapher.Models.Mouse; using grapher.Models.Options; using grapher.Models.Serialized; +using System; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; @@ -331,7 +332,7 @@ namespace grapher.Models showLastMouseMoveMenuItem, showVelocityGainToolStripMenuItem); - var mouseWatcher = new MouseWatcher(form, mouseLabel, accelCharts, accelCalculator.PollRate); + var mouseWatcher = new MouseWatcher(form, mouseLabel, accelCharts, settings); return new AccelGUI( form, diff --git a/grapher/Models/Calculations/AccelData.cs b/grapher/Models/Calculations/AccelData.cs index 67d4f3f..778c5a2 100644 --- a/grapher/Models/Calculations/AccelData.cs +++ b/grapher/Models/Calculations/AccelData.cs @@ -56,9 +56,9 @@ namespace grapher.Models.Calculations OutVelocityToPoints.Clear(); } - public void CalculateDots(int x, int y, double timeInMs) + public void CalculateDots(double x, double y, double timeInMsRecip) { - var outVelocity = AccelCalculator.Velocity(x, y, timeInMs); + var outVelocity = AccelCalculator.Magnitude(x, y) * timeInMsRecip; (var inCombVel, var combSens, var combGain) = Combined.FindPointValuesFromOut(outVelocity); Estimated.Velocity.Set(inCombVel, outVelocity); @@ -66,10 +66,10 @@ namespace grapher.Models.Calculations Estimated.Gain.Set(inCombVel, combGain); } - public void CalculateDotsXY(int x, int y, double timeInMs) + public void CalculateDotsXY(double x, double y, double timeInMsRecip) { - var outX = Math.Abs(x) / timeInMs; - var outY = Math.Abs(y) / timeInMs; + var outX = Math.Abs(x) * timeInMsRecip; + var outY = Math.Abs(y) * timeInMsRecip; (var inXVelocity, var xSensitivity, var xGain) = X.FindPointValuesFromOut(outX); EstimatedX.Velocity.Set(inXVelocity, outX); @@ -82,10 +82,10 @@ namespace grapher.Models.Calculations EstimatedY.Gain.Set(inYVelocity, yGain); } - public void CalculateDotsCombinedDiffSens(int x, int y, double timeInMs, DriverSettings settings) + public void CalculateDotsCombinedDiffSens(double x, double y, double timeInMsRecip, DriverSettings settings) { (var xStripped, var yStripped) = AccelCalculator.StripSens(x, y, settings.sensitivity.x, settings.sensitivity.y); - var outVelocity = AccelCalculator.Velocity(xStripped, yStripped, timeInMs); + var outVelocity = AccelCalculator.Magnitude(xStripped, yStripped) * timeInMsRecip; if (OutVelocityToPoints.TryGetValue(outVelocity, out var points)) { diff --git a/grapher/Models/Charts/AccelCharts.cs b/grapher/Models/Charts/AccelCharts.cs index 6247811..188db10 100644 --- a/grapher/Models/Charts/AccelCharts.cs +++ b/grapher/Models/Charts/AccelCharts.cs @@ -99,9 +99,9 @@ namespace grapher #region Methods - public void MakeDots(int x, int y, double timeInMs) + public void MakeDots(double x, double y, double timeInMsRecip) { - ChartState.MakeDots(x, y, timeInMs); + ChartState.MakeDots(x, y, timeInMsRecip); } public void DrawLastMovement() diff --git a/grapher/Models/Charts/ChartState/ChartState.cs b/grapher/Models/Charts/ChartState/ChartState.cs index 270e212..c1b8e9b 100644 --- a/grapher/Models/Charts/ChartState/ChartState.cs +++ b/grapher/Models/Charts/ChartState/ChartState.cs @@ -40,7 +40,7 @@ namespace grapher.Models.Charts.ChartState internal bool TwoDotsPerGraph { get; set; } - public abstract void MakeDots(int x, int y, double timeInMs); + public abstract void MakeDots(double x, double y, double timeInMsRecip); public abstract void Bind(); diff --git a/grapher/Models/Charts/ChartState/CombinedState.cs b/grapher/Models/Charts/ChartState/CombinedState.cs index aab8a38..9fcdc11 100644 --- a/grapher/Models/Charts/ChartState/CombinedState.cs +++ b/grapher/Models/Charts/ChartState/CombinedState.cs @@ -30,9 +30,9 @@ namespace grapher.Models.Charts.ChartState GainChart.ClearSecondDots(); } - public override void MakeDots(int x, int y, double timeInMs) + public override void MakeDots(double x, double y, double timeInMsRecip) { - Data.CalculateDots(x, y, timeInMs); + Data.CalculateDots(x, y, timeInMsRecip); } public override void Bind() diff --git a/grapher/Models/Charts/ChartState/XYOneGraphState.cs b/grapher/Models/Charts/ChartState/XYOneGraphState.cs index 92c799f..95c4b20 100644 --- a/grapher/Models/Charts/ChartState/XYOneGraphState.cs +++ b/grapher/Models/Charts/ChartState/XYOneGraphState.cs @@ -28,9 +28,9 @@ namespace grapher.Models.Charts.ChartState GainChart.SetCombined(); } - public override void MakeDots(int x, int y, double timeInMs) + public override void MakeDots(double x, double y, double timeInMsRecip) { - Data.CalculateDotsCombinedDiffSens(x, y, timeInMs, Settings); + Data.CalculateDotsCombinedDiffSens(x, y, timeInMsRecip, Settings); } public override void Bind() diff --git a/grapher/Models/Charts/ChartState/XYTwoGraphState.cs b/grapher/Models/Charts/ChartState/XYTwoGraphState.cs index d107f87..075cc0f 100644 --- a/grapher/Models/Charts/ChartState/XYTwoGraphState.cs +++ b/grapher/Models/Charts/ChartState/XYTwoGraphState.cs @@ -33,9 +33,9 @@ namespace grapher.Models.Charts.ChartState GainChart.ClearSecondDots(); } - public override void MakeDots(int x, int y, double timeInMs) + public override void MakeDots(double x, double y, double timeInMsRecip) { - Data.CalculateDotsXY(x, y, timeInMs); + Data.CalculateDotsXY(x, y, timeInMsRecip); } public override void Bind() diff --git a/grapher/Models/Mouse/MouseWatcher.cs b/grapher/Models/Mouse/MouseWatcher.cs index 6209445..66e72bb 100644 --- a/grapher/Models/Mouse/MouseWatcher.cs +++ b/grapher/Models/Mouse/MouseWatcher.cs @@ -1,4 +1,5 @@ -using System; +using grapher.Models.Serialized; +using System; using System.Runtime.InteropServices; using System.Windows.Forms; @@ -677,12 +678,12 @@ namespace grapher.Models.Mouse #region Constructors - public MouseWatcher(Form containingForm, Label display, AccelCharts accelCharts, Field pollRate) + public MouseWatcher(Form containingForm, Label display, AccelCharts accelCharts, SettingsManager setMngr) { ContainingForm = containingForm; Display = display; AccelCharts = accelCharts; - PollRateField = pollRate; + SettingsManager = setMngr; MouseData = new MouseData(); RAWINPUTDEVICE device = new RAWINPUTDEVICE(); @@ -694,7 +695,7 @@ namespace grapher.Models.Mouse RAWINPUTDEVICE[] devices = new RAWINPUTDEVICE[1]; devices[0] = device; RegisterRawInputDevices(devices, 1, Marshal.SizeOf(typeof(RAWINPUTDEVICE))); - PollTime = 1; + PollTimeRecip = 1; PollRate = 1000; } @@ -708,24 +709,18 @@ namespace grapher.Models.Mouse private AccelCharts AccelCharts { get; } - private Field PollRateField { get; set; } + private SettingsManager SettingsManager { get; } private MouseData MouseData { get; } private double PollRate { get; set; } - private double PollTime { get; set; } + private double PollTimeRecip { get; set; } #endregion Properties #region Methods - public void OnMouseMove(int x, int y, double timeInMs) - { - MouseData.Set(x,y); - AccelCharts.MakeDots(x, y, timeInMs); - } - public void UpdateLastMove() { MouseData.Get(out var x, out var y); @@ -740,15 +735,34 @@ namespace grapher.Models.Mouse outSize = GetRawInputData((IntPtr)message.LParam, RawInputCommand.Input, out rawInput, ref size, Marshal.SizeOf(typeof(RAWINPUTHEADER))); - if (PollRateField.Data != PollRate) + if (SettingsManager.PollRateField.Data != PollRate) { - PollRate = PollRateField.Data; - PollTime = 1000 / PollRate; + PollRate = SettingsManager.PollRateField.Data; + PollTimeRecip = Math.Abs(SettingsManager.PollRateField.Data) / 1000; } if (rawInput.Data.Mouse.LastX != 0 || rawInput.Data.Mouse.LastY != 0) { - OnMouseMove(rawInput.Data.Mouse.LastX, rawInput.Data.Mouse.LastY, PollTime); + double x = rawInput.Data.Mouse.LastX; + double y = rawInput.Data.Mouse.LastY; + + // strip negative multipliers, charts calculated from positive input + + Vec2<double> negMults = SettingsManager.RawAccelSettings + .AccelerationSettings.negativeMultipliers; + + if (negMults.x > 0 && x < 0) + { + x /= negMults.x; + } + + if (negMults.y > 0 && y < 0) + { + y /= negMults.y; + } + + MouseData.Set(rawInput.Data.Mouse.LastX, rawInput.Data.Mouse.LastY); + AccelCharts.MakeDots(x, y, PollTimeRecip); } } diff --git a/grapher/Models/Serialized/RawAccelSettings.cs b/grapher/Models/Serialized/RawAccelSettings.cs index af87a65..67953ac 100644 --- a/grapher/Models/Serialized/RawAccelSettings.cs +++ b/grapher/Models/Serialized/RawAccelSettings.cs @@ -127,6 +127,8 @@ namespace grapher.Models.Serialized return accelSettings.sensitivity.x == 1 && accelSettings.sensitivity.y == 1 && + accelSettings.negativeMultipliers.x <= 0 && + accelSettings.negativeMultipliers.y <= 0 && accelSettings.rotation == 0 && accelSettings.modes.x == AccelMode.noaccel && wholeOrNoY; diff --git a/grapher/Models/Serialized/SettingsManager.cs b/grapher/Models/Serialized/SettingsManager.cs index f5bb1f1..41ebcb5 100644 --- a/grapher/Models/Serialized/SettingsManager.cs +++ b/grapher/Models/Serialized/SettingsManager.cs @@ -34,9 +34,9 @@ namespace grapher.Models.Serialized public RawAccelSettings RawAccelSettings { get; private set; } - private Field DpiField { get; set; } + public Field DpiField { get; private set; } - private Field PollRateField { get; set; } + public Field PollRateField { get; private set; } private ToolStripMenuItem AutoWriteMenuItem { get; set; } diff --git a/wrapper/wrapper.cpp b/wrapper/wrapper.cpp index acd0dbf..54bfb91 100644 --- a/wrapper/wrapper.cpp +++ b/wrapper/wrapper.cpp @@ -71,7 +71,10 @@ public ref struct DriverSettings [JsonProperty("Sensitivity multipliers")] Vec2<double> sensitivity; - + + [JsonProperty("Negative directional multipliers", Required = Required::Default)] + Vec2<double> negativeMultipliers; + [JsonProperty(Required = Required::Default)] double minimumTime; |