diff --git a/DesktopVRIK/DesktopVRIK.cs b/DesktopVRIK/DesktopVRIK.cs index 7e28795..783e8db 100644 --- a/DesktopVRIK/DesktopVRIK.cs +++ b/DesktopVRIK/DesktopVRIK.cs @@ -17,6 +17,8 @@ public class DesktopVRIK : MonoBehaviour public bool Setting_EmulateVRChatHipMovement; public bool Setting_EmoteVRIK; public bool Setting_EmoteLookAtIK; + //fuck + public bool Setting_CompatibilityMode; void Start() { diff --git a/DesktopVRIK/HarmonyPatches.cs b/DesktopVRIK/HarmonyPatches.cs index eef2266..49940eb 100644 --- a/DesktopVRIK/HarmonyPatches.cs +++ b/DesktopVRIK/HarmonyPatches.cs @@ -5,12 +5,14 @@ using ABI_RC.Systems.IK; using ABI_RC.Systems.IK.SubSystems; using HarmonyLib; using RootMotion.FinalIK; +using UnityEngine; namespace DesktopVRIK; [HarmonyPatch] internal class HarmonyPatches { + [HarmonyPostfix] [HarmonyPatch(typeof(PlayerSetup), "SetupAvatarGeneral")] private static void SetupDesktopIKSystem(ref CVRAvatar ____avatarDescriptor) @@ -24,12 +26,42 @@ internal class HarmonyPatches [HarmonyPostfix] [HarmonyPatch(typeof(IKSystem), "InitializeAvatar")] - private static void InitializeDesktopAvatarVRIK(CVRAvatar avatar, ref VRIK ____vrik) + private static void InitializeDesktopAvatarVRIK(CVRAvatar avatar, ref VRIK ____vrik, ref HumanPoseHandler ____poseHandler, ref float[] ___HandCalibrationPoseMuscles, ref Vector3 ____referenceRootPosition, ref Quaternion ____referenceRootRotation, ref HumanPose ___humanPose) { if (!MetaPort.Instance.isUsingVr && DesktopVRIK.Instance.Setting_Enabled) { //need IKSystem to see VRIK component for setup - ____vrik = avatar.gameObject.AddComponent(); + if (____vrik == null) + { + ____vrik = avatar.gameObject.AddComponent(); + } + + //ChilloutVR stuffs that makes sure garbage armatures are supported + //this places heels in the ground... can i just use my own tpose animation + if (DesktopVRIK.Instance.Setting_CompatibilityMode) + { + if (____poseHandler == null) + { + ____poseHandler = new HumanPoseHandler(IKSystem.Instance.animator.avatar, IKSystem.Instance.animator.transform); + } + ____poseHandler.GetHumanPose(ref ___humanPose); + ____referenceRootPosition = IKSystem.Instance.animator.GetBoneTransform(HumanBodyBones.Hips).position; + ____referenceRootRotation = IKSystem.Instance.animator.GetBoneTransform(HumanBodyBones.Hips).rotation; + for (int i = 0; i < ___HandCalibrationPoseMuscles.Length; i++) + { + IKSystem.Instance.ApplyMuscleValue((MuscleIndex)i, ___HandCalibrationPoseMuscles[i], ref ___humanPose.muscles); + } + ____poseHandler.SetHumanPose(ref ___humanPose); + if (IKSystem.Instance.applyOriginalHipPosition) + { + IKSystem.Instance.animator.GetBoneTransform(HumanBodyBones.Hips).position = ____referenceRootPosition; + } + if (IKSystem.Instance.applyOriginalHipRotation) + { + IKSystem.Instance.animator.GetBoneTransform(HumanBodyBones.Hips).rotation = ____referenceRootRotation; + } + } + //now I calibrate DesktopVRIK DesktopVRIK.Instance.CalibrateDesktopVRIK(avatar); } diff --git a/DesktopVRIK/Main.cs b/DesktopVRIK/Main.cs index a04b2fc..14119ad 100644 --- a/DesktopVRIK/Main.cs +++ b/DesktopVRIK/Main.cs @@ -7,7 +7,7 @@ public class DesktopVRIKMod : MelonMod { internal const string SettingsCategory = "DesktopVRIK"; private static MelonPreferences_Category m_categoryDesktopVRIK; - private static MelonPreferences_Entry m_entryEnabled, m_entryEmulateHipMovement, m_entryEmoteVRIK, m_entryEmoteLookAtIK; + private static MelonPreferences_Entry m_entryEnabled, m_entryEmulateHipMovement, m_entryEmoteVRIK, m_entryEmoteLookAtIK, m_entryCompatibilityMode; public override void OnInitializeMelon() { m_categoryDesktopVRIK = MelonPreferences.CreateCategory(SettingsCategory); @@ -15,6 +15,7 @@ public class DesktopVRIKMod : MelonMod m_entryEmulateHipMovement = m_categoryDesktopVRIK.CreateEntry("Emulate Hip Movement", true, description: "Emulates VRChat-like hip movement when moving head up/down on desktop."); m_entryEmoteVRIK = m_categoryDesktopVRIK.CreateEntry("Disable Emote VRIK", true, description: "Disable VRIK while emoting. Only disable if you are ok with looking dumb."); m_entryEmoteLookAtIK = m_categoryDesktopVRIK.CreateEntry("Disable Emote LookAtIK", true, description: "Disable LookAtIK while emoting. This setting doesn't really matter, as LookAtIK isn't networked while doing an emote."); + m_entryCompatibilityMode = m_categoryDesktopVRIK.CreateEntry("Compatibility Mode", false, description: "Runs finger muscle calibration- which somehow makes bad armatures work better but also pushes heels into the ground."); ; m_categoryDesktopVRIK.SaveToFile(false); foreach (var setting in m_categoryDesktopVRIK.Entries) @@ -42,6 +43,7 @@ public class DesktopVRIKMod : MelonMod DesktopVRIK.Instance.Setting_EmulateVRChatHipMovement = m_entryEmulateHipMovement.Value; DesktopVRIK.Instance.Setting_EmoteVRIK = m_entryEmoteVRIK.Value; DesktopVRIK.Instance.Setting_EmoteLookAtIK = m_entryEmoteLookAtIK.Value; + DesktopVRIK.Instance.Setting_CompatibilityMode = m_entryCompatibilityMode.Value; } private void OnUpdateSettings(object arg1, object arg2) => UpdateAllSettings();