summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authora1xd <[email protected]>2020-12-03 20:00:31 -0500
committera1xd <[email protected]>2020-12-03 20:00:31 -0500
commit5657d5a54c0a8e980c9b0cac39e2d16e452f302e (patch)
tree03c254c41dba5f64a998ac13c38e36943bf8b942
parentupdate writer - use messagebox instead of console (diff)
downloadrawaccel-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.h1
-rw-r--r--common/rawaccel.hpp13
-rw-r--r--grapher/Models/AccelGUI.cs3
-rw-r--r--grapher/Models/AccelGUIFactory.cs3
-rw-r--r--grapher/Models/Calculations/AccelData.cs14
-rw-r--r--grapher/Models/Charts/AccelCharts.cs4
-rw-r--r--grapher/Models/Charts/ChartState/ChartState.cs2
-rw-r--r--grapher/Models/Charts/ChartState/CombinedState.cs4
-rw-r--r--grapher/Models/Charts/ChartState/XYOneGraphState.cs4
-rw-r--r--grapher/Models/Charts/ChartState/XYTwoGraphState.cs4
-rw-r--r--grapher/Models/Mouse/MouseWatcher.cs46
-rw-r--r--grapher/Models/Serialized/RawAccelSettings.cs2
-rw-r--r--grapher/Models/Serialized/SettingsManager.cs4
-rw-r--r--wrapper/wrapper.cpp5
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;