initial release

This commit is contained in:
NotAKidoS 2023-04-07 21:51:13 -05:00
parent f2f7874ffe
commit bf1dbf5e01
6 changed files with 266 additions and 0 deletions

92
KneeFix/HarmonyPatches.cs Normal file
View file

@ -0,0 +1,92 @@
using ABI_RC.Systems.IK;
using ABI_RC.Systems.IK.SubSystems;
using HarmonyLib;
using RootMotion.FinalIK;
using UnityEngine;
namespace NAK.Melons.KneeFix.HarmonyPatches;
internal static class BodySystemPatches
{
[HarmonyPostfix]
[HarmonyPatch(typeof(BodySystem), "SetupOffsets")]
private static void Postfix_BodySystem_SetupOffsets(List<TrackingPoint> trackingPoints)
{
//redo offsets for knees as native is too far from pivot
foreach (TrackingPoint trackingPoint in trackingPoints)
{
Transform parent = null;
if (trackingPoint.assignedRole == TrackingPoint.TrackingRole.LeftKnee)
{
parent = IKSystem.vrik.references.leftCalf;
}
else if (trackingPoint.assignedRole == TrackingPoint.TrackingRole.RightKnee)
{
parent = IKSystem.vrik.references.rightCalf;
}
if (parent != null)
{
trackingPoint.offsetTransform.parent = parent;
trackingPoint.offsetTransform.localPosition = Vector3.zero;
trackingPoint.offsetTransform.localRotation = Quaternion.identity;
trackingPoint.offsetTransform.parent = trackingPoint.referenceTransform;
Vector3 b = IKSystem.vrik.references.root.forward * 0.5f;
trackingPoint.offsetTransform.position += b;
}
}
}
[HarmonyPostfix]
[HarmonyPatch(typeof(BodySystem), "Update")]
private static void Postfix_BodySystem_Update()
{
// FBT needs avatar root to follow head
if (IKSystem.vrik != null)
IKSystem.vrik.solver.spine.maxRootAngle = BodySystem.isCalibratedAsFullBody ? 0f : 180f;
}
}
internal static class VRIKPatches
{
/**
Leg solver uses virtual bone calf and foot, plus world tracked knee position for normal maths.
This breaks as you playspace up, because calf and foot position aren't offset yet in solve order.
**/
[HarmonyPrefix]
[HarmonyPatch(typeof(IKSolverVR.Leg), "ApplyOffsets")]
private static bool Prefix_IKSolverVR_Leg_ApplyOffsets(ref IKSolverVR.Leg __instance)
{
//This is the second part of the above fix, preventing the solver from calculating a bad bendNormal
//when it doesn't need to. The knee tracker should dictate the bendNormal completely.
if (__instance.usingKneeTracker)
{
__instance.ApplyPositionOffset(__instance.footPositionOffset, 1f);
__instance.ApplyRotationOffset(__instance.footRotationOffset, 1f);
Quaternion quaternion = Quaternion.FromToRotation(__instance.footPosition - __instance.position, __instance.footPosition + __instance.heelPositionOffset - __instance.position);
__instance.footPosition = __instance.position + quaternion * (__instance.footPosition - __instance.position);
__instance.footRotation = quaternion * __instance.footRotation;
return false;
}
// run full method like normal otherwise
float num = __instance.bendGoalWeight;
__instance.bendGoalWeight = 0f;
__instance.ApplyOffsetsOld();
__instance.bendGoalWeight = num;
return false;
}
[HarmonyPrefix]
[HarmonyPatch(typeof(IKSolverVR.Leg), "Solve")]
private static void Prefix_IKSolverVR_Leg_Solve(ref IKSolverVR.Leg __instance)
{
//Turns out VRIK applies bend goal maths before root is offset in solving process.
//We will apply ourselves before then to fix it.
if (__instance.usingKneeTracker)
__instance.ApplyBendGoal();
}
}

71
KneeFix/KneeFix.csproj Normal file
View file

