New customizable output curve functionality. User can create any kind of output curve via a bezier curve editor (external HTML web app in BezierCurveEditor folder).

This commit is contained in:
mika-n 2019-07-07 00:47:54 +03:00
parent 7a2224f109
commit 22866d6a5c
9 changed files with 10638 additions and 370 deletions

View File

@ -0,0 +1,250 @@
/* MIT License
*
* KeySpline - use bezier curve for transition easing function
* Copyright (c) 2012 Gaetan Renaudeau <renaudeau.gaetan@gmail.com> (GRE)
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/* KeySpline - use bezier curve for transition easing function is inspired from Firefox's nsSMILKeySpline.cpp */
/*
* This file contains the original bezier curve code (see comments above) and calculations ported as C# code. The original code was in JavaScript.
*
* This file has few customizations and optimizations for the needs of DS4Windows application (see https://github.com/Ryochan7/DS4Windows).
* MIT License. Permission is hereby granted, free of charge, to any person to do whatever they want with this C# ported version of BezierCurve calculation code
* as long usage is in compliance with the above shown original license, also.
*
* Copyright (c) 2019, MIKA-N (https://github.com/mika-n).
*
* The original JavaScript version of bezier easing made by GRE (https://github.com/gre/bezier-easing).
*
* Usage:
* BezierCurve.InitBezierCurve = Initialize bezier curve and output lookup table. Must be called at least once before calling GetBezierEasing method (or accessing lookup table directly) to re-map analog axis input.
* BezierCurve.GetBezierEasing = Return re-mapped output value for an input axis value (or alternatively directly accessing the lookup table BezierCurve.arrayBezierLUT[inputVal] if even tiny CPU cycles matter)
*
*/
using System;
namespace DS4Windows
{
public class BezierCurve
{
public enum AxisType { LSRS, L2R2, SA };
private static int kSplineTableSize = 11;
private static double kSampleStepSize = 1.0 / (kSplineTableSize - 1.0);
private double[] arraySampleValues;
// These values are established by empiricism with tests (tradeoff: performance VS precision) (comment by GRE)
private static int NEWTON_ITERATIONS = 4;
private static double NEWTON_MIN_SLOPE = 0.001;
private static double SUBDIVISION_PRECISION = 0.0000001;
private static int SUBDIVISION_MAX_ITERATIONS = 10;
private double mX1 = 0, mY1 = 0, mX2 = 0, mY2 = 0; // Bezier curve definition (0, 0, 0, 0 = Linear)
// Set or Get string representation of the bezier curve definition value (Note! Set doesn't initialize the lookup table. InitBezierCurve needs to be called to actually initalize the calculation)
public string AsString
{
get { return ($"{mX1}, {mY1}, {mX2}, {mY2}"); }
set
{
// Set bezier curve defintion from a string value (4 comma separated decimals). If any of the string values are invalid then set curve as linear "zero" curve
string[] bezierDef = value.Split(new Char[] { ',' }, 4);
if (bezierDef.Length < 4 || !Double.TryParse(bezierDef[0], out mX1) || !Double.TryParse(bezierDef[1], out mY1) || !Double.TryParse(bezierDef[2], out mX2) || !Double.TryParse(bezierDef[3], out mY2) )
mX1 = mY1 = mX2 = mY2 = 0;
}
}
// Custom definition set by DS4Windows options screens. This string is not validated, but AsString property returns validated value
public string CustomDefinition { get; set; }
public string ToString() { return this.CustomDefinition; }
public AxisType axisType;
// Lookup result table is always either in 0..128 or 0..255 range depending on the DS4 analog axis range. LUT table set as public to let DS4Win reading thread to access it directly (every CPU cycle matters)
public byte[] arrayBezierLUT = null;
public BezierCurve()
{
CustomDefinition = "";
}
public bool InitBezierCurve(string bezierCurveDefinition, AxisType gamepadAxisType)
{
this.AsString = bezierCurveDefinition;
return InitBezierCurve(mX1, mY1, mX2, mY2, gamepadAxisType);
}
public bool InitBezierCurve(double x1, double y1, double x2, double y2, AxisType gamepadAxisType)
{
if (arrayBezierLUT == null)
arrayBezierLUT = new byte[256];
if (x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1)
return false;
//throw new Exception("INVALID VALUE. BezierCurve X1 and X2 should be in [0, 1] range");
mX1 = x1;
mY1 = y1;
mX2 = x2;
mY2 = y2;
axisType = gamepadAxisType;
// If this is linear definition then init the lookup table with 1-on-1 mapping
if(x1 == 0 && y1 == 0 && x2 == 0 && y2 == 0)
{
for (int idx = 0; idx <= 255; idx++)
arrayBezierLUT[idx] = (byte)idx;
return true;
}
try
{
double axisMaxDouble;
double axisCenterPosDouble;
switch (gamepadAxisType)
{
case AxisType.LSRS:
axisMaxDouble = 127; // DS4 LS/RS axis has a "center position" at 128. Left turn has 0..127 positions and right turn 128..255 positions.
axisCenterPosDouble = 128;
break;
case AxisType.L2R2:
axisMaxDouble = 255; // L2R2 analog trigger range 0..255
axisCenterPosDouble = 0;
break;
default:
axisMaxDouble = 128; // SixAxis x/z/y range 0..128
axisCenterPosDouble = 0;
break;
}
arraySampleValues = new double[BezierCurve.kSplineTableSize];
for (int idx = 0; idx < BezierCurve.kSplineTableSize; idx++)
arraySampleValues[idx] = CalcBezier(idx * BezierCurve.kSampleStepSize, mX1, mX2);
// Pre-populate lookup result table for GetBezierEasing function (performance optimization)
for (byte idx = 0; idx <= (byte)axisMaxDouble; idx++)
{
arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)(Global.Clamp(0, Math.Round(CalcBezier(getTForX(idx / axisMaxDouble), mY1, mY2) * axisMaxDouble), axisMaxDouble) + axisCenterPosDouble);
// Invert curve from a right side of the center position (128) to the left tilted stick axis (or from up tilt to down tilt)
if (gamepadAxisType == AxisType.LSRS)
arrayBezierLUT[127 - idx] = (byte)(255 - arrayBezierLUT[idx + (byte)axisCenterPosDouble]);
// If the axisMaxDouble is 255 then we need this to break the look (byte is unsigned 0..255, so the FOR loop never reaches 256 idx value. C# would throw an overflow exceptio)
if (idx == axisMaxDouble) break;
}
}
finally
{
arraySampleValues = null;
}
return true;
}
public byte GetBezierEasing(byte inputXValue)
{
unchecked
{
return (arrayBezierLUT == null ? inputXValue : arrayBezierLUT[inputXValue]);
//return (byte)(Global.Clamp(0, Math.Round(CalcBezier(getTForX(inputXValue / 255), mY1, mY2) * 255), 255));
}
}
private double A(double aA1, double aA2) { return 1.0 - 3.0 * aA2 + 3.0 * aA1; }
private double B(double aA1, double aA2) { return 3.0 * aA2 - 6.0 * aA1; }
private double C(double aA1) { return 3.0 * aA1; }
private double CalcBezier(double aT, double aA1, double aA2)
{
return ((A(aA1, aA2) * aT + B(aA1, aA2)) * aT + C(aA1)) * aT;
}
private double getTForX(double aX)
{
double intervalStart = 0.0;
int currentSample = 1;
int lastSample = kSplineTableSize - 1;
for (; currentSample != lastSample && arraySampleValues[currentSample] <= aX; ++currentSample)
{
intervalStart += kSampleStepSize;
}
--currentSample;
// Interpolate to provide an initial guess for t
double dist = (aX - arraySampleValues[currentSample]) / (arraySampleValues[currentSample + 1] - arraySampleValues[currentSample]);
double guessForT = intervalStart + dist * kSampleStepSize;
double initialSlope = getSlope(guessForT, mX1, mX2);
if (initialSlope >= NEWTON_MIN_SLOPE)
{
return newtonRaphsonIterate(aX, guessForT /*, mX1, mX2*/);
}
else if (initialSlope == 0.0)
{
return guessForT;
}
else
{
return binarySubdivide(aX, intervalStart, intervalStart + kSampleStepSize /*, mX1, mX2*/);
}
}
// Returns dx/dt given t, x1, and x2, or dy/dt given t, y1, and y2.
private double getSlope(double aT, double aA1, double aA2)
{
return 3.0 * A(aA1, aA2) * aT * aT + 2.0 * B(aA1, aA2) * aT + C(aA1);
}
private double newtonRaphsonIterate(double aX, double aGuessT /*, double mX1, double mX2*/)
{
for (int i = 0; i < BezierCurve.NEWTON_ITERATIONS; ++i)
{
double currentSlope = getSlope(aGuessT, mX1, mX2);
if (currentSlope == 0.0)
{
return aGuessT;
}
double currentX = CalcBezier(aGuessT, mX1, mX2) - aX;
aGuessT -= currentX / currentSlope;
}
return aGuessT;
}
private double binarySubdivide(double aX, double aA, double aB /*, double mX1, double mX2*/)
{
double currentX, currentT, i = 0;
do
{
currentT = aA + (aB - aA) / 2.0;
currentX = CalcBezier(currentT, mX1, mX2) - aX;
if (currentX > 0.0)
{
aB = currentT;
}
else
{
aA = currentT;
}
} while (Math.Abs(currentX) > BezierCurve.SUBDIVISION_PRECISION && ++i < BezierCurve.SUBDIVISION_MAX_ITERATIONS);
return currentT;
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Bezier Curve Editor for DS4Windows</title>
</head>
<body>
<script src="build.js"></script>
</body>
</html>

View File

@ -253,11 +253,12 @@ namespace DS4Windows
// Define here to save some time processing.
// It is enough to feel a difference during gameplay.
private static int[] rsOutCurveModeArray = new int[4] { 0, 0, 0, 0 };
private static int[] lsOutCurveModeArray = new int[4] { 0, 0, 0, 0 };
static bool tempBool = false;
private static double[] tempDoubleArray = new double[4] { 0.0, 0.0, 0.0, 0.0 };
private static int[] tempIntArray = new int[4] { 0, 0, 0, 0 };
// 201907: Commented out these temp variables because those were not actually used anymore (value was assigned but it was never used anywhere)
//private static int[] rsOutCurveModeArray = new int[4] { 0, 0, 0, 0 };
//private static int[] lsOutCurveModeArray = new int[4] { 0, 0, 0, 0 };
//static bool tempBool = false;
//private static double[] tempDoubleArray = new double[4] { 0.0, 0.0, 0.0, 0.0 };
//private static int[] tempIntArray = new int[4] { 0, 0, 0, 0 };
// Special macros
static bool altTabDone = true;
@ -533,11 +534,11 @@ namespace DS4Windows
public static DS4State SetCurveAndDeadzone(int device, DS4State cState, DS4State dState)
{
double rotation = tempDoubleArray[device] = getLSRotation(device);
double rotation = /*tempDoubleArray[device] =*/ getLSRotation(device);
if (rotation > 0.0 || rotation < 0.0)
cState.rotateLSCoordinates(rotation);
double rotationRS = tempDoubleArray[device] = getRSRotation(device);
double rotationRS = /*tempDoubleArray[device] =*/ getRSRotation(device);
if (rotationRS > 0.0 || rotationRS < 0.0)
cState.rotateRSCoordinates(rotationRS);
@ -910,84 +911,10 @@ namespace DS4Windows
dState.LY = (byte)(tempY * capY + 128.0);
}
int lsOutCurveMode = lsOutCurveModeArray[device] = getLsOutCurveMode(device);
if (lsOutCurveMode > 0 && (dState.LX != 128 || dState.LY != 128))
if (getLsOutCurveMode(device) > 0)
{
double capX = dState.LX >= 128 ? 127.0 : 128.0;
double capY = dState.LY >= 128 ? 127.0 : 128.0;
double tempX = (dState.LX - 128.0) / capX;
double tempY = (dState.LY - 128.0) / capY;
double signX = tempX >= 0.0 ? 1.0 : -1.0;
double signY = tempY >= 0.0 ? 1.0 : -1.0;
if (lsOutCurveMode == 1)
{
double absX = Math.Abs(tempX);
double absY = Math.Abs(tempY);
double outputX = 0.0;
double outputY = 0.0;
if (absX <= 0.4)
{
outputX = 0.55 * absX;
}
else if (absX <= 0.75)
{
outputX = absX - 0.18;
}
else if (absX > 0.75)
{
outputX = (absX * 1.72) - 0.72;
}
if (absY <= 0.4)
{
outputY = 0.55 * absY;
}
else if (absY <= 0.75)
{
outputY = absY - 0.18;
}
else if (absY > 0.75)
{
outputY = (absY * 1.72) - 0.72;
}
dState.LX = (byte)(outputX * signX * capX + 128.0);
dState.LY = (byte)(outputY * signY * capY + 128.0);
}
else if (lsOutCurveMode == 2)
{
double outputX = tempX * tempX;
double outputY = tempY * tempY;
dState.LX = (byte)(outputX * signX * capX + 128.0);
dState.LY = (byte)(outputY * signY * capY + 128.0);
}
else if (lsOutCurveMode == 3)
{
double outputX = tempX * tempX * tempX;
double outputY = tempY * tempY * tempY;
dState.LX = (byte)(outputX * capX + 128.0);
dState.LY = (byte)(outputY * capY + 128.0);
}
else if (lsOutCurveMode == 4)
{
double absX = Math.Abs(tempX);
double absY = Math.Abs(tempY);
double outputX = absX * (absX - 2.0);
double outputY = absY * (absY - 2.0);
dState.LX = (byte)(-1.0 * outputX * signX * capX + 128.0);
dState.LY = (byte)(-1.0 * outputY * signY * capY + 128.0);
}
else if (lsOutCurveMode == 5)
{
double innerX = Math.Abs(tempX) - 1.0;
double innerY = Math.Abs(tempY) - 1.0;
double outputX = innerX * innerX * innerX + 1.0;
double outputY = innerY * innerY * innerY + 1.0;
dState.LX = (byte)(1.0 * outputX * signX * capX + 128.0);
dState.LY = (byte)(1.0 * outputY * signY * capY + 128.0);
}
dState.LX = lsOutBezierCurveObj[device].arrayBezierLUT[dState.LX];
dState.LY = lsOutBezierCurveObj[device].arrayBezierLUT[dState.LY];
}
if (squStk.rsMode && (dState.RX != 128 || dState.RY != 128))
@ -1008,141 +935,19 @@ namespace DS4Windows
dState.RY = (byte)(tempY * capY + 128.0);
}
int rsOutCurveMode = rsOutCurveModeArray[device] = getRsOutCurveMode(device);
if (rsOutCurveMode > 0 && (dState.RX != 128 || dState.RY != 128))
if (getRsOutCurveMode(device) > 0)
{
double capX = dState.RX >= 128 ? 127.0 : 128.0;
double capY = dState.RY >= 128 ? 127.0 : 128.0;
double tempX = (dState.RX - 128.0) / capX;
double tempY = (dState.RY - 128.0) / capY;
double signX = tempX >= 0.0 ? 1.0 : -1.0;
double signY = tempY >= 0.0 ? 1.0 : -1.0;
if (rsOutCurveMode == 1)
{
double absX = Math.Abs(tempX);
double absY = Math.Abs(tempY);
double outputX = 0.0;
double outputY = 0.0;
if (absX <= 0.4)
{
outputX = 0.55 * absX;
}
else if (absX <= 0.75)
{
outputX = absX - 0.18;
}
else if (absX > 0.75)
{
outputX = (absX * 1.72) - 0.72;
dState.RX = rsOutBezierCurveObj[device].arrayBezierLUT[dState.RX];
dState.RY = rsOutBezierCurveObj[device].arrayBezierLUT[dState.RY];
}
if (absY <= 0.4)
{
outputY = 0.55 * absY;
}
else if (absY <= 0.75)
{
outputY = absY - 0.18;
}
else if (absY > 0.75)
{
outputY = (absY * 1.72) - 0.72;
}
if (getL2OutCurveMode(device) > 0)
dState.L2 = l2OutBezierCurveObj[device].arrayBezierLUT[dState.L2];
dState.RX = (byte)(outputX * signX * capX + 128.0);
dState.RY = (byte)(outputY * signY * capY + 128.0);
}
else if (rsOutCurveMode == 2)
{
double outputX = tempX * tempX;
double outputY = tempY * tempY;
dState.RX = (byte)(outputX * signX * capX + 128.0);
dState.RY = (byte)(outputY * signY * capY + 128.0);
}
else if (rsOutCurveMode == 3)
{
double outputX = tempX * tempX * tempX;
double outputY = tempY * tempY * tempY;
dState.RX = (byte)(outputX * capX + 128.0);
dState.RY = (byte)(outputY * capY + 128.0);
}
else if (rsOutCurveMode == 4)
{
double absX = Math.Abs(tempX);
double absY = Math.Abs(tempY);
double outputX = absX * (absX - 2.0);
double outputY = absY * (absY - 2.0);
dState.RX = (byte)(-1.0 * outputX * signX * capX + 128.0);
dState.RY = (byte)(-1.0 * outputY * signY * capY + 128.0);
}
else if (rsOutCurveMode == 5)
{
double innerX = Math.Abs(tempX) - 1.0;
double innerY = Math.Abs(tempY) - 1.0;
double outputX = innerX * innerX * innerX + 1.0;
double outputY = innerY * innerY * innerY + 1.0;
dState.RX = (byte)(1.0 * outputX * signX * capX + 128.0);
dState.RY = (byte)(1.0 * outputY * signY * capY + 128.0);
}
}
if (getR2OutCurveMode(device) > 0)
dState.R2 = r2OutBezierCurveObj[device].arrayBezierLUT[dState.R2];
int l2OutCurveMode = tempIntArray[device] = getL2OutCurveMode(device);
if (l2OutCurveMode > 0 && dState.L2 != 0)
{
double temp = dState.L2 / 255.0;
if (l2OutCurveMode == 1)
{
double output = temp * temp;
dState.L2 = (byte)(output * 255.0);
}
else if (l2OutCurveMode == 2)
{
double output = temp * temp * temp;
dState.L2 = (byte)(output * 255.0);
}
else if (l2OutCurveMode == 3)
{
double output = temp * (temp - 2.0);
dState.L2 = (byte)(-1.0 * output * 255.0);
}
else if (l2OutCurveMode == 4)
{
double inner = Math.Abs(temp) - 1.0;
double output = inner * inner * inner + 1.0;
dState.L2 = (byte)(-1.0 * output * 255.0);
}
}
int r2OutCurveMode = tempIntArray[device] = getR2OutCurveMode(device);
if (r2OutCurveMode > 0 && dState.R2 != 0)
{
double temp = dState.R2 / 255.0;
if (r2OutCurveMode == 1)
{
double output = temp * temp;
dState.R2 = (byte)(output * 255.0);
}
else if (r2OutCurveMode == 2)
{
double output = temp * temp * temp;
dState.R2 = (byte)(output * 255.0);
}
else if (r2OutCurveMode == 3)
{
double output = temp * (temp - 2.0);
dState.R2 = (byte)(-1.0 * output * 255.0);
}
else if (r2OutCurveMode == 4)
{
double inner = Math.Abs(temp) - 1.0;
double output = inner * inner * inner + 1.0;
dState.R2 = (byte)(-1.0 * output * 255.0);
}
}
bool sOff = tempBool = isUsingSAforMouse(device);
bool sOff = /*tempBool =*/ isUsingSAforMouse(device);
if (sOff == false)
{
int SXD = (int)(128d * getSXDeadzone(device));
@ -1198,68 +1003,16 @@ namespace DS4Windows
(int)Math.Min(128d, szsens * 128d * (absz / 128d));
}
int sxOutCurveMode = tempIntArray[device] = getSXOutCurveMode(device);
if (sxOutCurveMode > 0 && dState.Motion.outputAccelX != 0)
if (getSXOutCurveMode(device) > 0)
{
double temp = dState.Motion.outputAccelX / 128.0;
double sign = Math.Sign(temp);
if (sxOutCurveMode == 1)
{
double output = temp * temp;
result = (int)(output * sign * 128.0);
dState.Motion.outputAccelX = result;
}
else if (sxOutCurveMode == 2)
{
double output = temp * temp * temp;
result = (int)(output * 128.0);
dState.Motion.outputAccelX = result;
}
else if (sxOutCurveMode == 3)
{
double abs = Math.Abs(temp);
double output = abs * (abs - 2.0);
dState.Motion.outputAccelX = (byte)(-1.0 * output *
sign * 128.0);
}
else if (sxOutCurveMode == 4)
{
double inner = Math.Abs(temp) - 1.0;
double output = inner * inner * inner + 1.0;
dState.Motion.outputAccelX = (byte)(-1.0 * output * 255.0);
}
int signSA = Math.Sign(dState.Motion.outputAccelX);
dState.Motion.outputAccelX = sxOutBezierCurveObj[device].arrayBezierLUT[Math.Min(Math.Abs(dState.Motion.outputAccelX), 128)] * signSA;
}
int szOutCurveMode = tempIntArray[device] = getSZOutCurveMode(device);
if (szOutCurveMode > 0 && dState.Motion.outputAccelZ != 0)
if (getSZOutCurveMode(device) > 0)
{
double temp = dState.Motion.outputAccelZ / 128.0;
double sign = Math.Sign(temp);
if (szOutCurveMode == 1)
{
double output = temp * temp;
result = (int)(output * sign * 128.0);
dState.Motion.outputAccelZ = result;
}
else if (szOutCurveMode == 2)
{
double output = temp * temp * temp;
result = (int)(output * 128.0);
dState.Motion.outputAccelZ = result;
}
else if (szOutCurveMode == 3)
{
double abs = Math.Abs(temp);
double output = abs * (abs - 2.0);
dState.Motion.outputAccelZ = (byte)(-1.0 * output *
sign * 128.0);
}
else if (szOutCurveMode == 4)
{
double inner = Math.Abs(temp) - 1.0;
double output = inner * inner * inner + 1.0;
dState.Motion.outputAccelZ = (byte)(-1.0 * output * 255.0);
}
int signSA = Math.Sign(dState.Motion.outputAccelZ);
dState.Motion.outputAccelZ = szOutBezierCurveObj[device].arrayBezierLUT[Math.Min(Math.Abs(dState.Motion.outputAccelZ), 128)] * signSA;
}
}
@ -2064,11 +1817,11 @@ namespace DS4Windows
actionFound = true;
DS4Device d = ctrl.DS4Controllers[device];
bool synced = tempBool = d.isSynced();
bool synced = /*tempBool =*/ d.isSynced();
if (synced && !d.isCharging())
{
ConnectionType deviceConn = d.getConnectionType();
bool exclusive = tempBool = d.isExclusive();
bool exclusive = /*tempBool =*/ d.isExclusive();
if (deviceConn == ConnectionType.BT)
{
d.DisconnectBT();

View File

@ -1214,41 +1214,65 @@ namespace DS4Windows
return m_Config.squStickInfo[device];
}
public static int[] lsOutCurveMode => m_Config.lsOutCurveMode;
public static void setLsOutCurveMode(int index, int value)
{
m_Config.setLsOutCurveMode(index, value);
}
public static int getLsOutCurveMode(int index)
{
return m_Config.lsOutCurveMode[index];
return m_Config.getLsOutCurveMode(index);
}
public static BezierCurve[] lsOutBezierCurveObj => m_Config.lsOutBezierCurveObj;
public static int[] rsOutCurveMode => m_Config.rsOutCurveMode;
public static void setRsOutCurveMode(int index, int value)
{
m_Config.setRsOutCurveMode(index, value);
}
public static int getRsOutCurveMode(int index)
{
return m_Config.rsOutCurveMode[index];
return m_Config.getRsOutCurveMode(index);
}
public static BezierCurve[] rsOutBezierCurveObj => m_Config.rsOutBezierCurveObj;
public static int[] l2OutCurveMode => m_Config.l2OutCurveMode;
public static void setL2OutCurveMode(int index, int value)
{
m_Config.setL2OutCurveMode(index, value);
}
public static int getL2OutCurveMode(int index)
{
return m_Config.l2OutCurveMode[index];
return m_Config.getL2OutCurveMode(index);
}
public static BezierCurve[] l2OutBezierCurveObj => m_Config.l2OutBezierCurveObj;
public static int[] r2OutCurveMode => m_Config.r2OutCurveMode;
public static void setR2OutCurveMode(int index, int value)
{
m_Config.setR2OutCurveMode(index, value);
}
public static int getR2OutCurveMode(int index)
{
return m_Config.r2OutCurveMode[index];
return m_Config.getR2OutCurveMode(index);
}
public static BezierCurve[] r2OutBezierCurveObj => m_Config.r2OutBezierCurveObj;
public static int[] sxOutCurveMode => m_Config.sxOutCurveMode;
public static void setSXOutCurveMode(int index, int value)
{
m_Config.setSXOutCurveMode(index, value);
}
public static int getSXOutCurveMode(int index)
{
return m_Config.sxOutCurveMode[index];
return m_Config.getSXOutCurveMode(index);
}
public static BezierCurve[] sxOutBezierCurveObj => m_Config.sxOutBezierCurveObj;
public static int[] szOutCurveMode => m_Config.szOutCurveMode;
public static void setSZOutCurveMode(int index, int value)
{
m_Config.setSZOutCurveMode(index, value);
}
public static int getSZOutCurveMode(int index)
{
return m_Config.szOutCurveMode[index];
return m_Config.getSZOutCurveMode(index);
}
public static BezierCurve[] szOutBezierCurveObj => m_Config.szOutBezierCurveObj;
public static bool[] TrackballMode => m_Config.trackballMode;
public static bool getTrackballMode(int index)
@ -1687,12 +1711,75 @@ namespace DS4Windows
new SquareStickInfo(), new SquareStickInfo(),
new SquareStickInfo(),
};
public int[] lsOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int[] rsOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int[] l2OutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int[] r2OutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int[] sxOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int[] szOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
private void setOutBezierCurveObjArrayItem(BezierCurve[] bezierCurveArray, int device, int curveOptionValue, BezierCurve.AxisType axisType)
{
// Set bezier curve obj of axis. 0=Linear (no curve mapping), 1-5=Pre-defined curves, 6=User supplied custom curve string value of a profile (comma separated list of 4 decimal numbers)
switch (curveOptionValue)
{
case 1: bezierCurveArray[device].InitBezierCurve(0.70, 0.28, 1.00, 1.00, axisType); break; // Enhanced Precision
case 2: bezierCurveArray[device].InitBezierCurve(0.55, 0.09, 0.68, 0.53, axisType); break; // Quadric
case 3: bezierCurveArray[device].InitBezierCurve(0.74, 0.12, 0.64, 0.29, axisType); break; // Cubic
case 4: bezierCurveArray[device].InitBezierCurve(0.00, 0.00, 0.41, 0.96, axisType); break; // Easeout Quad
case 5: bezierCurveArray[device].InitBezierCurve(0.08, 0.22, 0.22, 0.91, axisType); break; // Easeout Cubic
case 6: bezierCurveArray[device].InitBezierCurve(bezierCurveArray[device].CustomDefinition, axisType); break; // Custom output curve
}
}
public BezierCurve[] lsOutBezierCurveObj = new BezierCurve[5] { new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve() };
public BezierCurve[] rsOutBezierCurveObj = new BezierCurve[5] { new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve() };
public BezierCurve[] l2OutBezierCurveObj = new BezierCurve[5] { new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve() };
public BezierCurve[] r2OutBezierCurveObj = new BezierCurve[5] { new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve() };
public BezierCurve[] sxOutBezierCurveObj = new BezierCurve[5] { new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve() };
public BezierCurve[] szOutBezierCurveObj = new BezierCurve[5] { new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve(), new BezierCurve() };
private int[] _lsOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int getLsOutCurveMode(int index) { return _lsOutCurveMode[index]; }
public void setLsOutCurveMode(int index, int value)
{
if (value >= 1) setOutBezierCurveObjArrayItem(lsOutBezierCurveObj, index, value, BezierCurve.AxisType.LSRS);
_lsOutCurveMode[index] = value;
}
private int[] _rsOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int getRsOutCurveMode(int index) { return _rsOutCurveMode[index]; }
public void setRsOutCurveMode(int index, int value)
{
if (value >= 1) setOutBezierCurveObjArrayItem(rsOutBezierCurveObj, index, value, BezierCurve.AxisType.LSRS);
_rsOutCurveMode[index] = value;
}
private int[] _l2OutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int getL2OutCurveMode(int index) { return _l2OutCurveMode[index]; }
public void setL2OutCurveMode(int index, int value)
{
if (value >= 1) setOutBezierCurveObjArrayItem(l2OutBezierCurveObj, index, value, BezierCurve.AxisType.L2R2);
_l2OutCurveMode[index] = value;
}
private int[] _r2OutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int getR2OutCurveMode(int index) { return _r2OutCurveMode[index]; }
public void setR2OutCurveMode(int index, int value)
{
if (value >= 1) setOutBezierCurveObjArrayItem(r2OutBezierCurveObj, index, value, BezierCurve.AxisType.L2R2);
_r2OutCurveMode[index] = value;
}
private int[] _sxOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int getSXOutCurveMode(int index) { return _sxOutCurveMode[index]; }
public void setSXOutCurveMode(int index, int value)
{
if (value >= 1) setOutBezierCurveObjArrayItem(sxOutBezierCurveObj, index, value, BezierCurve.AxisType.SA);
_sxOutCurveMode[index] = value;
}
private int[] _szOutCurveMode = new int[5] { 0, 0, 0, 0, 0 };
public int getSZOutCurveMode(int index) { return _szOutCurveMode[index]; }
public void setSZOutCurveMode(int index, int value)
{
if (value >= 1) setOutBezierCurveObjArrayItem(szOutBezierCurveObj, index, value, BezierCurve.AxisType.SA);
_szOutCurveMode[index] = value;
}
public DS4Color[] m_LowLeds = new DS4Color[5]
{
@ -1838,6 +1925,7 @@ namespace DS4Windows
case 3: result = "cubic"; break;
case 4: result = "easeout-quad"; break;
case 5: result = "easeout-cubic"; break;
case 6: result = "custom"; break;
default: break;
}
@ -1855,6 +1943,7 @@ namespace DS4Windows
case "cubic": id = 3; break;
case "easeout-quad": id = 4; break;
case "easeout-cubic": id = 5; break;
case "custom": id = 6; break;
default: break;
}
@ -1863,34 +1952,12 @@ namespace DS4Windows
private string axisOutputCurveString(int id)
{
string result = "linear";
switch (id)
{
case 0: break;
case 1: result = "quadratic"; break;
case 2: result = "cubic"; break;
case 3: result = "easeout-quad"; break;
case 4: result = "easeout-cubic"; break;
default: break;
}
return result;
return stickOutputCurveString(id);
}
private int axisOutputCurveId(string name)
{
int id = 0;
switch (name)
{
case "linear": id = 0; break;
case "quadratic": id = 1; break;
case "cubic": id = 2; break;
case "easeout-quad": id = 3; break;
case "easeout-cubic": id = 4; break;
default: break;
}
return id;
return stickOutputCurveId(name);
}
private bool SaTriggerCondValue(string text)
@ -2068,19 +2135,29 @@ namespace DS4Windows
XmlNode xmlRSC = m_Xdoc.CreateNode(XmlNodeType.Element, "RSCurve", null); xmlRSC.InnerText = rsCurve[device].ToString(); Node.AppendChild(xmlRSC);
XmlNode xmlProfileActions = m_Xdoc.CreateNode(XmlNodeType.Element, "ProfileActions", null); xmlProfileActions.InnerText = string.Join("/", profileActions[device]); Node.AppendChild(xmlProfileActions);
XmlNode xmlBTPollRate = m_Xdoc.CreateNode(XmlNodeType.Element, "BTPollRate", null); xmlBTPollRate.InnerText = btPollRate[device].ToString(); Node.AppendChild(xmlBTPollRate);
XmlNode xmlLsOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "LSOutputCurveMode", null); xmlLsOutputCurveMode.InnerText = stickOutputCurveString(lsOutCurveMode[device]); Node.AppendChild(xmlLsOutputCurveMode);
XmlNode xmlRsOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "RSOutputCurveMode", null); xmlRsOutputCurveMode.InnerText = stickOutputCurveString(rsOutCurveMode[device]); Node.AppendChild(xmlRsOutputCurveMode);
XmlNode xmlLsOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "LSOutputCurveMode", null); xmlLsOutputCurveMode.InnerText = stickOutputCurveString(getLsOutCurveMode(device)); Node.AppendChild(xmlLsOutputCurveMode);
XmlNode xmlLsOutputCurveCustom = m_Xdoc.CreateNode(XmlNodeType.Element, "LSOutputCurveCustom", null); xmlLsOutputCurveCustom.InnerText = lsOutBezierCurveObj[device].ToString(); Node.AppendChild(xmlLsOutputCurveCustom);
XmlNode xmlRsOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "RSOutputCurveMode", null); xmlRsOutputCurveMode.InnerText = stickOutputCurveString(getRsOutCurveMode(device)); Node.AppendChild(xmlRsOutputCurveMode);
XmlNode xmlRsOutputCurveCustom = m_Xdoc.CreateNode(XmlNodeType.Element, "RSOutputCurveCustom", null); xmlRsOutputCurveCustom.InnerText = rsOutBezierCurveObj[device].ToString(); Node.AppendChild(xmlRsOutputCurveCustom);
XmlNode xmlLsSquareStickMode = m_Xdoc.CreateNode(XmlNodeType.Element, "LSSquareStick", null); xmlLsSquareStickMode.InnerText = squStickInfo[device].lsMode.ToString(); Node.AppendChild(xmlLsSquareStickMode);
XmlNode xmlRsSquareStickMode = m_Xdoc.CreateNode(XmlNodeType.Element, "RSSquareStick", null); xmlRsSquareStickMode.InnerText = squStickInfo[device].rsMode.ToString(); Node.AppendChild(xmlRsSquareStickMode);
XmlNode xmlSquareStickRoundness = m_Xdoc.CreateNode(XmlNodeType.Element, "SquareStickRoundness", null); xmlSquareStickRoundness.InnerText = squStickInfo[device].roundness.ToString(); Node.AppendChild(xmlSquareStickRoundness);
XmlNode xmlL2OutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "L2OutputCurveMode", null); xmlL2OutputCurveMode.InnerText = axisOutputCurveString(l2OutCurveMode[device]); Node.AppendChild(xmlL2OutputCurveMode);
XmlNode xmlR2OutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "R2OutputCurveMode", null); xmlR2OutputCurveMode.InnerText = axisOutputCurveString(r2OutCurveMode[device]); Node.AppendChild(xmlR2OutputCurveMode);
XmlNode xmlL2OutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "L2OutputCurveMode", null); xmlL2OutputCurveMode.InnerText = axisOutputCurveString(getL2OutCurveMode(device)); Node.AppendChild(xmlL2OutputCurveMode);
XmlNode xmlL2OutputCurveCustom = m_Xdoc.CreateNode(XmlNodeType.Element, "L2OutputCurveCustom", null); xmlL2OutputCurveCustom.InnerText = l2OutBezierCurveObj[device].ToString(); Node.AppendChild(xmlL2OutputCurveCustom);
XmlNode xmlSXOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "SXOutputCurveMode", null); xmlSXOutputCurveMode.InnerText = axisOutputCurveString(sxOutCurveMode[device]); Node.AppendChild(xmlSXOutputCurveMode);
XmlNode xmlSZOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "SZOutputCurveMode", null); xmlSZOutputCurveMode.InnerText = axisOutputCurveString(szOutCurveMode[device]); Node.AppendChild(xmlSZOutputCurveMode);
XmlNode xmlR2OutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "R2OutputCurveMode", null); xmlR2OutputCurveMode.InnerText = axisOutputCurveString(getR2OutCurveMode(device)); Node.AppendChild(xmlR2OutputCurveMode);
XmlNode xmlR2OutputCurveCustom = m_Xdoc.CreateNode(XmlNodeType.Element, "R2OutputCurveCustom", null); xmlR2OutputCurveCustom.InnerText = r2OutBezierCurveObj[device].ToString(); Node.AppendChild(xmlR2OutputCurveCustom);
XmlNode xmlSXOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "SXOutputCurveMode", null); xmlSXOutputCurveMode.InnerText = axisOutputCurveString(getSXOutCurveMode(device)); Node.AppendChild(xmlSXOutputCurveMode);
XmlNode xmlSXOutputCurveCustom = m_Xdoc.CreateNode(XmlNodeType.Element, "SXOutputCurveCustom", null); xmlSXOutputCurveCustom.InnerText = sxOutBezierCurveObj[device].ToString(); Node.AppendChild(xmlSXOutputCurveCustom);
XmlNode xmlSZOutputCurveMode = m_Xdoc.CreateNode(XmlNodeType.Element, "SZOutputCurveMode", null); xmlSZOutputCurveMode.InnerText = axisOutputCurveString(getSZOutCurveMode(device)); Node.AppendChild(xmlSZOutputCurveMode);
XmlNode xmlSZOutputCurveCustom = m_Xdoc.CreateNode(XmlNodeType.Element, "SZOutputCurveCustom", null); xmlSZOutputCurveCustom.InnerText = szOutBezierCurveObj[device].ToString(); Node.AppendChild(xmlSZOutputCurveCustom);
XmlNode xmlTrackBallMode = m_Xdoc.CreateNode(XmlNodeType.Element, "TrackballMode", null); xmlTrackBallMode.InnerText = trackballMode[device].ToString(); Node.AppendChild(xmlTrackBallMode);
XmlNode xmlTrackBallFriction = m_Xdoc.CreateNode(XmlNodeType.Element, "TrackballFriction", null); xmlTrackBallFriction.InnerText = trackballFriction[device].ToString(); Node.AppendChild(xmlTrackBallFriction);
@ -2971,11 +3048,16 @@ namespace DS4Windows
}
catch { btPollRate[device] = 4; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/LSOutputCurveMode"); lsOutCurveMode[device] = stickOutputCurveId(Item.InnerText); }
catch { lsOutCurveMode[device] = 0; missingSetting = true; }
// Note! xxOutputCurveCustom property needs to be read before xxOutputCurveMode property in case the curveMode is value 6
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/LSOutputCurveCustom"); lsOutBezierCurveObj[device].CustomDefinition = Item.InnerText; }
catch { missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/LSOutputCurveMode"); setLsOutCurveMode(device, stickOutputCurveId(Item.InnerText)); }
catch { setLsOutCurveMode(device, 0); missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/RSOutputCurveMode"); rsOutCurveMode[device] = stickOutputCurveId(Item.InnerText); }
catch { rsOutCurveMode[device] = 0; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/RSOutputCurveCustom"); rsOutBezierCurveObj[device].CustomDefinition = Item.InnerText; }
catch { missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/RSOutputCurveMode"); setRsOutCurveMode(device, stickOutputCurveId(Item.InnerText)); }
catch { setRsOutCurveMode(device, 0); missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/LSSquareStick"); bool.TryParse(Item.InnerText, out squStickInfo[device].lsMode); }
catch { squStickInfo[device].lsMode = false; missingSetting = true; }
@ -2986,17 +3068,25 @@ namespace DS4Windows
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/RSSquareStick"); bool.TryParse(Item.InnerText, out squStickInfo[device].rsMode); }
catch { squStickInfo[device].rsMode = false; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/L2OutputCurveMode"); l2OutCurveMode[device] = axisOutputCurveId(Item.InnerText); }
catch { l2OutCurveMode[device] = 0; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/L2OutputCurveCustom"); l2OutBezierCurveObj[device].CustomDefinition = Item.InnerText; }
catch { missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/L2OutputCurveMode"); setL2OutCurveMode(device, axisOutputCurveId(Item.InnerText)); }
catch { setL2OutCurveMode(device, 0); missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/R2OutputCurveMode"); r2OutCurveMode[device] = axisOutputCurveId(Item.InnerText); }
catch { r2OutCurveMode[device] = 0; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/R2OutputCurveCustom"); r2OutBezierCurveObj[device].CustomDefinition = Item.InnerText; }
catch { missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/R2OutputCurveMode"); setR2OutCurveMode(device, axisOutputCurveId(Item.InnerText)); }
catch { setR2OutCurveMode(device, 0); missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/SXOutputCurveMode"); sxOutCurveMode[device] = axisOutputCurveId(Item.InnerText); }
catch { sxOutCurveMode[device] = 0; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/SXOutputCurveCustom"); sxOutBezierCurveObj[device].CustomDefinition = Item.InnerText; }
catch { missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/SXOutputCurveMode"); setSXOutCurveMode(device, axisOutputCurveId(Item.InnerText)); }
catch { setSXOutCurveMode(device, 0); missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/SZOutputCurveMode"); szOutCurveMode[device] = axisOutputCurveId(Item.InnerText); }
catch { szOutCurveMode[device] = 0; missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/SZOutputCurveCustom"); szOutBezierCurveObj[device].CustomDefinition = Item.InnerText; }
catch { missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/SZOutputCurveMode"); setSZOutCurveMode(device, axisOutputCurveId(Item.InnerText)); }
catch { setSZOutCurveMode(device, 0); missingSetting = true; }
try { Item = m_Xdoc.SelectSingleNode("/" + rootname + "/TrackballMode"); bool.TryParse(Item.InnerText, out trackballMode[device]); }
catch { trackballMode[device] = false; missingSetting = true; }
@ -4283,11 +4373,12 @@ namespace DS4Windows
squStickInfo[device].lsMode = false;
squStickInfo[device].rsMode = false;
squStickInfo[device].roundness = 5;
lsOutCurveMode[device] = 0;
rsOutCurveMode[device] = 0;
l2OutCurveMode[device] = 0;
r2OutCurveMode[device] = 0;
sxOutCurveMode[device] = szOutCurveMode[device] = 0;
setLsOutCurveMode(device, 0);
setRsOutCurveMode(device, 0);
setL2OutCurveMode(device, 0);
setR2OutCurveMode(device, 0);
setSXOutCurveMode(device, 0);
setSZOutCurveMode(device, 0);
trackballMode[device] = false;
trackballFriction[device] = 10.0;
outputDevType[device] = OutContType.X360;

View File

@ -3281,7 +3281,9 @@
resources.GetString("cBSixaxisZOutputCurve.Items1"),
resources.GetString("cBSixaxisZOutputCurve.Items2"),
resources.GetString("cBSixaxisZOutputCurve.Items3"),
resources.GetString("cBSixaxisZOutputCurve.Items4")});
resources.GetString("cBSixaxisZOutputCurve.Items4"),
resources.GetString("cBSixaxisZOutputCurve.Items5"),
resources.GetString("cBSixaxisZOutputCurve.Items6")});
resources.ApplyResources(this.cBSixaxisZOutputCurve, "cBSixaxisZOutputCurve");
this.cBSixaxisZOutputCurve.Name = "cBSixaxisZOutputCurve";
this.cBSixaxisZOutputCurve.SelectedIndexChanged += new System.EventHandler(this.cBSixaxisZOutputCurve_SelectedIndexChanged);
@ -3296,7 +3298,9 @@
resources.GetString("cBSixaxisXOutputCurve.Items1"),
resources.GetString("cBSixaxisXOutputCurve.Items2"),
resources.GetString("cBSixaxisXOutputCurve.Items3"),
resources.GetString("cBSixaxisXOutputCurve.Items4")});
resources.GetString("cBSixaxisXOutputCurve.Items4"),
resources.GetString("cBSixaxisXOutputCurve.Items5"),
resources.GetString("cBSixaxisXOutputCurve.Items6")});
resources.ApplyResources(this.cBSixaxisXOutputCurve, "cBSixaxisXOutputCurve");
this.cBSixaxisXOutputCurve.Name = "cBSixaxisXOutputCurve";
this.cBSixaxisXOutputCurve.SelectedIndexChanged += new System.EventHandler(this.cBSixaxisXOutputCurve_SelectedIndexChanged);
@ -3321,7 +3325,9 @@
resources.GetString("cBR2OutputCurve.Items1"),
resources.GetString("cBR2OutputCurve.Items2"),
resources.GetString("cBR2OutputCurve.Items3"),
resources.GetString("cBR2OutputCurve.Items4")});
resources.GetString("cBR2OutputCurve.Items4"),
resources.GetString("cBR2OutputCurve.Items5"),
resources.GetString("cBR2OutputCurve.Items6")});
resources.ApplyResources(this.cBR2OutputCurve, "cBR2OutputCurve");
this.cBR2OutputCurve.Name = "cBR2OutputCurve";
this.cBR2OutputCurve.SelectedIndexChanged += new System.EventHandler(this.cBR2OutputCurve_SelectedIndexChanged);
@ -3336,7 +3342,9 @@
resources.GetString("cBL2OutputCurve.Items1"),
resources.GetString("cBL2OutputCurve.Items2"),
resources.GetString("cBL2OutputCurve.Items3"),
resources.GetString("cBL2OutputCurve.Items4")});
resources.GetString("cBL2OutputCurve.Items4"),
resources.GetString("cBL2OutputCurve.Items5"),
resources.GetString("cBL2OutputCurve.Items6")});
resources.ApplyResources(this.cBL2OutputCurve, "cBL2OutputCurve");
this.cBL2OutputCurve.Name = "cBL2OutputCurve";
this.cBL2OutputCurve.SelectedIndexChanged += new System.EventHandler(this.cBL2OutputCurve_SelectedIndexChanged);
@ -3362,7 +3370,8 @@
resources.GetString("rsOutCurveComboBox.Items2"),
resources.GetString("rsOutCurveComboBox.Items3"),
resources.GetString("rsOutCurveComboBox.Items4"),
resources.GetString("rsOutCurveComboBox.Items5")});
resources.GetString("rsOutCurveComboBox.Items5"),
resources.GetString("rsOutCurveComboBox.Items6")});
resources.ApplyResources(this.rsOutCurveComboBox, "rsOutCurveComboBox");
this.rsOutCurveComboBox.Name = "rsOutCurveComboBox";
this.rsOutCurveComboBox.SelectedIndexChanged += new System.EventHandler(this.rsOutCurveComboBox_SelectedIndexChanged);
@ -3378,7 +3387,8 @@
resources.GetString("lsOutCurveComboBox.Items2"),
resources.GetString("lsOutCurveComboBox.Items3"),
resources.GetString("lsOutCurveComboBox.Items4"),
resources.GetString("lsOutCurveComboBox.Items5")});
resources.GetString("lsOutCurveComboBox.Items5"),
resources.GetString("lsOutCurveComboBox.Items6")});
resources.ApplyResources(this.lsOutCurveComboBox, "lsOutCurveComboBox");
this.lsOutCurveComboBox.Name = "lsOutCurveComboBox";
this.lsOutCurveComboBox.SelectedIndexChanged += new System.EventHandler(this.lsOutCurveComboBox_SelectedIndexChanged);

