From 04d9152d9c33ad43a16fa090e874c5f232c09970 Mon Sep 17 00:00:00 2001 From: NotAKidoS <37721153+NotAKidOnSteam@users.noreply.github.com> Date: Wed, 29 Mar 2023 04:00:42 -0500 Subject: [PATCH] fix desktop thrusting --- DesktopVRIK/DesktopVRIKSystem.cs | 68 ++++++++++---------------------- DesktopVRIK/Main.cs | 18 --------- 2 files changed, 21 insertions(+), 65 deletions(-) diff --git a/DesktopVRIK/DesktopVRIKSystem.cs b/DesktopVRIK/DesktopVRIKSystem.cs index 06464ee..50a0cec 100644 --- a/DesktopVRIK/DesktopVRIKSystem.cs +++ b/DesktopVRIK/DesktopVRIKSystem.cs @@ -166,9 +166,12 @@ internal class DesktopVRIKSystem : MonoBehaviour float _initialStepHeight; // Player Info - Transform _cameraTransform; - bool _isEmotePlaying; - float _simulatedRootAngle; + Transform _cameraTransform = null; + bool _isEmotePlaying = false; + float _simulatedRootAngle = 0f; + float _locomotionWeight = 1f; + float _locomotionWeightLerp = 1f; + float _locomotionLerpSpeed = 10f; // Last Movement Parent Info Vector3 _previousPosition; @@ -196,37 +199,13 @@ internal class DesktopVRIKSystem : MonoBehaviour if (avatarVRIK == null) return; HandleLocomotionTracking(); + LerpLocomotionWeight(); ApplyBodySystemWeights(); } void HandleLocomotionTracking() { bool isMoving = movementSystem.movementVector.magnitude > 0f; - - // AvatarMotionTweaker handles VRIK a bit better than DesktopVRIK - if (Setting_IntegrationAMT && DesktopVRIKMod.integration_AMT) - { - if (isMoving) - { - if (BodySystem.TrackingLocomotionEnabled) - { - BodySystem.TrackingLocomotionEnabled = false; - avatarIKSolver.Reset(); - ResetDesktopVRIK(); - } - } - else - { - if (!BodySystem.TrackingLocomotionEnabled) - { - BodySystem.TrackingLocomotionEnabled = true; - avatarIKSolver.Reset(); - ResetDesktopVRIK(); - } - } - return; - } - bool isGrounded = movementSystem._isGrounded; bool isCrouching = movementSystem.crouching; bool isProne = movementSystem.prone; @@ -256,6 +235,12 @@ internal class DesktopVRIKSystem : MonoBehaviour } } + void LerpLocomotionWeight() + { + _locomotionWeight = BodySystem.TrackingEnabled && BodySystem.TrackingLocomotionEnabled ? 1.0f : 0.0f; + _locomotionWeightLerp = Mathf.Lerp(_locomotionWeightLerp, _locomotionWeight, Time.deltaTime * _locomotionLerpSpeed); + } + void ApplyBodySystemWeights() { void SetArmWeight(IKSolverVR.Arm arm, bool isTracked) @@ -274,7 +259,7 @@ internal class DesktopVRIKSystem : MonoBehaviour { avatarVRIK.enabled = true; avatarIKSolver.IKPositionWeight = BodySystem.TrackingPositionWeight; - avatarIKSolver.locomotion.weight = BodySystem.TrackingLocomotionEnabled ? 1f : 0f; + avatarIKSolver.locomotion.weight = _locomotionWeight; SetArmWeight(avatarIKSolver.leftArm, BodySystem.TrackingLeftArmEnabled && avatarIKSolver.leftArm.target != null); SetArmWeight(avatarIKSolver.rightArm, BodySystem.TrackingRightArmEnabled && avatarIKSolver.rightArm.target != null); @@ -324,19 +309,15 @@ internal class DesktopVRIKSystem : MonoBehaviour { if (avatarVRIK == null) return; - bool changed = isEmotePlaying != _isEmotePlaying; - if (!changed) return; - + if (isEmotePlaying == _isEmotePlaying) return; + _isEmotePlaying = isEmotePlaying; - avatarTransform.localPosition = Vector3.zero; - avatarTransform.localRotation = Quaternion.identity; - if (avatarLookAtIK != null) avatarLookAtIK.enabled = !isEmotePlaying; + // Disable tracking completely while emoting BodySystem.TrackingEnabled = !isEmotePlaying; - avatarIKSolver.Reset(); ResetDesktopVRIK(); } @@ -372,26 +353,19 @@ internal class DesktopVRIKSystem : MonoBehaviour public void OnPreSolverUpdate() { - if (_isEmotePlaying) return; - - bool isGrounded = movementSystem._isGrounded; - - // Calculate weight - float weight = avatarIKSolver.IKPositionWeight; - weight *= 1f - movementSystem.movementVector.magnitude; - weight *= isGrounded ? 1f : 0f; - // Reset avatar offset avatarTransform.localPosition = Vector3.zero; avatarTransform.localRotation = Quaternion.identity; + if (_isEmotePlaying) return; + // Set plant feet avatarIKSolver.plantFeet = Setting_PlantFeet; // Emulate old VRChat hip movementSystem if (Setting_BodyLeanWeight > 0) { - float weightedAngle = Setting_BodyLeanWeight * weight; + float weightedAngle = Setting_BodyLeanWeight * _locomotionWeightLerp; float angle = _cameraTransform.localEulerAngles.x; angle = angle > 180 ? angle - 360 : angle; Quaternion rotation = Quaternion.AngleAxis(angle * weightedAngle, avatarTransform.right); @@ -401,7 +375,7 @@ internal class DesktopVRIKSystem : MonoBehaviour // Make root heading follow within a set limit if (Setting_BodyHeadingLimit > 0) { - float weightedAngleLimit = Setting_BodyHeadingLimit * weight; + float weightedAngleLimit = Setting_BodyHeadingLimit * _locomotionWeightLerp; float deltaAngleRoot = Mathf.DeltaAngle(transform.eulerAngles.y, _simulatedRootAngle); float absDeltaAngleRoot = Mathf.Abs(deltaAngleRoot); if (absDeltaAngleRoot > weightedAngleLimit) diff --git a/DesktopVRIK/Main.cs b/DesktopVRIK/Main.cs index 8dff84b..bb82623 100644 --- a/DesktopVRIK/Main.cs +++ b/DesktopVRIK/Main.cs @@ -33,11 +33,6 @@ public class DesktopVRIKMod : MelonMod public static readonly MelonPreferences_Entry EntryChestHeadingWeight = CategoryDesktopVRIK.CreateEntry("Chest Heading Weight", 0.75f, description: "Determines how much the chest will face the Body Heading Limit. Set to 0 to align with head."); - public static readonly MelonPreferences_Entry EntryIntegrationAMT = - CategoryDesktopVRIK.CreateEntry("AMT Integration", true, description: "Relies on AvatarMotionTweaker to handle VRIK Locomotion weights if available."); - - public static bool integration_AMT = false; - public override void OnInitializeMelon() { Logger = LoggerInstance; @@ -52,16 +47,6 @@ public class DesktopVRIKMod : MelonMod Logger.Msg("Initializing BTKUILib support."); BTKUIAddon.Init(); } - //AvatarMotionTweaker Handling - if (MelonMod.RegisteredMelons.Any(it => it.Info.Name == "AvatarMotionTweaker")) - { - Logger.Msg("AvatarMotionTweaker was found. Relying on it to handle VRIK locomotion."); - integration_AMT = true; - } - else - { - Logger.Msg("AvatarMotionTweaker was not found. Using built-in VRIK locomotion handling."); - } } internal static void UpdateAllSettings() @@ -79,9 +64,6 @@ public class DesktopVRIKMod : MelonMod // Calibration Settings DesktopVRIKSystem.Instance.Setting_UseVRIKToes = EntryUseVRIKToes.Value; DesktopVRIKSystem.Instance.Setting_FindUnmappedToes = EntryFindUnmappedToes.Value; - - // Integration Settings - DesktopVRIKSystem.Instance.Setting_IntegrationAMT = EntryIntegrationAMT.Value; } void OnUpdateSettings(object arg1, object arg2) => UpdateAllSettings();