Merge branch 'mika-n-jay-bezierCurveOutput' into jay

This commit is contained in:
Travis Nickles 2019-07-25 14:55:07 -05:00
commit 233ca62ff8
10 changed files with 15027 additions and 4000 deletions

View File

@ -0,0 +1,327 @@
/* 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 this part of the code is open sourced and 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. 99, 99, 0, 0 = Pre-defined hard-coded EnhancedPrecision curve)
// 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 (ie. the value is as user entered it and could be an invalid curve definition). This value is saved in a profile XML file.
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, bool setCustomDefinitionProperty = false)
{
if (setCustomDefinitionProperty)
this.CustomDefinition = bezierCurveDefinition;
this.AsString = bezierCurveDefinition;
return InitBezierCurve(mX1, mY1, mX2, mY2, gamepadAxisType);
}
public bool InitBezierCurve(double x1, double y1, double x2, double y2, AxisType gamepadAxisType)
{
bool bRetValue = true;
if (arrayBezierLUT == null)
arrayBezierLUT = new byte[256];
if (x1 == 99.0)
{
// If curve is "99.0, 99.0, 0.0, 0.0" then curve is a pre-defined fixed EnchPrecision curve and not a customizable bezier curve
if (y1 == 99.0) return InitEnhancedPrecision(gamepadAxisType);
}
if (x1 < 0 || x1 > 1 || x2 < 0 || x2 > 1)
{
// throw new Exception("INVALID VALUE. BezierCurve X1 and X2 should be in [0, 1] range");
AppLogger.LogToGui($"WARNING. Invalid custom bezier curve \"{x1}, {y1}, {x2}, {y2}\" in {gamepadAxisType} axis. x1 and x2 should be in 0..1 range. Using linear curve.", true);
mX1 = mY1 = mX2 = mY2 = 0;
bRetValue = false;
}
else
{
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) || (x2 == 1 && y2 == 1)))
{
for (int idx = 0; idx <= 255; idx++)
arrayBezierLUT[idx] = (byte)idx;
return bRetValue;
}
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 bRetValue;
}
// Initialize a special "hard-coded" and pre-defined EnhancedPrecision output curve as a lookup result table
private bool InitEnhancedPrecision(AxisType gamepadAxisType)
{
mX1 = mY1 = 99; // x1=99, y1=99 is a dummy curve identifier of hard-coded EnhancedPrecision "curve"
mX2 = mY2 = 0;
axisType = gamepadAxisType;
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;
}
double abs, output;
// double temp, cap, sign;
for (byte idx = 0; idx <= axisMaxDouble; idx++)
{
//cap = dState.RX >=128 ? 127.0 : 128.0;
//temp = (dState.RX - 128.0) / cap;
//sign = temp >= 0.0 ? 1.0 : -1.0;
//abs = Math.Abs(temp);
//output = 0.0;
abs = idx / axisMaxDouble;
if (abs <= 0.4)
output = 0.55 * abs;
else if (abs <= 0.75)
output = abs - 0.18;
else //if (abs > 0.75)
output = (abs * 1.72) - 0.72;
// dState.RX = output * sign * cap + 128.0;
arrayBezierLUT[idx + (byte)axisCenterPosDouble] = (byte)(output * 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;
}
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,7 +911,7 @@ namespace DS4Windows
dState.LY = (byte)(tempY * capY + 128.0);
}
int lsOutCurveMode = lsOutCurveModeArray[device] = getLsOutCurveMode(device);
int lsOutCurveMode = getLsOutCurveMode(device);
if (lsOutCurveMode > 0 && (dState.LX != 128 || dState.LY != 128))
{
double capX = dState.LX >= 128 ? 127.0 : 128.0;
@ -988,8 +989,13 @@ namespace DS4Windows
dState.LX = (byte)(1.0 * outputX * signX * capX + 128.0);
dState.LY = (byte)(1.0 * outputY * signY * capY + 128.0);
}
else if (lsOutCurveMode == 6)
{
dState.LX = lsOutBezierCurveObj[device].arrayBezierLUT[dState.LX];
dState.LY = lsOutBezierCurveObj[device].arrayBezierLUT[dState.LY];
}
}
if (squStk.rsMode && (dState.RX != 128 || dState.RY != 128))
{
double capX = dState.RX >= 128 ? 127.0 : 128.0;
@ -1008,7 +1014,7 @@ namespace DS4Windows
dState.RY = (byte)(tempY * capY + 128.0);
}
int rsOutCurveMode = rsOutCurveModeArray[device] = getRsOutCurveMode(device);
int rsOutCurveMode = getRsOutCurveMode(device);
if (rsOutCurveMode > 0 && (dState.RX != 128 || dState.RY != 128))
{
double capX = dState.RX >= 128 ? 127.0 : 128.0;
@ -1086,9 +1092,14 @@ namespace DS4Windows
dState.RX = (byte)(1.0 * outputX * signX * capX + 128.0);
dState.RY = (byte)(1.0 * outputY * signY * capY + 128.0);
}
else if (rsOutCurveMode == 6)
{
dState.RX = rsOutBezierCurveObj[device].arrayBezierLUT[dState.RX];
dState.RY = rsOutBezierCurveObj[device].arrayBezierLUT[dState.RY];
}
}
int l2OutCurveMode = tempIntArray[device] = getL2OutCurveMode(device);
int l2OutCurveMode = getL2OutCurveMode(device);
if (l2OutCurveMode > 0 && dState.L2 != 0)
{
double temp = dState.L2 / 255.0;
@ -1113,9 +1124,13 @@ namespace DS4Windows
double output = inner * inner * inner + 1.0;
dState.L2 = (byte)(-1.0 * output * 255.0);
}
else if (l2OutCurveMode == 5)
{
dState.L2 = l2OutBezierCurveObj[device].arrayBezierLUT[dState.L2];
}
}
int r2OutCurveMode = tempIntArray[device] = getR2OutCurveMode(device);
int r2OutCurveMode = getR2OutCurveMode(device);
if (r2OutCurveMode > 0 && dState.R2 != 0)
{
double temp = dState.R2 / 255.0;
@ -1140,9 +1155,14 @@ namespace DS4Windows
double output = inner * inner * inner + 1.0;
dState.R2 = (byte)(-1.0 * output * 255.0);
}
else if (r2OutCurveMode == 5)
{
dState.R2 = r2OutBezierCurveObj[device].arrayBezierLUT[dState.R2];
}
}
bool sOff = tempBool = isUsingSAforMouse(device);
bool sOff = /*tempBool =*/ isUsingSAforMouse(device);
if (sOff == false)
{
int SXD = (int)(128d * getSXDeadzone(device));
@ -1198,8 +1218,8 @@ namespace DS4Windows
(int)Math.Min(128d, szsens * 128d * (absz / 128d));
}
int sxOutCurveMode = tempIntArray[device] = getSXOutCurveMode(device);
if (sxOutCurveMode > 0 && dState.Motion.outputAccelX != 0)
int sxOutCurveMode = getSXOutCurveMode(device);
if (sxOutCurveMode > 0)
{
double temp = dState.Motion.outputAccelX / 128.0;
double sign = Math.Sign(temp);
@ -1228,9 +1248,14 @@ namespace DS4Windows
double output = inner * inner * inner + 1.0;
dState.Motion.outputAccelX = (byte)(-1.0 * output * 255.0);
}
else if (sxOutCurveMode == 5)
{
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);
int szOutCurveMode = getSZOutCurveMode(device);
if (szOutCurveMode > 0 && dState.Motion.outputAccelZ != 0)
{
double temp = dState.Motion.outputAccelZ / 128.0;
@ -1260,6 +1285,11 @@ namespace DS4Windows
double output = inner * inner * inner + 1.0;
dState.Motion.outputAccelZ = (byte)(-1.0 * output * 255.0);
}
else if (szOutCurveMode == 5)
{
int signSA = Math.Sign(dState.Motion.outputAccelZ);
dState.Motion.outputAccelZ = szOutBezierCurveObj[device].arrayBezierLUT[Math.Min(Math.Abs(dState.Motion.outputAccelZ), 128)] * signSA;
}
}
}
@ -2064,11 +2094,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(99.0, 99.0, 0.00, 0.00, axisType); break; // Enhanced Precision (hard-coded curve) (The same curve as bezier 0.70, 0.28, 1.00, 1.00)
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;

