diff --git a/DirectInputExplorer~/DirectInputExplorer/Form1.cs b/DirectInputExplorer~/DirectInputExplorer/Form1.cs index d351ad9..9845fcd 100644 --- a/DirectInputExplorer~/DirectInputExplorer/Form1.cs +++ b/DirectInputExplorer~/DirectInputExplorer/Form1.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics; using System.Linq; using System.Windows.Forms; using DirectInputManager; @@ -90,7 +91,14 @@ private void FFB_CheckBox_CheckedChanged(object sender, EventArgs e) { FFBEffects TriggeringEffectType = (FFBEffects)Enum.Parse(typeof(FFBEffects), TriggeringCheckBox.Tag.ToString()); if (TriggeringCheckBox.Checked) { // Enable the effect - TriggeringCheckBox.Checked = DIManager.EnableFFBEffect(DIManager.devices[ComboBoxDevices.SelectedIndex], TriggeringEffectType); // If enable fails, checkbox will be unchecked + + if (TriggeringEffectType == FFBEffects.Inertia) + { + Debug.Write("PRINT BUMP"); + DIManager.EnablePeroidicFFBEffect(DIManager.devices[ComboBoxDevices.SelectedIndex], FFBEffects.ConstantForce); + } + else + TriggeringCheckBox.Checked = DIManager.EnableFFBEffect(DIManager.devices[ComboBoxDevices.SelectedIndex], TriggeringEffectType); // If enable fails, checkbox will be unchecked } else { // Disable the effect TriggeringCheckBox.Checked = !DIManager.DestroyFFBEffect(DIManager.devices[ComboBoxDevices.SelectedIndex], TriggeringEffectType); } @@ -159,7 +167,7 @@ private void FFB_UpDown_ValueChanged(object sender, EventArgs e) { DIManager.UpdateFrictionSimple(ActiveDevice, (int)((TrigElement.Parent.Controls.Find("UDFrictionMagnitude", false).FirstOrDefault() as NumericUpDown).Value)); break; case "Inertia": - DIManager.UpdateInertiaSimple(ActiveDevice, (int)((TrigElement.Parent.Controls.Find("UDInertiaMagnitude", false).FirstOrDefault() as NumericUpDown).Value)); + DIManager.UpdatePeroidEffect(ActiveDevice, FFBEffects.ConstantForce,(int)((TrigElement.Parent.Controls.Find("UDInertiaMagnitude", false).FirstOrDefault() as NumericUpDown).Value)); break; default: break; diff --git a/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.dll b/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.dll index 797b767..d05812d 100644 Binary files a/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.dll and b/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.dll differ diff --git a/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.exe b/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.exe index e39c1fe..7bd352b 100644 Binary files a/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.exe and b/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.exe differ diff --git a/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.runtimeconfig.dev.json b/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.runtimeconfig.dev.json index 6c11489..3195011 100644 --- a/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.runtimeconfig.dev.json +++ b/DirectInputExplorer~/DirectInputExplorer/bin/Debug/net5.0-windows/DirectInputExplorer.runtimeconfig.dev.json @@ -1,8 +1,9 @@ { "runtimeOptions": { "additionalProbingPaths": [ - "C:\\Users\\Ducky\\.dotnet\\store\\|arch|\\|tfm|", - "C:\\Users\\Ducky\\.nuget\\packages" + "C:\\Users\\drathod\\.dotnet\\store\\|arch|\\|tfm|", + "C:\\Users\\drathod\\.nuget\\packages", + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" ] } } \ No newline at end of file diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.AssemblyInfo.cs b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.AssemblyInfo.cs index c95c71c..7703e21 100644 --- a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.AssemblyInfo.cs +++ b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.AssemblyInfo.cs @@ -1,7 +1,6 @@ //------------------------------------------------------------------------------ // // This code was generated by a tool. -// Runtime Version:4.0.30319.42000 // // Changes to this file may cause incorrect behavior and will be lost if // the code is regenerated. diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig index 5f52e58..5e8c30d 100644 --- a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig +++ b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig @@ -14,4 +14,6 @@ build_property.PlatformNeutralAssembly = build_property.EnforceExtendedAnalyzerRules = build_property._SupportedPlatformList = Linux,macOS,Windows build_property.RootNamespace = DirectInputExplorer -build_property.ProjectDir = C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputExplorer~\DirectInputExplorer\ +build_property.ProjectDir = C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\ +build_property.EnableComHosting = +build_property.EnableGeneratedComInterfaceComImportInterop = diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.csproj.FileListAbsolute.txt b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.csproj.FileListAbsolute.txt index 8b24315..68f56a7 100644 --- a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.csproj.FileListAbsolute.txt +++ b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.csproj.FileListAbsolute.txt @@ -52,3 +52,54 @@ C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputExplorer~\DirectInp C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.pdb C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.genruntimeconfig.cache C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\ref\DirectInputExplorer.dll +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.exe +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.deps.json +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.runtimeconfig.json +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.runtimeconfig.dev.json +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.dll +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.pdb +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.Form1.resources +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.csproj.GenerateResource.cache +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.AssemblyInfoInputs.cache +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.AssemblyInfo.cs +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.csproj.CoreCompileInputs.cache +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.dll +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\refint\DirectInputExplorer.dll +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.pdb +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.genruntimeconfig.cache +E:\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\ref\DirectInputExplorer.dll +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.exe +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.deps.json +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.runtimeconfig.json +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.runtimeconfig.dev.json +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.dll +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.pdb +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.Form1.resources +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.csproj.GenerateResource.cache +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.AssemblyInfoInputs.cache +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.AssemblyInfo.cs +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.csproj.CoreCompileInputs.cache +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.dll +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\refint\DirectInputExplorer.dll +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.pdb +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.genruntimeconfig.cache +C:\Users\dhruv.000\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\ref\DirectInputExplorer.dll +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.exe +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.deps.json +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.runtimeconfig.json +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.runtimeconfig.dev.json +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.dll +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\bin\Debug\net5.0-windows\DirectInputExplorer.pdb +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.Form1.resources +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.csproj.GenerateResource.cache +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.GeneratedMSBuildEditorConfig.editorconfig +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.AssemblyInfoInputs.cache +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.AssemblyInfo.cs +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.csproj.CoreCompileInputs.cache +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.dll +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\refint\DirectInputExplorer.dll +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.pdb +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\DirectInputExplorer.genruntimeconfig.cache +C:\Users\drathod\Downloads\Unity-DirectInput-main\Unity-DirectInput-main\Unity-DirectInput-main\DirectInputExplorer~\DirectInputExplorer\obj\Debug\net5.0-windows\ref\DirectInputExplorer.dll diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.dll b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.dll index 797b767..d05812d 100644 Binary files a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.dll and b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/DirectInputExplorer.dll differ diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/apphost.exe b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/apphost.exe index e39c1fe..7bd352b 100644 Binary files a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/apphost.exe and b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/apphost.exe differ diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/ref/DirectInputExplorer.dll b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/ref/DirectInputExplorer.dll index aa73451..c46bfca 100644 Binary files a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/ref/DirectInputExplorer.dll and b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/ref/DirectInputExplorer.dll differ diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/refint/DirectInputExplorer.dll b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/refint/DirectInputExplorer.dll index aa73451..c46bfca 100644 Binary files a/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/refint/DirectInputExplorer.dll and b/DirectInputExplorer~/DirectInputExplorer/obj/Debug/net5.0-windows/refint/DirectInputExplorer.dll differ diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.dgspec.json b/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.dgspec.json index 873059a..fd8fe85 100644 --- a/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.dgspec.json +++ b/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.dgspec.json @@ -1,20 +1,24 @@ { "format": 1, "restore": { - "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj": {} + "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj": {} }, "projects": { - "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj": { + "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", + "projectUniqueName": "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", "projectName": "DirectInputExplorer", - "projectPath": "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", - "packagesPath": "C:\\Users\\Ducky\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\obj\\", + "projectPath": "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", + "packagesPath": "C:\\Users\\drathod\\.nuget\\packages\\", + "outputPath": "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\obj\\", "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], "configFilePaths": [ - "C:\\Users\\Ducky\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\drathod\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ @@ -22,6 +26,7 @@ ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { @@ -51,9 +56,21 @@ "assetTargetFallback": true, "warn": true, "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[5.0.0, 5.0.0]" + }, { "name": "Microsoft.NETCore.App.Host.win-x64", "version": "[5.0.17, 5.0.17]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[5.0.0, 5.0.0]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[5.0.0, 5.0.0]" } ], "frameworkReferences": { @@ -64,7 +81,7 @@ "privateAssets": "none" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.100\\RuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.300\\RuntimeIdentifierGraph.json" } } } diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.g.props b/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.g.props index 405add7..ad1627d 100644 --- a/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.g.props +++ b/DirectInputExplorer~/DirectInputExplorer/obj/DirectInputExplorer.csproj.nuget.g.props @@ -5,11 +5,12 @@ NuGet $(MSBuildThisFileDirectory)project.assets.json $(UserProfile)\.nuget\packages\ - C:\Users\Ducky\.nuget\packages\ + C:\Users\drathod\.nuget\packages\;C:\Program Files (x86)\Microsoft Visual Studio\Shared\NuGetPackages PackageReference - 6.4.0 + 6.9.1 - + + \ No newline at end of file diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/project.assets.json b/DirectInputExplorer~/DirectInputExplorer/obj/project.assets.json index 7a4c022..08194ac 100644 --- a/DirectInputExplorer~/DirectInputExplorer/obj/project.assets.json +++ b/DirectInputExplorer~/DirectInputExplorer/obj/project.assets.json @@ -8,19 +8,24 @@ "net5.0-windows7.0": [] }, "packageFolders": { - "C:\\Users\\Ducky\\.nuget\\packages\\": {} + "C:\\Users\\drathod\\.nuget\\packages\\": {}, + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages": {} }, "project": { "version": "1.0.0", "restore": { - "projectUniqueName": "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", + "projectUniqueName": "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", "projectName": "DirectInputExplorer", - "projectPath": "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", - "packagesPath": "C:\\Users\\Ducky\\.nuget\\packages\\", - "outputPath": "C:\\Users\\Ducky\\Documents\\GitHub\\Unity-DirectInput\\DirectInputExplorer~\\DirectInputExplorer\\obj\\", + "projectPath": "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj", + "packagesPath": "C:\\Users\\drathod\\.nuget\\packages\\", + "outputPath": "C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\obj\\", "projectStyle": "PackageReference", + "fallbackFolders": [ + "C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages" + ], "configFilePaths": [ - "C:\\Users\\Ducky\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Users\\drathod\\AppData\\Roaming\\NuGet\\NuGet.Config", + "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.FallbackLocation.config", "C:\\Program Files (x86)\\NuGet\\Config\\Microsoft.VisualStudio.Offline.config" ], "originalTargetFrameworks": [ @@ -28,6 +33,7 @@ ], "sources": { "C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\": {}, + "C:\\Program Files\\dotnet\\library-packs": {}, "https://api.nuget.org/v3/index.json": {} }, "frameworks": { @@ -57,9 +63,21 @@ "assetTargetFallback": true, "warn": true, "downloadDependencies": [ + { + "name": "Microsoft.AspNetCore.App.Ref", + "version": "[5.0.0, 5.0.0]" + }, { "name": "Microsoft.NETCore.App.Host.win-x64", "version": "[5.0.17, 5.0.17]" + }, + { + "name": "Microsoft.NETCore.App.Ref", + "version": "[5.0.0, 5.0.0]" + }, + { + "name": "Microsoft.WindowsDesktop.App.Ref", + "version": "[5.0.0, 5.0.0]" } ], "frameworkReferences": { @@ -70,7 +88,7 @@ "privateAssets": "none" } }, - "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\7.0.100\\RuntimeIdentifierGraph.json" + "runtimeIdentifierGraphPath": "C:\\Program Files\\dotnet\\sdk\\8.0.300\\RuntimeIdentifierGraph.json" } } } diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/project.packagespec.json b/DirectInputExplorer~/DirectInputExplorer/obj/project.packagespec.json new file mode 100644 index 0000000..8dfe9fb --- /dev/null +++ b/DirectInputExplorer~/DirectInputExplorer/obj/project.packagespec.json @@ -0,0 +1 @@ +"restore":{"projectUniqueName":"C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj","projectName":"DirectInputExplorer","projectPath":"C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\DirectInputExplorer.csproj","outputPath":"C:\\Users\\drathod\\Downloads\\Unity-DirectInput-main\\Unity-DirectInput-main\\Unity-DirectInput-main\\DirectInputExplorer~\\DirectInputExplorer\\obj\\","projectStyle":"PackageReference","fallbackFolders":["C:\\Program Files (x86)\\Microsoft Visual Studio\\Shared\\NuGetPackages"],"originalTargetFrameworks":["net5.0-windows"],"sources":{"C:\\Program Files (x86)\\Microsoft SDKs\\NuGetPackages\\":{},"C:\\Program Files\\dotnet\\library-packs":{},"https://api.nuget.org/v3/index.json":{}},"frameworks":{"net5.0-windows7.0":{"targetAlias":"net5.0-windows","projectReferences":{}}},"warningProperties":{"warnAsError":["NU1605"]}}"frameworks":{"net5.0-windows7.0":{"targetAlias":"net5.0-windows","imports":["net461","net462","net47","net471","net472","net48","net481"],"assetTargetFallback":true,"warn":true,"downloadDependencies":[{"name":"Microsoft.AspNetCore.App.Ref","version":"[5.0.0, 5.0.0]"},{"name":"Microsoft.NETCore.App.Host.win-x64","version":"[5.0.17, 5.0.17]"},{"name":"Microsoft.NETCore.App.Ref","version":"[5.0.0, 5.0.0]"},{"name":"Microsoft.WindowsDesktop.App.Ref","version":"[5.0.0, 5.0.0]"}],"frameworkReferences":{"Microsoft.NETCore.App":{"privateAssets":"all"},"Microsoft.WindowsDesktop.App.WindowsForms":{"privateAssets":"none"}},"runtimeIdentifierGraphPath":"C:\\Program Files\\dotnet\\sdk\\8.0.300\\RuntimeIdentifierGraph.json"}} \ No newline at end of file diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/rider.project.model.nuget.info b/DirectInputExplorer~/DirectInputExplorer/obj/rider.project.model.nuget.info new file mode 100644 index 0000000..b3b4b73 --- /dev/null +++ b/DirectInputExplorer~/DirectInputExplorer/obj/rider.project.model.nuget.info @@ -0,0 +1 @@ +17182072109614828 \ No newline at end of file diff --git a/DirectInputExplorer~/DirectInputExplorer/obj/rider.project.restore.info b/DirectInputExplorer~/DirectInputExplorer/obj/rider.project.restore.info new file mode 100644 index 0000000..312c27c --- /dev/null +++ b/DirectInputExplorer~/DirectInputExplorer/obj/rider.project.restore.info @@ -0,0 +1 @@ +17182152559110528 \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/DirectIn.197a2616/Debug/vc143.idb b/DirectInputForceFeedback~/DirectInputForceFeedback/DirectIn.197a2616/Debug/vc143.idb new file mode 100644 index 0000000..823980a Binary files /dev/null and b/DirectInputForceFeedback~/DirectInputForceFeedback/DirectIn.197a2616/Debug/vc143.idb differ diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.cpp b/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.cpp index b1d88e7..790e626 100644 --- a/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.cpp +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.cpp @@ -2,7 +2,8 @@ #include "pch.h" #include "DirectInputForceFeedback.h" -typedef std::string DeviceGUID; // Alias to make it clearer what maps below use as key +// Other necessary includes and definitions +typedef std::string DeviceGUID; std::vector< DeviceInfo > _DeviceInstances; // Store devices available for connection std::map < DeviceGUID, LPDIRECTINPUTDEVICE8 > _ActiveDevices; // Store all of the connected devices @@ -10,6 +11,7 @@ std::map < DeviceGUID, std::vector > _DeviceE std::map < DeviceGUID, std::vector > _DeviceFFBAxes; // Store the Axes available for FFB std::map < DeviceGUID, std::map > _DeviceFFBEffectConfig; // Effect Configuration std::map < DeviceGUID, std::map > _DeviceFFBEffectControl; // Handle to Start/Stop Effect +std::map _ActiveEffects; // Handle to Start/Stop Effect DeviceChangeCallback _DeviceChangeCallback; // External function to invoke on device change @@ -21,429 +23,517 @@ std::vector DEBUGDATA; // Used for Debugging during development // Create the _DirectInput global HRESULT StartDirectInput() { - if (_DirectInput != NULL) { return S_OK; } // Already initialised + if (_DirectInput != NULL) { return S_OK; } // Already initialised - // Setup Device Change Detection (Add/Remove Device Events) - SetWindowsHookExW(WH_CALLWNDPROC, (HOOKPROC)&_WindowsHookCallback, GetModuleHandleW(NULL), GetCurrentThreadId()); + // Setup Device Change Detection (Add/Remove Device Events) + SetWindowsHookExW(WH_CALLWNDPROC, (HOOKPROC)&_WindowsHookCallback, GetModuleHandleW(NULL), GetCurrentThreadId()); - return DirectInput8Create( // Create DirectInput - GetModuleHandle(NULL), - DIRECTINPUT_VERSION, - IID_IDirectInput8, - (void**)&_DirectInput, // Place our DirectInput instance in _DirectInput - NULL - ); + return DirectInput8Create( // Create DirectInput + GetModuleHandle(NULL), + DIRECTINPUT_VERSION, + IID_IDirectInput8, + (void**)&_DirectInput, // Place our DirectInput instance in _DirectInput + NULL + ); } // Stop _DirectInput HRESULT StopDirectInput() { - HRESULT hr = E_FAIL; - if (_DirectInput == NULL) { return hr = S_OK; } // No DirectInput Instance + HRESULT hr = E_FAIL; + if (_DirectInput == NULL) { return hr = S_OK; } // No DirectInput Instance - for (const auto& [GUIDString, Device] : _ActiveDevices) { // For each device - // TODO: Stop Effects? - if (FAILED(hr = Device->Unacquire())) { return hr; } - } + for (const auto& [GUIDString, Device] : _ActiveDevices) { // For each device + if (FAILED(hr = Device->Unacquire())) { return hr; } + } - _DeviceInstances.clear(); - _ActiveDevices.clear(); - _DeviceEnumeratedEffects.clear(); - _DeviceFFBAxes.clear(); - _DeviceFFBEffectConfig.clear(); - _DeviceFFBEffectControl.clear(); + _DeviceInstances.clear(); + _ActiveDevices.clear(); + _DeviceEnumeratedEffects.clear(); + _DeviceFFBAxes.clear(); + _DeviceFFBEffectConfig.clear(); + _DeviceFFBEffectControl.clear(); - _DirectInput = NULL; + _DirectInput = NULL; - return hr; + return hr; } // Return a vector of all attached devices DeviceInfo* EnumerateDevices(/*[out]*/ int& deviceCount) { - HRESULT hr = E_FAIL; - if (_DirectInput == NULL) { return NULL; } // If DI not ready, return nothing - _DeviceInstances.clear(); // Clear devices - - // First fetch all devices - hr = _DirectInput->EnumDevices( // Invoke device enumeration to the _EnumDevicesCallback callback - DI8DEVCLASS_GAMECTRL, // List devices of type GameController - _EnumDevicesCallback, // Callback executed for each device found - NULL, // Passed to callback as optional arg - DIEDFL_ATTACHEDONLY //| DIEDFL_FORCEFEEDBACK - ); - - // Next update FFB devices (Important this happens after as it modifies existing entries) - hr = _DirectInput->EnumDevices( // Invoke device enumeration to the _EnumDevicesCallback callback - DI8DEVCLASS_GAMECTRL, // List devices of type GameController - _EnumDevicesCallbackFFB, // Callback executed for each device found - NULL, // Passed to callback as optional arg - DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK - ); - - if (_DeviceInstances.size() > 0) { - deviceCount = (int)_DeviceInstances.size(); - return &_DeviceInstances[0]; // Return 1st element, structure size & deviceCount are used to find next elements - } else { - deviceCount = 0; - } - return NULL; + HRESULT hr = E_FAIL; + if (_DirectInput == NULL) { return NULL; } // If DI not ready, return nothing + _DeviceInstances.clear(); // Clear devices + + // First fetch all devices + hr = _DirectInput->EnumDevices( // Invoke device enumeration to the _EnumDevicesCallback callback + DI8DEVCLASS_GAMECTRL, // List devices of type GameController + _EnumDevicesCallback, // Callback executed for each device found + NULL, // Passed to callback as optional arg + DIEDFL_ATTACHEDONLY //| DIEDFL_FORCEFEEDBACK + ); + + // Next update FFB devices (Important this happens after as it modifies existing entries) + hr = _DirectInput->EnumDevices( // Invoke device enumeration to the _EnumDevicesCallback callback + DI8DEVCLASS_GAMECTRL, // List devices of type GameController + _EnumDevicesCallbackFFB, // Callback executed for each device found + NULL, // Passed to callback as optional arg + DIEDFL_ATTACHEDONLY | DIEDFL_FORCEFEEDBACK + ); + + if (_DeviceInstances.size() > 0) { + deviceCount = (int)_DeviceInstances.size(); + return &_DeviceInstances[0]; // Return 1st element, structure size & deviceCount are used to find next elements + } else { + deviceCount = 0; + } + return NULL; } // Create the DirectInput Device and Acquire ready for State retreval & FFB Effects (Requires Cooperation level Exclusive) // Pass the GUID (as a string) of the Device you'd like to attach to, GUID obtained from the Enumerated Devices HRESULT CreateDevice(LPCSTR guidInstance) { - HRESULT hr; - DestroyDeviceIfExists(guidInstance); // If device exists, clear it first + HRESULT hr; + DestroyDeviceIfExists(guidInstance); // If device exists, clear it first - LPDIRECTINPUTDEVICE8 DIDevice; - if (FAILED(hr = _DirectInput->CreateDevice(LPCSTRGUIDtoGUID(guidInstance), &DIDevice, NULL))) { return hr; } - if (FAILED(hr = DIDevice->SetDataFormat(&c_dfDIJoystick2))) { return hr; } - if (FAILED(hr = DIDevice->SetCooperativeLevel(FindMainWindow(GetCurrentProcessId()), DISCL_EXCLUSIVE | DISCL_BACKGROUND))) { return hr; } - if (FAILED(hr = DIDevice->Acquire())) { return hr; } + LPDIRECTINPUTDEVICE8 DIDevice; + if (FAILED(hr = _DirectInput->CreateDevice(LPCSTRGUIDtoGUID(guidInstance), &DIDevice, NULL))) { return hr; } + if (FAILED(hr = DIDevice->SetDataFormat(&c_dfDIJoystick2))) { return hr; } + if (FAILED(hr = DIDevice->SetCooperativeLevel(FindMainWindow(GetCurrentProcessId()), DISCL_EXCLUSIVE | DISCL_BACKGROUND))) { return hr; } + if (FAILED(hr = DIDevice->Acquire())) { return hr; } - std::string GUIDString((LPCSTR)guidInstance); // Convert the LPCSTR to a STL String for use as key in map (String as GUID has no operater<) - _ActiveDevices[GUIDString] = DIDevice; // Store Device in _ActiveDevices Map to be referenced later + std::string GUIDString((LPCSTR)guidInstance); // Convert the LPCSTR to a STL String for use as key in map (String as GUID has no operater<) + _ActiveDevices[GUIDString] = DIDevice; // Store Device in _ActiveDevices Map to be referenced later - return hr; + return hr; } // Remove the DirectInput Device, Unacquire and remove from ActiveDevices HRESULT DestroyDevice(LPCSTR guidInstance) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - StopAllFFBEffects(guidInstance); - if (SUCCEEDED(hr = _ActiveDevices[GUIDString]->Unacquire())) { - _ActiveDevices.erase(GUIDString); - } + StopAllFFBEffects(guidInstance); + if (SUCCEEDED(hr = _ActiveDevices[GUIDString]->Unacquire())) { + _ActiveDevices.erase(GUIDString); + } - return hr; + return hr; } // Fetch the Device State, give GUID of the Device (Must already be created by CreateDevice) and out FlatJoyState2 HRESULT GetDeviceState(LPCSTR guidInstance, /*[out]*/ FlatJoyState2& deviceState) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - DIJOYSTATE2 DeviceStateRaw; - hr = _ActiveDevices[GUIDString]->GetDeviceState(sizeof(DIJOYSTATE2), &DeviceStateRaw); // Fetch the device State - deviceState = FlattenDIJOYSTATE2(DeviceStateRaw); // Convert to a friendlier format (Nested arrays are more difficult to check for change) + DIJOYSTATE2 DeviceStateRaw; + hr = _ActiveDevices[GUIDString]->GetDeviceState(sizeof(DIJOYSTATE2), &DeviceStateRaw); // Fetch the device State + deviceState = FlattenDIJOYSTATE2(DeviceStateRaw); // Convert to a friendlier format (Nested arrays are more difficult to check for change) - return hr; + return hr; } // Fetch the Device State, give GUID of the Device (Must already be created by CreateDevice) and out DIJOYSTATE2 HRESULT GetDeviceStateRaw(LPCSTR guidInstance, /*[out]*/ DIJOYSTATE2& deviceState) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - hr = _ActiveDevices[GUIDString]->GetDeviceState(sizeof(DIJOYSTATE2), &deviceState); // Fetch the device State + hr = _ActiveDevices[GUIDString]->GetDeviceState(sizeof(DIJOYSTATE2), &deviceState); // Fetch the device State - return hr; + return hr; } // Fetch the capabilities of the device, returns DIDEVCAPS see https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416607(v=vs.85) HRESULT GetDeviceCapabilities(LPCSTR guidInstance, /*[out]*/ DIDEVCAPS& deviceCapabilitiesOut) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - DIDEVCAPS DeviceCapabilities; - DeviceCapabilities.dwSize = sizeof(DIDEVCAPS); - hr = _ActiveDevices[GUIDString]->GetCapabilities(&DeviceCapabilities); - deviceCapabilitiesOut = DeviceCapabilities; + DIDEVCAPS DeviceCapabilities; + DeviceCapabilities.dwSize = sizeof(DIDEVCAPS); + hr = _ActiveDevices[GUIDString]->GetCapabilities(&DeviceCapabilities); + deviceCapabilitiesOut = DeviceCapabilities; - return hr; + return hr; } // Generate SAFEARRAY of ActiveDevice GUIDs -HRESULT GetActiveDevices(/*[out]*/ SAFEARRAY** activeGUIDs){ - HRESULT hr = E_FAIL; +HRESULT GetActiveDevices(/*[out]*/ SAFEARRAY** activeGUIDs) { + HRESULT hr = E_FAIL; - std::vector SAData; - for (const auto& [GUIDString, Device] : _ActiveDevices) { - SAData.push_back( string_to_wstring(GUIDString) ); - } + std::vector SAData; + for (const auto& [GUIDString, Device] : _ActiveDevices) { + SAData.push_back(string_to_wstring(GUIDString)); + } - hr = BuildSafeArray(SAData, activeGUIDs); - return hr; + hr = BuildSafeArray(SAData, activeGUIDs); + return hr; } // Set the Autocenter property for a DI device, pass device GUID and bool to enable or disable HRESULT SetAutocenter(LPCSTR guidInstance, bool AutocenterState) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - DIPROPDWORD DIPropAutoCenter; + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + DIPROPDWORD DIPropAutoCenter; - DIPropAutoCenter.diph.dwSize = sizeof(DIPropAutoCenter); - DIPropAutoCenter.diph.dwHeaderSize = sizeof(DIPROPHEADER); - DIPropAutoCenter.diph.dwObj = 0; - DIPropAutoCenter.diph.dwHow = DIPH_DEVICE; - DIPropAutoCenter.dwData = AutocenterState ? DIPROPAUTOCENTER_ON : DIPROPAUTOCENTER_OFF; + DIPropAutoCenter.diph.dwSize = sizeof(DIPropAutoCenter); + DIPropAutoCenter.diph.dwHeaderSize = sizeof(DIPROPHEADER); + DIPropAutoCenter.diph.dwObj = 0; + DIPropAutoCenter.diph.dwHow = DIPH_DEVICE; + DIPropAutoCenter.dwData = AutocenterState ? DIPROPAUTOCENTER_ON : DIPROPAUTOCENTER_OFF; - hr = _ActiveDevices[GUIDString]->SetProperty(DIPROP_AUTOCENTER, &DIPropAutoCenter.diph); + hr = _ActiveDevices[GUIDString]->SetProperty(DIPROP_AUTOCENTER, &DIPropAutoCenter.diph); - return hr; + return hr; } // Generate SAFEARRAY of possible FFB Effects for this Device HRESULT EnumerateFFBEffects(LPCSTR guidInstance, /*[out]*/ SAFEARRAY** FFBEffects) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - _DeviceEnumeratedEffects[GUIDString].clear(); // Clear effects for this device - hr = _ActiveDevices[GUIDString]->EnumEffects(&_EnumFFBEffectsCallback, &GUIDString, DIEFT_ALL); // Callback adds each effect to _DeviceEnumeratedEffects with key as device's GUID + _DeviceEnumeratedEffects[GUIDString].clear(); // Clear effects for this device + hr = _ActiveDevices[GUIDString]->EnumEffects(&_EnumFFBEffectsCallback, &GUIDString, DIEFT_ALL); // Callback adds each effect to _DeviceEnumeratedEffects with key as device's GUID - // Generate SafeArray of supported effects - std::vector SAData; // Store what will be in the SafeArray - for (const auto& Effect : _DeviceEnumeratedEffects[GUIDString]) { - SAData.push_back(Effect.tszName); // Add each effect name - } - hr = BuildSafeArray(SAData, FFBEffects); + // Generate SafeArray of supported effects + std::vector SAData; // Store what will be in the SafeArray + for (const auto& Effect : _DeviceEnumeratedEffects[GUIDString]) { + SAData.push_back(Effect.tszName); // Add each effect name + } + hr = BuildSafeArray(SAData, FFBEffects); - return hr; + return hr; } // Generate SAFEARRAY of possible FFB Effects for this Device HRESULT EnumerateFFBAxes(LPCSTR guidInstance, /*[out]*/ SAFEARRAY** FFBAxes) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - - _DeviceFFBAxes[GUIDString].clear(); // Clear Axes info for this device - hr = _ActiveDevices[GUIDString]->EnumObjects(&_EnumFFBAxisCallback, &GUIDString, DIEFT_ALL); // Callback adds each effect to _DeviceFFBAxes with key as device's GUID - - // Generate SafeArray of FFB Axes - std::vector SAData; // Store what will be in the SafeArray - SAData.push_back(L"FFB Axes: " + std::to_wstring(_DeviceFFBAxes.size())); - for (const auto& ObjectInst : _DeviceFFBAxes[GUIDString]) { - - wchar_t szGUID[64] = { 0 }; - (void)StringFromGUID2(ObjectInst.guidType, szGUID, 64); // Void cast ignores [[nodiscard]] warning - std::wstring guidType(szGUID); - - SAData.push_back(ObjectInst.tszName); // Add each effect name - SAData.push_back(L"dwSize: " + std::to_wstring(ObjectInst.dwSize)); - SAData.push_back(L"guidType: " + guidType); - SAData.push_back(L"dwOfs: " + std::to_wstring(ObjectInst.dwOfs)); - SAData.push_back(L"dwType: " + std::to_wstring(ObjectInst.dwType)); - SAData.push_back(L"dwFlags: " + std::to_wstring(ObjectInst.dwFlags)); - SAData.push_back(L"dwFFMaxForce: " + std::to_wstring(ObjectInst.dwFFMaxForce)); - SAData.push_back(L"dwFFForceResolution: " + std::to_wstring(ObjectInst.dwFFForceResolution)); - SAData.push_back(L"wCollectionNumber: " + std::to_wstring(ObjectInst.wCollectionNumber)); - SAData.push_back(L"wDesignatorIndex: " + std::to_wstring(ObjectInst.wDesignatorIndex)); - SAData.push_back(L"wUsagePage: " + std::to_wstring(ObjectInst.wUsagePage)); - SAData.push_back(L"wUsage: " + std::to_wstring(ObjectInst.wUsage)); - SAData.push_back(L"dwDimension: " + std::to_wstring(ObjectInst.dwDimension)); - SAData.push_back(L"wExponent: " + std::to_wstring(ObjectInst.wExponent)); - SAData.push_back(L"wReportId: " + std::to_wstring(ObjectInst.wReportId)); - } - hr = BuildSafeArray(SAData, FFBAxes); - - return hr; -} + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail -// Creates/Enables the Effect on the device -HRESULT CreateFFBEffect(LPCSTR guidInstance, Effects::Type effectType) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - - if (_DeviceFFBEffectControl[GUIDString].contains(effectType)) { return E_ABORT; } // Effect Already Exists on Device - - //Enumerate FFBAxes if not already - if (!_DeviceFFBAxes.contains(GUIDString)) { _DeviceFFBAxes[GUIDString].clear(); // Clear Axes info for this device hr = _ActiveDevices[GUIDString]->EnumObjects(&_EnumFFBAxisCallback, &GUIDString, DIEFT_ALL); // Callback adds each effect to _DeviceFFBAxes with key as device's GUID - } + // Generate SafeArray of FFB Axes + std::vector SAData; // Store what will be in the SafeArray + SAData.push_back(L"FFB Axes: " + std::to_wstring(_DeviceFFBAxes.size())); + for (const auto& ObjectInst : _DeviceFFBAxes[GUIDString]) { + + wchar_t szGUID[64] = { 0 }; + (void)StringFromGUID2(ObjectInst.guidType, szGUID, 64); // Void cast ignores [[nodiscard]] warning + std::wstring guidType(szGUID); + + SAData.push_back(ObjectInst.tszName); // Add each effect name + SAData.push_back(L"dwSize: " + std::to_wstring(ObjectInst.dwSize)); + SAData.push_back(L"guidType: " + guidType); + SAData.push_back(L"dwOfs: " + std::to_wstring(ObjectInst.dwOfs)); + SAData.push_back(L"dwType: " + std::to_wstring(ObjectInst.dwType)); + SAData.push_back(L"dwFlags: " + std::to_wstring(ObjectInst.dwFlags)); + SAData.push_back(L"dwFFMaxForce: " + std::to_wstring(ObjectInst.dwFFMaxForce)); + SAData.push_back(L"dwFFForceResolution: " + std::to_wstring(ObjectInst.dwFFForceResolution)); + SAData.push_back(L"wCollectionNumber: " + std::to_wstring(ObjectInst.wCollectionNumber)); + SAData.push_back(L"wDesignatorIndex: " + std::to_wstring(ObjectInst.wDesignatorIndex)); + SAData.push_back(L"wUsagePage: " + std::to_wstring(ObjectInst.wUsagePage)); + SAData.push_back(L"wUsage: " + std::to_wstring(ObjectInst.wUsage)); + SAData.push_back(L"dwDimension: " + std::to_wstring(ObjectInst.dwDimension)); + SAData.push_back(L"wExponent: " + std::to_wstring(ObjectInst.wExponent)); + SAData.push_back(L"wReportId: " + std::to_wstring(ObjectInst.wReportId)); + } + hr = BuildSafeArray(SAData, FFBAxes); + return hr; +} - int FFBAxesCount = (int)_DeviceFFBAxes[GUIDString].size(); - DWORD* FFBAxes = new DWORD[FFBAxesCount]; - LONG* FFBDirections = new LONG[FFBAxesCount]; +// Creates/Enables the Effect on the device +HRESULT CreateFFBEffect(LPCSTR guidInstance, Effects::Type effectType) { + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - for (int idx = 0; idx < FFBAxesCount; idx++) { - FFBAxes[idx] = AxisTypeToDIJOFS(_DeviceFFBAxes[GUIDString][idx].guidType); // FFB Axis GUID to DirectInput representation - FFBDirections[idx] = 0; // Init this axis - } + if (_DeviceFFBEffectControl[GUIDString].contains(effectType)) { return E_ABORT; } // Effect Already Exists on Device - // Create the Effect + //Enumerate FFBAxes if not already + if (!_DeviceFFBAxes.contains(GUIDString)) { + _DeviceFFBAxes[GUIDString].clear(); // Clear Axes info for this device + hr = _ActiveDevices[GUIDString]->EnumObjects(&_EnumFFBAxisCallback, &GUIDString, DIEFT_ALL); // Callback adds each effect to _DeviceFFBAxes with key as device's GUID + } - DICONSTANTFORCE* constantForce = NULL; - DICONDITION* conditions = NULL; - DIEFFECT effect = {}; // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416616(v=vs.85) - effect.dwSize = sizeof(DIEFFECT); - effect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; - effect.dwDuration = INFINITE; - effect.dwSamplePeriod = 0; - effect.dwGain = DI_FFNOMINALMAX; - effect.dwTriggerButton = DIEB_NOTRIGGER; // Start effect without requiring a button press - effect.dwTriggerRepeatInterval = 0; - effect.cAxes = FFBAxesCount; // How many Axes will the effect be on (cannot be changed once it has been set) - effect.rgdwAxes = FFBAxes; // Identifies the axes to which the effects will be applied (cannot be changed once it has been set) - effect.rglDirection = FFBDirections; // Distribution of effect strength between Axes? - effect.lpEnvelope = 0; - effect.dwStartDelay = 0; + int FFBAxesCount = (int)_DeviceFFBAxes[GUIDString].size(); + DWORD* FFBAxes = new DWORD[FFBAxesCount]; + LONG* FFBDirections = new LONG[FFBAxesCount]; + for (int idx = 0; idx < FFBAxesCount; idx++) { + FFBAxes[idx] = AxisTypeToDIJOFS(_DeviceFFBAxes[GUIDString][idx].guidType); // FFB Axis GUID to DirectInput representation + FFBDirections[idx] = 0; // Init this axis + } + // Create the Effect + + DICONSTANTFORCE* constantForce = NULL; + DICONDITION* conditions = NULL; + DIEFFECT effect = {}; // https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416616(v=vs.85) + effect.dwSize = sizeof(DIEFFECT); + effect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; + effect.dwDuration = INFINITE; + effect.dwSamplePeriod = 0; + effect.dwGain = DI_FFNOMINALMAX; + effect.dwTriggerButton = DIEB_NOTRIGGER; // Start effect without requiring a button press + effect.dwTriggerRepeatInterval = 0; + effect.cAxes = FFBAxesCount; // How many Axes will the effect be on (cannot be changed once it has been set) + effect.rgdwAxes = FFBAxes; // Identifies the axes to which the effects will be applied (cannot be changed once it has been set) + effect.rglDirection = FFBDirections; // Distribution of effect strength between Axes? + effect.lpEnvelope = 0; + effect.dwStartDelay = 0; - switch (effectType) { + switch (effectType) { case Effects::Type::ConstantForce: - constantForce = new DICONSTANTFORCE(); - constantForce->lMagnitude = 0; - effect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE); - effect.lpvTypeSpecificParams = constantForce; - break; + constantForce = new DICONSTANTFORCE(); + constantForce->lMagnitude = 0; + effect.cbTypeSpecificParams = sizeof(DICONSTANTFORCE); + effect.lpvTypeSpecificParams = constantForce; + break; case Effects::Type::Spring: - conditions = new DICONDITION[FFBAxesCount]; - ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); - effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; - effect.lpvTypeSpecificParams = conditions; - break; + conditions = new DICONDITION[FFBAxesCount]; + ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); + effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; + effect.lpvTypeSpecificParams = conditions; + break; case Effects::Type::Damper: - conditions = new DICONDITION[FFBAxesCount]; - ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); - effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; - effect.lpvTypeSpecificParams = conditions; - break; + conditions = new DICONDITION[FFBAxesCount]; + ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); + effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; + effect.lpvTypeSpecificParams = conditions; + break; case Effects::Type::Friction: - conditions = new DICONDITION[FFBAxesCount]; - ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); - effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; - effect.lpvTypeSpecificParams = conditions; - break; + conditions = new DICONDITION[FFBAxesCount]; + ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); + effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; + effect.lpvTypeSpecificParams = conditions; + break; case Effects::Type::Inertia: - conditions = new DICONDITION[FFBAxesCount]; - ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); - effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; - effect.lpvTypeSpecificParams = conditions; - break; + conditions = new DICONDITION[FFBAxesCount]; + ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); + effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; + effect.lpvTypeSpecificParams = conditions; + break; + + case Effects::Type::Sine: + conditions = new DICONDITION[FFBAxesCount]; + ZeroMemory(conditions, sizeof(DICONDITION) * FFBAxesCount); + effect.cbTypeSpecificParams = sizeof(DICONDITION) * FFBAxesCount; + effect.lpvTypeSpecificParams = conditions; + break; default: - return E_FAIL; // Unsupported Effect - } + return E_FAIL; // Unsupported Effect + } - LPDIRECTINPUTEFFECT effectControl; - if (FAILED(hr = _ActiveDevices[GUIDString]->CreateEffect(EffectTypeToGUID(effectType), &effect, &effectControl, nullptr))) { return hr; } - if (FAILED(hr = effectControl->Start(1, 0))) { return hr; } - _DeviceFFBEffectConfig[GUIDString][effectType] = effect; - _DeviceFFBEffectControl[GUIDString][effectType] = effectControl; + LPDIRECTINPUTEFFECT effectControl; + if (FAILED(hr = _ActiveDevices[GUIDString]->CreateEffect(EffectTypeToGUID(effectType), &effect, &effectControl, nullptr))) { return hr; } + if (FAILED(hr = effectControl->Start(1, 0))) { return hr; } + _DeviceFFBEffectConfig[GUIDString][effectType] = effect; + _DeviceFFBEffectControl[GUIDString][effectType] = effectControl; - return hr; + return hr; } HRESULT DestroyFFBEffect(LPCSTR guidInstance, Effects::Type effectType) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - // Destroy Effect - if (!_DeviceFFBEffectControl[GUIDString].contains(effectType)) { return S_OK; } // Effect doesn't exist + // Destroy Effect + if (!_DeviceFFBEffectControl[GUIDString].contains(effectType)) { return S_OK; } // Effect doesn't exist - hr = _DeviceFFBEffectControl[GUIDString][effectType]->Stop(); // Stop Effect - _DeviceFFBEffectControl[GUIDString].erase(effectType); // Remove Effect Control - _DeviceFFBEffectConfig[GUIDString].erase(effectType); // Remove Effect Config + hr = _DeviceFFBEffectControl[GUIDString][effectType]->Stop(); // Stop Effect + _DeviceFFBEffectControl[GUIDString].erase(effectType); // Remove Effect Control + _DeviceFFBEffectConfig[GUIDString].erase(effectType); // Remove Effect Config - return hr; + return hr; } HRESULT UpdateFFBEffect(LPCSTR guidInstance, Effects::Type effectType, DICONDITION* conditions) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - if (!_DeviceFFBEffectControl[GUIDString].contains(effectType)) { return E_ABORT; } // Effect doesn't exist - - for (int idx = 0; idx < _DeviceFFBEffectConfig[GUIDString][effectType].cAxes; idx++) { // For each Axis in this effect - switch (effectType) { - case Effects::Type::ConstantForce: - DICONSTANTFORCE CF = *reinterpret_cast(_DeviceFFBEffectConfig[GUIDString][Effects::Type::ConstantForce].lpvTypeSpecificParams); - CF.lMagnitude = conditions[idx].lPositiveCoefficient; - _DeviceFFBEffectConfig[GUIDString][Effects::Type::ConstantForce].lpvTypeSpecificParams = &CF; - break; - default: - ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lOffset = conditions->lOffset; - ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lPositiveCoefficient = conditions[idx].lPositiveCoefficient; - ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lNegativeCoefficient = conditions[idx].lNegativeCoefficient; - ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].dwPositiveSaturation = conditions[idx].dwPositiveSaturation; - ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].dwNegativeSaturation = conditions[idx].dwNegativeSaturation; - ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lDeadBand = conditions[idx].lDeadBand; - break; + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + if (!_DeviceFFBEffectControl[GUIDString].contains(effectType)) { return E_ABORT; } // Effect doesn't exist + + for (int idx = 0; idx < _DeviceFFBEffectConfig[GUIDString][effectType].cAxes; idx++) { // For each Axis in this effect + switch (effectType) { + case Effects::Type::ConstantForce: + DICONSTANTFORCE CF = *reinterpret_cast(_DeviceFFBEffectConfig[GUIDString][Effects::Type::ConstantForce].lpvTypeSpecificParams); + CF.lMagnitude = conditions[idx].lPositiveCoefficient; + _DeviceFFBEffectConfig[GUIDString][Effects::Type::ConstantForce].lpvTypeSpecificParams = &CF; + break; + default: + ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lOffset = conditions->lOffset; + ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lPositiveCoefficient = conditions[idx].lPositiveCoefficient; + ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lNegativeCoefficient = conditions[idx].lNegativeCoefficient; + ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].dwPositiveSaturation = conditions[idx].dwPositiveSaturation; + ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].dwNegativeSaturation = conditions[idx].dwNegativeSaturation; + ((DICONDITION*)_DeviceFFBEffectConfig[GUIDString][effectType].lpvTypeSpecificParams)[idx].lDeadBand = conditions[idx].lDeadBand; + break; + } } - } - hr = _DeviceFFBEffectControl[GUIDString][effectType]->SetParameters(&_DeviceFFBEffectConfig[GUIDString][effectType], DIEP_TYPESPECIFICPARAMS); - return hr; + hr = _DeviceFFBEffectControl[GUIDString][effectType]->SetParameters(&_DeviceFFBEffectConfig[GUIDString][effectType], DIEP_TYPESPECIFICPARAMS); + return hr; } HRESULT StopAllFFBEffects(LPCSTR guidInstance) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail - hr = S_OK; // Incase there are no active effects, act like we stopped them all - - //for (auto& [effectType, effectControl] : _DeviceFFBEffectControl[GUIDString]) { // For each effect - // if (FAILED(hr = effectControl->Stop())) { return hr; } // Stop Effect - // //_DeviceFFBEffectControl[GUIDString].erase(effectType); // Remove Effect Control // effectType isn't behaving like Effects::Type, "An unhandled exception of type 'System.AccessViolationException' occurred in DirectInputExplorer.dll" "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." - // //_DeviceFFBEffectConfig[GUIDString].erase(effectType); // Remove Effect Config - //} - - hr = DestroyFFBEffect(guidInstance, Effects::Type::ConstantForce); - hr = DestroyFFBEffect(guidInstance, Effects::Type::RampForce); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Square); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Sine); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Triangle); - hr = DestroyFFBEffect(guidInstance, Effects::Type::SawtoothUp); - hr = DestroyFFBEffect(guidInstance, Effects::Type::SawtoothDown); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Spring); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Damper); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Inertia); - hr = DestroyFFBEffect(guidInstance, Effects::Type::Friction); - hr = DestroyFFBEffect(guidInstance, Effects::Type::CustomForce); - - return hr; + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + hr = S_OK; // Incase there are no active effects, act like we stopped them all + + //for (auto& [effectType, effectControl] : _DeviceFFBEffectControl[GUIDString]) { // For each effect + // if (FAILED(hr = effectControl->Stop())) { return hr; } // Stop Effect + // //_DeviceFFBEffectControl[GUIDString].erase(effectType); // Remove Effect Control // effectType isn't behaving like Effects::Type, "An unhandled exception of type 'System.AccessViolationException' occurred in DirectInputExplorer.dll" "Attempted to read or write protected memory. This is often an indication that other memory is corrupt." + // //_DeviceFFBEffectConfig[GUIDString].erase(effectType); // Remove Effect Config + //} + + hr = DestroyFFBEffect(guidInstance, Effects::Type::ConstantForce); + hr = DestroyFFBEffect(guidInstance, Effects::Type::RampForce); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Square); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Sine); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Triangle); + hr = DestroyFFBEffect(guidInstance, Effects::Type::SawtoothUp); + hr = DestroyFFBEffect(guidInstance, Effects::Type::SawtoothDown); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Spring); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Damper); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Inertia); + hr = DestroyFFBEffect(guidInstance, Effects::Type::Friction); + hr = DestroyFFBEffect(guidInstance, Effects::Type::CustomForce); + + return hr; } -void SetDeviceChangeCallback(DeviceChangeCallback CB) { - _DeviceChangeCallback = CB; +////////////////////////////////////////////////////////////// +//*********************************************************** + +///////////CUSTOM CODE START --- DHRUV RATHOD @RATHOD-DHRUV + +//*********************************************************** +////////////////////////////////////////////////////////////// + +HRESULT CreatePeriodicFFBEffect(LPCSTR guidInstance, Effects::Type effectType) { + std::string GUIDString((LPCSTR)guidInstance); + LPDIRECTINPUTDEVICE8 device = _ActiveDevices[GUIDString]; + + if (device == nullptr) return E_FAIL; + + DIPERIODIC pe = { 0, 0, 0, 0 }; // Parameters for periodic effect + + DIEFFECT effect; + ZeroMemory(&effect, sizeof(effect)); + effect.dwSize = sizeof(DIEFFECT); + effect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; + effect.dwDuration = INFINITE; // Infinite duration + effect.dwSamplePeriod = 0; + effect.dwGain = DI_FFNOMINALMAX; + effect.dwTriggerButton = DIEB_NOTRIGGER; + effect.dwTriggerRepeatInterval = 0; + DWORD rgdwAxes[1] = { DIJOFS_X }; + LONG rglDirection[1] = { 0 }; + effect.cAxes = 1; + effect.rgdwAxes = rgdwAxes; + effect.rglDirection = rglDirection; + effect.lpEnvelope = nullptr; + effect.cbTypeSpecificParams = sizeof(DIPERIODIC); + effect.lpvTypeSpecificParams = &pe; + effect.dwStartDelay = 0; + + LPDIRECTINPUTEFFECT diEffect; + GUID guidEffect = GUID_Square; + + HRESULT hr = device->CreateEffect(guidEffect, &effect, &diEffect, nullptr); + if (FAILED(hr)) return hr; + + hr = diEffect->Start(1, 0); // Start the effect + if (FAILED(hr)) return hr; + + _ActiveEffects[GUIDString] = diEffect; // Store the effect in a map for later use + + return S_OK; } +HRESULT UpdatePeriodicFFBEffect(LPCSTR guidInstance, Effects::Type effectType, int magnitude, int duration) { + std::string GUIDString((LPCSTR)guidInstance); + LPDIRECTINPUTDEVICE8 device = _ActiveDevices[GUIDString]; + LPDIRECTINPUTEFFECT diEffect = _ActiveEffects[GUIDString]; -// Generate SAFEARRAY of DEBUG data -HRESULT DEBUG1(LPCSTR guidInstance, /*[out]*/ SAFEARRAY** DebugData) { - HRESULT hr = E_FAIL; - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + if (device == nullptr || diEffect == nullptr) return E_FAIL; + + DIPERIODIC pe = { magnitude, 0, 1000, 20000 }; // Update the magnitude + + DIEFFECT effect; + ZeroMemory(&effect, sizeof(effect)); + effect.dwSize = sizeof(DIEFFECT); + effect.dwFlags = DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS; + effect.dwDuration = (duration > 0) ? static_cast(duration * DI_SECONDS) : INFINITE; + effect.dwSamplePeriod = 0; + effect.dwGain = DI_FFNOMINALMAX; + effect.dwTriggerButton = DIEB_NOTRIGGER; + effect.dwTriggerRepeatInterval = 0; + DWORD rgdwAxes[1] = { DIJOFS_X }; + LONG rglDirection[1] = { 0 }; + effect.cAxes = 1; + effect.rgdwAxes = rgdwAxes; + effect.rglDirection = rglDirection; + effect.lpEnvelope = nullptr; + effect.cbTypeSpecificParams = sizeof(DIPERIODIC); + effect.lpvTypeSpecificParams = &pe; + effect.dwStartDelay = 0; + + HRESULT hr = diEffect->SetParameters(&effect, DIEP_DIRECTION | DIEP_TYPESPECIFICPARAMS | DIEP_DURATION | DIEP_START); + if (FAILED(hr)) return hr; - //std::vector SAData; + return S_OK; +} - //SAData.push_back(L"Modifying Constant Force!"); - //DICONSTANTFORCE CF = { 1000 }; - //_DeviceFFBEffectConfig[GUIDString][Effects::ConstantForce].lpvTypeSpecificParams = &CF; - //_DeviceFFBEffectControl[GUIDString][Effects::ConstantForce]->SetParameters(&_DeviceFFBEffectConfig[GUIDString][Effects::ConstantForce], DIEP_TYPESPECIFICPARAMS); - //hr = BuildSafeArray(SAData, DebugData); +HRESULT DestroyPeriodicFFBEffect(LPCSTR guidInstance) { + std::string GUIDString((LPCSTR)guidInstance); + LPDIRECTINPUTEFFECT diEffect = _ActiveEffects[GUIDString]; + if (diEffect == nullptr) return E_FAIL; + HRESULT hr = diEffect->Stop(); // Stop the effect + if (FAILED(hr)) return hr; - // Testing Fanatec Fix - LPDIRECTINPUTDEVICE8 DIDevice = nullptr; - if (FAILED(hr = _DirectInput->CreateDevice(LPCSTRGUIDtoGUID(guidInstance), &DIDevice, NULL))) { return true; } // L"CreateDevice failed! 0x%08x", hr + diEffect->Release(); // Release the effect + _ActiveEffects.erase(GUIDString); // Remove it from the map - DIPROPGUIDANDPATH GUIDPath; - GUIDPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH); - GUIDPath.diph.dwHeaderSize = sizeof(DIPROPHEADER); - GUIDPath.diph.dwObj = 0; - GUIDPath.diph.dwHow = DIPH_DEVICE; - if (FAILED(hr = DIDevice->GetProperty(DIPROP_GUIDANDPATH, &GUIDPath.diph))) { DIDevice->Release(); return true; } // L"GetProperty failed! Failed to get symbolic path for device 0x%08x", hr - DIDevice->Release(); + return S_OK; +} +////////////////////////////////////////////////////////////// +//*********************************************************** - //if (wcsstr(GUIDPath.wszPath, L"&col01") != 0) { // This is our primary device (HID Path contains "&col01") - // return false; - //} - //else { - // return true; // This is a duplicate device - //} - DEBUGDATA.push_back(GUIDPath.wszPath); +///////////CUSTOM CODE END --- DHRUV RATHOD @RATHOD-DHRUV + +//*********************************************************** +////////////////////////////////////////////////////////////// - hr = BuildSafeArray(DEBUGDATA, DebugData); - return hr; +void SetDeviceChangeCallback(DeviceChangeCallback CB) { + _DeviceChangeCallback = CB; } +// Generate SAFEARRAY of DEBUG data +HRESULT DEBUG1(LPCSTR guidInstance, /*[out]*/ SAFEARRAY** DebugData) { + HRESULT hr = E_FAIL; + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return hr; // Device not attached, fail + + LPDIRECTINPUTDEVICE8 DIDevice = nullptr; + if (FAILED(hr = _DirectInput->CreateDevice(LPCSTRGUIDtoGUID(guidInstance), &DIDevice, NULL))) { return true; } // L"CreateDevice failed! 0x%08x", hr + + DIPROPGUIDANDPATH GUIDPath; + GUIDPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH); + GUIDPath.diph.dwHeaderSize = sizeof(DIPROPHEADER); + GUIDPath.diph.dwObj = 0; + GUIDPath.diph.dwHow = DIPH_DEVICE; + if (FAILED(hr = DIDevice->GetProperty(DIPROP_GUIDANDPATH, &GUIDPath.diph))) { DIDevice->Release(); return true; } // L"GetProperty failed! Failed to get symbolic path for device 0x%08x", hr + DIDevice->Release(); + + DEBUGDATA.push_back(GUIDPath.wszPath); + + hr = BuildSafeArray(DEBUGDATA, DebugData); + return hr; +} ////////////////////////////////////////////////////////////// // Callback Functions @@ -451,84 +541,66 @@ HRESULT DEBUG1(LPCSTR guidInstance, /*[out]*/ SAFEARRAY** DebugData) { // Callback for each device enumerated, each device is added to the _DeviceInstances vector BOOL CALLBACK _EnumDevicesCallback(const DIDEVICEINSTANCE* DIDI, void* pContext) { - DeviceInfo di = { 0 }; // Store DeviceInfo - di.deviceType = DIDI->dwDevType; - std::string GIStr = (GUID_to_string( DIDI->guidInstance ).c_str()); - std::string GPStr = (GUID_to_string( DIDI->guidProduct ).c_str()); - std::string INStr = (wstring_to_string(DIDI->tszInstanceName).c_str()); - std::string PNStr = (wstring_to_string(DIDI->tszProductName ).c_str()); - di.guidInstance = new char[GIStr.length()+1]; - di.guidProduct = new char[GPStr.length()+1]; - di.instanceName = new char[INStr.length()+1]; - di.productName = new char[PNStr.length()+1]; - strcpy_s( di.guidInstance, GIStr.length()+1, GIStr.c_str() ); - strcpy_s( di.guidProduct, GPStr.length()+1, GPStr.c_str() ); - strcpy_s( di.instanceName, INStr.length()+1, INStr.c_str() ); - strcpy_s( di.productName, PNStr.length()+1, PNStr.c_str() ); - di.FFBCapable = false; // Default all devices to false, FFB devices are updated later - - // Fanatec Fix (Fanatec devices enumerate as 2) - if (LOWORD(DIDI->guidProduct.Data1) == 0x0EB7) // Fanatec manufacturer ID - if (IsDuplicateHID(DIDI)) { return DIENUM_CONTINUE; } // Skip if duplicate - - _DeviceInstances.push_back(di); - return DIENUM_CONTINUE; + DeviceInfo di = { 0 }; // Store DeviceInfo + di.deviceType = DIDI->dwDevType; + std::string GIStr = (GUID_to_string(DIDI->guidInstance).c_str()); + std::string GPStr = (GUID_to_string(DIDI->guidProduct).c_str()); + std::string INStr = (wstring_to_string(DIDI->tszInstanceName).c_str()); + std::string PNStr = (wstring_to_string(DIDI->tszProductName).c_str()); + di.guidInstance = new char[GIStr.length() + 1]; + di.guidProduct = new char[GPStr.length() + 1]; + di.instanceName = new char[INStr.length() + 1]; + di.productName = new char[PNStr.length() + 1]; + strcpy_s(di.guidInstance, GIStr.length() + 1, GIStr.c_str()); + strcpy_s(di.guidProduct, GPStr.length() + 1, GPStr.c_str()); + strcpy_s(di.instanceName, INStr.length() + 1, INStr.c_str()); + strcpy_s(di.productName, PNStr.length() + 1, PNStr.c_str()); + di.FFBCapable = false; // Default all devices to false, FFB devices are updated later + + // Fanatec Fix (Fanatec devices enumerate as 2) + if (LOWORD(DIDI->guidProduct.Data1) == 0x0EB7) // Fanatec manufacturer ID + if (IsDuplicateHID(DIDI)) { return DIENUM_CONTINUE; } // Skip if duplicate + + _DeviceInstances.push_back(di); + return DIENUM_CONTINUE; } // Callback for each device enumerated, each device is added to the _DeviceInstances vector BOOL CALLBACK _EnumDevicesCallbackFFB(const DIDEVICEINSTANCE* DIDI, void* pContext) { - std::string GUIDStr = (GUID_to_string(DIDI->guidInstance).c_str()); // Convert GUID to str to compare against - for (auto& di : _DeviceInstances) { - if (di.guidInstance == GUIDStr) { // Update existing entry - di.FFBCapable = true; + std::string GUIDStr = (GUID_to_string(DIDI->guidInstance).c_str()); // Convert GUID to str to compare against + for (auto& di : _DeviceInstances) { + if (di.guidInstance == GUIDStr) { // Update existing entry + di.FFBCapable = true; + } } - } - return DIENUM_CONTINUE; + return DIENUM_CONTINUE; } BOOL CALLBACK _EnumFFBEffectsCallback(LPCDIEFFECTINFO EffectInfo, LPVOID pvRef) { - std::string GUIDString = *reinterpret_cast(pvRef); // Device GUID passed in as 2nd arg - _DeviceEnumeratedEffects[GUIDString].push_back(*EffectInfo); // Add the DIEffectInfo to the entry for this Device - return DIENUM_CONTINUE; // Continue to next effect + std::string GUIDString = *reinterpret_cast(pvRef); // Device GUID passed in as 2nd arg + _DeviceEnumeratedEffects[GUIDString].push_back(*EffectInfo); // Add the DIEffectInfo to the entry for this Device + return DIENUM_CONTINUE; // Continue to next effect } BOOL CALLBACK _EnumFFBAxisCallback(const DIDEVICEOBJECTINSTANCE* ObjectInst, LPVOID pvRef) { - std::string GUIDString = *reinterpret_cast(pvRef); // Device GUID passed in as 2nd arg + std::string GUIDString = *reinterpret_cast(pvRef); // Device GUID passed in as 2nd arg - if ((ObjectInst->dwFlags & DIDOI_FFACTUATOR) != 0) { // FFB Axis - _DeviceFFBAxes[GUIDString].push_back(*ObjectInst); // Add this ObjectIntance to the vector for this Device - } + if ((ObjectInst->dwFlags & DIDOI_FFACTUATOR) != 0) { // FFB Axis + _DeviceFFBAxes[GUIDString].push_back(*ObjectInst); // Add this ObjectIntance to the vector for this Device + } - return DIENUM_CONTINUE; + return DIENUM_CONTINUE; } LRESULT _WindowsHookCallback(int code, WPARAM wParam, LPARAM lParam) { - if (code < 0) return CallNextHookEx(NULL, code, wParam, lParam); // invalid code skip - - // check if device was added/removed - PCWPSTRUCT pMsg = PCWPSTRUCT(lParam); - if (pMsg->message == WM_DEVICECHANGE) { - if (_DeviceChangeCallback) { _DeviceChangeCallback((int)pMsg->wParam); } // If callback assigned, invoke it - //switch (pMsg->wParam) { - // case DBT_DEVNODES_CHANGED: - // DEBUGDATA.push_back(L"Changed!"); - // // TODO: Invoke Callback - // //if (_DeviceChangeCallback) { _DeviceChangeCallback(1); } - // break; - // case DBT_DEVICEARRIVAL: - // DEBUGDATA.push_back(L"Arrival!"); - // // TODO: Invoke Callback - // break; - // case DBT_DEVICEREMOVECOMPLETE: - // DEBUGDATA.push_back(L"Remove!"); - // // TODO: Invoke Callback - // break; - // default: - // DEBUGDATA.push_back(L"Other!"); - // break; - //} - } - return CallNextHookEx(NULL, code, wParam, lParam); // Continue to next hook + if (code < 0) return CallNextHookEx(NULL, code, wParam, lParam); // invalid code skip + + // check if device was added/removed + PCWPSTRUCT pMsg = PCWPSTRUCT(lParam); + if (pMsg->message == WM_DEVICECHANGE) { + if (_DeviceChangeCallback) { _DeviceChangeCallback((int)pMsg->wParam); } // If callback assigned, invoke it + } + return CallNextHookEx(NULL, code, wParam, lParam); // Continue to next hook } ////////////////////////////////////////////////////////////// @@ -537,273 +609,251 @@ LRESULT _WindowsHookCallback(int code, WPARAM wParam, LPARAM lParam) { // Generate SAFEARRAY from vector of wstrings, useful for exporing data across interop boundary HRESULT BuildSafeArray(std::vector sourceData, /*[out]*/ SAFEARRAY** SafeArrayData) { - HRESULT hr = E_FAIL; - try { - // Build the destination SAFEARRAY from the source data - const LONG dataEntries = static_cast(sourceData.size()); - CComSafeArray SAFEARRAY(dataEntries); - for (LONG i = 0; i < dataEntries; i++) { - CComBSTR bstr = ToBstr(sourceData[i]); // Create a BSTR from the std::wstring - if (FAILED(hr = SAFEARRAY.SetAt(i, bstr.Detach(), FALSE))) { AtlThrow(hr); } // Move the BSTR into the safe array + HRESULT hr = E_FAIL; + try { + // Build the destination SAFEARRAY from the source data + const LONG dataEntries = static_cast(sourceData.size()); + CComSafeArray SAFEARRAY(dataEntries); + for (LONG i = 0; i < dataEntries; i++) { + CComBSTR bstr = ToBstr(sourceData[i]); // Create a BSTR from the std::wstring + if (FAILED(hr = SAFEARRAY.SetAt(i, bstr.Detach(), FALSE))) { AtlThrow(hr); } // Move the BSTR into the safe array + } + + // Return the safe array to the caller (transfer ownership) + *SafeArrayData = SAFEARRAY.Detach(); + } + catch (const CAtlException& e) { + hr = e; + } + catch (const std::exception&) { + hr = E_FAIL; } - // Return the safe array to the caller (transfer ownership) - *SafeArrayData = SAFEARRAY.Detach(); - } catch (const CAtlException& e) { - hr = e; - } catch (const std::exception&) { - hr = E_FAIL; - } - - return hr; + return hr; } // Utilities for converting string types ( https://stackoverflow.com/a/3999597/3055031 ) // Convert a wide Unicode string to an UTF8 string // Convert an UTF8 string to a wide Unicode String -std::wstring string_to_wstring(const std::string& str){ - if (str.empty()) return std::wstring(); - int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0); - std::wstring wstrTo(size_needed, 0); - MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed); - return wstrTo; +std::wstring string_to_wstring(const std::string& str) { + if (str.empty()) return std::wstring(); + int size_needed = MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), NULL, 0); + std::wstring wstrTo(size_needed, 0); + MultiByteToWideChar(CP_UTF8, 0, &str[0], (int)str.size(), &wstrTo[0], size_needed); + return wstrTo; } -std::string wstring_to_string(const std::wstring& wstr){ - if (wstr.empty()) return std::string(); - int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL); - std::string strTo(size_needed, 0); - WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL); - return strTo; +std::string wstring_to_string(const std::wstring& wstr) { + if (wstr.empty()) return std::string(); + int size_needed = WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), NULL, 0, NULL, NULL); + std::string strTo(size_needed, 0); + WideCharToMultiByte(CP_UTF8, 0, &wstr[0], (int)wstr.size(), &strTo[0], size_needed, NULL, NULL); + return strTo; } // Convert a GUID to a String std::string GUID_to_string(GUID guidInstance) { - OLECHAR* guidSTR; - (void)StringFromCLSID(guidInstance, &guidSTR); - return wstring_to_string(guidSTR); + OLECHAR* guidSTR; + (void)StringFromCLSID(guidInstance, &guidSTR); + return wstring_to_string(guidSTR); } // Return window handle for specified PID HWND FindMainWindow(unsigned long process_id) { - WindowData data; - data.process_id = process_id; - data.window_handle = 0; - EnumWindows(_EnumWindowsCallback, (LPARAM)&data); - return data.window_handle; + WindowData data; + data.process_id = process_id; + data.window_handle = 0; + EnumWindows(_EnumWindowsCallback, (LPARAM)&data); + return data.window_handle; } // Callback to find the main window when Enumerating windows of PID BOOL CALLBACK _EnumWindowsCallback(HWND handle, LPARAM lParam) { - WindowData& data = *(WindowData*)lParam; // Pointer to our original WindowData data object - unsigned long process_id = 0; // Store PID - GetWindowThreadProcessId(handle, &process_id); // Get PID of our handle (Window in callback) - if (data.process_id != process_id || !IsMainWindow(handle)) - return TRUE; - data.window_handle = handle; // This is the main window, set the WindowData handle - return FALSE; + WindowData& data = *(WindowData*)lParam; // Pointer to our original WindowData data object + unsigned long process_id = 0; // Store PID + GetWindowThreadProcessId(handle, &process_id); // Get PID of our handle (Window in callback) + if (data.process_id != process_id || !IsMainWindow(handle)) + return TRUE; + data.window_handle = handle; // This is the main window, set the WindowData handle + return FALSE; } // True if the handle is for the main window BOOL IsMainWindow(HWND handle) { - return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle); + return GetWindow(handle, GW_OWNER) == (HWND)0 && IsWindowVisible(handle); } GUID LPCSTRGUIDtoGUID(LPCSTR guidInstance) { - GUID deviceGuid; - int wcharCount = MultiByteToWideChar(CP_UTF8, 0, guidInstance, -1, NULL, 0); - WCHAR* wstrGuidInstance = new WCHAR[wcharCount]; - MultiByteToWideChar(CP_UTF8, 0, guidInstance, -1, wstrGuidInstance, wcharCount); - (void)CLSIDFromString(wstrGuidInstance, &deviceGuid); - delete[] wstrGuidInstance; - return deviceGuid; + GUID deviceGuid; + int wcharCount = MultiByteToWideChar(CP_UTF8, 0, guidInstance, -1, NULL, 0); + WCHAR* wstrGuidInstance = new WCHAR[wcharCount]; + MultiByteToWideChar(CP_UTF8, 0, guidInstance, -1, wstrGuidInstance, wcharCount); + (void)CLSIDFromString(wstrGuidInstance, &deviceGuid); + delete[] wstrGuidInstance; + return deviceGuid; } FlatJoyState2 FlattenDIJOYSTATE2(DIJOYSTATE2 DeviceState) { - FlatJoyState2 state = FlatJoyState2(); // Hold the flattend state - - // ButtonA - for (int i = 0; i < 64; i++) { // In banks of 64, shift in the sate of each button BankA 0-63 - if (DeviceState.rgbButtons[i] == 128) // 128 = Button pressed - state.buttonsA |= (unsigned long long)1 << i; // Shift in a 1 to the button at index i - } - // ButtonB - for (int i = 64; i < 128; i++) { // 2nd bank of buttons from 64-128 - if (DeviceState.rgbButtons[i] == 128) // 128 = Button pressed - state.buttonsB |= (unsigned long long)1 << i; // Shift in a 1 to the button at index i - } - - state.lX = DeviceState.lX; // X-axis - state.lY = DeviceState.lY; // Y-axis - state.lZ = DeviceState.lZ; // Z-axis - // rglSlider - state.lU = DeviceState.rglSlider[0]; // U-axis - state.lV = DeviceState.rglSlider[1]; // V-axis - - state.lRx = DeviceState.lRx; // X-axis rotation - state.lRy = DeviceState.lRy; // Y-axis rotation - state.lRz = DeviceState.lRz; // Z-axis rotation - - state.lVX = DeviceState.lVX; // X-axis velocity - state.lVY = DeviceState.lVY; // Y-axis velocity - state.lVZ = DeviceState.lVZ; // Z-axis velocity - // rglVSlider - state.lVU = DeviceState.rglVSlider[0]; // U-axis velocity - state.lVV = DeviceState.rglVSlider[1]; // V-axis velocity - - state.lVRx = DeviceState.lVRx; // X-axis angular velocity - state.lVRy = DeviceState.lVRy; // Y-axis angular velocity - state.lVRz = DeviceState.lVRz; // Z-axis angular velocity - - state.lAX = DeviceState.lAX; // X-axis acceleration - state.lAY = DeviceState.lAY; // Y-axis acceleration - state.lAZ = DeviceState.lAZ; // Z-axis acceleration - // rglASlider - state.lAU = DeviceState.rglASlider[0]; // U-axis acceleration - state.lAV = DeviceState.rglASlider[1]; // V-axis acceleration - - state.lARx = DeviceState.lARx; // X-axis angular acceleration - state.lARy = DeviceState.lARy; // Y-axis angular acceleration - state.lARz = DeviceState.lARz; // Z-axis angular acceleration - - state.lFX = DeviceState.lFX; // X-axis force - state.lFY = DeviceState.lFY; // Y-axis force - state.lFZ = DeviceState.lFZ; // Z-axis force - // rglFSlider - state.lFU = DeviceState.rglFSlider[0]; // U-axis force - state.lFV = DeviceState.rglFSlider[1]; // V-axis force - - state.lFRx = DeviceState.lFRx; // X-axis torque - state.lFRy = DeviceState.lFRy; // Y-axis torque - state.lFRz = DeviceState.lFRz; // Z-axis torque - - for (int i = 0; i < 4; i++) { // In banks of 4, shift in the sate of each DPAD 0-16 bits - switch (DeviceState.rgdwPOV[i]) { - case 0: state.rgdwPOV |= (byte)(1 << ((i + 1) * 0)); break; // dpad[i]/up, bit = 0 shift into value at stride (i+1) * DPADButton - case 18000: state.rgdwPOV |= (byte)(1 << ((i + 1) * 1)); break; // dpad[i]/down, bit = 1 - case 27000: state.rgdwPOV |= (byte)(1 << ((i + 1) * 2)); break; // dpad[i]/left, bit = 2 - case 9000: state.rgdwPOV |= (byte)(1 << ((i + 1) * 3)); break; // dpad[i]/right, bit = 3 + FlatJoyState2 state = FlatJoyState2(); // Hold the flattend state + + // ButtonA + for (int i = 0; i < 64; i++) { // In banks of 64, shift in the sate of each button BankA 0-63 + if (DeviceState.rgbButtons[i] == 128) // 128 = Button pressed + state.buttonsA |= (unsigned long long)1 << i; // Shift in a 1 to the button at index i + } + // ButtonB + for (int i = 64; i < 128; i++) { // 2nd bank of buttons from 64-128 + if (DeviceState.rgbButtons[i] == 128) // 128 = Button pressed + state.buttonsB |= (unsigned long long)1 << i; // Shift in a 1 to the button at index i } - } - return state; + state.lX = DeviceState.lX; // X-axis + state.lY = DeviceState.lY; // Y-axis + state.lZ = DeviceState.lZ; // Z-axis + // rglSlider + state.lU = DeviceState.rglSlider[0]; // U-axis + state.lV = DeviceState.rglSlider[1]; // V-axis + + state.lRx = DeviceState.lRx; // X-axis rotation + state.lRy = DeviceState.lRy; // Y-axis rotation + state.lRz = DeviceState.lRz; // Z-axis rotation + + state.lVX = DeviceState.lVX; // X-axis velocity + state.lVY = DeviceState.lVY; // Y-axis velocity + state.lVZ = DeviceState.lVZ; // Z-axis velocity + // rglVSlider + state.lVU = DeviceState.rglVSlider[0]; // U-axis velocity + state.lVV = DeviceState.rglVSlider[1]; // V-axis velocity + + state.lVRx = DeviceState.lVRx; // X-axis angular velocity + state.lVRy = DeviceState.lVRy; // Y-axis angular velocity + state.lVRz = DeviceState.lVRz; // Z-axis angular velocity + + state.lAX = DeviceState.lAX; // X-axis acceleration + state.lAY = DeviceState.lAY; // Y-axis acceleration + state.lAZ = DeviceState.lAZ; // Z-axis acceleration + // rglASlider + state.lAU = DeviceState.rglASlider[0]; // U-axis acceleration + state.lAV = DeviceState.rglASlider[1]; // V-axis acceleration + + state.lARx = DeviceState.lARx; // X-axis angular acceleration + state.lARy = DeviceState.lARy; // Y-axis angular acceleration + state.lARz = DeviceState.lARz; // Z-axis angular acceleration + + state.lFX = DeviceState.lFX; // X-axis force + state.lFY = DeviceState.lFY; // Y-axis force + state.lFZ = DeviceState.lFZ; // Z-axis force + // rglFSlider + state.lFU = DeviceState.rglFSlider[0]; // U-axis force + state.lFV = DeviceState.rglFSlider[1]; // V-axis force + + state.lFRx = DeviceState.lFRx; // X-axis torque + state.lFRy = DeviceState.lFRy; // Y-axis torque + state.lFRz = DeviceState.lFRz; // Z-axis torque + + for (int i = 0; i < 4; i++) { // In banks of 4, shift in the sate of each DPAD 0-16 bits + switch (DeviceState.rgdwPOV[i]) { + case 0: state.rgdwPOV |= (byte)(1 << ((i + 1) * 0)); break; // dpad[i]/up, bit = 0 shift into value at stride (i+1) * DPADButton + case 18000: state.rgdwPOV |= (byte)(1 << ((i + 1) * 1)); break; // dpad[i]/down, bit = 1 + case 27000: state.rgdwPOV |= (byte)(1 << ((i + 1) * 2)); break; // dpad[i]/left, bit = 2 + case 9000: state.rgdwPOV |= (byte)(1 << ((i + 1) * 3)); break; // dpad[i]/right, bit = 3 + } + } + + return state; } bool GUIDMatch(LPCSTR guidInstance, LPDIRECTINPUTDEVICE8 Device) { - DIDEVICEINSTANCE deviceInfo = { sizeof(DIDEVICEINSTANCE) }; - if (FAILED(Device->GetDeviceInfo(&deviceInfo))) { return false; } // Fetch device info - if (deviceInfo.guidInstance == LPCSTRGUIDtoGUID(guidInstance)) { // Check if GUID matches the device we want - return true; - } - return false; + DIDEVICEINSTANCE deviceInfo = { sizeof(DIDEVICEINSTANCE) }; + if (FAILED(Device->GetDeviceInfo(&deviceInfo))) { return false; } // Fetch device info + if (deviceInfo.guidInstance == LPCSTRGUIDtoGUID(guidInstance)) { // Check if GUID matches the device we want + return true; + } + return false; } GUID Device2GUID(LPDIRECTINPUTDEVICE8 Device) { - DIDEVICEINSTANCE deviceInfo = { sizeof(DIDEVICEINSTANCE) }; - if (FAILED(Device->GetDeviceInfo(&deviceInfo))) { /*return false;*/ } // Fetch device info - return deviceInfo.guidInstance; + DIDEVICEINSTANCE deviceInfo = { sizeof(DIDEVICEINSTANCE) }; + if (FAILED(Device->GetDeviceInfo(&deviceInfo))) { /*return false;*/ } // Fetch device info + return deviceInfo.guidInstance; } // Helper function to convert a std::wstring to the ATL CComBSTR wrapper (Handy because it can be sized at runtime) inline CComBSTR ToBstr(const std::wstring& s) { - if (s.empty()) { return CComBSTR(); }// Special case of empty string - return CComBSTR(static_cast(s.size()), s.data()); + if (s.empty()) { return CComBSTR(); }// Special case of empty string + return CComBSTR(static_cast(s.size()), s.data()); } void DestroyDeviceIfExists(LPCSTR guidInstance) { - std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return; // Device not attached, fail - DestroyDevice(guidInstance); + std::string GUIDString((LPCSTR)guidInstance); if (!_ActiveDevices.contains(GUIDString)) return; // Device not attached, fail + DestroyDevice(guidInstance); } DWORD AxisTypeToDIJOFS(GUID axisType) { - if (axisType == GUID_XAxis) { - return DIJOFS_X; - } else if (axisType == GUID_YAxis) { - return DIJOFS_Y; - } else if (axisType == GUID_ZAxis) { - return DIJOFS_Z; - } else if (axisType == GUID_RxAxis) { - return DIJOFS_RX; - } else if (axisType == GUID_RyAxis) { - return DIJOFS_RY; - } else if (axisType == GUID_RzAxis) { - return DIJOFS_RZ; - } /*else if (axisType == GUID_Slider) { - return DIJOFS_SLIDER; - } else if (axisType == GUID_Button) { - return DIJOFS_BUTTON1; - } else if (axisType == GUID_Key) { - return DIJOFS_; - } else if (axisType == GUID_POV) { - return DIJOFS_POV; - } else if (AxesType == GUID_Unknown) { - return DIJOFS_; - }*/ - - return 0; // GUID Type not found, likely POV Hat, Slider or Button + if (axisType == GUID_XAxis) { + return DIJOFS_X; + } else if (axisType == GUID_YAxis) { + return DIJOFS_Y; + } else if (axisType == GUID_ZAxis) { + return DIJOFS_Z; + } else if (axisType == GUID_RxAxis) { + return DIJOFS_RX; + } else if (axisType == GUID_RyAxis) { + return DIJOFS_RY; + } else if (axisType == GUID_RzAxis) { + return DIJOFS_RZ; + } + return 0; // GUID Type not found, likely POV Hat, Slider or Button } GUID EffectTypeToGUID(Effects::Type effectType) { - switch (effectType) { + switch (effectType) { case Effects::Type::ConstantForce: - return GUID_ConstantForce; - break; + return GUID_ConstantForce; case Effects::Type::RampForce: - return GUID_RampForce; - break; + return GUID_RampForce; case Effects::Type::Square: - return GUID_Square; - break; + return GUID_Square; case Effects::Type::Sine: - return GUID_Sine; - break; + return GUID_Sine; case Effects::Type::Triangle: - return GUID_Triangle; - break; + return GUID_Triangle; case Effects::Type::SawtoothUp: - return GUID_SawtoothUp; - break; + return GUID_SawtoothUp; case Effects::Type::SawtoothDown: - return GUID_SawtoothDown; - break; + return GUID_SawtoothDown; case Effects::Type::Spring: - return GUID_Spring; - break; + return GUID_Spring; case Effects::Type::Damper: - return GUID_Damper; - break; + return GUID_Damper; case Effects::Type::Inertia: - return GUID_Inertia; - break; + return GUID_Inertia; case Effects::Type::Friction: - return GUID_Friction; - break; + return GUID_Friction; case Effects::Type::CustomForce: - return GUID_CustomForce; - break; + return GUID_CustomForce; default: - return GUID_Unknown; - } + return GUID_Unknown; + } } bool IsDuplicateHID(const DIDEVICEINSTANCE* DIDI) { - HRESULT hr; - LPDIRECTINPUTDEVICE8 DIDevice = nullptr; - if (FAILED(hr = _DirectInput->CreateDevice(DIDI->guidInstance, &DIDevice, NULL))) { return true; } // L"CreateDevice failed! 0x%08x", hr - - DIPROPGUIDANDPATH GUIDPath; - GUIDPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH); - GUIDPath.diph.dwHeaderSize = sizeof(DIPROPHEADER); - GUIDPath.diph.dwObj = 0; - GUIDPath.diph.dwHow = DIPH_DEVICE; - if (FAILED(hr = DIDevice->GetProperty(DIPROP_GUIDANDPATH, &GUIDPath.diph))) { DIDevice->Release(); return true; } // L"GetProperty failed! Failed to get symbolic path for device 0x%08x", hr - DIDevice->Release(); - - if (wcsstr(GUIDPath.wszPath, L"&col02") != 0) { // This is a duplicate device (HID Path contains "&col02") - return true; - } - else { - return false; // This is our primary device - } + HRESULT hr; + LPDIRECTINPUTDEVICE8 DIDevice = nullptr; + if (FAILED(hr = _DirectInput->CreateDevice(DIDI->guidInstance, &DIDevice, NULL))) { return true; } // L"CreateDevice failed! 0x%08x", hr + + DIPROPGUIDANDPATH GUIDPath; + GUIDPath.diph.dwSize = sizeof(DIPROPGUIDANDPATH); + GUIDPath.diph.dwHeaderSize = sizeof(DIPROPHEADER); + GUIDPath.diph.dwObj = 0; + GUIDPath.diph.dwHow = DIPH_DEVICE; + if (FAILED(hr = DIDevice->GetProperty(DIPROP_GUIDANDPATH, &GUIDPath.diph))) { DIDevice->Release(); return true; } // L"GetProperty failed! Failed to get symbolic path for device 0x%08x", hr + DIDevice->Release(); + if (wcsstr(GUIDPath.wszPath, L"&col02") != 0) { // This is a duplicate device (HID Path contains "&col02") + return true; + } + else { + return false; // This is our primary device + } } \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.h b/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.h index 20a8f47..ea322e7 100644 --- a/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.h +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/DirectInputForceFeedback.h @@ -72,7 +72,7 @@ extern "C" { // Everything to be made available by the DLL Damper = 8, Inertia = 9, Friction = 10, - CustomForce = 11 + CustomForce = 11, }; }; @@ -96,6 +96,12 @@ extern "C" { // Everything to be made available by the DLL DIRECTINPUTFORCEFEEDBACK_API HRESULT UpdateFFBEffect(LPCSTR guidInstance, Effects::Type effectType, DICONDITION* conditions); DIRECTINPUTFORCEFEEDBACK_API HRESULT StopAllFFBEffects(LPCSTR guidInstance); + ///////////CUSTOM CODE START --- DHRUV RATHOD @RATHOD-DHRUV + DIRECTINPUTFORCEFEEDBACK_API HRESULT CreatePeriodicFFBEffect(LPCSTR guidInstance, Effects::Type effectType); + DIRECTINPUTFORCEFEEDBACK_API HRESULT DestroyPeriodicFFBEffect(LPCSTR guidInstance); + DIRECTINPUTFORCEFEEDBACK_API HRESULT UpdatePeriodicFFBEffect(LPCSTR guidInstance, Effects::Type effectType, int magnitude, int duration); + ///////////CUSTOM CODE END --- DHRUV RATHOD @RATHOD-DHRUV + typedef void(__stdcall* DeviceChangeCallback)(int); DIRECTINPUTFORCEFEEDBACK_API void SetDeviceChangeCallback(DeviceChangeCallback CB); @@ -137,4 +143,4 @@ void DestroyDeviceIfExists(LPCSTR guidInstance); HRESULT BuildSafeArray(std::vector sourceData, /*[out]*/ SAFEARRAY** SafeArrayData); DWORD AxisTypeToDIJOFS(GUID axisType); GUID EffectTypeToGUID(Effects::Type effectType); -bool IsDuplicateHID(const DIDEVICEINSTANCE* DIDI); \ No newline at end of file +bool IsDuplicateHID(const DIDEVICEINSTANCE* DIDI); diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/DirectInputForceFeedback.dll.recipe b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/DirectInputForceFeedback.dll.recipe index 2444bba..e13a18b 100644 --- a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/DirectInputForceFeedback.dll.recipe +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/DirectInputForceFeedback.dll.recipe @@ -2,7 +2,7 @@ - C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputForceFeedback~\x64\Debug\DirectInputForceFeedback.dll + C:\Users\drathod\Unity-DirectInput\DirectInputForceFeedback~\x64\Debug\DirectInputForceFeedback.dll diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.d.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.d.json new file mode 100644 index 0000000..e4cf53a --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.d.json @@ -0,0 +1,10 @@ +{ + "Version": "1.2", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.compat.ixx", + "ProvidedModule": "std.compat", + "Includes": [], + "ImportedModules": [], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.module.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.module.json new file mode 100644 index 0000000..f747fe1 --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.module.json @@ -0,0 +1,11 @@ +{ + "Version": "1.1", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.compat.ixx", + "ProvidedModule": "std.compat", + "ImportedModules": [ + "std" + ], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.module.json.command b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.module.json.command new file mode 100644 index 0000000..15aec4a Binary files /dev/null and b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.compat.ixx.ifc.dt.module.json.command differ diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.d.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.d.json new file mode 100644 index 0000000..80c3da5 --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.d.json @@ -0,0 +1,244 @@ +{ + "Version": "1.2", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.ixx", + "ProvidedModule": "std", + "Includes": [ + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\assert.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\sal.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\concurrencysal.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vadefs.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\ctype.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wctype.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\errno.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\fenv.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\float.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\inttypes.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdint.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\limits.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\locale.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\math.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_math.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\setjmp.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\signal.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdarg.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\stddef.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\stdio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wstdio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_stdio_config.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\stdlib.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_malloc.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_search.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wstdlib.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\string.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_memory.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_memcpy_s.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_string.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wstring.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\time.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wtime.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\uchar.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\wchar.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wconio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wdirect.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_share.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wprocess.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\sys\\stat.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\sys\\types.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\wctype.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\yvals_core.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xkeycheck.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\algorithm", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_minmax.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdint", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xmemory", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdlib", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\math.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\limits", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cfloat", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\climits", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cwchar", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdio", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xtr1common", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\intrin0.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\intrin0.inl.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\new", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\exception", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\yvals.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\crtdbg.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_new_debug.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_new.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\crtdefs.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\use_ansi.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\type_traits", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstddef", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\malloc.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_exception.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\eh.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_terminate.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xatomic.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xutility", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_iter_core.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\utility", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\initializer_list", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\compare", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\concepts", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstring", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\tuple", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\optional", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xsmf_control.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\any", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\typeinfo", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_typeinfo.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\array", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\atomic", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xatomic_wait.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xthreads.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xtimec.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ctime", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\barrier", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\bit", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_bit_utils.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\bitset", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iosfwd", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xstring", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_sanitizer_annotate_container.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xpolymorphic_allocator.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\charconv", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xbit_ops.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xerrc.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv_ryu.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv_ryu_tables.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv_tables.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\chrono", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_chrono.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ratio", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\system_error", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_system_error_abi.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cerrno", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdexcept", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcall_once.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xfilesystem_abi.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_tzdb.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cmath", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\format", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_format_ucd_tables.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_formatter.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_print.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iterator", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\locale", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocbuf", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\streambuf", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xiosbase", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\share.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocale", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\memory", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xfacet", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocinfo", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_xlocinfo_types.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cctype", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\clocale", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocmes", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocmon", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocnum", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xloctime", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\forward_list", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iomanip", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\istream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ostream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ios", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_filebuf.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\sstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\string", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vector", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\codecvt", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\complex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ymath.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\emmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\mmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\condition_variable", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\mutex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\thread", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\process.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_startup.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\math.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_startup.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stop_token", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\coroutine", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\deque", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\execution", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\numeric", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\queue", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ranges", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_int128.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\span", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\string_view", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\expected", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\filesystem", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\fstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\functional", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\unordered_map", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xhash", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\list", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xnode_handle.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\future", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ppltasks.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pplwin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pplinterface.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ppltaskscheduler.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\crtdefs.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pplcancellation_token.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\intrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\immintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\wmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\nmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\smmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\tmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\zmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ammintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iostream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\latch", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\map", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xtree", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\mdspan", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\memory_resource", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\numbers", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\print", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\random", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\regex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\scoped_allocator", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\semaphore", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\set", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\shared_mutex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\source_location", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\spanstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stack", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stacktrace", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdfloat", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\strstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\syncstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\typeindex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\unordered_set", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\valarray", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\variant", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\version", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cassert", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\assert.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cfenv", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cinttypes", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\csetjmp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\csignal", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdarg", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cuchar", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cwctype" + ], + "ImportedModules": [], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.module.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.module.json new file mode 100644 index 0000000..7cf5fe0 --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.module.json @@ -0,0 +1,9 @@ +{ + "Version": "1.1", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.ixx", + "ProvidedModule": "std", + "ImportedModules": [], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.module.json.command b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.module.json.command new file mode 100644 index 0000000..45abfe4 Binary files /dev/null and b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/microsoft/STL/std.ixx.ifc.dt.module.json.command differ diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/vc143.idb b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/vc143.idb index c9b5eb0..3f79707 100644 Binary files a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/vc143.idb and b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Debug/vc143.idb differ diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/DirectInputForceFeedback.dll.recipe b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/DirectInputForceFeedback.dll.recipe index 5b94819..a08351f 100644 --- a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/DirectInputForceFeedback.dll.recipe +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/DirectInputForceFeedback.dll.recipe @@ -2,7 +2,7 @@ - C:\Users\Ducky\Documents\GitHub\Unity-DirectInput\DirectInputForceFeedback~\x64\Release\DirectInputForceFeedback.dll + C:\Users\drathod\Unity-DirectInput\DirectInputForceFeedback~\x64\Release\DirectInputForceFeedback.dll diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.d.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.d.json new file mode 100644 index 0000000..e4cf53a --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.d.json @@ -0,0 +1,10 @@ +{ + "Version": "1.2", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.compat.ixx", + "ProvidedModule": "std.compat", + "Includes": [], + "ImportedModules": [], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.module.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.module.json new file mode 100644 index 0000000..f747fe1 --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.module.json @@ -0,0 +1,11 @@ +{ + "Version": "1.1", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.compat.ixx", + "ProvidedModule": "std.compat", + "ImportedModules": [ + "std" + ], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.module.json.command b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.module.json.command new file mode 100644 index 0000000..3cf91a4 Binary files /dev/null and b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.compat.ixx.ifc.dt.module.json.command differ diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.d.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.d.json new file mode 100644 index 0000000..80c3da5 --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.d.json @@ -0,0 +1,244 @@ +{ + "Version": "1.2", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.ixx", + "ProvidedModule": "std", + "Includes": [ + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\assert.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\sal.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\concurrencysal.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vadefs.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\ctype.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wctype.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\errno.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\fenv.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\float.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\inttypes.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdint.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\limits.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\locale.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\math.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_math.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\setjmp.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\signal.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdarg.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\stddef.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\stdio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wstdio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_stdio_config.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\stdlib.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_malloc.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_search.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wstdlib.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\string.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_memory.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_memcpy_s.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_string.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wstring.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\time.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wtime.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\uchar.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\wchar.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wconio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wdirect.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wio.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_share.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_wprocess.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\sys\\stat.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\sys\\types.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\wctype.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\yvals_core.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xkeycheck.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\algorithm", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_minmax.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdint", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xmemory", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdlib", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\math.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\limits", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cfloat", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\climits", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cwchar", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdio", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xtr1common", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\intrin0.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\intrin0.inl.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\new", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\exception", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\yvals.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\crtdbg.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_new_debug.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_new.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\crtdefs.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\use_ansi.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\type_traits", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstddef", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\malloc.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_exception.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\eh.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_terminate.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xatomic.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xutility", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_iter_core.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\utility", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\initializer_list", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\compare", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\concepts", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstring", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\tuple", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\optional", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xsmf_control.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\any", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\typeinfo", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_typeinfo.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\array", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\atomic", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xatomic_wait.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xthreads.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xtimec.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ctime", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\barrier", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\bit", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_bit_utils.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\bitset", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iosfwd", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xstring", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_sanitizer_annotate_container.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xpolymorphic_allocator.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\charconv", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xbit_ops.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xerrc.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv_ryu.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv_ryu_tables.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcharconv_tables.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\chrono", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_chrono.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ratio", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\system_error", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_system_error_abi.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cerrno", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdexcept", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xcall_once.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xfilesystem_abi.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_tzdb.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cmath", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\format", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_format_ucd_tables.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_formatter.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_print.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iterator", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\locale", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocbuf", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\streambuf", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xiosbase", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\share.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocale", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\memory", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xfacet", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocinfo", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_xlocinfo_types.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cctype", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\clocale", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocmes", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocmon", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xlocnum", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xloctime", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\forward_list", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iomanip", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\istream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ostream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ios", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_filebuf.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\sstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\string", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vector", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\codecvt", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\complex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ymath.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\emmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\mmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\condition_variable", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\mutex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\thread", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\process.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\corecrt_startup.h", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\math.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\vcruntime_startup.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stop_token", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\coroutine", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\deque", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\execution", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\numeric", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\queue", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ranges", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\__msvc_int128.hpp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\span", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\string_view", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\expected", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\filesystem", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\fstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\functional", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\unordered_map", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xhash", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\list", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xnode_handle.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\future", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ppltasks.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pplwin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pplinterface.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ppltaskscheduler.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\crtdefs.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pplcancellation_token.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\intrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\immintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\wmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\nmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\smmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\tmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\pmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\zmmintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\ammintrin.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\iostream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\latch", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\map", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\xtree", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\mdspan", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\memory_resource", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\numbers", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\print", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\random", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\regex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\scoped_allocator", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\semaphore", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\set", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\shared_mutex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\source_location", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\spanstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stack", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stacktrace", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\stdfloat", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\strstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\syncstream", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\typeindex", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\unordered_set", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\valarray", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\variant", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\version", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cassert", + "c:\\program files (x86)\\windows kits\\10\\include\\10.0.22621.0\\ucrt\\assert.h", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cfenv", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cinttypes", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\csetjmp", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\csignal", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cstdarg", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cuchar", + "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\include\\cwctype" + ], + "ImportedModules": [], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.module.json b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.module.json new file mode 100644 index 0000000..7cf5fe0 --- /dev/null +++ b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.module.json @@ -0,0 +1,9 @@ +{ + "Version": "1.1", + "Data": { + "Source": "c:\\program files\\microsoft visual studio\\2022\\community\\vc\\tools\\msvc\\14.40.33807\\modules\\std.ixx", + "ProvidedModule": "std", + "ImportedModules": [], + "ImportedHeaderUnits": [] + } +} \ No newline at end of file diff --git a/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.module.json.command b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.module.json.command new file mode 100644 index 0000000..bbe3821 Binary files /dev/null and b/DirectInputForceFeedback~/DirectInputForceFeedback/x64/Release/microsoft/STL/std.ixx.ifc.dt.module.json.command differ diff --git a/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.dll b/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.dll index fb1fa5c..c1c4e0e 100644 Binary files a/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.dll and b/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.dll differ diff --git a/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.exp b/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.exp index a22a6d8..524d16f 100644 Binary files a/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.exp and b/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.exp differ diff --git a/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.lib b/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.lib index 95dfcf3..a19949c 100644 Binary files a/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.lib and b/DirectInputForceFeedback~/x64/Debug/DirectInputForceFeedback.lib differ diff --git a/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.dll b/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.dll index 83bb721..c821a5f 100644 Binary files a/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.dll and b/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.dll differ diff --git a/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.exp b/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.exp index e0c208d..8a048fb 100644 Binary files a/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.exp and b/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.exp differ diff --git a/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.lib b/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.lib index c0e7a48..0ae5ce7 100644 Binary files a/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.lib and b/DirectInputForceFeedback~/x64/Release/DirectInputForceFeedback.lib differ diff --git a/Plugin/DLL/DirectInputForceFeedback.dll b/Plugin/DLL/DirectInputForceFeedback.dll index 83bb721..c821a5f 100644 Binary files a/Plugin/DLL/DirectInputForceFeedback.dll and b/Plugin/DLL/DirectInputForceFeedback.dll differ diff --git a/Plugin/DirectInputManager.cs b/Plugin/DirectInputManager.cs index 738fc65..c8ecab2 100644 --- a/Plugin/DirectInputManager.cs +++ b/Plugin/DirectInputManager.cs @@ -1,4 +1,4 @@ -#pragma warning disable CS0618 // Disable Marshalling warnings +#pragma warning disable CS0618 // Disable Marshalling warnings using System; using System.Collections.Generic; @@ -34,6 +34,13 @@ class Native { [DllImport(DLLFile)] public static extern int CreateFFBEffect(string guidInstance, FFBEffects effectType); [DllImport(DLLFile)] public static extern int DestroyFFBEffect(string guidInstance, FFBEffects effectType); [DllImport(DLLFile)] public static extern int UpdateFFBEffect(string guidInstance, FFBEffects effectType, DICondition[] conditions); + + ///////////CUSTOM CODE START --- DHRUV RATHOD @RATHOD-DHRUV + [DllImport(DLLFile, CallingConvention = CallingConvention.Cdecl)] public static extern int CreatePeriodicFFBEffect(string guidInstance, FFBEffects effectType); + [DllImport(DLLFile,CallingConvention = CallingConvention.Cdecl)] public static extern int DestroyPeriodicFFBEffect(string guidInstance); + [DllImport(DLLFile,CallingConvention = CallingConvention.Cdecl)] public static extern int UpdatePeriodicFFBEffect(string guidInstance, FFBEffects effectType, int magnitude, int duration); + + ///////////CUSTOM CODE END --- DHRUV RATHOD @RATHOD-DHRUV [DllImport(DLLFile)] public static extern int StopAllFFBEffects(string guidInstance); [UnmanagedFunctionPointer(CallingConvention.StdCall)] public delegate void DeviceChangeCallback(DBTEvents DBTEvent); @@ -761,6 +768,38 @@ public static bool UpdateInertiaSimple(string guidInstance, int Magnitude) { /// A boolean representing the if the Effect updated successfully /// public static bool UpdateInertiaSimple(DeviceInfo device, int Magnitude) => UpdateInertiaSimple(device.guidInstance, Magnitude); + + + ///////////CUSTOM CODE START --- DHRUV RATHOD @RATHOD-DHRUV + + public static bool EnablePeroidicFFBEffect(DeviceInfo device, FFBEffects effectType) => EnablePeroidicFFBEffect(device.guidInstance, effectType ); + public static bool EnablePeroidicFFBEffect(string guidInstance, FFBEffects effectType) { + int hresult = Native.CreatePeriodicFFBEffect(guidInstance, effectType); + if (hresult != 0) { DebugLog($"CreatePeriodic FFBEffect Failed: 0x{hresult.ToString("x")} {WinErrors.GetSystemMessage(hresult)}"); return false; } + return true; + } + + public static bool DestroyPeroidicFFBEffect(DeviceInfo device) => DestroyPeroidicFFBEffect(device.guidInstance ); + public static bool DestroyPeroidicFFBEffect(string guidInstance) { + int hresult = Native.DestroyPeriodicFFBEffect(guidInstance); + if (hresult != 0) { DebugLog($"DestroyPeriodic FFBEffect Failed: 0x{hresult.ToString("x")} {WinErrors.GetSystemMessage(hresult)}"); return false; } + return true; + } + + + + public static bool UpdatePeroidEffect(DeviceInfo device, FFBEffects effectType, int Magnitude, int duration = 100000) => UpdatePeroidEffect(device.guidInstance,effectType, Magnitude, duration); + + public static bool UpdatePeroidEffect(string guidInstance, FFBEffects effectType, int Magnitude, int duration = 100000) { + + int hresult = Native.UpdatePeriodicFFBEffect(guidInstance, effectType, Magnitude, duration); + if (hresult != 0) { DebugLog($"UpdatePeroidic FFBEffect Failed: 0x{hresult.ToString("x")} {WinErrors.GetSystemMessage(hresult)}"); return false; } + return true; + } + + + + ///////////CUSTOM CODE END --- DHRUV RATHOD @RATHOD-DHRUV } // End of DIManager @@ -861,4 +900,4 @@ private void CancelAllTokens() { } } } -} \ No newline at end of file +} diff --git a/Plugin/DirectInputTypes.cs b/Plugin/DirectInputTypes.cs index 36600ba..11c6d05 100644 --- a/Plugin/DirectInputTypes.cs +++ b/Plugin/DirectInputTypes.cs @@ -17,8 +17,8 @@ public enum FFBEffects { Damper = 8, Inertia = 9, Friction = 10, - CustomForce = 11 - } + CustomForce = 11, + } /// /// Types of OnDeviceChange DBTEvents
diff --git a/Plugin/Input/VirtualInputSystemDevice.cs b/Plugin/Input/VirtualInputSystemDevice.cs index 909ffb6..259b603 100644 --- a/Plugin/Input/VirtualInputSystemDevice.cs +++ b/Plugin/Input/VirtualInputSystemDevice.cs @@ -11,206 +11,215 @@ using UnityEditor; #endif using DirectInputManager; +public struct FlatJoyState2State : IInputStateTypeInfo +{ + public FourCC format => new FourCC('D', 'F', 'F', 'B'); // FourCC Code used for type checking? D-F-F-B -> DirectInput FFB -////////////////////////////////////////////////////////////// -// FlatJoyState2State Struct - InputSystem Bindings -////////////////////////////////////////////////////////////// + // Define all the buttons + [InputControl(name = "Button000", layout = "Button", bit = 0, displayName = "000")] + [InputControl(name = "Button001", layout = "Button", bit = 1, displayName = "001")] + [InputControl(name = "Button002", layout = "Button", bit = 2, displayName = "002")] + [InputControl(name = "Button003", layout = "Button", bit = 3, displayName = "003")] + [InputControl(name = "Button004", layout = "Button", bit = 4, displayName = "004")] + [InputControl(name = "Button005", layout = "Button", bit = 5, displayName = "005")] + [InputControl(name = "Button006", layout = "Button", bit = 6, displayName = "006")] + [InputControl(name = "Button007", layout = "Button", bit = 7, displayName = "007")] + [InputControl(name = "Button008", layout = "Button", bit = 8, displayName = "008")] + [InputControl(name = "Button009", layout = "Button", bit = 9, displayName = "009")] + [InputControl(name = "Button010", layout = "Button", bit = 10, displayName = "010")] + [InputControl(name = "Button011", layout = "Button", bit = 11, displayName = "011")] + [InputControl(name = "Button012", layout = "Button", bit = 12, displayName = "012")] + [InputControl(name = "Button013", layout = "Button", bit = 13, displayName = "013")] + [InputControl(name = "Button014", layout = "Button", bit = 14, displayName = "014")] + [InputControl(name = "Button015", layout = "Button", bit = 15, displayName = "015")] + [InputControl(name = "Button016", layout = "Button", bit = 16, displayName = "016")] + [InputControl(name = "Button017", layout = "Button", bit = 17, displayName = "017")] + [InputControl(name = "Button018", layout = "Button", bit = 18, displayName = "018")] + [InputControl(name = "Button019", layout = "Button", bit = 19, displayName = "019")] + [InputControl(name = "Button020", layout = "Button", bit = 20, displayName = "020")] + [InputControl(name = "Button021", layout = "Button", bit = 21, displayName = "021")] + [InputControl(name = "Button022", layout = "Button", bit = 22, displayName = "022")] + [InputControl(name = "Button023", layout = "Button", bit = 23, displayName = "023")] + [InputControl(name = "Button024", layout = "Button", bit = 24, displayName = "024")] + [InputControl(name = "Button025", layout = "Button", bit = 25, displayName = "025")] + [InputControl(name = "Button026", layout = "Button", bit = 26, displayName = "026")] + [InputControl(name = "Button027", layout = "Button", bit = 27, displayName = "027")] + [InputControl(name = "Button028", layout = "Button", bit = 28, displayName = "028")] + [InputControl(name = "Button029", layout = "Button", bit = 29, displayName = "029")] + [InputControl(name = "Button030", layout = "Button", bit = 30, displayName = "030")] + [InputControl(name = "Button031", layout = "Button", bit = 31, displayName = "031")] + [InputControl(name = "Button032", layout = "Button", bit = 32, displayName = "032")] + [InputControl(name = "Button033", layout = "Button", bit = 33, displayName = "033")] + [InputControl(name = "Button034", layout = "Button", bit = 34, displayName = "034")] + [InputControl(name = "Button035", layout = "Button", bit = 35, displayName = "035")] + [InputControl(name = "Button036", layout = "Button", bit = 36, displayName = "036")] + [InputControl(name = "Button037", layout = "Button", bit = 37, displayName = "037")] + [InputControl(name = "Button038", layout = "Button", bit = 38, displayName = "038")] + [InputControl(name = "Button039", layout = "Button", bit = 39, displayName = "039")] + [InputControl(name = "Button040", layout = "Button", bit = 40, displayName = "040")] + [InputControl(name = "Button041", layout = "Button", bit = 41, displayName = "041")] + [InputControl(name = "Button042", layout = "Button", bit = 42, displayName = "042")] + [InputControl(name = "Button043", layout = "Button", bit = 43, displayName = "043")] + [InputControl(name = "Button044", layout = "Button", bit = 44, displayName = "044")] + [InputControl(name = "Button045", layout = "Button", bit = 45, displayName = "045")] + [InputControl(name = "Button046", layout = "Button", bit = 46, displayName = "046")] + [InputControl(name = "Button047", layout = "Button", bit = 47, displayName = "047")] + [InputControl(name = "Button048", layout = "Button", bit = 48, displayName = "048")] + [InputControl(name = "Button049", layout = "Button", bit = 49, displayName = "049")] + [InputControl(name = "Button050", layout = "Button", bit = 50, displayName = "050")] + [InputControl(name = "Button051", layout = "Button", bit = 51, displayName = "051")] + [InputControl(name = "Button052", layout = "Button", bit = 52, displayName = "052")] + [InputControl(name = "Button053", layout = "Button", bit = 53, displayName = "053")] + [InputControl(name = "Button054", layout = "Button", bit = 54, displayName = "054")] + [InputControl(name = "Button055", layout = "Button", bit = 55, displayName = "055")] + [InputControl(name = "Button056", layout = "Button", bit = 56, displayName = "056")] + [InputControl(name = "Button057", layout = "Button", bit = 57, displayName = "057")] + [InputControl(name = "Button058", layout = "Button", bit = 58, displayName = "058")] + [InputControl(name = "Button059", layout = "Button", bit = 59, displayName = "059")] + [InputControl(name = "Button060", layout = "Button", bit = 60, displayName = "060")] + [InputControl(name = "Button061", layout = "Button", bit = 61, displayName = "061")] + [InputControl(name = "Button062", layout = "Button", bit = 62, displayName = "062")] + [InputControl(name = "Button063", layout = "Button", bit = 63, displayName = "063")] + public UInt64 buttonsA; // Buttons separated into banks of 64-Bits to fit into Unsigned 64-bit integer -/// -/// Describes a (Flattened)DIJOYSTATE2 in the Unity Input System form
-/// Breaks out RGLSlider-s into U and V axis
-/// See https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ee416628(v=vs.85) -///
-public struct FlatJoyState2State : IInputStateTypeInfo { - public FourCC format => new FourCC('D', 'F', 'F', 'B'); // FourCC Code used for type checking? D-F-F-B -> DirectInput FFB - - [InputControl(name="Button000", layout="Button", bit=0, displayName="000")] - [InputControl(name="Button001", layout="Button", bit=1, displayName="001")] - [InputControl(name="Button002", layout="Button", bit=2, displayName="002")] - [InputControl(name="Button003", layout="Button", bit=3, displayName="003")] - [InputControl(name="Button004", layout="Button", bit=4, displayName="004")] - [InputControl(name="Button005", layout="Button", bit=5, displayName="005")] - [InputControl(name="Button006", layout="Button", bit=6, displayName="006")] - [InputControl(name="Button007", layout="Button", bit=7, displayName="007")] - [InputControl(name="Button008", layout="Button", bit=8, displayName="008")] - [InputControl(name="Button009", layout="Button", bit=9, displayName="009")] - [InputControl(name="Button010", layout="Button", bit=10, displayName="010")] - [InputControl(name="Button011", layout="Button", bit=11, displayName="011")] - [InputControl(name="Button012", layout="Button", bit=12, displayName="012")] - [InputControl(name="Button013", layout="Button", bit=13, displayName="013")] - [InputControl(name="Button014", layout="Button", bit=14, displayName="014")] - [InputControl(name="Button015", layout="Button", bit=15, displayName="015")] - [InputControl(name="Button016", layout="Button", bit=16, displayName="016")] - [InputControl(name="Button017", layout="Button", bit=17, displayName="017")] - [InputControl(name="Button018", layout="Button", bit=18, displayName="018")] - [InputControl(name="Button019", layout="Button", bit=19, displayName="019")] - [InputControl(name="Button020", layout="Button", bit=20, displayName="020")] - [InputControl(name="Button021", layout="Button", bit=21, displayName="021")] - [InputControl(name="Button022", layout="Button", bit=22, displayName="022")] - [InputControl(name="Button023", layout="Button", bit=23, displayName="023")] - [InputControl(name="Button024", layout="Button", bit=24, displayName="024")] - [InputControl(name="Button025", layout="Button", bit=25, displayName="025")] - [InputControl(name="Button026", layout="Button", bit=26, displayName="026")] - [InputControl(name="Button027", layout="Button", bit=27, displayName="027")] - [InputControl(name="Button028", layout="Button", bit=28, displayName="028")] - [InputControl(name="Button029", layout="Button", bit=29, displayName="029")] - [InputControl(name="Button030", layout="Button", bit=30, displayName="030")] - [InputControl(name="Button031", layout="Button", bit=31, displayName="031")] - [InputControl(name="Button032", layout="Button", bit=32, displayName="032")] - [InputControl(name="Button033", layout="Button", bit=33, displayName="033")] - [InputControl(name="Button034", layout="Button", bit=34, displayName="034")] - [InputControl(name="Button035", layout="Button", bit=35, displayName="035")] - [InputControl(name="Button036", layout="Button", bit=36, displayName="036")] - [InputControl(name="Button037", layout="Button", bit=37, displayName="037")] - [InputControl(name="Button038", layout="Button", bit=38, displayName="038")] - [InputControl(name="Button039", layout="Button", bit=39, displayName="039")] - [InputControl(name="Button040", layout="Button", bit=40, displayName="040")] - [InputControl(name="Button041", layout="Button", bit=41, displayName="041")] - [InputControl(name="Button042", layout="Button", bit=42, displayName="042")] - [InputControl(name="Button043", layout="Button", bit=43, displayName="043")] - [InputControl(name="Button044", layout="Button", bit=44, displayName="044")] - [InputControl(name="Button045", layout="Button", bit=45, displayName="045")] - [InputControl(name="Button046", layout="Button", bit=46, displayName="046")] - [InputControl(name="Button047", layout="Button", bit=47, displayName="047")] - [InputControl(name="Button048", layout="Button", bit=48, displayName="048")] - [InputControl(name="Button049", layout="Button", bit=49, displayName="049")] - [InputControl(name="Button050", layout="Button", bit=50, displayName="050")] - [InputControl(name="Button051", layout="Button", bit=51, displayName="051")] - [InputControl(name="Button052", layout="Button", bit=52, displayName="052")] - [InputControl(name="Button053", layout="Button", bit=53, displayName="053")] - [InputControl(name="Button054", layout="Button", bit=54, displayName="054")] - [InputControl(name="Button055", layout="Button", bit=55, displayName="055")] - [InputControl(name="Button056", layout="Button", bit=56, displayName="056")] - [InputControl(name="Button057", layout="Button", bit=57, displayName="057")] - [InputControl(name="Button058", layout="Button", bit=58, displayName="058")] - [InputControl(name="Button059", layout="Button", bit=59, displayName="059")] - [InputControl(name="Button060", layout="Button", bit=60, displayName="060")] - [InputControl(name="Button061", layout="Button", bit=61, displayName="061")] - [InputControl(name="Button062", layout="Button", bit=62, displayName="062")] - [InputControl(name="Button063", layout="Button", bit=63, displayName="063")] - public UInt64 buttonsA; // Buttons seperated into banks of 64-Bits to fit into Unsigned 64-bit integer - - [InputControl(name="Button064", layout="Button", bit=0, displayName="064")] - [InputControl(name="Button065", layout="Button", bit=1, displayName="065")] - [InputControl(name="Button066", layout="Button", bit=2, displayName="066")] - [InputControl(name="Button067", layout="Button", bit=3, displayName="067")] - [InputControl(name="Button068", layout="Button", bit=4, displayName="068")] - [InputControl(name="Button069", layout="Button", bit=5, displayName="069")] - [InputControl(name="Button070", layout="Button", bit=6, displayName="070")] - [InputControl(name="Button071", layout="Button", bit=7, displayName="071")] - [InputControl(name="Button072", layout="Button", bit=8, displayName="072")] - [InputControl(name="Button073", layout="Button", bit=9, displayName="073")] - [InputControl(name="Button074", layout="Button", bit=10, displayName="074")] - [InputControl(name="Button075", layout="Button", bit=11, displayName="075")] - [InputControl(name="Button076", layout="Button", bit=12, displayName="076")] - [InputControl(name="Button077", layout="Button", bit=13, displayName="077")] - [InputControl(name="Button078", layout="Button", bit=14, displayName="078")] - [InputControl(name="Button079", layout="Button", bit=15, displayName="079")] - [InputControl(name="Button080", layout="Button", bit=16, displayName="080")] - [InputControl(name="Button081", layout="Button", bit=17, displayName="081")] - [InputControl(name="Button082", layout="Button", bit=18, displayName="082")] - [InputControl(name="Button083", layout="Button", bit=19, displayName="083")] - [InputControl(name="Button084", layout="Button", bit=20, displayName="084")] - [InputControl(name="Button085", layout="Button", bit=21, displayName="085")] - [InputControl(name="Button086", layout="Button", bit=22, displayName="086")] - [InputControl(name="Button087", layout="Button", bit=23, displayName="087")] - [InputControl(name="Button088", layout="Button", bit=24, displayName="088")] - [InputControl(name="Button089", layout="Button", bit=25, displayName="089")] - [InputControl(name="Button090", layout="Button", bit=26, displayName="090")] - [InputControl(name="Button091", layout="Button", bit=27, displayName="091")] - [InputControl(name="Button092", layout="Button", bit=28, displayName="092")] - [InputControl(name="Button093", layout="Button", bit=29, displayName="093")] - [InputControl(name="Button094", layout="Button", bit=30, displayName="094")] - [InputControl(name="Button095", layout="Button", bit=31, displayName="095")] - [InputControl(name="Button096", layout="Button", bit=32, displayName="096")] - [InputControl(name="Button097", layout="Button", bit=33, displayName="097")] - [InputControl(name="Button098", layout="Button", bit=34, displayName="098")] - [InputControl(name="Button099", layout="Button", bit=35, displayName="099")] - [InputControl(name="Button100", layout="Button", bit=36, displayName="100")] - [InputControl(name="Button101", layout="Button", bit=37, displayName="101")] - [InputControl(name="Button102", layout="Button", bit=38, displayName="102")] - [InputControl(name="Button103", layout="Button", bit=39, displayName="103")] - [InputControl(name="Button104", layout="Button", bit=40, displayName="104")] - [InputControl(name="Button105", layout="Button", bit=41, displayName="105")] - [InputControl(name="Button106", layout="Button", bit=42, displayName="106")] - [InputControl(name="Button107", layout="Button", bit=43, displayName="107")] - [InputControl(name="Button108", layout="Button", bit=44, displayName="108")] - [InputControl(name="Button109", layout="Button", bit=45, displayName="109")] - [InputControl(name="Button110", layout="Button", bit=46, displayName="110")] - [InputControl(name="Button111", layout="Button", bit=47, displayName="111")] - [InputControl(name="Button112", layout="Button", bit=48, displayName="112")] - [InputControl(name="Button113", layout="Button", bit=49, displayName="113")] - [InputControl(name="Button114", layout="Button", bit=50, displayName="114")] - [InputControl(name="Button115", layout="Button", bit=51, displayName="115")] - [InputControl(name="Button116", layout="Button", bit=52, displayName="116")] - [InputControl(name="Button117", layout="Button", bit=53, displayName="117")] - [InputControl(name="Button118", layout="Button", bit=54, displayName="118")] - [InputControl(name="Button119", layout="Button", bit=55, displayName="119")] - [InputControl(name="Button120", layout="Button", bit=56, displayName="120")] - [InputControl(name="Button121", layout="Button", bit=57, displayName="121")] - [InputControl(name="Button122", layout="Button", bit=58, displayName="122")] - [InputControl(name="Button123", layout="Button", bit=59, displayName="123")] - [InputControl(name="Button124", layout="Button", bit=60, displayName="124")] - [InputControl(name="Button125", layout="Button", bit=61, displayName="125")] - [InputControl(name="Button126", layout="Button", bit=62, displayName="126")] - [InputControl(name="Button127", layout="Button", bit=63, displayName="127")] - public UInt64 buttonsB; // Buttons seperated into banks of 64-Bits to fit into Unsigned 64-bit integer - - // Axes listed as "LONG" in C++ (Uint32) but values are 0-65535, so UInt16? No issues so far - [InputControl(name="X", layout="Axis", displayName="X")] public UInt16 lX; // X-axis - [InputControl(name="Y", layout="Axis", displayName="Y")] public UInt16 lY; // Y-axis - [InputControl(name="Z", layout="Axis", displayName="Z")] public UInt16 lZ; // Z-axis - [InputControl(name="U", layout="Axis", displayName="U")] public UInt16 lU; // U-axis (rglSlider[0]) - [InputControl(name="V", layout="Axis", displayName="V")] public UInt16 lV; // V-axis (rglSlider[1]) - [InputControl(name="RX", layout="Axis", displayName="X Rotation")] public UInt16 lRx; // X-axis rotation - [InputControl(name="RY", layout="Axis", displayName="Y Rotation")] public UInt16 lRy; // Y-axis rotation - [InputControl(name="RZ", layout="Axis", displayName="Z Rotation")] public UInt16 lRz; // Z-axis rotation - [InputControl(name="VX", layout="Axis", displayName="X Velocity")] public UInt16 lVX; // X-axis velocity - [InputControl(name="VY", layout="Axis", displayName="Y Velocity")] public UInt16 lVY; // Y-axis velocity - [InputControl(name="VZ", layout="Axis", displayName="Z Velocity")] public UInt16 lVZ; // Z-axis velocity - [InputControl(name="VU", layout="Axis", displayName="U Velocity")] public UInt16 lVU; // U-axis velocity (rglVSlider[0]) - [InputControl(name="VV", layout="Axis", displayName="V Velocity")] public UInt16 lVV; // V-axis velocity (rglVSlider[1]) - [InputControl(name="VRX", layout="Axis", displayName="X Angular Velocity")] public UInt16 lVRx; // X-axis angular velocity - [InputControl(name="VRY", layout="Axis", displayName="Y Angular Velocity")] public UInt16 lVRy; // Y-axis angular velocity - [InputControl(name="VRZ", layout="Axis", displayName="Z Angular Velocity")] public UInt16 lVRz; // Z-axis angular velocity - [InputControl(name="AX", layout="Axis", displayName="X Acceleration")] public UInt16 lAX; // X-axis acceleration - [InputControl(name="AY", layout="Axis", displayName="Y Acceleration")] public UInt16 lAY; // Y-axis acceleration - [InputControl(name="AZ", layout="Axis", displayName="Z Acceleration")] public UInt16 lAZ; // Z-axis acceleration - [InputControl(name="AU", layout="Axis", displayName="U Acceleration")] public UInt16 lAU; // U-axis acceleration (rglASlider[0]) - [InputControl(name="AV", layout="Axis", displayName="V Acceleration")] public UInt16 lAV; // V-axis acceleration (rglASlider[1]) - [InputControl(name="ARX", layout="Axis", displayName="X Angular Acceleration")] public UInt16 lARx; // X-axis angular acceleration - [InputControl(name="ARY", layout="Axis", displayName="Y Angular Acceleration")] public UInt16 lARy; // Y-axis angular acceleration - [InputControl(name="ARZ", layout="Axis", displayName="Z Angular Acceleration")] public UInt16 lARz; // Z-axis angular acceleration - [InputControl(name="AFX", layout="Axis", displayName="X Force")] public UInt16 lFX; // X-axis force - [InputControl(name="AFY", layout="Axis", displayName="Y Force")] public UInt16 lFY; // Y-axis force - [InputControl(name="AFZ", layout="Axis", displayName="Z Force")] public UInt16 lFZ; // Z-axis force - [InputControl(name="AFU", layout="Axis", displayName="U Force")] public UInt16 lFU; // U-axis force (rglFSlider[0]) - [InputControl(name="AFV", layout="Axis", displayName="V Force")] public UInt16 lFV; // V-axis force (rglFSlider[1]) - [InputControl(name="FRX", layout="Axis", displayName="X Torque")] public UInt16 lFRx; // X-axis torque - [InputControl(name="FRY", layout="Axis", displayName="Y Torque")] public UInt16 lFRy; // Y-axis torque - [InputControl(name="FRZ", layout="Axis", displayName="Z Torque")] public UInt16 lFRz; // Z-axis torque - - [InputControl(name="dpad0", layout="Dpad", bit=0, sizeInBits=4, displayName="Dpad0")] - [InputControl(name="dpad0/up", bit=0, displayName="Up" )] - [InputControl(name="dpad0/down", bit=1, displayName="Down" )] - [InputControl(name="dpad0/left", bit=2, displayName="Left" )] - [InputControl(name="dpad0/right", bit=3, displayName="Right")] - [InputControl(name="dpad1", layout="Dpad", bit=4, sizeInBits=4, displayName="Dpad1")] - [InputControl(name="dpad1/up", bit=4, displayName="Up" )] - [InputControl(name="dpad1/down", bit=5, displayName="Down" )] - [InputControl(name="dpad1/left", bit=6, displayName="Left" )] - [InputControl(name="dpad1/right", bit=7, displayName="Right")] - [InputControl(name="dpad2", layout="Dpad", bit=8, sizeInBits=4, displayName="Dpad2")] - [InputControl(name="dpad2/up", bit=8, displayName="Up" )] - [InputControl(name="dpad2/down", bit=9, displayName="Down" )] - [InputControl(name="dpad2/left", bit=10, displayName="Left" )] - [InputControl(name="dpad2/right", bit=11, displayName="Right")] - [InputControl(name="dpad3", layout="Dpad", bit=12, sizeInBits=4, displayName="Dpad3")] - [InputControl(name="dpad3/up", bit=12, displayName="Up" )] - [InputControl(name="dpad3/down", bit=13, displayName="Down" )] - [InputControl(name="dpad3/left", bit=14, displayName="Left" )] - [InputControl(name="dpad3/right", bit=15, displayName="Right")] - public UInt16 rgdwPOV; // Store each DPAD in chunks of 4 bits inside a 16-bit Unsigned integer + [InputControl(name = "Button064", layout = "Button", bit = 0, displayName = "064")] + [InputControl(name = "Button065", layout = "Button", bit = 1, displayName = "065")] + [InputControl(name = "Button066", layout = "Button", bit = 2, displayName = "066")] + [InputControl(name = "Button067", layout = "Button", bit = 3, displayName = "067")] + [InputControl(name = "Button068", layout = "Button", bit = 4, displayName = "068")] + [InputControl(name = "Button069", layout = "Button", bit = 5, displayName = "069")] + [InputControl(name = "Button070", layout = "Button", bit = 6, displayName = "070")] + [InputControl(name = "Button071", layout = "Button", bit = 7, displayName = "071")] + [InputControl(name = "Button072", layout = "Button", bit = 8, displayName = "072")] + [InputControl(name = "Button073", layout = "Button", bit = 9, displayName = "073")] + [InputControl(name = "Button074", layout = "Button", bit = 10, displayName = "074")] + [InputControl(name = "Button075", layout = "Button", bit = 11, displayName = "075")] + [InputControl(name = "Button076", layout = "Button", bit = 12, displayName = "076")] + [InputControl(name = "Button077", layout = "Button", bit = 13, displayName = "077")] + [InputControl(name = "Button078", layout = "Button", bit = 14, displayName = "078")] + [InputControl(name = "Button079", layout = "Button", bit = 15, displayName = "079")] + [InputControl(name = "Button080", layout = "Button", bit = 16, displayName = "080")] + [InputControl(name = "Button081", layout = "Button", bit = 17, displayName = "081")] + [InputControl(name = "Button082", layout = "Button", bit = 18, displayName = "082")] + [InputControl(name = "Button083", layout = "Button", bit = 19, displayName = "083")] + [InputControl(name = "Button084", layout = "Button", bit = 20, displayName = "084")] + [InputControl(name = "Button085", layout = "Button", bit = 21, displayName = "085")] + [InputControl(name = "Button086", layout = "Button", bit = 22, displayName = "086")] + [InputControl(name = "Button087", layout = "Button", bit = 23, displayName = "087")] + [InputControl(name = "Button088", layout = "Button", bit = 24, displayName = "088")] + [InputControl(name = "Button089", layout = "Button", bit = 25, displayName = "089")] + [InputControl(name = "Button090", layout = "Button", bit = 26, displayName = "090")] + [InputControl(name = "Button091", layout = "Button", bit = 27, displayName = "091")] + [InputControl(name = "Button092", layout = "Button", bit = 28, displayName = "092")] + [InputControl(name = "Button093", layout = "Button", bit = 29, displayName = "093")] + [InputControl(name = "Button094", layout = "Button", bit = 30, displayName = "094")] + [InputControl(name = "Button095", layout = "Button", bit = 31, displayName = "095")] + [InputControl(name = "Button096", layout = "Button", bit = 32, displayName = "096")] + [InputControl(name = "Button097", layout = "Button", bit = 33, displayName = "097")] + [InputControl(name = "Button098", layout = "Button", bit = 34, displayName = "098")] + [InputControl(name = "Button099", layout = "Button", bit = 35, displayName = "099")] + [InputControl(name = "Button100", layout = "Button", bit = 36, displayName = "100")] + [InputControl(name = "Button101", layout = "Button", bit = 37, displayName = "101")] + [InputControl(name = "Button102", layout = "Button", bit = 38, displayName = "102")] + [InputControl(name = "Button103", layout = "Button", bit = 39, displayName = "103")] + [InputControl(name = "Button104", layout = "Button", bit = 40, displayName = "104")] + [InputControl(name = "Button105", layout = "Button", bit = 41, displayName = "105")] + [InputControl(name = "Button106", layout = "Button", bit = 42, displayName = "106")] + [InputControl(name = "Button107", layout = "Button", bit = 43, displayName = "107")] + [InputControl(name = "Button108", layout = "Button", bit = 44, displayName = "108")] + [InputControl(name = "Button109", layout = "Button", bit = 45, displayName = "109")] + [InputControl(name = "Button110", layout = "Button", bit = 46, displayName = "110")] + [InputControl(name = "Button111", layout = "Button", bit = 47, displayName = "111")] + [InputControl(name = "Button112", layout = "Button", bit = 48, displayName = "112")] + [InputControl(name = "Button113", layout = "Button", bit = 49, displayName = "113")] + [InputControl(name = "Button114", layout = "Button", bit = 50, displayName = "114")] + [InputControl(name = "Button115", layout = "Button", bit = 51, displayName = "115")] + [InputControl(name = "Button116", layout = "Button", bit = 52, displayName = "116")] + [InputControl(name = "Button117", layout = "Button", bit = 53, displayName = "117")] + [InputControl(name = "Button118", layout = "Button", bit = 54, displayName = "118")] + [InputControl(name = "Button119", layout = "Button", bit = 55, displayName = "119")] + [InputControl(name = "Button120", layout = "Button", bit = 56, displayName = "120")] + [InputControl(name = "Button121", layout = "Button", bit = 57, displayName = "121")] + [InputControl(name = "Button122", layout = "Button", bit = 58, displayName = "122")] + [InputControl(name = "Button123", layout = "Button", bit = 59, displayName = "123")] + [InputControl(name = "Button124", layout = "Button", bit = 60, displayName = "124")] + [InputControl(name = "Button125", layout = "Button", bit = 61, displayName = "125")] + [InputControl(name = "Button126", layout = "Button", bit = 62, displayName = "126")] + [InputControl(name = "Button127", layout = "Button", bit = 63, displayName = "127")] + public UInt64 buttonsB; // Buttons separated into banks of 64-Bits to fit into Unsigned 64-bit integer + + // Axes listed as "LONG" in C++ (Uint32) but values are 0-65535, so UInt16? No issues so far + [InputControl(name = "X", layout = "Axis", displayName = "X")] public UInt16 lX; // X-axis + [InputControl(name = "Y", layout = "Axis", displayName = "Y")] public UInt16 lY; // Y-axis + [InputControl(name = "Z", layout = "Axis", displayName = "Z")] public UInt16 lZ; // Z-axis + [InputControl(name = "U", layout = "Axis", displayName = "U")] public UInt16 lU; // U-axis (rglSlider[0]) + [InputControl(name = "V", layout = "Axis", displayName = "V")] public UInt16 lV; // V-axis (rglSlider[1]) + [InputControl(name = "RX", layout = "Axis", displayName = "X Rotation")] public UInt16 lRx; // X-axis rotation + [InputControl(name = "RY", layout = "Axis", displayName = "Y Rotation")] public UInt16 lRy; // Y-axis rotation + [InputControl(name = "RZ", layout = "Axis", displayName = "Z Rotation")] public UInt16 lRz; // Z-axis rotation + [InputControl(name = "VX", layout = "Axis", displayName = "X Velocity")] public UInt16 lVX; // X-axis velocity + [InputControl(name = "VY", layout = "Axis", displayName = "Y Velocity")] public UInt16 lVY; // Y-axis velocity + [InputControl(name = "VZ", layout = "Axis", displayName = "Z Velocity")] public UInt16 lVZ; // Z-axis velocity + [InputControl(name = "VU", layout = "Axis", displayName = "U Velocity")] public UInt16 lVU; // U-axis velocity (rglVSlider[0]) + [InputControl(name = "VV", layout = "Axis", displayName = "V Velocity")] public UInt16 lVV; // V-axis velocity (rglVSlider[1]) + [InputControl(name = "VRX", layout = "Axis", displayName = "X Angular Velocity")] public UInt16 lVRx; // X-axis angular velocity + [InputControl(name = "VRY", layout = "Axis", displayName = "Y Angular Velocity")] public UInt16 lVRy; // Y-axis angular velocity + [InputControl(name = "VRZ", layout = "Axis", displayName = "Z Angular Velocity")] public UInt16 lVRz; // Z-axis angular velocity + [InputControl(name = "AX", layout = "Axis", displayName = "X Acceleration")] public UInt16 lAX; // X-axis acceleration + [InputControl(name = "AY", layout = "Axis", displayName = "Y Acceleration")] public UInt16 lAY; // Y-axis acceleration + [InputControl(name = "AZ", layout = "Axis", displayName = "Z Acceleration")] public UInt16 lAZ; // Z-axis acceleration + [InputControl(name = "AU", layout = "Axis", displayName = "U Acceleration")] public UInt16 lAU; // U-axis acceleration (rglASlider[0]) + [InputControl(name = "AV", layout = "Axis", displayName = "V Acceleration")] public UInt16 lAV; // V-axis acceleration (rglASlider[1]) + [InputControl(name = "ARX", layout = "Axis", displayName = "X Angular Acceleration")] public UInt16 lARx; // X-axis angular acceleration + [InputControl(name = "ARY", layout = "Axis", displayName = "Y Angular Acceleration")] public UInt16 lARy; // Y-axis angular acceleration + [InputControl(name = "ARZ", layout = "Axis", displayName = "Z Angular Acceleration")] public UInt16 lARz; // Z-axis angular acceleration + [InputControl(name = "AFX", layout = "Axis", displayName = "X Force")] public UInt16 lFX; // X-axis force + [InputControl(name = "AFY", layout = "Axis", displayName = "Y Force")] public UInt16 lFY; // Y-axis force + [InputControl(name = "AFZ", layout = "Axis", displayName = "Z Force")] public UInt16 lFZ; // Z-axis force + [InputControl(name = "AFU", layout = "Axis", displayName = "U Force")] public UInt16 lFU; // U-axis force (rglFSlider[0]) + [InputControl(name = "AFV", layout = "Axis", displayName = "V Force")] public UInt16 lFV; // V-axis force (rglFSlider[1]) + [InputControl(name = "FRX", layout = "Axis", displayName = "X Torque")] public UInt16 lFRx; // X-axis torque + [InputControl(name = "FRY", layout = "Axis", displayName = "Y Torque")] public UInt16 lFRy; // Y-axis torque + [InputControl(name = "FRZ", layout = "Axis", displayName = "Z Torque")] public UInt16 lFRz; // Z-axis torque + + // Store each DPAD in chunks of 4 bits inside a 16-bit Unsigned integer + + ///////////////// ---------- START ::: CHANGES BY DHRUV RATHOD -------------------///////////////// + + + /////////////////*------- REASON :: VR - OpenXR -- It was throwing errors becasue OpenXR also do the D-Pad binding and + ///Below code were also trying to do it so it was creating issue for my usecase, so I commented it, you can try to find better solution if you can *////////////////// + + + + + + /* [InputControl(name = "dpad0", layout = "Dpad", bit = 0, sizeInBits = 4, displayName = "Dpad0")] + [InputControl(name = "dpad0/up", bit = 0, displayName = "Up")] + [InputControl(name = "dpad0/down", bit = 1, displayName = "Down")] + [InputControl(name = "dpad0/left", bit = 2, displayName = "Left")] + [InputControl(name = "dpad0/right", bit = 3, displayName = "Right")] + [InputControl(name = "dpad1", layout = "Dpad", bit = 4, sizeInBits = 4, displayName = "Dpad1")] + [InputControl(name = "dpad1/up", bit = 4, displayName = "Up")] + [InputControl(name = "dpad1/down", bit = 5, displayName = "Down")] + [InputControl(name = "dpad1/left", bit = 6, displayName = "Left")] + [InputControl(name = "dpad1/right", bit = 7, displayName = "Right")] + [InputControl(name = "dpad2", layout = "Dpad", bit = 8, sizeInBits = 4, displayName = "Dpad2")] + [InputControl(name = "dpad2/up", bit = 8, displayName = "Up")] + [InputControl(name = "dpad2/down", bit = 9, displayName = "Down")] + [InputControl(name = "dpad2/left", bit = 10, displayName = "Left")] + [InputControl(name = "dpad2/right", bit = 11, displayName = "Right")] + [InputControl(name = "dpad3", layout = "Dpad", bit = 12, sizeInBits = 4, displayName = "Dpad3")] + [InputControl(name = "dpad3/up", bit = 12, displayName = "Up")] + [InputControl(name = "dpad3/down", bit = 13, displayName = "Down")] + [InputControl(name = "dpad3/left", bit = 14, displayName = "Left")] + [InputControl(name = "dpad3/right", bit = 15, displayName = "Right")]*/ + + + + ///////////////// ---------- END ::: CHANGES BY DHRUV RATHOD -------------------///////////////// + + public UInt16 rgdwPOV; } ////////////////////////////////////////////////////////////// @@ -220,121 +229,130 @@ public struct FlatJoyState2State : IInputStateTypeInfo { #if UNITY_EDITOR [InitializeOnLoad] #endif -[InputControlLayout(displayName="DirectInput Device",stateType=typeof(FlatJoyState2State))] -public class DirectInputDevice : InputDevice, IInputUpdateCallbackReceiver{ +[InputControlLayout(displayName = "DirectInput Device", stateType = typeof(FlatJoyState2State))] +public class DirectInputDevice : InputDevice, IInputUpdateCallbackReceiver +{ - public static DirectInputDevice current { get; private set; } + public static DirectInputDevice current { get; private set; } #if UNITY_EDITOR - static DirectInputDevice(){ - Initialize(); // Make sure layouts are ready even when just in the editor - } + static DirectInputDevice() + { + Initialize(); // Ensure layouts are ready even when just in the editor + } #endif - [RuntimeInitializeOnLoadMethod] - private static void Initialize(){ - DIManager.Initialize(); // Start DirectInput if it's not already - DIManager.EnumerateDevices(); // Scan for available devices - // await DIManager.EnumerateDevicesAsync(); // Async allows to detect enumeration issues but causes issues with domain reloads as await yields and processes devices before layouts can be built - DIManager.OnDeviceAdded += DIDeviceAdded; // Register handler for when a device is attached - GenerateISLayouts(); // Create InputSystem Layouts for the DI Devices - AddAllDIDevicesToIS(); // Create InputSystem Devices for the DI Devices - } - - public static void GenerateISLayouts(){ - foreach (DeviceInfo device in DIManager.devices){ - InputSystem.RegisterLayout($"DI_{device.productName}", matches: // Create a layout so we can uniquely address this device - new InputDeviceMatcher().WithProduct($"DID_{device.productName}") // Interface name to match our device against - ); + [RuntimeInitializeOnLoadMethod] + private static void Initialize() + { + DIManager.Initialize(); // Start DirectInput if it's not already + DIManager.EnumerateDevices(); // Scan for available devices + DIManager.OnDeviceAdded += DIDeviceAdded; // Register handler for when a device is attached + GenerateISLayouts(); // Create InputSystem Layouts for the DI Devices + AddAllDIDevicesToIS(); // Create InputSystem Devices for the DI Devices + } + + public static void GenerateISLayouts() + { + foreach (DeviceInfo device in DIManager.devices) + { + try + { + Debug.Log("Debug For DI :: " + device.productName); + InputSystem.RegisterLayout($"DI_{device.productName}", matches: // Create a layout so we can uniquely address this device + new InputDeviceMatcher().WithProduct($"DID_{device.productName}") // Interface name to match our device against + ); + } + + catch (Exception e) + { + Debug.Log("Exception For DI :: " + device.productName); + + } + + } + } + + protected override void FinishSetup() + { + if (DIManager.Attach(this.description.serial)) + { // Doing this in FinishSetup allows events to be re-created on Domain reloads + DIManager.activeDevices[this.description.serial].OnDeviceRemoved += this.DIDeviceRemoved; // Register a handler for when the device is removed + DIManager.activeDevices[this.description.serial].OnDeviceStateChange += this.DeviceStateChanged; // Register a handler for when the device state changes + } + base.FinishSetup(); + } + + public override void MakeCurrent() + { + base.MakeCurrent(); + current = this; + } + + protected override void OnRemoved() + { + base.OnRemoved(); + if (current == this) + { + current = null; + } + } + + public void OnUpdate() + { + DIManager.Poll(this.description.serial); // TODO: Make ASYNC } - } - protected override void FinishSetup(){ - if (DIManager.Attach(this.description.serial)){ // Doing this in FinishSetup allows events to be re-created on Domain reloads - DIManager.activeDevices[this.description.serial].OnDeviceRemoved += this.DIDeviceRemoved; // Register a handler for when the device is removed - DIManager.activeDevices[this.description.serial].OnDeviceStateChange += this.DeviceStateChanged; // Register a handler for when the device state changes + public static bool AddDIDeviceToIS(DeviceInfo device) + { + if (InputSystem.devices.OfType().Where(d => d.description.serial == device.guidInstance).Any()) + { + return true; // Device already exists + } + if (DIManager.Attach(device)) + { // Attach to DirectInput device, proceed if successfully connected + InputDevice ISDevice = InputSystem.AddDevice(new InputDeviceDescription + { + interfaceName = $"Unity-DirectInput", + product = $"DID_{device.productName}", + serial = $"{device.guidInstance}", + capabilities = $@"{{""FFBCapable"":{device.FFBCapable.ToString().ToLower()}}}", + }); + return true; + } + return false; // Couldn't attach to device } - base.FinishSetup(); - } - - public override void MakeCurrent(){ - base.MakeCurrent(); - current = this; - } - - protected override void OnRemoved(){ - base.OnRemoved(); - if (current == this){ current = null; } - } - - public void OnUpdate(){ - DIManager.Poll(this.description.serial); // TODO: Make ASYNC - } - - public static bool AddDIDeviceToIS(DeviceInfo device){ - if (InputSystem.devices.OfType().Where(d => d.description.serial == device.guidInstance).Any()){ return true; } // Device already exists - if (DIManager.Attach(device)){ // Attach to DirectInput device, proceed if successfully connected - InputDevice ISDevice = InputSystem.AddDevice(new InputDeviceDescription { - interfaceName = $"Unity-DirectInput", - product = $"DID_{device.productName}", - serial = $"{device.guidInstance}", - capabilities = $@"{{""FFBCapable"":{device.FFBCapable.ToString().ToLower()}}}", - }); - return true; + + public static void DIDeviceAdded(DeviceInfo device) + { + Debug.Log($"[DirectInputManager] DIDeviceAdded: {device.productName} : {device.guidProduct}"); + GenerateISLayouts(); // Ensure a layout is ready for the new device + AddDIDeviceToIS(device); // Add device to IS + } + + protected void DIDeviceRemoved(DeviceInfo device) + { + Debug.Log($"[DirectInputManager] DIDeviceRemoved: {device.productName} : {device.guidProduct}"); + InputSystem.RemoveDevice(this); // Remove device from InputSystem, DIManager handles destroying the device for us :) + } + + protected void DeviceStateChanged(DeviceInfo device, FlatJoyState2 state) + { + // Convert FlatJoyState2 to FlatJoyState2State (The InputSystem Type) + GCHandle handle = GCHandle.Alloc(state, GCHandleType.Pinned); + FlatJoyState2State ISState = (FlatJoyState2State)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(FlatJoyState2State)); + handle.Free(); + + InputDevice ISDevice = InputSystem.devices.OfType().Where(d => d.description.serial == device.guidInstance).FirstOrDefault(); // "this" caused issues after domain reload + if (ISDevice != null) + InputSystem.QueueStateEvent(ISDevice, ISState); // Notify InputSystem with updated state + } + + private static void AddAllDIDevicesToIS() + { + foreach (DeviceInfo device in DIManager.devices) + AddDIDeviceToIS(device); } - return false; // Couldn't attach to device - } - - public static void DIDeviceAdded(DeviceInfo device){ - Debug.Log($"[DirectInputManager] DIDeviceAdded: {device.productName} : {device.guidProduct}"); - GenerateISLayouts(); // Ensure a layout is ready for the new device - AddDIDeviceToIS(device); // Add device to IS - } - - protected void DIDeviceRemoved(DeviceInfo device){ - Debug.Log($"[DirectInputManager] DIDeviceRemoved: {device.productName} : {device.guidProduct}"); - InputSystem.RemoveDevice(this); // Remove device from InputSystem, DIManager handles destroying the device for us :) - } - - protected void DeviceStateChanged(DeviceInfo device, FlatJoyState2 state){ - // Convert FlatJoyState2 to FlatJoyState2State (The InputSystem Type) - GCHandle handle = GCHandle.Alloc(state, GCHandleType.Pinned); - FlatJoyState2State ISState = (FlatJoyState2State)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(FlatJoyState2State)); - handle.Free(); - - InputDevice ISDevice = InputSystem.devices.OfType().Where(d => d.description.serial == device.guidInstance).FirstOrDefault(); // "this" caused issues after domain reload - if (ISDevice != null) - InputSystem.QueueStateEvent(ISDevice, ISState); // Notify InputSystem with updated state - } - - private static void AddAllDIDevicesToIS(){ - foreach (DeviceInfo device in DIManager.devices) - AddDIDeviceToIS(device); - } - - // #if UNITY_EDITOR - // [MenuItem("FFBDev/Add All DI Devices To IS")] - // #endif - // private static void AddAllDIDevicesToIS(){ - // foreach (DeviceInfo device in DIManager.devices) - // AddDIDeviceToIS(device); - // } - - // #if UNITY_EDITOR - // [MenuItem("FFBDev/Remove All Devices From IS")] - // private static void RemoveAllDevices(){ - // while(InputSystem.devices.OfType().Any()){ - // InputSystem.RemoveDevice(InputSystem.devices.OfType().First()); - // } - // } - - // [MenuItem("FFBDev/Remove All Layouts From IS")] - // private static void RemoveAllLayouts(){ - // foreach (DeviceInfo device in DIManager.devices){ - // InputSystem.RemoveLayout($"DI_{device.productName}"); - // } - // } - // #endif } ////////////////////////////////////////////////////////////// @@ -347,35 +365,38 @@ private static void AddAllDIDevicesToIS(){ #if UNITY_EDITOR [InitializeOnLoad] #endif -public class CenterAxisProcessor : InputProcessor{ - #if UNITY_EDITOR - static CenterAxisProcessor(){ Initialize(); } - #endif +public class CenterAxisProcessor : InputProcessor +{ +#if UNITY_EDITOR + static CenterAxisProcessor() { Initialize(); } +#endif - [RuntimeInitializeOnLoadMethod] - static void Initialize(){ InputSystem.RegisterProcessor(); } + [RuntimeInitializeOnLoadMethod] + static void Initialize() { InputSystem.RegisterProcessor(); } - public override float Process(float value, InputControl control){ - return (value*2)-1; - } + public override float Process(float value, InputControl control) + { + return (value * 2) - 1; + } } - /// -/// (Value*-1)+1 Smart Invert, remaps values from 1-0 to 0-1 +/// (Value * -1) + 1 Smart Invert, remaps values from 1-0 to 0-1 /// #if UNITY_EDITOR [InitializeOnLoad] #endif -public class SmartInvertProcessor : InputProcessor{ - #if UNITY_EDITOR - static SmartInvertProcessor(){ Initialize(); } - #endif - - [RuntimeInitializeOnLoadMethod] - static void Initialize(){ InputSystem.RegisterProcessor(); } - - public override float Process(float value, InputControl control){ - return (value*-1)+1; - } -} \ No newline at end of file +public class SmartInvertProcessor : InputProcessor +{ +#if UNITY_EDITOR + static SmartInvertProcessor() { Initialize(); } +#endif + + [RuntimeInitializeOnLoadMethod] + static void Initialize() { InputSystem.RegisterProcessor(); } + + public override float Process(float value, InputControl control) + { + return (value * -1) + 1; + } +} diff --git a/Plugin/Samples~/InputSystem/ControlScheme.inputactions b/Plugin/Samples~/InputSystem/ControlScheme.inputactions index 4a39f8e..3e30aad 100644 --- a/Plugin/Samples~/InputSystem/ControlScheme.inputactions +++ b/Plugin/Samples~/InputSystem/ControlScheme.inputactions @@ -19,7 +19,7 @@ { "name": "", "id": "89e4d092-c412-4bb2-a279-cc13e8da82bf", - "path": "/X", + "path": "/X", "interactions": "", "processors": "", "groups": "", diff --git a/Plugin/Samples~/InputSystem/FFBInspectorDemo.cs b/Plugin/Samples~/InputSystem/FFBInspectorDemo.cs index 325ee3c..c7230ca 100644 --- a/Plugin/Samples~/InputSystem/FFBInspectorDemo.cs +++ b/Plugin/Samples~/InputSystem/FFBInspectorDemo.cs @@ -37,6 +37,13 @@ public class FFBInspectorDemo : MonoBehaviour { [Range(0, 10000f)] public int SpringCoefficient; [Range(0, 10000f)] public uint SpringSaturation; + + [Header("FFB Peroidic Force")] + public bool PeroidicForceEnabled = false; + [Range(-10000f, 10000f)] public int PeroidicForceMagnitude; + [Range(0f, 10000f)] public int PeroidicForceDuration; + public FFBEffects PeroidicFFBEffect; + void Start() { Actions = ControlScheme.FindActionMap("DirectInputDemo"); // Find the correct action map Actions.Enable(); @@ -60,7 +67,14 @@ void Update(){ DIManager.EnableFFBEffect(ISDevice.description.serial, FFBEffects.Friction); DIManager.EnableFFBEffect(ISDevice.description.serial, FFBEffects.Inertia); DIManager.EnableFFBEffect(ISDevice.description.serial, FFBEffects.Spring); - } + + DIManager.EnablePeroidicFFBEffect(ISDevice.description.serial, PeroidicFFBEffect); + + DIDEVCAPS dd = DIManager.GetDeviceCapabilities(ISDevice.description.serial); + + print("Device Capabilites " +dd.dwFlags.ToString()); + + } if (ISDevice is not null) { FFBAxisValue = Actions.FindAction("FFBAxis").ReadValue(); // Poll state of input axis @@ -69,12 +83,19 @@ void Update(){ if (FrictionForceEnabled) { DIManager.UpdateFrictionSimple(ISDevice.description.serial, FrictionMagnitude); } if (InertiaForceEnabled) { DIManager.UpdateInertiaSimple(ISDevice.description.serial, InertiaMagnitude); } if (SpringForceEnabled) { DIManager.UpdateSpringSimple(ISDevice.description.serial, SpringDeadband, SpringOffset, SpringCoefficient, SpringCoefficient, SpringSaturation, SpringSaturation); } + + if (PeroidicForceEnabled) + { + DIManager.UpdatePeroidEffect(ISDevice.description.serial, PeroidicFFBEffect, PeroidicForceMagnitude, + PeroidicForceDuration); + } } } - + void OnDestroy(){ if(ISDevice != null){ DIManager.StopAllFFBEffects(ISDevice.description.serial); + DIManager.DestroyPeroidicFFBEffect(ISDevice.description.serial); } } }