From 8890b053c72d1196d7de5078346b0024dcd8c3eb Mon Sep 17 00:00:00 2001 From: Gino Moena Date: Fri, 19 Jul 2024 10:44:25 -0400 Subject: [PATCH] Added n64 support (#1138) * Added n64 support * Updated icon n64 * fixed Y axis in C buttons * Added dynamic calibration for n64 joy * Added option real 64 range * corrected the stick minimum value for both axis --- BetterJoyForCemu/App.config | 2 + BetterJoyForCemu/BetterJoy.csproj | 1 + BetterJoyForCemu/Icons/ultra.png | Bin 0 -> 31907 bytes BetterJoyForCemu/Joycon.cs | 225 ++++++++++++++++-- BetterJoyForCemu/Program.cs | 11 +- .../Properties/Resources.Designer.cs | 10 + BetterJoyForCemu/Properties/Resources.resx | 3 + README.md | 2 +- 8 files changed, 225 insertions(+), 29 deletions(-) create mode 100644 BetterJoyForCemu/Icons/ultra.png diff --git a/BetterJoyForCemu/App.config b/BetterJoyForCemu/App.config index 5a4a98a..1edb266 100644 --- a/BetterJoyForCemu/App.config +++ b/BetterJoyForCemu/App.config @@ -46,6 +46,8 @@ + + diff --git a/BetterJoyForCemu/BetterJoy.csproj b/BetterJoyForCemu/BetterJoy.csproj index a915684..5de20ab 100644 --- a/BetterJoyForCemu/BetterJoy.csproj +++ b/BetterJoyForCemu/BetterJoy.csproj @@ -239,6 +239,7 @@ Always + diff --git a/BetterJoyForCemu/Icons/ultra.png b/BetterJoyForCemu/Icons/ultra.png new file mode 100644 index 0000000000000000000000000000000000000000..07a8753511dcacdeb54efa2bcdb480dddccd5cc0 GIT binary patch literal 31907 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%0AVI_{VDWF)6S#qsHb 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 short.Parse(s)).ToArray(); acc_sensiti[0] = temp[0]; acc_sensiti[1] = temp[1]; acc_sensiti[2] = temp[2]; temp = (short[])ConfigurationManager.AppSettings["gyr_sensiti"].Split(',').Select(s => short.Parse(s)).ToArray(); @@ -1325,15 +1335,103 @@ namespace BetterJoyForCemu { DebugPrint(string.Format(format, tostr), d); } + + private static float GetNormalizedValue(float value, float rawMin, float rawMax, float normalizedMin, float normalizedMax) + { + return (value - rawMin) / (rawMax - rawMin) * (normalizedMax - normalizedMin) + normalizedMin; + } + + private static float[] Getn64StickValues(Joycon input) + { + var isLeft = input.isLeft; + var other = input.other; + var stick = input.stick; + var stick2 = input.stick2; + var stick_correction = new float[] { 0f, 0f}; + + var xAxis = (other == input && !isLeft) ? stick2[0] : stick[0]; + var yAxis = (other == input && !isLeft) ? stick2[1] : stick[1]; + + + if (xAxis < input.minX) + { + input.minX = xAxis; + } + + if (xAxis > input.maxX) + { + input.maxX = xAxis; + } + + if (yAxis < input.minY) + { + input.minY = yAxis; + } + + if (yAxis > input.maxY) + { + input.maxY = yAxis; + } + + var middleX = (input.minX + (input.maxX - input.minX)/2); + var middleY = (input.minY + (input.maxY - input.minY)/2); + #if DEBUG + var desc = ""; + desc += "x: "+xAxis+"; y: "+yAxis; + desc += "\n X: ["+input.minX+", "+input.maxX+"]; Y: ["+input.minY+", "+input.maxY+"] "; + desc += "; middle ["+middleX+", "+middleY+"]"; + + Debug.WriteLine(desc); + #endif + + var negative_normalized = new float[] {-1, 0}; + var positive_normalized = new float[] {0, 1}; + + var xRange = new float[] {-1f, 1f}; + var yRange = new float[] {-1f, 1f}; + + if (input.realn64Range) + { + xRange = new float[] {-0.79f, 0.79f}; + yRange = new float[] {-0.79f, 0.79f}; + } + + + if (xAxis < (middleX - middleX)) + { + stick_correction[0] = GetNormalizedValue(xAxis, input.minX, (middleX - middleX), xRange[0], 0f); + } + + if (xAxis > (middleX+middleX)) + { + stick_correction[0] = GetNormalizedValue(xAxis, (middleX+middleX), input.maxX, 0f, xRange[1]); + } + + if (yAxis < (middleY-middleY)) + { + stick_correction[1] = GetNormalizedValue(yAxis, input.minY, (middleY-middleY), yRange[0], 0f); + } + + if (yAxis > (middleY+middleY)) + { + stick_correction[1] = GetNormalizedValue(yAxis, (middleY+middleY), input.maxY, 0f, yRange[1]); + } + + + return stick_correction; + } + private static OutputControllerXbox360InputState MapToXbox360Input(Joycon input) { var output = new OutputControllerXbox360InputState(); + var swapAB = input.swapAB; var swapXY = input.swapXY; var isPro = input.isPro; var isLeft = input.isLeft; var isSnes = input.isSnes; + var is64 = input.is64; var other = input.other; var GyroAnalogSliders = input.GyroAnalogSliders; @@ -1342,7 +1440,34 @@ namespace BetterJoyForCemu { var stick2 = input.stick2; var sliderVal = input.sliderVal; - if (isPro) { + if (is64) + { + output.axis_right_x = (short) ((buttons[(int)Button.X] ? Int16.MinValue : 0) + (buttons[(int)Button.MINUS] ? Int16.MaxValue : 0)); + output.axis_right_y = (short) ((buttons[(int)Button.SHOULDER2_2] ? Int16.MinValue: 0) + (buttons[(int)Button.Y] ? Int16.MaxValue: 0)); + + var n64Stick = Getn64StickValues(input); + + output.axis_left_x = CastStickValue(n64Stick[0]); + output.axis_left_y = CastStickValue(n64Stick[1]); + + output.start = buttons[(int)Button.PLUS]; + output.a = buttons[(int)(!swapAB ? Button.B : Button.A)]; + output.b = buttons[(int)(!swapAB ? Button.A : Button.B)]; + + output.shoulder_left = buttons[(int)Button.SHOULDER_1]; + output.shoulder_right = buttons[(int)Button.SHOULDER2_1]; + + output.trigger_left = (byte)(buttons[(int)Button.SHOULDER_2] ? Byte.MaxValue : 0); + output.trigger_right = (byte)(buttons[(int)Button.STICK] ? Byte.MaxValue : 0); + + output.dpad_down = buttons[(int)Button.DPAD_DOWN]; + output.dpad_left = buttons[(int)Button.DPAD_LEFT]; + output.dpad_right = buttons[(int)Button.DPAD_RIGHT]; + output.dpad_up = buttons[(int)Button.DPAD_UP]; + output.guide = buttons[(int)Button.HOME]; + + } + else if (isPro) { output.a = buttons[(int)(!swapAB ? Button.B : Button.A)]; output.b = buttons[(int)(!swapAB ? Button.A : Button.B)]; output.y = buttons[(int)(!swapXY ? Button.X : Button.Y)]; @@ -1403,7 +1528,7 @@ namespace BetterJoyForCemu { if (Config.Value("home") != "0") output.guide = false; - if (!isSnes) { + if (!(isSnes || is64)) { if (other != null || isPro) { // no need for && other != this output.axis_left_x = CastStickValue((other == input && !isLeft) ? stick2[0] : stick[0]); output.axis_left_y = CastStickValue((other == input && !isLeft) ? stick2[1] : stick[1]); @@ -1416,14 +1541,17 @@ namespace BetterJoyForCemu { } } - if (other != null || isPro) { - byte lval = GyroAnalogSliders ? sliderVal[0] : Byte.MaxValue; - byte rval = GyroAnalogSliders ? sliderVal[1] : Byte.MaxValue; - output.trigger_left = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER2_2)] ? lval : 0); - output.trigger_right = (byte)(buttons[(int)(isLeft ? Button.SHOULDER2_2 : Button.SHOULDER_2)] ? rval : 0); - } else { - output.trigger_left = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER_1)] ? Byte.MaxValue : 0); - output.trigger_right = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_1 : Button.SHOULDER_2)] ? Byte.MaxValue : 0); + if (!is64) + { + if (other != null || isPro) { + byte lval = GyroAnalogSliders ? sliderVal[0] : Byte.MaxValue; + byte rval = GyroAnalogSliders ? sliderVal[1] : Byte.MaxValue; + output.trigger_left = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER2_2)] ? lval : 0); + output.trigger_right = (byte)(buttons[(int)(isLeft ? Button.SHOULDER2_2 : Button.SHOULDER_2)] ? rval : 0); + } else { + output.trigger_left = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER_1)] ? Byte.MaxValue : 0); + output.trigger_right = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_1 : Button.SHOULDER_2)] ? Byte.MaxValue : 0); + } } return output; @@ -1438,6 +1566,7 @@ namespace BetterJoyForCemu { var isPro = input.isPro; var isLeft = input.isLeft; var isSnes = input.isSnes; + var is64 = input.is64; var other = input.other; var GyroAnalogSliders = input.GyroAnalogSliders; @@ -1446,6 +1575,47 @@ namespace BetterJoyForCemu { var stick2 = input.stick2; var sliderVal = input.sliderVal; + if (is64) + { + output.thumb_right_x = (byte) ((buttons[(int)Button.X] ? Byte.MinValue : 0) + (buttons[(int)Button.MINUS] ? Byte.MaxValue : 0)); + output.thumb_right_y = (byte) ((buttons[(int)Button.SHOULDER2_2] ? Byte.MinValue: 0) + (buttons[(int)Button.Y] ? Byte.MaxValue: 0)); + + output.thumb_left_x = CastStickValueByte((other == input && !isLeft) ? -stick2[0] : -stick[0]); + output.thumb_left_y = CastStickValueByte((other == input && !isLeft) ? stick2[1] : stick[1]); + + output.options = buttons[(int)Button.PLUS]; + output.cross = buttons[(int)(!swapAB ? Button.B : Button.A)]; + output.circle = buttons[(int)(!swapAB ? Button.A : Button.B)]; + + output.shoulder_left = buttons[(int)Button.SHOULDER_1]; + output.shoulder_right = buttons[(int)Button.SHOULDER2_1]; + + output.trigger_left = buttons[(int)Button.SHOULDER_2]; + output.trigger_right = buttons[(int)Button.STICK]; + output.trigger_left_value = (byte)(buttons[(int)Button.SHOULDER_2] ? Byte.MaxValue : 0); + output.trigger_right_value = (byte)(buttons[(int)Button.STICK] ? Byte.MaxValue : 0); + + + if (buttons[(int)Button.DPAD_UP]) { + if (buttons[(int)Button.DPAD_LEFT]) + output.dPad = DpadDirection.Northwest; + else if (buttons[(int)Button.DPAD_RIGHT]) + output.dPad = DpadDirection.Northeast; + else + output.dPad = DpadDirection.North; + } else if (buttons[(int)Button.DPAD_DOWN]) { + if (buttons[(int)Button.DPAD_LEFT]) + output.dPad = DpadDirection.Southwest; + else if (buttons[(int)Button.DPAD_RIGHT]) + output.dPad = DpadDirection.Southeast; + else + output.dPad = DpadDirection.South; + } else if (buttons[(int)Button.DPAD_LEFT]) + output.dPad = DpadDirection.West; + else if (buttons[(int)Button.DPAD_RIGHT]) + output.dPad = DpadDirection.East; + } + if (isPro) { output.cross = buttons[(int)(!swapAB ? Button.B : Button.A)]; output.circle = buttons[(int)(!swapAB ? Button.A : Button.B)]; @@ -1534,7 +1704,7 @@ namespace BetterJoyForCemu { if (Config.Value("home") != "0") output.ps = false; - if (!isSnes) { + if (!(isSnes || is64)) { if (other != null || isPro) { // no need for && other != this output.thumb_left_x = CastStickValueByte((other == input && !isLeft) ? -stick2[0] : -stick[0]); output.thumb_left_y = CastStickValueByte((other == input && !isLeft) ? stick2[1] : stick[1]); @@ -1546,18 +1716,21 @@ namespace BetterJoyForCemu { } } - if (other != null || isPro) { - byte lval = GyroAnalogSliders ? sliderVal[0] : Byte.MaxValue; - byte rval = GyroAnalogSliders ? sliderVal[1] : Byte.MaxValue; - output.trigger_left_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER2_2)] ? lval : 0); - output.trigger_right_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER2_2 : Button.SHOULDER_2)] ? rval : 0); - } else { - output.trigger_left_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER_1)] ? Byte.MaxValue : 0); - output.trigger_right_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_1 : Button.SHOULDER_2)] ? Byte.MaxValue : 0); - } + if (!is64) + { + if (other != null || isPro) { + byte lval = GyroAnalogSliders ? sliderVal[0] : Byte.MaxValue; + byte rval = GyroAnalogSliders ? sliderVal[1] : Byte.MaxValue; + output.trigger_left_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER2_2)] ? lval : 0); + output.trigger_right_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER2_2 : Button.SHOULDER_2)] ? rval : 0); + } else { + output.trigger_left_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_2 : Button.SHOULDER_1)] ? Byte.MaxValue : 0); + output.trigger_right_value = (byte)(buttons[(int)(isLeft ? Button.SHOULDER_1 : Button.SHOULDER_2)] ? Byte.MaxValue : 0); + } // Output digital L2 / R2 in addition to analog L2 / R2 output.trigger_left = output.trigger_left_value > 0 ? output.trigger_left = true : output.trigger_left = false; output.trigger_right = output.trigger_right_value > 0 ? output.trigger_right = true : output.trigger_right = false; + } return output; } diff --git a/BetterJoyForCemu/Program.cs b/BetterJoyForCemu/Program.cs index 8c11920..40e894d 100644 --- a/BetterJoyForCemu/Program.cs +++ b/BetterJoyForCemu/Program.cs @@ -30,6 +30,7 @@ namespace BetterJoyForCemu { private const ushort product_r = 0x2007; private const ushort product_pro = 0x2009; private const ushort product_snes = 0x2017; + private const ushort product_n64 = 0x2019; public ConcurrentList j { get; private set; } // Array of all connected Joy-Cons static JoyconManager instance; @@ -128,7 +129,7 @@ namespace BetterJoyForCemu { } bool validController = (enumerate.product_id == product_l || enumerate.product_id == product_r || - enumerate.product_id == product_pro || enumerate.product_id == product_snes) && enumerate.vendor_id == vendor_id; + enumerate.product_id == product_pro || enumerate.product_id == product_snes || enumerate.product_id == product_n64) && enumerate.vendor_id == vendor_id; // check list of custom controllers specified foreach (SController v in Program.thirdPartyCons) { if (enumerate.vendor_id == v.vendor_id && enumerate.product_id == v.product_id && enumerate.serial_number == v.serial_number) { @@ -158,6 +159,9 @@ namespace BetterJoyForCemu { case product_snes: isLeft = true; form.AppendTextBox("SNES controller connected.\r\n"); break; + case product_n64: + isLeft = true; + form.AppendTextBox("N64 controller connected.\r\n"); break; default: form.AppendTextBox("Non Joy-Con Nintendo input device skipped.\r\n"); break; } @@ -194,7 +198,8 @@ namespace BetterJoyForCemu { bool isPro = prod_id == product_pro; bool isSnes = prod_id == product_snes; - j.Add(new Joycon(handle, EnableIMU, EnableLocalize & EnableIMU, 0.05f, isLeft, enumerate.path, enumerate.serial_number, j.Count, isPro, isSnes, thirdParty != null)); + bool is64 = prod_id == product_n64; + j.Add(new Joycon(handle, EnableIMU, EnableLocalize & EnableIMU, 0.05f, isLeft, enumerate.path, enumerate.serial_number, j.Count, isPro, isSnes, is64,thirdParty != null)); foundNew = true; j.Last().form = form; @@ -214,6 +219,8 @@ namespace BetterJoyForCemu { temp = Properties.Resources.pro; break; case (product_snes): temp = Properties.Resources.snes; break; + case (product_n64): + temp = Properties.Resources.ultra; break; default: temp = Properties.Resources.cross; break; } diff --git a/BetterJoyForCemu/Properties/Resources.Designer.cs b/BetterJoyForCemu/Properties/Resources.Designer.cs index cd691cc..1d3c1e0 100644 --- a/BetterJoyForCemu/Properties/Resources.Designer.cs +++ b/BetterJoyForCemu/Properties/Resources.Designer.cs @@ -139,5 +139,15 @@ namespace BetterJoyForCemu.Properties { return ((System.Drawing.Bitmap)(obj)); } } + + /// + /// Looks up a localized resource of type System.Drawing.Bitmap. + /// + internal static System.Drawing.Bitmap ultra { + get { + object obj = ResourceManager.GetObject("ultra", resourceCulture); + return ((System.Drawing.Bitmap)(obj)); + } + } } } diff --git a/BetterJoyForCemu/Properties/Resources.resx b/BetterJoyForCemu/Properties/Resources.resx index 5bc74e0..08c8d17 100644 --- a/BetterJoyForCemu/Properties/Resources.resx +++ b/BetterJoyForCemu/Properties/Resources.resx @@ -121,6 +121,9 @@ ..\Icons\snes.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + + ..\Icons\ultra.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a + ..\Icons\pro.png;System.Drawing.Bitmap, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a diff --git a/README.md b/README.md index 042533f..c0166fa 100644 --- a/README.md +++ b/README.md @@ -104,4 +104,4 @@ A last thanks goes out to [dekuNukem](https://github.com/dekuNukem/Nintendo_Swit Massive *thank you* to **all** code contributors! Icons (modified): "[Switch Pro Controller](https://thenounproject.com/term/nintendo-switch/930119/)", "[ -Switch Detachable Controller Left](https://thenounproject.com/remsing/uploads/?i=930115)", "[Switch Detachable Controller Right](https://thenounproject.com/remsing/uploads/?i=930121)" icons by Chad Remsing from [the Noun Project](http://thenounproject.com/). [Super Nintendo Controller](https://thenounproject.com/themizarkshow/collection/vectogram/?i=193592) icon by Mark Davis from the [the Noun Project](http://thenounproject.com/); icon modified by [Amy Alexander](https://www.linkedin.com/in/-amy-alexander/). +Switch Detachable Controller Left](https://thenounproject.com/remsing/uploads/?i=930115)", "[Switch Detachable Controller Right](https://thenounproject.com/remsing/uploads/?i=930121)" icons by Chad Remsing from [the Noun Project](http://thenounproject.com/). [Super Nintendo Controller](https://thenounproject.com/themizarkshow/collection/vectogram/?i=193592) icon by Mark Davis from the [the Noun Project](http://thenounproject.com/); icon modified by [Amy Alexander](https://www.linkedin.com/in/-amy-alexander/). [Nintendo 64 Controller](https://thenounproject.com/icon/game-controller-193588/) icon by Mark Davis from the [the Noun Project](http://thenounproject.com/); icon modified by [Gino Moena](https://www.github.com/GinoMoena).