File diff suppressed because it is too large Load Diff

View File

@ -3,6 +3,7 @@ using System.Drawing;
using System.Windows.Forms;
using System.Collections.Generic;
using System.IO;
using Microsoft.Win32; // We need Registry class from here
using static DS4Windows.Global;
namespace DS4Windows.Forms
@ -153,6 +154,10 @@ namespace DS4Windows.Forms
populateHoverIndexDict();
populateHoverImageDict();
populateHoverLabelDict();
tBCustomOutputCurve.Text = String.Empty;
lbCurveEditorURL.Text = $" - {lbCurveEditorURL.Text}";
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = false;
}
private void TriggerCondAndCombo_SelectedIndexChanged(object sender, EventArgs e)
@ -456,6 +461,8 @@ namespace DS4Windows.Forms
cBSixaxisXOutputCurve.SelectedIndex = getSXOutCurveMode(device);
cBSixaxisZOutputCurve.SelectedIndex = getSZOutCurveMode(device);
CustomCurveChecker();
try
{
nUDL2.Value = Math.Round((decimal)L2ModInfo[device].deadZone / 255, 2);
@ -811,6 +818,11 @@ namespace DS4Windows.Forms
cBR2OutputCurve.SelectedIndex = 0;
cBSixaxisXOutputCurve.SelectedIndex = 0;
cBSixaxisZOutputCurve.SelectedIndex = 0;
tBCustomOutputCurve.Text = String.Empty;
lbCurveEditorURL.Text = $" - {lbCurveEditorURL.Text}";
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = false;
rBTPMouse.Checked = true;
rBSAControls.Checked = true;
ToggleRainbow(false);
@ -1290,12 +1302,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 +2866,14 @@ namespace DS4Windows.Forms
{
if (!loading)
{
lsOutCurveMode[device] = lsOutCurveComboBox.SelectedIndex;
bool customIdx = lsOutCurveComboBox.SelectedIndex == lsOutCurveComboBox.Items.Count - 1;
// This same handler is called when combobox label object is clicked. Update curve mode only when sender is ComboxBox with a new selection index
if (sender is ComboBox && customIdx)
setLsOutCurveMode(device, lsOutCurveComboBox.SelectedIndex);
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (customIdx ? lsOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"LS - {lbCurveEditorURL.Text.Substring(5)}";
}
}
@ -2862,10 +2881,76 @@ namespace DS4Windows.Forms
{
if (!loading)
{
rsOutCurveMode[device] = rsOutCurveComboBox.SelectedIndex;
bool customIdx = rsOutCurveComboBox.SelectedIndex == rsOutCurveComboBox.Items.Count - 1;
if (sender is ComboBox && customIdx)
setRsOutCurveMode(device, rsOutCurveComboBox.SelectedIndex);
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (customIdx ? rsOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"RS - {lbCurveEditorURL.Text.Substring(5)}";
}
}
private void CustomCurveChecker()
{
bool customIdx = lsOutCurveComboBox.SelectedIndex == lsOutCurveComboBox.Items.Count - 1;
if (customIdx)
{
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (customIdx ? lsOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"LS - {lbCurveEditorURL.Text.Substring(5)}";
goto end;
}
customIdx = rsOutCurveComboBox.SelectedIndex == rsOutCurveComboBox.Items.Count - 1;
if (customIdx)
{
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (customIdx ? rsOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"RS - {lbCurveEditorURL.Text.Substring(5)}";
goto end;
}
customIdx = cBL2OutputCurve.SelectedIndex == cBL2OutputCurve.Items.Count - 1;
if (customIdx)
{
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? l2OutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"L2 - {lbCurveEditorURL.Text.Substring(5)}";
goto end;
}
customIdx = cBR2OutputCurve.SelectedIndex == cBR2OutputCurve.Items.Count - 1;
if (customIdx)
{
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? r2OutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"R2 - {lbCurveEditorURL.Text.Substring(5)}";
goto end;
}
customIdx = cBSixaxisXOutputCurve.SelectedIndex == cBSixaxisXOutputCurve.Items.Count - 1;
if (customIdx)
{
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? sxOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"SX - {lbCurveEditorURL.Text.Substring(5)}";
goto end;
}
customIdx = cBSixaxisZOutputCurve.SelectedIndex == cBSixaxisZOutputCurve.Items.Count - 1;
if (customIdx)
{
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? szOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"SZ - {lbCurveEditorURL.Text.Substring(5)}";
goto end;
}
end:
return;
}
private void gyroTriggerBehavior_CheckedChanged(object sender, EventArgs e)
{
if (!loading)
@ -2971,7 +3056,13 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
l2OutCurveMode[device] = cBL2OutputCurve.SelectedIndex;
bool customIdx = cBL2OutputCurve.SelectedIndex == cBL2OutputCurve.Items.Count - 1;
if (sender is ComboBox && customIdx)
setL2OutCurveMode(device, cBL2OutputCurve.SelectedIndex);
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? l2OutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"L2 - {lbCurveEditorURL.Text.Substring(5)}";
}
}
@ -2979,7 +3070,13 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
r2OutCurveMode[device] = cBR2OutputCurve.SelectedIndex;
bool customIdx = cBR2OutputCurve.SelectedIndex == cBR2OutputCurve.Items.Count - 1;
if (sender is ComboBox && customIdx)
setR2OutCurveMode(device, cBR2OutputCurve.SelectedIndex);
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? r2OutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"R2 - {lbCurveEditorURL.Text.Substring(5)}";
}
}
@ -2987,7 +3084,13 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
sxOutCurveMode[device] = cBSixaxisXOutputCurve.SelectedIndex;
bool customIdx = cBSixaxisXOutputCurve.SelectedIndex == cBSixaxisXOutputCurve.Items.Count - 1;
if (sender is ComboBox && customIdx)
setSXOutCurveMode(device, cBSixaxisXOutputCurve.SelectedIndex);
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? sxOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"SX - {lbCurveEditorURL.Text.Substring(5)}";
}
}
@ -2995,7 +3098,13 @@ namespace DS4Windows.Forms
{
if (loading == false)
{
szOutCurveMode[device] = cBSixaxisZOutputCurve.SelectedIndex;
bool customIdx = cBSixaxisZOutputCurve.SelectedIndex == cBSixaxisZOutputCurve.Items.Count - 1;
if (sender is ComboBox && customIdx)
setSZOutCurveMode(device, cBSixaxisZOutputCurve.SelectedIndex);
tBCustomOutputCurve.Enabled = lbCurveEditorURL.Enabled = customIdx;
tBCustomOutputCurve.Text = (tBCustomOutputCurve.Enabled ? szOutBezierCurveObj[device].ToString() : "");
lbCurveEditorURL.Text = $"SZ - {lbCurveEditorURL.Text.Substring(5)}";
}
}
@ -3187,6 +3296,110 @@ namespace DS4Windows.Forms
}
}
private void lbCurveEditorURL_LinkClicked(object sender, LinkLabelLinkClickedEventArgs e)
{
string customDefinition;
switch (lbCurveEditorURL.Text.Substring(0, 2))
{
case "LS": customDefinition = lsOutBezierCurveObj[device].ToString(); break;
case "RS": customDefinition = rsOutBezierCurveObj[device].ToString(); break;
case "L2": customDefinition = l2OutBezierCurveObj[device].ToString(); break;
case "R2": customDefinition = r2OutBezierCurveObj[device].ToString(); break;
case "SX": customDefinition = sxOutBezierCurveObj[device].ToString(); break;
case "SZ": customDefinition = szOutBezierCurveObj[device].ToString(); break;
default: customDefinition = String.Empty; break;
}
// Custom curve editor web link clicked. Open the bezier curve editor web app usign the default browser app and pass on current custom definition as a query string parameter.
// The Process.Start command using HTML page doesn't support query parameters, so if there is a custom curve definition then lookup the default browser executable name from a sysreg.
string defaultBrowserCmd = String.Empty;
try
{
if (!String.IsNullOrEmpty(customDefinition))
{
string progId = String.Empty;
using (RegistryKey userChoiceKey = Registry.CurrentUser.OpenSubKey("Software\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations\\http\\UserChoice"))
{
progId = userChoiceKey?.GetValue("Progid")?.ToString();
}
if (!String.IsNullOrEmpty(progId))
{
using (RegistryKey browserPathCmdKey = Registry.ClassesRoot.OpenSubKey($"{progId}\\shell\\open\\command"))
{
defaultBrowserCmd = browserPathCmdKey?.GetValue(null).ToString();
}
if(!String.IsNullOrEmpty(defaultBrowserCmd))
{
int iStartPos = (defaultBrowserCmd[0] == '"' ? 1 : 0);
defaultBrowserCmd = defaultBrowserCmd.Substring(iStartPos, defaultBrowserCmd.LastIndexOf(".exe") + 4 - iStartPos);
if (Path.GetFileName(defaultBrowserCmd).ToLower() == "launchwinapp.exe")
defaultBrowserCmd = String.Empty;
}
// Fallback to IE executable if the default browser HTML shell association is for some reason missing or is not set
if (String.IsNullOrEmpty(defaultBrowserCmd))
defaultBrowserCmd = "C:\\program files\\Internet Explorer\\iexplore.exe";
if (!File.Exists(defaultBrowserCmd))
defaultBrowserCmd = String.Empty;
}
}
// Launch custom bezier editor webapp using a default browser executable command or via a default shell command. The default shell exeution doesn't support query parameters.
if (!String.IsNullOrEmpty(defaultBrowserCmd))
System.Diagnostics.Process.Start(defaultBrowserCmd, $"\"file:///{Global.exepath}\\BezierCurveEditor\\index.html?curve={customDefinition.Replace(" ", "")}\"");
else
System.Diagnostics.Process.Start($"{Global.exepath}\\BezierCurveEditor\\index.html");
}
catch (Exception ex)
{
AppLogger.LogToGui($"ERROR. Failed to open {Global.exepath}\\BezierCurveEditor\\index.html web app. Check that the web file exits or launch it outside of DS4Windows application. {ex.Message}", true);
}
}
private void tBCustomOutputCurve_Leave(object sender, EventArgs e)
{
if (loading == false)
{
// Focus leaves the custom output curve editbox. Store the new custom curve value into LS/RS/L2/R2/SX/SZ bezierCurve object
switch (lbCurveEditorURL.Text.Substring(0, 2))
{
case "LS":
if (lsOutCurveComboBox.SelectedIndex == lsOutCurveComboBox.Items.Count - 1)
lsOutBezierCurveObj[device].InitBezierCurve(tBCustomOutputCurve.Text, BezierCurve.AxisType.LSRS, true);
break;
case "RS":
if (rsOutCurveComboBox.SelectedIndex == rsOutCurveComboBox.Items.Count - 1)
rsOutBezierCurveObj[device].InitBezierCurve(tBCustomOutputCurve.Text, BezierCurve.AxisType.LSRS, true);
break;
case "L2":
if (cBL2OutputCurve.SelectedIndex == cBL2OutputCurve.Items.Count - 1)
l2OutBezierCurveObj[device].InitBezierCurve(tBCustomOutputCurve.Text, BezierCurve.AxisType.L2R2, true);
break;
case "R2":
if (cBR2OutputCurve.SelectedIndex == cBR2OutputCurve.Items.Count - 1)
r2OutBezierCurveObj[device].InitBezierCurve(tBCustomOutputCurve.Text, BezierCurve.AxisType.L2R2, true);
break;
case "SX":
if (cBSixaxisXOutputCurve.SelectedIndex == cBSixaxisXOutputCurve.Items.Count - 1)
sxOutBezierCurveObj[device].InitBezierCurve(tBCustomOutputCurve.Text, BezierCurve.AxisType.SA, true);
break;
case "SZ":
if (cBSixaxisZOutputCurve.SelectedIndex == cBSixaxisZOutputCurve.Items.Count - 1)
szOutBezierCurveObj[device].InitBezierCurve(tBCustomOutputCurve.Text, BezierCurve.AxisType.SA, true);
break;
}
}
}
private void trackFrictionNUD_ValueChanged(object sender, EventArgs e)
{
if (loading == false)

View File

@ -365,7 +365,7 @@
<value>154, 21</value>
</data>
<data name="cBDinput.Text" xml:space="preserve">
<value>käytä vain Dinput:ia</value>
<value>Käytä vain Dinput:ia</value>
</data>
<data name="cBLaunchProgram.Size" type="System.Drawing.Size, System.Drawing">
<value>149, 38</value>
@ -494,7 +494,7 @@
<value>Pidä valittuja näppäimiä pohjassa tehdäksesi valitun toiminnon. Valitse toiminto käyttääksesi sitä tässä profiilissa.</value>
</data>
<data name="tPCurve.Text" xml:space="preserve">
<value>Kurvi</value>
<value>Kurvi (sisään)</value>
</data>
<data name="rBSAControls.Size" type="System.Drawing.Size, System.Drawing">
<value>140, 21</value>
@ -607,9 +607,6 @@
<data name="DpadToolStripMenuItem.Text" xml:space="preserve">
<value>Dpad</value>
</data>
<data name="gBSensitivity,Text" xml:space="preserve">
<value>Herkkyys</value>
</data>
<data name="lb6Gryo.Text" xml:space="preserve">
<value>Gyro</value>
</data>
@ -640,19 +637,109 @@
<data name="tPDeadzone.Text" xml:space="preserve">
<value>Deadzone</value>
</data>
<data name="lblSteeringWheelEmulationRange.Text" xml:space="preserve">
<value>Rattiohjaimen kääntösäde</value>
<data name="trackballCk.Text" xml:space="preserve">
<value>Pallohiiri</value>
</data>
<data name="lblSteeringWheelEmulationAxis.Text" xml:space="preserve">
<value>Rattiohjaimen akseli</value>
<data name="trackFrictionLb.Text" xml:space="preserve">
<value>Kitka</value>
</data>
<data name="label25.Text" xml:space="preserve">
<value>Kääntö pois:</value>
</data>
<data name="label15.Text" xml:space="preserve">
<value>Kääntö:</value>
</data>
<data name="rBTPControls.Text" xml:space="preserve">
<value>Käytä ohjaimena:</value>
</data>
<data name="rBTPMouse.Text" xml:space="preserve">
<value>Käytä hiirenä:</value>
</data>
<data name="controlToolStripMenuItem.Text" xml:space="preserve">
<value>Ohjain</value>
</data>
<data name="bnSwipeUp.Text" xml:space="preserve">
<value>Pyyhkäisy ylös</value>
</data>
<data name="lbSwipeUp.Text" xml:space="preserve">
<value>Asetukset</value>
</data>
<data name="bnSwipeDown.Text" xml:space="preserve">
<value>Pyyhkäisy alas</value>
</data>
<data name="lbSwipeDown.Text" xml:space="preserve">
<value>Asetukset</value>
</data>
<data name="bnSwipeLeft.Text" xml:space="preserve">
<value>Pyyhkäisy vasen</value>
</data>
<data name="lbSwipeLeft.Text" xml:space="preserve">
<value>Asetukset</value>
</data>
<data name="bnSwipeRight.Text" xml:space="preserve">
<value>Pyyhkäisy oikea</value>
</data>
<data name="lbSwipeRight.Text" xml:space="preserve">
<value>Asetukset</value>
</data>
<data name="outcontLb.Text" xml:space="preserve">
<value>Ohjain:</value>
</data>
<data name="btPollRateLabel.Text" xml:space="preserve">
<value>BT lukutaajuus</value>
</data>
<data name="enableTouchToggleCheckbox.Text" xml:space="preserve">
<value>Käytä kosketuslevyn kytkentää</value>
</data>
<data name="btnLSTrack.Text" xml:space="preserve">
<value>nappi1</value>
</data>
<data name="btnRSTrack.Text" xml:space="preserve">
<value>nappi1</value>
</data>
<data name="lbL2TrackS.Text" xml:space="preserve">
<value>Ohjaimen lukemat</value>
<value>Ohjaimen tilatiedot</value>
</data>
<data name="lblSteeringWheelEmulationAxis.Text" xml:space="preserve">
<value>Ratin akseli</value>
</data>
<data name="lblSteeringWheelEmulationRange.Text" xml:space="preserve">
<value>Ratin kääntösäde</value>
</data>
<data name="lbCurveEditorURL.Text" xml:space="preserve">
<value>Custom kurvieditointi</value>
</data>
<data name="tPOutCurve.Text" xml:space="preserve">
<value>Kurvi (ulos)</value>
</data>
<data name="tpRotation.Text" xml:space="preserve">
<value>Kierto</value>
</data>
<data name="toggleGyroMCb.Text" xml:space="preserve">
<value>Kytke</value>
</data>
<data name="lbGyroSmooth.Text" xml:space="preserve">
<value>Tasaaminen:</value>
</data>
<data name="lbSmoothWeight.Text" xml:space="preserve">
<value>Tasauksen painotus:</value>
</data>
<data name="label11.Text" xml:space="preserve">
<value>Pystyskaalaus:</value>
</data>
<data name="$this.Text" xml:space="preserve">
<value>Profiiliasetukset</value>
</data>
<data name="btnSteeringWheelEmulationCalibrate.Text" xml:space="preserve">
<value>Kalibroi...</value>
</data>
<data name="rBTPMouse.Text" xml:space="preserve">
<value>Käytä hiirenä</value>
<data name="gBSensitivity.Text" xml:space="preserve">
<value>Herkkyys</value>
</data>
<data name="oneFingerTouchInvStripMenuItem.Text" xml:space="preserve">
<value>Sormi kosketuslevyllä</value>
</data>
<data name="twoFingerTouchInvStripMenuItem.Text" xml:space="preserve">
<value>2 sormea kosketuslevyllä</value>
</data>
</root>

View File

@ -601,7 +601,7 @@
<value>NoControl</value>
</data>
<data name="lbButtonMouseSens.Location" type="System.Drawing.Point, System.Drawing">
<value>5, 17</value>
<value>2, 45</value>
</data>
<data name="lbButtonMouseSens.Size" type="System.Drawing.Size, System.Drawing">
<value>92, 13</value>
@ -612,9 +612,6 @@
<data name="lbButtonMouseSens.Text" xml:space="preserve">
<value>Mouse Sensitivity:</value>
</data>
<data name="lbButtonMouseSens.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>TopRight</value>
</data>
<data name="&gt;&gt;lbButtonMouseSens.Name" xml:space="preserve">
<value>lbButtonMouseSens</value>
</data>
@ -760,7 +757,7 @@
<value>NoControl</value>
</data>
<data name="lbIdleMinutes.Location" type="System.Drawing.Point, System.Drawing">
<value>169, 67</value>
<value>171, 172</value>
</data>
<data name="lbIdleMinutes.Size" type="System.Drawing.Size, System.Drawing">
<value>28, 13</value>
@ -784,7 +781,7 @@
<value>18</value>
</data>
<data name="nUDIdleDisconnect.Location" type="System.Drawing.Point, System.Drawing">
<value>115, 64</value>
<value>117, 169</value>
</data>
<data name="nUDIdleDisconnect.Size" type="System.Drawing.Size, System.Drawing">
<value>49, 20</value>
@ -831,14 +828,14 @@
<data name="cBFlushHIDQueue.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cBFlushHIDQueue.CheckAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="cBFlushHIDQueue.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cBFlushHIDQueue.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 178</value>
</data>
<data name="cBFlushHIDQueue.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
<value>142, 144</value>
</data>
<data name="cBFlushHIDQueue.Size" type="System.Drawing.Size, System.Drawing">
<value>73, 17</value>
@ -849,6 +846,9 @@
<data name="cBFlushHIDQueue.Text" xml:space="preserve">
<value>Flush HID</value>
</data>
<data name="cBFlushHIDQueue.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="&gt;&gt;cBFlushHIDQueue.Name" xml:space="preserve">
<value>cBFlushHIDQueue</value>
</data>
@ -1267,10 +1267,10 @@
<value>6</value>
</data>
<data name="numUDMouseSens.Location" type="System.Drawing.Point, System.Drawing">
<value>109, 16</value>
<value>100, 42</value>
</data>
<data name="numUDMouseSens.Size" type="System.Drawing.Size, System.Drawing">
<value>49, 20</value>
<value>44, 20</value>
</data>
<data name="numUDMouseSens.TabIndex" type="System.Int32, mscorlib">
<value>241</value>
@ -2119,7 +2119,7 @@
<value>DualShock 4</value>
</data>
<data name="OutContTypeCb.Location" type="System.Drawing.Point, System.Drawing">
<value>84, 251</value>
<value>84, 220</value>
</data>
<data name="OutContTypeCb.Size" type="System.Drawing.Size, System.Drawing">
<value>121, 21</value>
@ -2143,7 +2143,7 @@
<value>True</value>
</data>
<data name="outcontLb.Location" type="System.Drawing.Point, System.Drawing">
<value>11, 254</value>
<value>4, 223</value>
</data>
<data name="outcontLb.Size" type="System.Drawing.Size, System.Drawing">
<value>54, 13</value>
@ -2173,7 +2173,7 @@
<value>NoControl</value>
</data>
<data name="btPollRateLabel.Location" type="System.Drawing.Point, System.Drawing">
<value>10, 227</value>
<value>3, 197</value>
</data>
<data name="btPollRateLabel.Size" type="System.Drawing.Size, System.Drawing">
<value>67, 13</value>
@ -2248,7 +2248,7 @@
<value>62 Hz (16 ms)</value>
</data>
<data name="btPollRateComboBox.Location" type="System.Drawing.Point, System.Drawing">
<value>85, 224</value>
<value>84, 193</value>
</data>
<data name="btPollRateComboBox.Size" type="System.Drawing.Size, System.Drawing">
<value>121, 21</value>
@ -2271,14 +2271,14 @@
<data name="enableTouchToggleCheckbox.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="enableTouchToggleCheckbox.CheckAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="enableTouchToggleCheckbox.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="enableTouchToggleCheckbox.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 202</value>
</data>
<data name="enableTouchToggleCheckbox.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
<value>2, 93</value>
</data>
<data name="enableTouchToggleCheckbox.Size" type="System.Drawing.Size, System.Drawing">
<value>147, 17</value>
@ -2289,6 +2289,9 @@
<data name="enableTouchToggleCheckbox.Text" xml:space="preserve">
<value>Enable Touchpad Toggle</value>
</data>
<data name="enableTouchToggleCheckbox.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>TopLeft</value>
</data>
<data name="&gt;&gt;enableTouchToggleCheckbox.Name" xml:space="preserve">
<value>enableTouchToggleCheckbox</value>
</data>
@ -2304,14 +2307,14 @@
<data name="cBDinput.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cBDinput.CheckAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="cBDinput.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cBDinput.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 154</value>
</data>
<data name="cBDinput.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
<value>2, 144</value>
</data>
<data name="cBDinput.Size" type="System.Drawing.Size, System.Drawing">
<value>101, 17</value>
@ -2322,6 +2325,9 @@
<data name="cBDinput.Text" xml:space="preserve">
<value>Use Dinput only</value>
</data>
<data name="cBDinput.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>TopLeft</value>
</data>
<data name="&gt;&gt;cBDinput.Name" xml:space="preserve">
<value>cBDinput</value>
</data>
@ -2338,13 +2344,13 @@
<value>NoControl</value>
</data>
<data name="pBProgram.Location" type="System.Drawing.Point, System.Drawing">
<value>215, 122</value>
<value>247, 113</value>
</data>
<data name="pBProgram.Size" type="System.Drawing.Size, System.Drawing">
<value>23, 23</value>
</data>
<data name="pBProgram.SizeMode" type="System.Windows.Forms.PictureBoxSizeMode, System.Windows.Forms">
<value>AutoSize</value>
<value>Zoom</value>
</data>
<data name="pBProgram.TabIndex" type="System.Int32, mscorlib">
<value>255</value>
@ -2364,24 +2370,26 @@
<data name="cBLaunchProgram.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cBLaunchProgram.CheckAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="cBLaunchProgram.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cBLaunchProgram.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 118</value>
</data>
<data name="cBLaunchProgram.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
<value>2, 119</value>
</data>
<data name="cBLaunchProgram.Size" type="System.Drawing.Size, System.Drawing">
<value>107, 30</value>
<value>157, 17</value>
</data>
<data name="cBLaunchProgram.TabIndex" type="System.Int32, mscorlib">
<value>254</value>
</data>
<data name="cBLaunchProgram.Text" xml:space="preserve">
<value>Launch Program
with profile</value>
<value>Launch Program with profile</value>
</data>
<data name="cBLaunchProgram.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>TopLeft</value>
</data>
<data name="&gt;&gt;cBLaunchProgram.Name" xml:space="preserve">
<value>cBLaunchProgram</value>
@ -2405,7 +2413,7 @@ with profile</value>
<value>NoControl</value>
</data>
<data name="btnBrowse.Location" type="System.Drawing.Point, System.Drawing">
<value>132, 122</value>
<value>178, 115</value>
</data>
<data name="btnBrowse.Size" type="System.Drawing.Size, System.Drawing">
<value>67, 23</value>
@ -2435,7 +2443,7 @@ with profile</value>
<value>NoControl</value>
</data>
<data name="lbUseController.Location" type="System.Drawing.Point, System.Drawing">
<value>5, 96</value>
<value>2, 17</value>
</data>
<data name="lbUseController.Size" type="System.Drawing.Size, System.Drawing">
<value>73, 13</value>
@ -2461,14 +2469,14 @@ with profile</value>
<data name="cBMouseAccel.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cBMouseAccel.CheckAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="cBMouseAccel.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cBMouseAccel.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 42</value>
</data>
<data name="cBMouseAccel.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
<value>2, 68</value>
</data>
<data name="cBMouseAccel.Size" type="System.Drawing.Size, System.Drawing">
<value>120, 17</value>
@ -2479,6 +2487,9 @@ with profile</value>
<data name="cBMouseAccel.Text" xml:space="preserve">
<value>Mouse Acceleration</value>
</data>
<data name="cBMouseAccel.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>TopLeft</value>
</data>
<data name="&gt;&gt;cBMouseAccel.Name" xml:space="preserve">
<value>cBMouseAccel</value>
</data>
@ -2492,7 +2503,7 @@ with profile</value>
<value>10</value>
</data>
<data name="nUDSixaxis.Location" type="System.Drawing.Point, System.Drawing">
<value>85, 95</value>
<value>87, 14</value>
</data>
<data name="nUDSixaxis.Size" type="System.Drawing.Size, System.Drawing">
<value>29, 20</value>
@ -2519,7 +2530,7 @@ with profile</value>
<value>NoControl</value>
</data>
<data name="cBControllerInput.Location" type="System.Drawing.Point, System.Drawing">
<value>118, 95</value>
<value>122, 16</value>
</data>
<data name="cBControllerInput.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
@ -2548,14 +2559,14 @@ with profile</value>
<data name="cBIdleDisconnect.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="cBIdleDisconnect.CheckAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>MiddleRight</value>
</data>
<data name="cBIdleDisconnect.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="cBIdleDisconnect.Location" type="System.Drawing.Point, System.Drawing">
<value>8, 65</value>
</data>
<data name="cBIdleDisconnect.RightToLeft" type="System.Windows.Forms.RightToLeft, System.Windows.Forms">
<value>Yes</value>
<value>2, 170</value>
</data>
<data name="cBIdleDisconnect.Size" type="System.Drawing.Size, System.Drawing">
<value>100, 17</value>
@ -2566,6 +2577,9 @@ with profile</value>
<data name="cBIdleDisconnect.Text" xml:space="preserve">
<value>Idle Disconnect</value>
</data>
<data name="cBIdleDisconnect.TextAlign" type="System.Drawing.ContentAlignment, System.Drawing">
<value>TopLeft</value>
</data>
<data name="&gt;&gt;cBIdleDisconnect.Name" xml:space="preserve">
<value>cBIdleDisconnect</value>
</data>
@ -2579,10 +2593,13 @@ with profile</value>
<value>14</value>
</data>
<data name="gBOther.Location" type="System.Drawing.Point, System.Drawing">
<value>281, 221</value>
<value>281, 243</value>
</data>
<data name="gBOther.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 1, 3, 1</value>
</data>
<data name="gBOther.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 278</value>
<value>272, 247</value>
</data>
<data name="gBOther.TabIndex" type="System.Int32, mscorlib">
<value>247</value>
@ -6479,7 +6496,7 @@ with profile</value>
<value>3, 3, 3, 3</value>
</data>
<data name="tPDeadzone.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="tPDeadzone.TabIndex" type="System.Int32, mscorlib">
<value>0</value>
@ -6812,7 +6829,7 @@ with profile</value>
<value>3, 3, 3, 3</value>
</data>
<data name="antiDeadzoneTabPage.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="antiDeadzoneTabPage.TabIndex" type="System.Int32, mscorlib">
<value>2</value>
@ -7145,7 +7162,7 @@ with profile</value>
<value>3, 3, 3, 3</value>
</data>
<data name="maxZoneTabPage.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="maxZoneTabPage.TabIndex" type="System.Int32, mscorlib">
<value>3</value>
@ -7274,7 +7291,7 @@ with profile</value>
<value>3, 3, 3, 3</value>
</data>
<data name="squStickTabPage.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="squStickTabPage.TabIndex" type="System.Int32, mscorlib">
<value>6</value>
@ -7294,21 +7311,81 @@ with profile</value>
<data name="&gt;&gt;squStickTabPage.ZOrder" xml:space="preserve">
<value>3</value>
</data>
<data name="lbCurveEditorURL.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
</data>
<data name="lbCurveEditorURL.ImeMode" type="System.Windows.Forms.ImeMode, System.Windows.Forms">
<value>NoControl</value>
</data>
<data name="lbCurveEditorURL.Location" type="System.Drawing.Point, System.Drawing">
<value>118, 60</value>
</data>
<data name="lbCurveEditorURL.Size" type="System.Drawing.Size, System.Drawing">
<value>101, 13</value>
</data>
<data name="lbCurveEditorURL.TabIndex" type="System.Int32, mscorlib">
<value>207</value>
</data>
<data name="lbCurveEditorURL.Text" xml:space="preserve">
<value>Custom curve editor</value>
</data>
<data name="&gt;&gt;lbCurveEditorURL.Name" xml:space="preserve">
<value>lbCurveEditorURL</value>
</data>
<data name="&gt;&gt;lbCurveEditorURL.Type" xml:space="preserve">
<value>System.Windows.Forms.LinkLabel, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;lbCurveEditorURL.Parent" xml:space="preserve">
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;lbCurveEditorURL.ZOrder" xml:space="preserve">
<value>0</value>
</data>
<data name="tBCustomOutputCurve.Location" type="System.Drawing.Point, System.Drawing">
<value>6, 57</value>
</data>
<data name="tBCustomOutputCurve.Size" type="System.Drawing.Size, System.Drawing">
<value>112, 20</value>
</data>
<data name="tBCustomOutputCurve.TabIndex" type="System.Int32, mscorlib">
<value>206</value>
</data>
<data name="tBCustomOutputCurve.Text" xml:space="preserve">
<value>0.00, 0.00, 1.00, 1.00</value>
</data>
<data name="&gt;&gt;tBCustomOutputCurve.Name" xml:space="preserve">
<value>tBCustomOutputCurve</value>
</data>
<data name="&gt;&gt;tBCustomOutputCurve.Type" xml:space="preserve">
<value>System.Windows.Forms.TextBox, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<data name="&gt;&gt;tBCustomOutputCurve.Parent" xml:space="preserve">
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;tBCustomOutputCurve.ZOrder" xml:space="preserve">
<value>1</value>
</data>
<data name="cBSixaxisZOutputCurve.Items" xml:space="preserve">
<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>
@ -7328,23 +7405,29 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;cBSixaxisZOutputCurve.ZOrder" xml:space="preserve">
<value>0</value>
<value>2</value>
</data>
<data name="cBSixaxisXOutputCurve.Items" xml:space="preserve">
<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>
@ -7364,7 +7447,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;cBSixaxisXOutputCurve.ZOrder" xml:space="preserve">
<value>1</value>
<value>3</value>
</data>
<data name="label24.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -7394,7 +7477,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;label24.ZOrder" xml:space="preserve">
<value>2</value>
<value>4</value>
</data>
<data name="label23.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -7424,23 +7507,29 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;label23.ZOrder" xml:space="preserve">
<value>3</value>
<value>5</value>
</data>
<data name="cBR2OutputCurve.Items" xml:space="preserve">
<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>
@ -7460,23 +7549,29 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;cBR2OutputCurve.ZOrder" xml:space="preserve">
<value>4</value>
<value>6</value>
</data>
<data name="cBL2OutputCurve.Items" xml:space="preserve">
<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>
@ -7496,7 +7591,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;cBL2OutputCurve.ZOrder" xml:space="preserve">
<value>5</value>
<value>7</value>
</data>
<data name="label22.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -7526,7 +7621,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;label22.ZOrder" xml:space="preserve">
<value>6</value>
<value>8</value>
</data>
<data name="label21.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -7556,7 +7651,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;label21.ZOrder" xml:space="preserve">
<value>7</value>
<value>9</value>
</data>
<data name="rsOutCurveComboBox.Items" xml:space="preserve">
<value>Linear</value>
@ -7576,6 +7671,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>
@ -7595,7 +7693,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;rsOutCurveComboBox.ZOrder" xml:space="preserve">
<value>8</value>
<value>10</value>
</data>
<data name="lsOutCurveComboBox.Items" xml:space="preserve">
<value>Linear</value>
@ -7615,6 +7713,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>
@ -7634,7 +7735,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;lsOutCurveComboBox.ZOrder" xml:space="preserve">
<value>9</value>
<value>11</value>
</data>
<data name="label10.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -7664,7 +7765,7 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;label10.ZOrder" xml:space="preserve">
<value>10</value>
<value>12</value>
</data>
<data name="label9.AutoSize" type="System.Boolean, mscorlib">
<value>True</value>
@ -7694,13 +7795,13 @@ with profile</value>
<value>tPOutCurve</value>
</data>
<data name="&gt;&gt;label9.ZOrder" xml:space="preserve">
<value>11</value>
<value>13</value>
</data>
<data name="tPOutCurve.Location" type="System.Drawing.Point, System.Drawing">
<value>4, 22</value>
</data>
<data name="tPOutCurve.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="tPOutCurve.TabIndex" type="System.Int32, mscorlib">
<value>4</value>
@ -7895,7 +7996,7 @@ with profile</value>
<value>3, 3, 3, 3</value>
</data>
<data name="tPCurve.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="tPCurve.TabIndex" type="System.Int32, mscorlib">
<value>1</value>
@ -8024,7 +8125,7 @@ with profile</value>
<value>3, 3, 3, 3</value>
</data>
<data name="tpRotation.Size" type="System.Drawing.Size, System.Drawing">
<value>264, 52</value>
<value>264, 80</value>
</data>
<data name="tpRotation.TabIndex" type="System.Int32, mscorlib">
<value>5</value>
@ -8048,7 +8149,7 @@ with profile</value>
<value>281, 55</value>
</data>
<data name="tCSens.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 78</value>
<value>272, 106</value>
</data>
<data name="tCSens.TabIndex" type="System.Int32, mscorlib">
<value>234</value>
@ -9137,7 +9238,10 @@ with profile</value>
<value>11</value>
</data>
<data name="gBSensitivity.Location" type="System.Drawing.Point, System.Drawing">
<value>281, 139</value>
<value>281, 165</value>
</data>
<data name="gBSensitivity.Margin" type="System.Windows.Forms.Padding, System.Windows.Forms">
<value>3, 1, 3, 1</value>
</data>
<data name="gBSensitivity.Size" type="System.Drawing.Size, System.Drawing">
<value>272, 76</value>
@ -9323,7 +9427,7 @@ with profile</value>
<value>System.Windows.Forms.ContextMenuStrip, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</data>
<metadata name="cMTouchDisableInvert.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>144, 63</value>
<value>625, 18</value>
</metadata>
<data name="crossTouchInvStripMenuItem.Size" type="System.Drawing.Size, System.Drawing">
<value>194, 22</value>
@ -9452,7 +9556,7 @@ with profile</value>
<value>True</value>
</metadata>
<metadata name="$this.TrayHeight" type="System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<value>222</value>
<value>47</value>
</metadata>
<data name="$this.AutoScaleDimensions" type="System.Drawing.SizeF, System.Drawing">
<value>96, 96</value>

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" />