View File

@ -1290,12 +1290,12 @@ namespace DS4Windows.Forms
FlashColor[device] = new DS4Color(Color.Black);
BTPollRate[device] = btPollRateComboBox.SelectedIndex;
lsOutCurveMode[device] = lsOutCurveComboBox.SelectedIndex;
rsOutCurveMode[device] = rsOutCurveComboBox.SelectedIndex;
l2OutCurveMode[device] = cBL2OutputCurve.SelectedIndex;
r2OutCurveMode[device] = cBR2OutputCurve.SelectedIndex;
sxOutCurveMode[device] = cBSixaxisXOutputCurve.SelectedIndex;
szOutCurveMode[device] = cBSixaxisZOutputCurve.SelectedIndex;
setLsOutCurveMode(device, lsOutCurveComboBox.SelectedIndex);
setRsOutCurveMode(device, rsOutCurveComboBox.SelectedIndex);
setL2OutCurveMode(device, cBL2OutputCurve.SelectedIndex);
setR2OutCurveMode(device, cBR2OutputCurve.SelectedIndex);
setSXOutCurveMode(device, cBSixaxisXOutputCurve.SelectedIndex);
setSZOutCurveMode(device, cBSixaxisZOutputCurve.SelectedIndex);
L2ModInfo[device].deadZone = (byte)Math.Round((nUDL2.Value * 255), 0);
R2ModInfo[device].deadZone = (byte)Math.Round((nUDR2.Value * 255), 0);
L2ModInfo[device].antiDeadZone = (int)(nUDL2AntiDead.Value * 100);
@ -2854,7 +2854,7 @@ namespace DS4Windows.Forms
{
if (!loading)
{
lsOutCurveMode[device] = lsOutCurveComboBox.SelectedIndex;
setLsOutCurveMode(device, lsOutCurveComboBox.SelectedIndex);
}
}
@ -2862,7 +2862,7 @@ namespace DS4Windows.Forms
{
if (!loading)
{
rsOutCurveMode[device] = rsOutCurveComboBox.SelectedIndex;
setRsOutCurveMode(device, rsOutCurveComboBox.SelectedIndex);
}
}
@ -2971,7 +2971,7 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
l2OutCurveMode[device] = cBL2OutputCurve.SelectedIndex;
setL2OutCurveMode(device, cBL2OutputCurve.SelectedIndex);
}
}
@ -2979,7 +2979,7 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
r2OutCurveMode[device] = cBR2OutputCurve.SelectedIndex;
setR2OutCurveMode(device, cBR2OutputCurve.SelectedIndex);
}
}
@ -2987,7 +2987,7 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
sxOutCurveMode[device] = cBSixaxisXOutputCurve.SelectedIndex;
setSXOutCurveMode(device, cBSixaxisXOutputCurve.SelectedIndex);
}
}
@ -2995,7 +2995,7 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
szOutCurveMode[device] = cBSixaxisZOutputCurve.SelectedIndex;
setSZOutCurveMode(device, cBSixaxisZOutputCurve.SelectedIndex);
}
}

