From ab7f66b730218030bdabd1a1c659da786c4c1b4a Mon Sep 17 00:00:00 2001 From: SDraw Date: Mon, 21 Nov 2022 17:30:01 +0300 Subject: [PATCH] Fixed local finger tracking with Index controllers --- README.md | 2 +- ml_lme/LeapTracked.cs | 82 +++++++++++++++++-------------- ml_lme/Main.cs | 12 +++++ ml_lme/Properties/AssemblyInfo.cs | 6 +-- 4 files changed, 60 insertions(+), 42 deletions(-) diff --git a/README.md b/README.md index 1e3d42e..e2d2890 100644 --- a/README.md +++ b/README.md @@ -8,5 +8,5 @@ Merged set of MelonLoader mods for ChilloutVR. | Desktop Head Tracking | ml_dht | 1.1.0 | Yes, pending update | Working | | Desktop Reticle Switch | ml_drs | 1.0.0 | Yes | Working | | Four Point Tracking | ml_fpt | 1.0.9 | Yes | Working | -| Leap Motion Extension | ml_lme | 1.2.6 | Yes, pending update | Working | +| Leap Motion Extension | ml_lme | 1.2.7 | Yes, pending update | Working | | Server Connection Info | ml_sci | 1.0.2 | Yes | Working | diff --git a/ml_lme/LeapTracked.cs b/ml_lme/LeapTracked.cs index bddae6f..174cce7 100644 --- a/ml_lme/LeapTracked.cs +++ b/ml_lme/LeapTracked.cs @@ -11,11 +11,13 @@ namespace ml_lme class LeapTracked : MonoBehaviour { static readonly float[] ms_tposeMuscles = typeof(ABI_RC.Systems.IK.SubSystems.BodySystem).GetField("TPoseMuscles", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null) as float[]; + static readonly FieldInfo ms_indexGestureToggle = typeof(InputModuleSteamVR).GetField("_steamVrIndexGestureToggleValue", BindingFlags.Instance | BindingFlags.NonPublic); static readonly Quaternion ms_offsetLeft = Quaternion.Euler(0f, 0f, 270f); static readonly Quaternion ms_offsetRight = Quaternion.Euler(0f, 0f, 90f); static readonly Quaternion ms_offsetLeftDesktop = Quaternion.Euler(0f, 90f, 0f); static readonly Quaternion ms_offsetRightDesktop = Quaternion.Euler(0f, 270f, 0f); + InputModuleSteamVR m_steamVrModule = null; IndexIK m_indexIK = null; VRIK m_vrIK = null; Vector2 m_armsWeights = Vector2.zero; @@ -38,6 +40,7 @@ namespace ml_lme void Start() { m_indexIK = this.GetComponent(); + m_steamVrModule = CVRInputManager.Instance.GetComponent(); if(m_leftHand != null) { @@ -115,7 +118,7 @@ namespace ml_lme public void UpdateTracking(GestureMatcher.GesturesData p_gesturesData) { - if(m_enabled && (m_indexIK != null)) + if(m_enabled) { if((m_leftIK != null) && (m_rightIK != null)) { @@ -125,41 +128,8 @@ namespace ml_lme m_rightIK.solver.IKRotationWeight = Mathf.Lerp(m_rightIK.solver.IKRotationWeight, (p_gesturesData.m_handsPresenses[1] && !m_fingersOnly) ? 1f : 0f, 0.25f); } - if(p_gesturesData.m_handsPresenses[0]) - { - m_indexIK.leftThumbCurl = p_gesturesData.m_leftFingersBends[0]; - m_indexIK.leftIndexCurl = p_gesturesData.m_leftFingersBends[1]; - m_indexIK.leftMiddleCurl = p_gesturesData.m_leftFingersBends[2]; - m_indexIK.leftRingCurl = p_gesturesData.m_leftFingersBends[3]; - m_indexIK.leftPinkyCurl = p_gesturesData.m_leftFingersBends[4]; - - if(CVRInputManager.Instance != null) - { - CVRInputManager.Instance.fingerCurlLeftThumb = p_gesturesData.m_leftFingersBends[0]; - CVRInputManager.Instance.fingerCurlLeftIndex = p_gesturesData.m_leftFingersBends[1]; - CVRInputManager.Instance.fingerCurlLeftMiddle = p_gesturesData.m_leftFingersBends[2]; - CVRInputManager.Instance.fingerCurlLeftRing = p_gesturesData.m_leftFingersBends[3]; - CVRInputManager.Instance.fingerCurlLeftPinky = p_gesturesData.m_leftFingersBends[4]; - } - } - - if(p_gesturesData.m_handsPresenses[1]) - { - m_indexIK.rightThumbCurl = p_gesturesData.m_rightFingersBends[0]; - m_indexIK.rightIndexCurl = p_gesturesData.m_rightFingersBends[1]; - m_indexIK.rightMiddleCurl = p_gesturesData.m_rightFingersBends[2]; - m_indexIK.rightRingCurl = p_gesturesData.m_rightFingersBends[3]; - m_indexIK.rightPinkyCurl = p_gesturesData.m_rightFingersBends[4]; - - if(CVRInputManager.Instance != null) - { - CVRInputManager.Instance.fingerCurlRightThumb = p_gesturesData.m_rightFingersBends[0]; - CVRInputManager.Instance.fingerCurlRightIndex = p_gesturesData.m_rightFingersBends[1]; - CVRInputManager.Instance.fingerCurlRightMiddle = p_gesturesData.m_rightFingersBends[2]; - CVRInputManager.Instance.fingerCurlRightRing = p_gesturesData.m_rightFingersBends[3]; - CVRInputManager.Instance.fingerCurlRightPinky = p_gesturesData.m_rightFingersBends[4]; - } - } + if(!Utils.AreKnucklesInUse()) + UpdateFingers(p_gesturesData); if((m_vrIK != null) && !m_fingersOnly) { @@ -196,6 +166,42 @@ namespace ml_lme } } + public void UpdateFingers(GestureMatcher.GesturesData p_data) + { + if(m_enabled && (m_indexIK != null) && (CVRInputManager.Instance != null)) + { + CVRInputManager.Instance.individualFingerTracking = true; + + if(p_data.m_handsPresenses[0]) + { + m_indexIK.leftThumbCurl = p_data.m_leftFingersBends[0]; + m_indexIK.leftIndexCurl = p_data.m_leftFingersBends[1]; + m_indexIK.leftMiddleCurl = p_data.m_leftFingersBends[2]; + m_indexIK.leftRingCurl = p_data.m_leftFingersBends[3]; + m_indexIK.leftPinkyCurl = p_data.m_leftFingersBends[4]; + CVRInputManager.Instance.fingerCurlLeftThumb = p_data.m_leftFingersBends[0]; + CVRInputManager.Instance.fingerCurlLeftIndex = p_data.m_leftFingersBends[1]; + CVRInputManager.Instance.fingerCurlLeftMiddle = p_data.m_leftFingersBends[2]; + CVRInputManager.Instance.fingerCurlLeftRing = p_data.m_leftFingersBends[3]; + CVRInputManager.Instance.fingerCurlLeftPinky = p_data.m_leftFingersBends[4]; + } + + if(p_data.m_handsPresenses[1]) + { + m_indexIK.rightThumbCurl = p_data.m_rightFingersBends[0]; + m_indexIK.rightIndexCurl = p_data.m_rightFingersBends[1]; + m_indexIK.rightMiddleCurl = p_data.m_rightFingersBends[2]; + m_indexIK.rightRingCurl = p_data.m_rightFingersBends[3]; + m_indexIK.rightPinkyCurl = p_data.m_rightFingersBends[4]; + CVRInputManager.Instance.fingerCurlRightThumb = p_data.m_rightFingersBends[0]; + CVRInputManager.Instance.fingerCurlRightIndex = p_data.m_rightFingersBends[1]; + CVRInputManager.Instance.fingerCurlRightMiddle = p_data.m_rightFingersBends[2]; + CVRInputManager.Instance.fingerCurlRightRing = p_data.m_rightFingersBends[3]; + CVRInputManager.Instance.fingerCurlRightPinky = p_data.m_rightFingersBends[4]; + } + } + } + public void OnAvatarClear() { m_vrIK = null; @@ -358,8 +364,8 @@ namespace ml_lme { if(m_indexIK != null) { - m_indexIK.activeControl = (m_enabled || Utils.AreKnucklesInUse()); - CVRInputManager.Instance.individualFingerTracking = (m_enabled || Utils.AreKnucklesInUse()); + m_indexIK.activeControl = (m_enabled || (PlayerSetup.Instance._inVr && Utils.AreKnucklesInUse())); + CVRInputManager.Instance.individualFingerTracking = (m_enabled || (PlayerSetup.Instance._inVr && Utils.AreKnucklesInUse() && !(bool)ms_indexGestureToggle.GetValue(m_steamVrModule))); } } } diff --git a/ml_lme/Main.cs b/ml_lme/Main.cs index 96d28f1..84c9feb 100644 --- a/ml_lme/Main.cs +++ b/ml_lme/Main.cs @@ -57,6 +57,11 @@ namespace ml_lme null, new HarmonyLib.HarmonyMethod(typeof(LeapMotionExtension).GetMethod(nameof(OnSetupAvatar_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) ); + HarmonyInstance.Patch( + typeof(PlayerSetup).GetMethod("GetGesturesFromControllers", BindingFlags.Instance | BindingFlags.NonPublic), + null, + new HarmonyLib.HarmonyMethod(typeof(LeapMotionExtension).GetMethod(nameof(OnGetGesturesFromControllers_Postfix), BindingFlags.Static | BindingFlags.NonPublic)) + ); MelonLoader.MelonCoroutines.Start(CreateTrackingObjects()); @@ -356,5 +361,12 @@ namespace ml_lme MelonLoader.MelonLogger.Error(e); } } + + static void OnGetGesturesFromControllers_Postfix() => ms_instance?.OnGetGesturesFromControllers(); + void OnGetGesturesFromControllers() + { + if(Settings.Enabled && Utils.AreKnucklesInUse() && (m_leapTracked != null)) + m_leapTracked.UpdateFingers(m_gesturesData); + } } } diff --git a/ml_lme/Properties/AssemblyInfo.cs b/ml_lme/Properties/AssemblyInfo.cs index 1d74167..446d348 100644 --- a/ml_lme/Properties/AssemblyInfo.cs +++ b/ml_lme/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; [assembly: AssemblyTitle("LeapMotionExtension")] -[assembly: AssemblyVersion("1.2.6")] -[assembly: AssemblyFileVersion("1.2.6")] +[assembly: AssemblyVersion("1.2.7")] +[assembly: AssemblyFileVersion("1.2.7")] -[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.2.6", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.2.7", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] [assembly: MelonLoader.MelonGame(null, "ChilloutVR")] [assembly: MelonLoader.MelonPlatform(MelonLoader.MelonPlatformAttribute.CompatiblePlatforms.WINDOWS_X64)] [assembly: MelonLoader.MelonPlatformDomain(MelonLoader.MelonPlatformDomainAttribute.CompatibleDomains.MONO)]