@ -0,0 +1,71 @@
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<LangVersion>latest</LangVersion>
<GenerateAssemblyInfo>false</GenerateAssemblyInfo>
<AllowUnsafeBlocks>True</AllowUnsafeBlocks>
</PropertyGroup>
<ItemGroup>
<Reference Include="0Harmony">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\0Harmony.dll</HintPath>
</Reference>
<Reference Include="Assembly-CSharp">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\Assembly-CSharp.dll</HintPath>
</Reference>
<Reference Include="Assembly-CSharp-firstpass">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\Assembly-CSharp-firstpass.dll</HintPath>
</Reference>
<Reference Include="Aura2_Core">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\Aura2_Core.dll</HintPath>
</Reference>
<Reference Include="BTKUILib">
<HintPath>..\..\..\..\..\..\..\..\Program Files (x86)\Steam\steamapps\common\ChilloutVR\Mods\BTKUILib.dll</HintPath>
</Reference>
<Reference Include="cohtml.Net">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\cohtml.Net.dll</HintPath>
</Reference>
<Reference Include="Cohtml.Runtime">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\Cohtml.Runtime.dll</HintPath>
</Reference>
<Reference Include="MelonLoader">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\MelonLoader.dll</HintPath>
</Reference>
<Reference Include="SteamVR">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\SteamVR.dll</HintPath>
</Reference>
<Reference Include="Unity.Postprocessing.Runtime">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\Unity.Postprocessing.Runtime.dll</HintPath>
</Reference>
<Reference Include="Unity.TextMeshPro">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\Unity.TextMeshPro.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.AnimationModule">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\UnityEngine.AnimationModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.CoreModule">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\UnityEngine.CoreModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.InputLegacyModule">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\UnityEngine.InputLegacyModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.PhysicsModule">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\UnityEngine.PhysicsModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.VRModule">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\UnityEngine.VRModule.dll</HintPath>
</Reference>
<Reference Include="UnityEngine.XRModule">
<HintPath>C:\Users\krist\Documents\GitHub\_ChilloutVR Modding\_ManagedLibs\UnityEngine.XRModule.dll</HintPath>
</Reference>
</ItemGroup>
<Target Name="Deploy" AfterTargets="Build">
<Copy SourceFiles="$(TargetPath)" DestinationFolder="C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\Mods\" />
<Message Text="Copied $(TargetPath) to C:\Program Files (x86)\Steam\steamapps\common\ChilloutVR\Mods\" Importance="high" />
</Target>
</Project>

25
KneeFix/KneeFix.sln Normal file
View file

@ -0,0 +1,25 @@

Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.2.32630.192
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KneeFix", "KneeFix.csproj", "{EF74B9F3-3891-4884-A8E1-B1BEE38E1803}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{EF74B9F3-3891-4884-A8E1-B1BEE38E1803}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EF74B9F3-3891-4884-A8E1-B1BEE38E1803}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EF74B9F3-3891-4884-A8E1-B1BEE38E1803}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EF74B9F3-3891-4884-A8E1-B1BEE38E1803}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {57B73DF6-AE94-4453-AE6D-CC87E6DE9B97}
EndGlobalSection
EndGlobal

25
KneeFix/Main.cs Normal file
View file

@ -0,0 +1,25 @@
using MelonLoader;
namespace NAK.Melons.KneeFix;
public class KneeFixMod : MelonMod
{
public override void OnInitializeMelon()
{
ApplyPatches(typeof(HarmonyPatches.BodySystemPatches));
ApplyPatches(typeof(HarmonyPatches.VRIKPatches));
}
void ApplyPatches(Type type)
{
try
{
HarmonyInstance.PatchAll(type);
}
catch (Exception e)
{
LoggerInstance.Msg($"Failed while patching {type.Name}!");
LoggerInstance.Error(e);
}
}
}

View file

@ -0,0 +1,30 @@
using MelonLoader;
using NAK.Melons.KneeFix.Properties;
using System.Reflection;
[assembly: AssemblyVersion(AssemblyInfoParams.Version)]
[assembly: AssemblyFileVersion(AssemblyInfoParams.Version)]
[assembly: AssemblyInformationalVersion(AssemblyInfoParams.Version)]
[assembly: AssemblyTitle(nameof(NAK.Melons.KneeFix))]
[assembly: AssemblyCompany(AssemblyInfoParams.Author)]
[assembly: AssemblyProduct(nameof(NAK.Melons.KneeFix))]
[assembly: MelonInfo(
typeof(NAK.Melons.KneeFix.KneeFixMod),
nameof(NAK.Melons.KneeFix),
AssemblyInfoParams.Version,
AssemblyInfoParams.Author,
downloadLink: "https://github.com/NotAKidOnSteam/KneeFix"
)]
[assembly: MelonGame("Alpha Blend Interactive", "ChilloutVR")]
[assembly: MelonPlatform(MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)]
[assembly: MelonPlatformDomain(MelonPlatformDomainAttribute.CompatibleDomains.MONO)]
[assembly: HarmonyDontPatchAll]
namespace NAK.Melons.KneeFix.Properties;
internal static class AssemblyInfoParams
{
public const string Version = "1.0.0";
public const string Author = "NotAKidoS";
}

23
KneeFix/format.json Normal file
View file

@ -0,0 +1,23 @@
{
"_id": -1,
"name": "KneeFix",
"modversion": "1.0.0",
"gameversion": "2022r170",
"loaderversion": "0.5.7",
"modtype": "Mod",
"author": "NotAKidoS",
"description": "Small fix to knee tracking while in FBT.\n\nThis also partially fixes running animations in FBT & emote direction.",
"searchtags": [
"knee",
"ik",
"tracking",
"fix"
],
"requirements": [
"None"
],
"downloadlink": "https://github.com/NotAKidOnSteam/KneeFix/releases/download/v1.0.0/KneeFix.dll",
"sourcelink": "https://github.com/NotAKidOnSteam/KneeFix/",
"changelog": "Initial Release",
"embedcolor": "7F3F99"
}