From a27d42d8769d9c79a17e179d66a06575d38912db Mon Sep 17 00:00:00 2001 From: NotAKidoS <37721153+NotAKidOnSteam@users.noreply.github.com> Date: Tue, 28 Feb 2023 07:16:32 -0600 Subject: [PATCH] push --- DesktopVRIK/DesktopVRIK.cs | 47 +++++---- DesktopVRIK/DesktopVRIKCalibrator.cs | 152 +++++++++++++++------------ DesktopVRIK/HarmonyPatches.cs | 19 ++-- 3 files changed, 113 insertions(+), 105 deletions(-) diff --git a/DesktopVRIK/DesktopVRIK.cs b/DesktopVRIK/DesktopVRIK.cs index a63d9ce..47e1a5d 100644 --- a/DesktopVRIK/DesktopVRIK.cs +++ b/DesktopVRIK/DesktopVRIK.cs @@ -30,7 +30,6 @@ public class DesktopVRIK : MonoBehaviour private float ik_SimulatedRootAngle; private bool - ms_lastGrounded, ps_emoteIsPlaying; static readonly FieldInfo ms_isGrounded = typeof(MovementSystem).GetField("_isGrounded", BindingFlags.NonPublic | BindingFlags.Instance); @@ -45,26 +44,31 @@ public class DesktopVRIK : MonoBehaviour { if (!Setting_Enabled) return; Calibrator.SetupDesktopVRIK(); - ik_SimulatedRootAngle = transform.eulerAngles.y; + ResetDesktopVRIK(); } - //public void OnReCalibrateAvatar() - //{ - // Calibrator.RecalibrateDesktopVRIK(); - // ik_SimulatedRootAngle = transform.eulerAngles.y; - //} - - public bool OnApplyAvatarScaleToIk(float height) + public bool OnSetupIKScaling(float avatarHeight, float scaleDifference) { if (Calibrator.vrik != null) { - Calibrator.vrik.solver.locomotion.footDistance = Calibrator.initialFootDistance * height; - Calibrator.vrik.solver.locomotion.stepThreshold = Calibrator.initialStepThreshold * height; + Calibrator.vrik.solver.locomotion.footDistance = Calibrator.initialFootDistance * scaleDifference; + Calibrator.vrik.solver.locomotion.stepThreshold = Calibrator.initialStepThreshold * scaleDifference; + DesktopVRIK.ScaleStepHeight(Calibrator.vrik.solver.locomotion.stepHeight, Calibrator.initialStepHeight * scaleDifference); + Calibrator.vrik.solver.Reset(); + ResetDesktopVRIK(); + return true; } return false; } + public static void ScaleStepHeight(AnimationCurve stepHeightCurve, float mag) + { + Keyframe[] keyframes = stepHeightCurve.keys; + keyframes[1].value = mag; + stepHeightCurve.keys = keyframes; + } + public void OnPlayerSetupUpdate(bool isEmotePlaying) { bool changed = isEmotePlaying != ps_emoteIsPlaying; @@ -79,12 +83,21 @@ public class DesktopVRIK : MonoBehaviour } BodySystem.TrackingEnabled = !isEmotePlaying; Calibrator.vrik.solver?.Reset(); + ResetDesktopVRIK(); } } + public void ResetDesktopVRIK() + { + ik_SimulatedRootAngle = transform.eulerAngles.y; + } + public void OnPreSolverUpdate() { - if (ps_emoteIsPlaying) return; + if (ps_emoteIsPlaying) + { + return; + } bool isGrounded = (bool)ms_isGrounded.GetValue(MovementSystem.Instance); @@ -103,16 +116,6 @@ public class DesktopVRIK : MonoBehaviour // This is nice for walk cycles //Calibrator.vrik.solver.spine.rotateChestByHands = Setting_RotateChestByHands * weight; - //reset solver if weight changes dramatically - if (Setting_ResetOnLand) - { - if (isGrounded && !ms_lastGrounded) - { - Calibrator.vrik.solver.Reset(); - } - ms_lastGrounded = isGrounded; - } - // Old VRChat hip movement emulation if (Setting_BodyLeanWeight > 0) { diff --git a/DesktopVRIK/DesktopVRIKCalibrator.cs b/DesktopVRIK/DesktopVRIKCalibrator.cs index e16340f..abbcba0 100644 --- a/DesktopVRIK/DesktopVRIKCalibrator.cs +++ b/DesktopVRIK/DesktopVRIKCalibrator.cs @@ -30,45 +30,33 @@ public class DesktopVRIKCalibrator _lookIKTraverse = Traverse.Create(playerSetup).Field("lookIK"); } - //Settings + // Settings public bool Setting_UseVRIKToes = true; public bool Setting_FindUnmappedToes = true; - //DesktopVRIK + // DesktopVRIK public CVRAvatar avatar; public Animator animator; public Transform avatarTransform; public VRIK vrik; public LookAtIK lookAtIK; + // Calibration public HumanPoseHandler humanPoseHandler; public HumanPose initialHumanPose; + // Calibrator public bool fixTransformsRequired; - public float initialFootDistance; - public float initialStepThreshold; + public float initialFootDistance, initialStepThreshold, initialStepHeight; - //Traverse + // Traverse private IKSystem ikSystem; private PlayerSetup playerSetup; - private Traverse _vrikTraverse; - private Traverse _lookIKTraverse; - private Traverse _avatarTraverse; - private Traverse _animatorManagerTraverse; - private Traverse _poseHandlerTraverse; - private Traverse _avatarRootHeightTraverse; - - //public void RecalibrateDesktopVRIK() - //{ - // if (avatar != null) - // { - // //calibrate VRIK - // CalibrateDesktopVRIK(); - // } - // else - // { - // //we never calibrated - // SetupDesktopVRIK(); - // } - //} + private Traverse + _vrikTraverse, + _lookIKTraverse, + _avatarTraverse, + _animatorManagerTraverse, + _poseHandlerTraverse, + _avatarRootHeightTraverse; public void SetupDesktopVRIK() { @@ -92,9 +80,9 @@ public class DesktopVRIKCalibrator //calibrate VRIK PrepareAvatarVRIK(); SetAvatarIKPose(true); - CalculateInitialIKScaling(); CalibrateHeadIK(); ForceInitiateVRIKSolver(); + CalculateInitialIKScaling(); SetAvatarIKPose(false); } @@ -220,18 +208,19 @@ public class DesktopVRIKCalibrator private void CalculateInitialIKScaling() { - // Get distance between feets and thighs (fixes some weird armatures) + // Get distance between feets and thighs float footDistance = Vector3.Distance(vrik.references.leftFoot.position, vrik.references.rightFoot.position); - float thighDistance = Vector3.Distance(vrik.references.leftThigh.position, vrik.references.rightThigh.position); - float greatestDistance = Mathf.Min(footDistance, thighDistance); - initialFootDistance = greatestDistance * 0.5f; - initialStepThreshold = greatestDistance * 0.4f; + initialFootDistance = footDistance * 0.5f; + initialStepThreshold = footDistance * 0.4f; + initialStepHeight = Vector3.Distance(vrik.references.leftFoot.position, vrik.references.leftCalf.position) * 0.2f; - //set initial values now, as avatars without scaling dont apply it + // Set initial values vrik.solver.locomotion.footDistance = initialFootDistance; vrik.solver.locomotion.stepThreshold = initialStepThreshold; + DesktopVRIK.ScaleStepHeight(vrik.solver.locomotion.stepHeight, initialStepHeight); } + private void CalibrateHeadIK() { // Lazy HeadIKTarget calibration @@ -262,12 +251,7 @@ public class DesktopVRIKCalibrator if (enforceTPose) { humanPoseHandler.GetHumanPose(ref initialHumanPose); - humanPoseHandler.GetHumanPose(ref ikSystem.humanPose); - for (int i = 0; i < IKPoseMuscles.Length; i++) - { - IKSystem.Instance.ApplyMuscleValue((MuscleIndex)i, IKPoseMuscles[i], ref ikSystem.humanPose.muscles); - } - humanPoseHandler.SetHumanPose(ref ikSystem.humanPose); + SetCustomPose(IKPoseMuscles); } else { @@ -275,6 +259,16 @@ public class DesktopVRIKCalibrator } } + private void SetCustomPose(float[] muscleValues) + { + humanPoseHandler.GetHumanPose(ref ikSystem.humanPose); + for (int i = 0; i < muscleValues.Length; i++) + { + IKSystem.Instance.ApplyMuscleValue((MuscleIndex)i, muscleValues[i], ref ikSystem.humanPose.muscles); + } + humanPoseHandler.SetHumanPose(ref ikSystem.humanPose); + } + private void ForceInitiateVRIKSolver() { //force immediate calibration before animator decides to fuck us @@ -286,17 +280,8 @@ public class DesktopVRIKCalibrator { fixTransformsRequired = false; - Transform leftShoulderBone = vrik.references.leftShoulder; - Transform rightShoulderBone = vrik.references.rightShoulder; - Transform assumedChest = leftShoulderBone?.parent; - - // Repair chest & spine bone references (valve models were messed up) - if (assumedChest != null && rightShoulderBone.parent == assumedChest && - vrik.references.chest != assumedChest) - { - vrik.references.chest = assumedChest; - vrik.references.spine = assumedChest.parent; - } + //might not work over netik + FixChestAndSpineReferences(); if (!Setting_UseVRIKToes) { @@ -305,32 +290,44 @@ public class DesktopVRIKCalibrator } else if (Setting_FindUnmappedToes) { - Transform leftToes = vrik.references.leftToes; - Transform rightToes = vrik.references.rightToes; - if (leftToes == null && rightToes == null) - { - leftToes = FindUnmappedToe(vrik.references.leftFoot); - rightToes = FindUnmappedToe(vrik.references.rightFoot); - if (leftToes != null && rightToes != null) - { - fixTransformsRequired = true; - vrik.references.leftToes = leftToes; - vrik.references.rightToes = rightToes; - } - } + //doesnt work with netik, but its toes... + FindAndSetUnmappedToes(); } - // Fix error when there is no finger bones - // Making up bullshit cause VRIK is evil otherwise - if (vrik.references.leftHand.childCount == 0) + //bullshit fix to not cause death + FixFingerBonesError(); + } + + private void FixChestAndSpineReferences() + { + Transform leftShoulderBone = vrik.references.leftShoulder; + Transform rightShoulderBone = vrik.references.rightShoulder; + Transform assumedChest = leftShoulderBone?.parent; + + if (assumedChest != null && rightShoulderBone.parent == assumedChest && + vrik.references.chest != assumedChest) { - vrik.solver.leftArm.wristToPalmAxis = Vector3.up; - vrik.solver.leftArm.palmToThumbAxis = -Vector3.forward; + vrik.references.chest = assumedChest; + vrik.references.spine = assumedChest.parent; } - if (vrik.references.rightHand.childCount == 0) + } + + private void FindAndSetUnmappedToes() + { + Transform leftToes = vrik.references.leftToes; + Transform rightToes = vrik.references.rightToes; + + if (leftToes == null && rightToes == null) { - vrik.solver.rightArm.wristToPalmAxis = Vector3.up; - vrik.solver.rightArm.palmToThumbAxis = Vector3.forward; + leftToes = FindUnmappedToe(vrik.references.leftFoot); + rightToes = FindUnmappedToe(vrik.references.rightFoot); + + if (leftToes != null && rightToes != null) + { + vrik.references.leftToes = leftToes; + vrik.references.rightToes = rightToes; + fixTransformsRequired = true; + } } } @@ -348,6 +345,21 @@ public class DesktopVRIKCalibrator return null; } + private void FixFingerBonesError() + { + FixFingerBones(vrik.references.leftHand, vrik.solver.leftArm); + FixFingerBones(vrik.references.rightHand, vrik.solver.rightArm); + } + + private void FixFingerBones(Transform hand, IKSolverVR.Arm armSolver) + { + if (hand.childCount == 0) + { + armSolver.wristToPalmAxis = Vector3.up; + armSolver.palmToThumbAxis = hand == vrik.references.leftHand ? -Vector3.forward : Vector3.forward; + } + } + private static readonly float[] IKPoseMuscles = new float[] { 0.00133321f, diff --git a/DesktopVRIK/HarmonyPatches.cs b/DesktopVRIK/HarmonyPatches.cs index 2a9562e..9b7d4af 100644 --- a/DesktopVRIK/HarmonyPatches.cs +++ b/DesktopVRIK/HarmonyPatches.cs @@ -40,12 +40,12 @@ class PlayerSetupPatches DesktopVRIK.Instance?.OnPlayerSetupUpdate(____emotePlaying); } - //[HarmonyPostfix] - //[HarmonyPatch(typeof(PlayerSetup), "ReCalibrateAvatar")] - //static void Postfix_PlayerSetup_ReCalibrateAvatar() - //{ - // DesktopVRIK.Instance?.OnReCalibrateAvatar(); - //} + [HarmonyPrefix] + [HarmonyPatch(typeof(PlayerSetup), "SetupIKScaling")] + private static bool Prefix_PlayerSetup_SetupIKScaling(float height, ref Vector3 ___scaleDifference) + { + return !(bool)DesktopVRIK.Instance?.OnSetupIKScaling(height, 1f + ___scaleDifference.y); + } } class IKSystemPatches @@ -56,11 +56,4 @@ class IKSystemPatches { __instance.gameObject.AddComponent(); } - - [HarmonyPrefix] - [HarmonyPatch(typeof(IKSystem), "ApplyAvatarScaleToIk")] - private static bool Prefix_IKSystem_ApplyAvatarScaleToIk(float height) - { - return !(bool)DesktopVRIK.Instance?.OnApplyAvatarScaleToIk(height); - } }