Fixed local finger tracking with Index controllers

This commit is contained in:
SDraw 2022-11-21 17:30:01 +03:00
parent 5aef3ab83c
commit ab7f66b730
No known key found for this signature in database
GPG key ID: BB95B4DAB2BB8BB5
4 changed files with 60 additions and 42 deletions

View file

@ -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 |

View file

@ -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<IndexIK>();
m_steamVrModule = CVRInputManager.Instance.GetComponent<InputModuleSteamVR>();
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)));
}
}
}

View file

@ -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);
}
}
}

View file

@ -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)]