View File

@ -7298,17 +7298,23 @@ with profile</value>
<value>Linear</value>
</data>
<data name="cBSixaxisZOutputCurve.Items1" xml:space="preserve">
<value>Quadratic</value>
<value>Enhanced Precison</value>
</data>
<data name="cBSixaxisZOutputCurve.Items2" xml:space="preserve">
<value>Cubic</value>
<value>Quadratic</value>
</data>
<data name="cBSixaxisZOutputCurve.Items3" xml:space="preserve">
<value>Easeout Quad</value>
<value>Cubic</value>
</data>
<data name="cBSixaxisZOutputCurve.Items4" xml:space="preserve">
<value>Easeout Quad</value>
</data>
<data name="cBSixaxisZOutputCurve.Items5" xml:space="preserve">
<value>Easeout Cubic</value>
</data>
<data name="cBSixaxisZOutputCurve.Items6" xml:space="preserve">
<value>Custom</value>
</data>
<data name="cBSixaxisZOutputCurve.Location" type="System.Drawing.Point, System.Drawing">
<value>221, 28</value>
</data>
@ -7334,17 +7340,23 @@ with profile</value>
<value>Linear</value>
</data>
<data name="cBSixaxisXOutputCurve.Items1" xml:space="preserve">
<value>Quadratic</value>
<value>Enhanced Precison</value>
</data>
<data name="cBSixaxisXOutputCurve.Items2" xml:space="preserve">
<value>Cubic</value>
<value>Quadratic</value>
</data>
<data name="cBSixaxisXOutputCurve.Items3" xml:space="preserve">
<value>Easeout Quad</value>
<value>Cubic</value>
</data>
<data name="cBSixaxisXOutputCurve.Items4" xml:space="preserve">
<value>Easeout Quad</value>
</data>
<data name="cBSixaxisXOutputCurve.Items5" xml:space="preserve">
<value>Easeout Cubic</value>
</data>
<data name="cBSixaxisXOutputCurve.Items6" xml:space="preserve">
<value>Custom</value>
</data>
<data name="cBSixaxisXOutputCurve.Location" type="System.Drawing.Point, System.Drawing">
<value>221, 1</value>
</data>
@ -7430,17 +7442,23 @@ with profile</value>
<value>Linear</value>
</data>
<data name="cBR2OutputCurve.Items1" xml:space="preserve">
<value>Quadratic</value>
<value>Enhanced Precison</value>
</data>
<data name="cBR2OutputCurve.Items2" xml:space="preserve">
<value>Cubic</value>
<value>Quadratic</value>
</data>
<data name="cBR2OutputCurve.Items3" xml:space="preserve">
<value>Easeout Quad</value>
<value>Cubic</value>
</data>
<data name="cBR2OutputCurve.Items4" xml:space="preserve">
<value>Easeout Quad</value>
</data>
<data name="cBR2OutputCurve.Items5" xml:space="preserve">
<value>Easeout Cubic</value>
</data>
<data name="cBR2OutputCurve.Items6" xml:space="preserve">
<value>Custom</value>
</data>
<data name="cBR2OutputCurve.Location" type="System.Drawing.Point, System.Drawing">
<value>111, 28</value>
</data>
@ -7466,17 +7484,23 @@ with profile</value>
<value>Linear</value>
</data>
<data name="cBL2OutputCurve.Items1" xml:space="preserve">
<value>Quadratic</value>
<value>Enhanced Precison</value>
</data>
<data name="cBL2OutputCurve.Items2" xml:space="preserve">
<value>Cubic</value>
<value>Quadratic</value>
</data>
<data name="cBL2OutputCurve.Items3" xml:space="preserve">
<value>Easeout Quad</value>
<value>Cubic</value>
</data>
<data name="cBL2OutputCurve.Items4" xml:space="preserve">
<value>Easeout Quad</value>
</data>
<data name="cBL2OutputCurve.Items5" xml:space="preserve">
<value>Easeout Cubic</value>
</data>
<data name="cBL2OutputCurve.Items6" xml:space="preserve">
<value>Custom</value>
</data>
<data name="cBL2OutputCurve.Location" type="System.Drawing.Point, System.Drawing">
<value>31, 28</value>
</data>
@ -7576,6 +7600,9 @@ with profile</value>
<data name="rsOutCurveComboBox.Items5" xml:space="preserve">
<value>Easeout Cubic</value>
</data>
<data name="rsOutCurveComboBox.Items6" xml:space="preserve">
<value>Custom</value>
</data>
<data name="rsOutCurveComboBox.Location" type="System.Drawing.Point, System.Drawing">
<value>111, 3</value>
</data>
@ -7615,6 +7642,9 @@ with profile</value>
<data name="lsOutCurveComboBox.Items5" xml:space="preserve">
<value>Easeout Cubic</value>
</data>
<data name="lsOutCurveComboBox.Items6" xml:space="preserve">
<value>Custom</value>
</data>
<data name="lsOutCurveComboBox.Location" type="System.Drawing.Point, System.Drawing">
<value>31, 2</value>
</data>

View File

@ -138,6 +138,7 @@
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="BezierCurveEditor\BezierCurve.cs" />
<Compile Include="DS4Control\ControlService.cs" />
<Compile Include="DS4Control\DS4LightBar.cs" />
<Compile Include="DS4Control\DS4OutDevice.cs" />
@ -358,12 +359,15 @@
</EmbeddedResource>
<EmbeddedResource Include="DS4Forms\DupBox.ar.resx">
<DependentUpon>DupBox.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="DS4Forms\DupBox.cs.resx">
<DependentUpon>DupBox.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="DS4Forms\DupBox.de-DE.resx">
<DependentUpon>DupBox.cs</DependentUpon>
<SubType>Designer</SubType>
</EmbeddedResource>
<EmbeddedResource Include="DS4Forms\DupBox.el.resx">
<DependentUpon>DupBox.cs</DependentUpon>
@ -1129,6 +1133,12 @@
<None Include="App.config" />
</ItemGroup>
<ItemGroup>
<Content Include="BezierCurveEditor\build.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="BezierCurveEditor\index.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="HidLibrary\LICENSE" />
<Content Include="Resources\360 fades.png" />
<None Include="Resources\360 map.png" />