Finger tracking value override fix

Rotation fix
Me angery
REEE
Funni joke about sttuff
This commit is contained in:
SDraw 2023-08-08 00:00:49 +03:00
parent 1efcb8aaee
commit a5d93643fa
No known key found for this signature in database
GPG key ID: BB95B4DAB2BB8BB5
4 changed files with 190 additions and 165 deletions

View file

@ -27,7 +27,9 @@ namespace ml_lme
~LeapInput() ~LeapInput()
{ {
Settings.EnabledChange -= this.OnEnableChange; Settings.EnabledChange -= this.OnEnableChange;
Settings.InputChange -= this.OnInputChange; Settings.InteractionChange -= this.OnInteractionChange;
Settings.GesturesChange -= this.OnGesturesChange;
Settings.FingersOnlyChange -= this.OnFingersOnlyChange;
MetaPort.Instance.settings.settingBoolChanged.RemoveListener(this.OnGameSettingBoolChange); MetaPort.Instance.settings.settingBoolChanged.RemoveListener(this.OnGameSettingBoolChange);
} }
@ -35,9 +37,8 @@ namespace ml_lme
public override void ModuleAdded() public override void ModuleAdded()
{ {
base.ModuleAdded(); base.ModuleAdded();
base.InputEnabled = Settings.Enabled; base.InputEnabled = Settings.Enabled;
HapticFeedback = false; base.HapticFeedback = false;
m_inVR = Utils.IsInVR(); m_inVR = Utils.IsInVR();
@ -47,13 +48,6 @@ namespace ml_lme
m_handRayLeft.isInteractionRay = true; m_handRayLeft.isInteractionRay = true;
m_handRayLeft.triggerGazeEvents = false; m_handRayLeft.triggerGazeEvents = false;
m_handRayLeft.holderRoot = m_handRayLeft.gameObject; m_handRayLeft.holderRoot = m_handRayLeft.gameObject;
m_handRayRight = LeapTracking.Instance.GetRightHand().gameObject.AddComponent<ControllerRay>();
m_handRayRight.hand = false;
m_handRayRight.generalMask = -1485;
m_handRayRight.isInteractionRay = true;
m_handRayRight.triggerGazeEvents = false;
m_handRayRight.holderRoot = m_handRayRight.gameObject;
m_handRayLeft.attachmentDistance = 0f; m_handRayLeft.attachmentDistance = 0f;
m_lineLeft = m_handRayLeft.gameObject.AddComponent<LineRenderer>(); m_lineLeft = m_handRayLeft.gameObject.AddComponent<LineRenderer>();
@ -67,6 +61,13 @@ namespace ml_lme
m_lineLeft.enabled = false; m_lineLeft.enabled = false;
m_lineLeft.receiveShadows = false; m_lineLeft.receiveShadows = false;
m_handRayLeft.lineRenderer = m_lineLeft; m_handRayLeft.lineRenderer = m_lineLeft;
m_handRayRight = LeapTracking.Instance.GetRightHand().gameObject.AddComponent<ControllerRay>();
m_handRayRight.hand = false;
m_handRayRight.generalMask = -1485;
m_handRayRight.isInteractionRay = true;
m_handRayRight.triggerGazeEvents = false;
m_handRayRight.holderRoot = m_handRayRight.gameObject;
m_handRayRight.attachmentDistance = 0f; m_handRayRight.attachmentDistance = 0f;
m_lineRight = m_handRayRight.gameObject.AddComponent<LineRenderer>(); m_lineRight = m_handRayRight.gameObject.AddComponent<LineRenderer>();
@ -82,12 +83,14 @@ namespace ml_lme
m_handRayRight.lineRenderer = m_lineRight; m_handRayRight.lineRenderer = m_lineRight;
Settings.EnabledChange += this.OnEnableChange; Settings.EnabledChange += this.OnEnableChange;
Settings.InputChange += this.OnInputChange; Settings.InteractionChange += this.OnInteractionChange;
Settings.GesturesChange += this.OnGesturesChange; Settings.GesturesChange += this.OnGesturesChange;
Settings.FingersOnlyChange += this.OnFingersOnlyChange;
OnEnableChange(Settings.Enabled); OnEnableChange(Settings.Enabled);
OnInputChange(Settings.Input); OnInteractionChange(Settings.Interaction);
OnGesturesChange(Settings.Gestures); OnGesturesChange(Settings.Gestures);
OnFingersOnlyChange(Settings.FingersOnly);
MelonLoader.MelonCoroutines.Start(WaitForSettings()); MelonLoader.MelonCoroutines.Start(WaitForSettings());
MelonLoader.MelonCoroutines.Start(WaitForMaterial()); MelonLoader.MelonCoroutines.Start(WaitForMaterial());
@ -128,134 +131,125 @@ namespace ml_lme
if(l_data.m_leftHand.m_present) if(l_data.m_leftHand.m_present)
{ {
m_handVisibleLeft = true; m_handVisibleLeft = true;
SetFingersInput(l_data.m_leftHand, true); SetFingersInput(l_data.m_leftHand, true);
if(Settings.Gestures) if(Settings.Gestures)
{ {
_inputManager.gestureLeftRaw = 0f; base._inputManager.gestureLeftRaw = 0f;
// Finger Point & Finger Gun // Finger Point & Finger Gun
if((_inputManager.fingerCurlLeftIndex < 0.2f) && (_inputManager.fingerCurlLeftMiddle > 0.75f) && if((base._inputManager.fingerCurlLeftIndex < 0.2f) && (base._inputManager.fingerCurlLeftMiddle > 0.75f) &&
(_inputManager.fingerCurlLeftRing > 0.75f) && (_inputManager.fingerCurlLeftPinky > 0.75f)) (base._inputManager.fingerCurlLeftRing > 0.75f) && (base._inputManager.fingerCurlLeftPinky > 0.75f))
{ {
_inputManager.gestureLeftRaw = (_inputManager.fingerCurlLeftThumb >= 0.5f) ? 4f : 3f; base._inputManager.gestureLeftRaw = (base._inputManager.fingerCurlLeftThumb >= 0.5f) ? 4f : 3f;
} }
// Peace Sign // Peace Sign
if((_inputManager.fingerCurlLeftIndex < 0.2f) && (_inputManager.fingerCurlLeftMiddle < 0.2f) && if((base._inputManager.fingerCurlLeftIndex < 0.2f) && (base._inputManager.fingerCurlLeftMiddle < 0.2f) &&
(_inputManager.fingerCurlLeftRing > 0.75f) && (_inputManager.fingerCurlLeftPinky > 0.75f)) (base._inputManager.fingerCurlLeftRing > 0.75f) && (base._inputManager.fingerCurlLeftPinky > 0.75f))
{ {
_inputManager.gestureLeftRaw = 5f; base._inputManager.gestureLeftRaw = 5f;
} }
// Rock and Roll // Rock and Roll
if((_inputManager.fingerCurlLeftIndex < 0.2f) && (_inputManager.fingerCurlLeftMiddle > 0.75f) && if((base._inputManager.fingerCurlLeftIndex < 0.2f) && (base._inputManager.fingerCurlLeftMiddle > 0.75f) &&
(_inputManager.fingerCurlLeftRing > 0.75f) && (_inputManager.fingerCurlLeftPinky < 0.5f)) (base._inputManager.fingerCurlLeftRing > 0.75f) && (base._inputManager.fingerCurlLeftPinky < 0.5f))
{ {
_inputManager.gestureLeftRaw = 6f; base._inputManager.gestureLeftRaw = 6f;
} }
// Fist & Thumbs Up // Fist & Thumbs Up
if((_inputManager.fingerCurlLeftIndex > 0.5f) && (_inputManager.fingerCurlLeftMiddle > 0.5f) && if((base._inputManager.fingerCurlLeftIndex > 0.5f) && (base._inputManager.fingerCurlLeftMiddle > 0.5f) &&
(_inputManager.fingerCurlLeftRing > 0.5f) && (_inputManager.fingerCurlLeftPinky > 0.5f)) (base._inputManager.fingerCurlLeftRing > 0.5f) && (base._inputManager.fingerCurlLeftPinky > 0.5f))
{ {
_inputManager.gestureLeftRaw = (_inputManager.fingerCurlLeftThumb >= 0.5f) ? ((l_data.m_leftHand.m_grabStrength - 0.5f) * 2f) : 2f; base._inputManager.gestureLeftRaw = (base._inputManager.fingerCurlLeftThumb >= 0.5f) ? ((l_data.m_leftHand.m_grabStrength - 0.5f) * 2f) : 2f;
} }
// Open Hand // Open Hand
if((_inputManager.fingerCurlLeftIndex < 0.2f) && (_inputManager.fingerCurlLeftMiddle < 0.2f) && if((base._inputManager.fingerCurlLeftIndex < 0.2f) && (base._inputManager.fingerCurlLeftMiddle < 0.2f) &&
(_inputManager.fingerCurlLeftRing < 0.2f) && (_inputManager.fingerCurlLeftPinky < 0.2f)) (base._inputManager.fingerCurlLeftRing < 0.2f) && (base._inputManager.fingerCurlLeftPinky < 0.2f))
{ {
_inputManager.gestureLeftRaw = -1f; base._inputManager.gestureLeftRaw = -1f;
} }
_inputManager.gestureLeft = _inputManager.gestureLeftRaw; base._inputManager.gestureLeft = base._inputManager.gestureLeftRaw;
} }
} }
else else
{ {
if(m_handVisibleLeft) if(m_handVisibleLeft)
{ {
m_handVisibleLeft = false;
ResetFingers(true); ResetFingers(true);
if(Settings.Gestures) if(Settings.Gestures)
ResetGestures(true); ResetGestures(true);
} }
m_handVisibleLeft = false;
} }
if(l_data.m_rightHand.m_present) if(l_data.m_rightHand.m_present)
{ {
m_handVisibleRight = true; m_handVisibleRight = true;
SetFingersInput(l_data.m_rightHand, false); SetFingersInput(l_data.m_rightHand, false);
if(Settings.Gestures) if(Settings.Gestures)
{ {
_inputManager.gestureRightRaw = 0f; base._inputManager.gestureRightRaw = 0f;
// Finger Point & Finger Gun // Finger Point & Finger Gun
if((_inputManager.fingerCurlRightIndex < 0.2f) && (_inputManager.fingerCurlRightMiddle > 0.75f) && if((base._inputManager.fingerCurlRightIndex < 0.2f) && (base._inputManager.fingerCurlRightMiddle > 0.75f) &&
(_inputManager.fingerCurlRightRing > 0.75f) && (_inputManager.fingerCurlRightPinky > 0.75f)) (base._inputManager.fingerCurlRightRing > 0.75f) && (base._inputManager.fingerCurlRightPinky > 0.75f))
{ {
_inputManager.gestureRightRaw = (_inputManager.fingerCurlRightThumb >= 0.5f) ? 4f : 3f; base._inputManager.gestureRightRaw = (base._inputManager.fingerCurlRightThumb >= 0.5f) ? 4f : 3f;
} }
// Peace Sign // Peace Sign
if((_inputManager.fingerCurlRightIndex < 0.2f) && (_inputManager.fingerCurlRightMiddle < 0.2f) && if((base._inputManager.fingerCurlRightIndex < 0.2f) && (base._inputManager.fingerCurlRightMiddle < 0.2f) &&
(_inputManager.fingerCurlRightRing > 0.75f) && (_inputManager.fingerCurlRightPinky > 0.75f)) (base._inputManager.fingerCurlRightRing > 0.75f) && (base._inputManager.fingerCurlRightPinky > 0.75f))
{ {
_inputManager.gestureRightRaw = 5f; base._inputManager.gestureRightRaw = 5f;
} }
// Rock and Roll // Rock and Roll
if((_inputManager.fingerCurlRightIndex < 0.2f) && (_inputManager.fingerCurlRightMiddle > 0.75f) && if((base._inputManager.fingerCurlRightIndex < 0.2f) && (base._inputManager.fingerCurlRightMiddle > 0.75f) &&
(_inputManager.fingerCurlRightRing > 0.75f) && (_inputManager.fingerCurlRightPinky < 0.5f)) (base._inputManager.fingerCurlRightRing > 0.75f) && (base._inputManager.fingerCurlRightPinky < 0.5f))
{ {
_inputManager.gestureRightRaw = 6f; base._inputManager.gestureRightRaw = 6f;
} }
// Fist & Thumbs Up // Fist & Thumbs Up
if((_inputManager.fingerCurlRightIndex > 0.5f) && (_inputManager.fingerCurlRightMiddle > 0.5f) && if((base._inputManager.fingerCurlRightIndex > 0.5f) && (base._inputManager.fingerCurlRightMiddle > 0.5f) &&
(_inputManager.fingerCurlRightRing > 0.5f) && (_inputManager.fingerCurlRightPinky > 0.5f)) (base._inputManager.fingerCurlRightRing > 0.5f) && (base._inputManager.fingerCurlRightPinky > 0.5f))
{ {
_inputManager.gestureRightRaw = (_inputManager.fingerCurlRightThumb >= 0.5f) ? ((l_data.m_rightHand.m_grabStrength - 0.5f) * 2f) : 2f; base._inputManager.gestureRightRaw = (base._inputManager.fingerCurlRightThumb >= 0.5f) ? ((l_data.m_rightHand.m_grabStrength - 0.5f) * 2f) : 2f;
} }
// Open Hand // Open Hand
if((_inputManager.fingerCurlRightIndex < 0.2f) && (_inputManager.fingerCurlRightMiddle < 0.2f) && if((base._inputManager.fingerCurlRightIndex < 0.2f) && (base._inputManager.fingerCurlRightMiddle < 0.2f) &&
(_inputManager.fingerCurlRightRing < 0.2f) && (_inputManager.fingerCurlRightPinky < 0.2f)) (base._inputManager.fingerCurlRightRing < 0.2f) && (base._inputManager.fingerCurlRightPinky < 0.2f))
{ {
_inputManager.gestureRightRaw = -1f; base._inputManager.gestureRightRaw = -1f;
} }
_inputManager.gestureRight = _inputManager.gestureRightRaw; base._inputManager.gestureRight = base._inputManager.gestureRightRaw;
} }
} }
else else
{ {
if(m_handVisibleRight) if(m_handVisibleRight)
{ {
m_handVisibleRight = false;
ResetFingers(false); ResetFingers(false);
if(Settings.Gestures) if(Settings.Gestures)
ResetGestures(false); ResetGestures(false);
} }
m_handVisibleRight = false;
} }
if(!ModSupporter.SkipFingersOverride()) if(!ModSupporter.SkipFingersOverride() && (!m_inVR || !Utils.AreKnucklesInUse()))
{ SetGameFingersTracking(m_handVisibleRight || m_handVisibleLeft);
if(m_inVR)
{
_inputManager.individualFingerTracking = !CVRInputManager._moduleXR.GestureToggleValue;
_inputManager.individualFingerTracking |= (l_data.m_leftHand.m_present || l_data.m_rightHand.m_present);
}
else
_inputManager.individualFingerTracking = (l_data.m_leftHand.m_present || l_data.m_rightHand.m_present);
IKSystem.Instance.FingerSystem.controlActive = _inputManager.individualFingerTracking;
}
m_handRayLeft.enabled = (l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly));
m_handRayRight.enabled = (l_data.m_rightHand.m_present && (!m_inVR || !Utils.IsRightHandTracked() || !Settings.FingersOnly));
base.UpdateInput(); base.UpdateInput();
} }
@ -263,11 +257,11 @@ namespace ml_lme
public override void Update_Interaction() public override void Update_Interaction()
{ {
if(Settings.Input) if(Settings.Interaction)
{ {
LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData(); LeapParser.LeapData l_data = LeapManager.Instance.GetLatestData();
if(l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly)) if(m_handVisibleLeft && (!m_inVR || !Utils.IsLeftHandTracked()) && !Settings.FingersOnly)
{ {
float l_strength = l_data.m_leftHand.m_grabStrength; float l_strength = l_data.m_leftHand.m_grabStrength;
@ -276,26 +270,26 @@ namespace ml_lme
l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(Mathf.Min(Settings.GripThreadhold, Settings.InteractThreadhold), Mathf.Max(Settings.GripThreadhold, Settings.InteractThreadhold), l_strength)); l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(Mathf.Min(Settings.GripThreadhold, Settings.InteractThreadhold), Mathf.Max(Settings.GripThreadhold, Settings.InteractThreadhold), l_strength));
else else
l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.InteractThreadhold, l_strength)); l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.InteractThreadhold, l_strength));
_inputManager.interactLeftValue = Mathf.Max(l_interactValue, _inputManager.interactLeftValue); base._inputManager.interactLeftValue = Mathf.Max(l_interactValue, base._inputManager.interactLeftValue);
if(m_interactLeft != (l_strength > Settings.InteractThreadhold)) if(m_interactLeft != (l_strength > Settings.InteractThreadhold))
{ {
m_interactLeft = (l_strength > Settings.InteractThreadhold); m_interactLeft = (l_strength > Settings.InteractThreadhold);
_inputManager.interactLeftDown |= m_interactLeft; base._inputManager.interactLeftDown |= m_interactLeft;
_inputManager.interactLeftUp |= !m_interactLeft; base._inputManager.interactLeftUp |= !m_interactLeft;
} }
float l_gripValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.GripThreadhold, l_strength)); float l_gripValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.GripThreadhold, l_strength));
_inputManager.gripLeftValue = Mathf.Max(l_gripValue, _inputManager.gripLeftValue); base._inputManager.gripLeftValue = Mathf.Max(l_gripValue, base._inputManager.gripLeftValue);
if(m_gripLeft != (l_strength > Settings.GripThreadhold)) if(m_gripLeft != (l_strength > Settings.GripThreadhold))
{ {
m_gripLeft = (l_strength > Settings.GripThreadhold); m_gripLeft = (l_strength > Settings.GripThreadhold);
_inputManager.gripLeftDown |= m_gripLeft; base._inputManager.gripLeftDown |= m_gripLeft;
_inputManager.gripLeftUp |= !m_gripLeft; base._inputManager.gripLeftUp |= !m_gripLeft;
} }
} }
if(l_data.m_rightHand.m_present && (!m_inVR || !Utils.IsRightHandTracked() || !Settings.FingersOnly)) if(m_handVisibleRight && (!m_inVR || !Utils.IsRightHandTracked()) && !Settings.FingersOnly)
{ {
float l_strength = l_data.m_rightHand.m_grabStrength; float l_strength = l_data.m_rightHand.m_grabStrength;
@ -304,24 +298,27 @@ namespace ml_lme
l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(Mathf.Min(Settings.GripThreadhold, Settings.InteractThreadhold), Mathf.Max(Settings.GripThreadhold, Settings.InteractThreadhold), l_strength)); l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(Mathf.Min(Settings.GripThreadhold, Settings.InteractThreadhold), Mathf.Max(Settings.GripThreadhold, Settings.InteractThreadhold), l_strength));
else else
l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.InteractThreadhold, l_strength)); l_interactValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.InteractThreadhold, l_strength));
_inputManager.interactRightValue = Mathf.Max(l_interactValue, _inputManager.interactRightValue); base._inputManager.interactRightValue = Mathf.Max(l_interactValue, base._inputManager.interactRightValue);
if(m_interactRight != (l_strength > Settings.InteractThreadhold)) if(m_interactRight != (l_strength > Settings.InteractThreadhold))
{ {
m_interactRight = (l_strength > Settings.InteractThreadhold); m_interactRight = (l_strength > Settings.InteractThreadhold);
_inputManager.interactRightDown |= m_interactRight; base._inputManager.interactRightDown |= m_interactRight;
_inputManager.interactRightUp |= !m_interactRight; base._inputManager.interactRightUp |= !m_interactRight;
} }
float l_gripValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.GripThreadhold, l_strength)); float l_gripValue = Mathf.Clamp01(Mathf.InverseLerp(0f, Settings.GripThreadhold, l_strength));
_inputManager.gripRightValue = Mathf.Max(l_gripValue, _inputManager.gripRightValue); base._inputManager.gripRightValue = Mathf.Max(l_gripValue, base._inputManager.gripRightValue);
if(m_gripRight != (l_strength > Settings.GripThreadhold)) if(m_gripRight != (l_strength > Settings.GripThreadhold))
{ {
m_gripRight = (l_strength > Settings.GripThreadhold); m_gripRight = (l_strength > Settings.GripThreadhold);
_inputManager.gripRightDown |= m_gripRight; base._inputManager.gripRightDown |= m_gripRight;
_inputManager.gripRightUp |= !m_gripRight; base._inputManager.gripRightUp |= !m_gripRight;
} }
} }
ToggleHandRay(m_handVisibleLeft && (!m_inVR || !Utils.IsLeftHandTracked()) && !Settings.FingersOnly, true);
ToggleHandRay(m_handVisibleRight && (!m_inVR || !Utils.IsRightHandTracked()) && !Settings.FingersOnly, false);
} }
} }
@ -329,21 +326,36 @@ namespace ml_lme
void OnEnableChange(bool p_state) void OnEnableChange(bool p_state)
{ {
base.InputEnabled = p_state; base.InputEnabled = p_state;
m_handVisibleLeft &= p_state; m_handVisibleLeft &= p_state;
m_handVisibleRight &= p_state; m_handVisibleRight &= p_state;
OnInputChange(p_state && Settings.Input); if(!p_state)
UpdateFingerTracking(); {
ResetFingers(true);
ResetFingers(false);
if(Settings.Gestures)
{
ResetGestures(true);
ResetGestures(false);
}
// Reset to default, FreedomFingers can go brrr, player should press funny controller button two times
SetGameFingersTracking(m_inVR && Utils.AreKnucklesInUse() && !CVRInputManager._moduleXR.GestureToggleValue);
}
OnInteractionChange(Settings.Interaction);
} }
void OnInputChange(bool p_state) void OnInteractionChange(bool p_state)
{ {
((MonoBehaviour)m_handRayLeft).enabled = (p_state && Settings.Enabled); bool l_state = (p_state && Settings.Enabled && !Settings.FingersOnly);
((MonoBehaviour)m_handRayRight).enabled = (p_state && Settings.Enabled);
m_lineLeft.enabled = (p_state && Settings.Enabled);
m_lineRight.enabled = (p_state && Settings.Enabled);
if(!p_state) ToggleHandRay(l_state, true);
ToggleHandRay(l_state, false);
if(!l_state)
{ {
m_handRayLeft.DropObject(true); m_handRayLeft.DropObject(true);
m_handRayLeft.ClearGrabbedObject(); m_handRayLeft.ClearGrabbedObject();
@ -360,10 +372,15 @@ namespace ml_lme
void OnGesturesChange(bool p_state) void OnGesturesChange(bool p_state)
{ {
_inputManager.gestureLeft = 0f; base._inputManager.gestureLeft = 0f;
_inputManager.gestureLeftRaw = 0f; base._inputManager.gestureLeftRaw = 0f;
_inputManager.gestureRight = 0f; base._inputManager.gestureRight = 0f;
_inputManager.gestureRightRaw = 0f; base._inputManager.gestureRightRaw = 0f;
}
void OnFingersOnlyChange(bool p_state)
{
OnInteractionChange(Settings.Interaction);
} }
// Game events // Game events
@ -379,47 +396,35 @@ namespace ml_lme
} }
// Arbitrary // Arbitrary
void UpdateFingerTracking()
{
_inputManager.individualFingerTracking = (Settings.Enabled || (m_inVR && Utils.AreKnucklesInUse() && !CVRInputManager._moduleXR.GestureToggleValue));
IKSystem.Instance.FingerSystem.controlActive = _inputManager.individualFingerTracking;
if(!Settings.Enabled)
{
ResetFingers(true);
ResetFingers(false);
}
}
void SetFingersInput(LeapParser.HandData p_hand, bool p_left) void SetFingersInput(LeapParser.HandData p_hand, bool p_left)
{ {
// Game has spreads in range of [0;1], but mod now operates in range of [-1;1] // Game has spreads in range of [0;1], but mod now operates in range of [-1;1]
// So spreads will be normalized towards game's range // So spreads will be normalized towards game's range
if(p_left) if(p_left)
{ {
_inputManager.fingerCurlLeftThumb = p_hand.m_bends[0]; base._inputManager.fingerCurlLeftThumb = p_hand.m_bends[0];
_inputManager.fingerCurlLeftIndex = p_hand.m_bends[1]; base._inputManager.fingerCurlLeftIndex = p_hand.m_bends[1];
_inputManager.fingerCurlLeftMiddle = p_hand.m_bends[2]; base._inputManager.fingerCurlLeftMiddle = p_hand.m_bends[2];
_inputManager.fingerCurlLeftRing = p_hand.m_bends[3]; base._inputManager.fingerCurlLeftRing = p_hand.m_bends[3];
_inputManager.fingerCurlLeftPinky = p_hand.m_bends[4]; base._inputManager.fingerCurlLeftPinky = p_hand.m_bends[4];
_inputManager.fingerSpreadLeftThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f); base._inputManager.fingerSpreadLeftThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f); base._inputManager.fingerSpreadLeftIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f); base._inputManager.fingerSpreadLeftMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f); base._inputManager.fingerSpreadLeftRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f);
_inputManager.fingerSpreadLeftPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f); base._inputManager.fingerSpreadLeftPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f);
} }
else else
{ {
_inputManager.fingerCurlRightThumb = p_hand.m_bends[0]; base._inputManager.fingerCurlRightThumb = p_hand.m_bends[0];
_inputManager.fingerCurlRightIndex = p_hand.m_bends[1]; base._inputManager.fingerCurlRightIndex = p_hand.m_bends[1];
_inputManager.fingerCurlRightMiddle = p_hand.m_bends[2]; base._inputManager.fingerCurlRightMiddle = p_hand.m_bends[2];
_inputManager.fingerCurlRightRing = p_hand.m_bends[3]; base._inputManager.fingerCurlRightRing = p_hand.m_bends[3];
_inputManager.fingerCurlRightPinky = p_hand.m_bends[4]; base._inputManager.fingerCurlRightPinky = p_hand.m_bends[4];
_inputManager.fingerSpreadRightThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f); base._inputManager.fingerSpreadRightThumb = 1f - (p_hand.m_spreads[0] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f); base._inputManager.fingerSpreadRightIndex = 1f - (p_hand.m_spreads[1] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f); base._inputManager.fingerSpreadRightMiddle = 1f - (p_hand.m_spreads[2] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f); base._inputManager.fingerSpreadRightRing = 1f - (p_hand.m_spreads[3] * 0.5f + 0.5f);
_inputManager.fingerSpreadRightPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f); base._inputManager.fingerSpreadRightPinky = 1f - (p_hand.m_spreads[4] * 0.5f + 0.5f);
} }
} }
@ -427,29 +432,29 @@ namespace ml_lme
{ {
if(p_left) if(p_left)
{ {
_inputManager.fingerCurlLeftThumb = 0f; base._inputManager.fingerCurlLeftThumb = 0f;
_inputManager.fingerCurlLeftIndex = 0f; base._inputManager.fingerCurlLeftIndex = 0f;
_inputManager.fingerCurlLeftMiddle = 0f; base._inputManager.fingerCurlLeftMiddle = 0f;
_inputManager.fingerCurlLeftRing = 0f; base._inputManager.fingerCurlLeftRing = 0f;
_inputManager.fingerCurlLeftPinky = 0f; base._inputManager.fingerCurlLeftPinky = 0f;
_inputManager.fingerSpreadLeftThumb = 0.5f; base._inputManager.fingerSpreadLeftThumb = 0.5f;
_inputManager.fingerSpreadLeftIndex = 0.5f; base._inputManager.fingerSpreadLeftIndex = 0.5f;
_inputManager.fingerSpreadLeftMiddle = 0.5f; base._inputManager.fingerSpreadLeftMiddle = 0.5f;
_inputManager.fingerSpreadLeftRing = 0.5f; base._inputManager.fingerSpreadLeftRing = 0.5f;
_inputManager.fingerSpreadLeftPinky = 0.5f; base._inputManager.fingerSpreadLeftPinky = 0.5f;
} }
else else
{ {
_inputManager.fingerCurlRightThumb = 0f; base._inputManager.fingerCurlRightThumb = 0f;
_inputManager.fingerCurlRightIndex = 0f; base._inputManager.fingerCurlRightIndex = 0f;
_inputManager.fingerCurlRightMiddle = 0f; base._inputManager.fingerCurlRightMiddle = 0f;
_inputManager.fingerCurlRightRing = 0f; base._inputManager.fingerCurlRightRing = 0f;
_inputManager.fingerCurlRightPinky = 0f; base._inputManager.fingerCurlRightPinky = 0f;
_inputManager.fingerSpreadRightThumb = 0.5f; base._inputManager.fingerSpreadRightThumb = 0.5f;
_inputManager.fingerSpreadRightIndex = 0.5f; base._inputManager.fingerSpreadRightIndex = 0.5f;
_inputManager.fingerSpreadRightMiddle = 0.5f; base._inputManager.fingerSpreadRightMiddle = 0.5f;
_inputManager.fingerSpreadRightRing = 0.5f; base._inputManager.fingerSpreadRightRing = 0.5f;
_inputManager.fingerSpreadRightPinky = 0.5f; base._inputManager.fingerSpreadRightPinky = 0.5f;
} }
} }
@ -457,13 +462,31 @@ namespace ml_lme
{ {
if(p_left) if(p_left)
{ {
_inputManager.gestureLeft = 0f; base._inputManager.gestureLeft = 0f;
_inputManager.gestureLeftRaw = 0f; base._inputManager.gestureLeftRaw = 0f;
} }
else else
{ {
_inputManager.gestureRight = 0f; base._inputManager.gestureRight = 0f;
_inputManager.gestureRightRaw = 0f; base._inputManager.gestureRightRaw = 0f;
}
}
void ToggleHandRay(bool p_state, bool p_left)
{
if(p_left)
{
m_handRayLeft.enabled = p_state;
((MonoBehaviour)m_handRayLeft).enabled = p_state;
m_lineLeft.enabled = p_state;
m_lineLeft.forceRenderingOff = !p_state;
}
else
{
m_handRayRight.enabled = p_state;
((MonoBehaviour)m_handRayRight).enabled = p_state;
m_lineRight.enabled = p_state;
m_lineRight.forceRenderingOff = !p_state;
} }
} }
@ -473,5 +496,11 @@ namespace ml_lme
if(p_name == "ControlUseGripToGrab") if(p_name == "ControlUseGripToGrab")
m_gripToGrab = p_state; m_gripToGrab = p_state;
} }
void SetGameFingersTracking(bool p_state)
{
base._inputManager.individualFingerTracking = p_state;
IKSystem.Instance.FingerSystem.controlActive = base._inputManager.individualFingerTracking;
}
} }
} }

View file

@ -10,10 +10,8 @@ namespace ml_lme
class LeapTracked : MonoBehaviour 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 float[] ms_tposeMuscles = typeof(ABI_RC.Systems.IK.SubSystems.BodySystem).GetField("TPoseMuscles", BindingFlags.Static | BindingFlags.NonPublic).GetValue(null) as float[];
static readonly Quaternion ms_offsetLeft = Quaternion.Euler(0f, 0f, 270f); static readonly Quaternion ms_offsetLeft = Quaternion.Euler(0f, 90f, 0f);
static readonly Quaternion ms_offsetRight = Quaternion.Euler(0f, 0f, 90f); static readonly Quaternion ms_offsetRight = Quaternion.Euler(0f, 270f, 0f);
static readonly Quaternion ms_offsetLeftDesktop = Quaternion.Euler(0f, 90f, 0f);
static readonly Quaternion ms_offsetRightDesktop = Quaternion.Euler(0f, 270f, 0f);
VRIK m_vrIK = null; VRIK m_vrIK = null;
Vector4 m_armsWeights = Vector2.zero; Vector4 m_armsWeights = Vector2.zero;
@ -145,7 +143,7 @@ namespace ml_lme
{ {
if(p_data.m_leftHand.m_present) if(p_data.m_leftHand.m_present)
{ {
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb1Stretched, -0.5f-p_data.m_leftHand.m_bends[0]); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb1Stretched, -0.5f - p_data.m_leftHand.m_bends[0]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb2Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb2Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb3Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumb3Stretched, 0.7f - p_data.m_leftHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumbSpread, -p_data.m_leftHand.m_spreads[0]); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.LeftThumbSpread, -p_data.m_leftHand.m_spreads[0]);
@ -173,7 +171,7 @@ namespace ml_lme
if(p_data.m_rightHand.m_present) if(p_data.m_rightHand.m_present)
{ {
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb1Stretched, -0.5f-p_data.m_rightHand.m_bends[0]); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb1Stretched, -0.5f - p_data.m_rightHand.m_bends[0]);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb2Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb2Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb3Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumb3Stretched, 0.7f - p_data.m_rightHand.m_bends[0] * 2f);
UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumbSpread, -p_data.m_rightHand.m_spreads[0]); UpdatePoseMuscle(ref m_pose, (int)MuscleIndex.RightThumbSpread, -p_data.m_rightHand.m_spreads[0]);
@ -256,11 +254,11 @@ namespace ml_lme
Transform l_hand = PlayerSetup.Instance._animator.GetBoneTransform(HumanBodyBones.LeftHand); Transform l_hand = PlayerSetup.Instance._animator.GetBoneTransform(HumanBodyBones.LeftHand);
if(l_hand != null) if(l_hand != null)
m_leftHandTarget.localRotation = (m_inVR ? ms_offsetLeft : ms_offsetLeftDesktop) * (PlayerSetup.Instance._avatar.transform.GetMatrix().inverse * l_hand.GetMatrix()).rotation; m_leftHandTarget.localRotation = ms_offsetLeft * (PlayerSetup.Instance._avatar.transform.GetMatrix().inverse * l_hand.GetMatrix()).rotation;
l_hand = PlayerSetup.Instance._animator.GetBoneTransform(HumanBodyBones.RightHand); l_hand = PlayerSetup.Instance._animator.GetBoneTransform(HumanBodyBones.RightHand);
if(l_hand != null) if(l_hand != null)
m_rightHandTarget.localRotation = (m_inVR ? ms_offsetRight : ms_offsetRightDesktop) * (PlayerSetup.Instance._avatar.transform.GetMatrix().inverse * l_hand.GetMatrix()).rotation; m_rightHandTarget.localRotation = ms_offsetRight * (PlayerSetup.Instance._avatar.transform.GetMatrix().inverse * l_hand.GetMatrix()).rotation;
if(m_vrIK == null) if(m_vrIK == null)
{ {
@ -424,8 +422,6 @@ namespace ml_lme
{ {
if(p_pose.muscles.Length > p_index) if(p_pose.muscles.Length > p_index)
p_pose.muscles[p_index] = p_value; p_pose.muscles[p_index] = p_value;
//p_pose.muscles[p_index] = (p_clamped ? Mathf.Lerp(ms_muscleLimits[p_index].x, ms_muscleLimits[p_index].y, p_value) : Mathf.LerpUnclamped(ms_muscleLimits[p_index].x, ms_muscleLimits[p_index].y, p_value));
} }
} }
} }

View file

@ -32,7 +32,7 @@ namespace ml_lme
HeadY, HeadY,
HeadZ, HeadZ,
TrackElbows, TrackElbows,
Input, Interaction,
Gestures, Gestures,
InteractThreadhold, InteractThreadhold,
GripThreadhold, GripThreadhold,
@ -48,7 +48,7 @@ namespace ml_lme
public static bool HeadAttach { get; private set; } = false; public static bool HeadAttach { get; private set; } = false;
public static Vector3 HeadOffset { get; private set; } = new Vector3(0f, -0.3f, 0.15f); public static Vector3 HeadOffset { get; private set; } = new Vector3(0f, -0.3f, 0.15f);
public static bool TrackElbows { get; private set; } = true; public static bool TrackElbows { get; private set; } = true;
public static bool Input { get; private set; } = true; public static bool Interaction { get; private set; } = true;
public static bool Gestures { get; private set; } = false; public static bool Gestures { get; private set; } = false;
public static float InteractThreadhold { get; private set; } = 0.8f; public static float InteractThreadhold { get; private set; } = 0.8f;
public static float GripThreadhold { get; private set; } = 0.4f; public static float GripThreadhold { get; private set; } = 0.4f;
@ -66,7 +66,7 @@ namespace ml_lme
static public event Action<bool> HeadAttachChange; static public event Action<bool> HeadAttachChange;
static public event Action<Vector3> HeadOffsetChange; static public event Action<Vector3> HeadOffsetChange;
static public event Action<bool> TrackElbowsChange; static public event Action<bool> TrackElbowsChange;
static public event Action<bool> InputChange; static public event Action<bool> InteractionChange;
static public event Action<bool> GesturesChange; static public event Action<bool> GesturesChange;
static public event Action<float> InteractThreadholdChange; static public event Action<float> InteractThreadholdChange;
static public event Action<float> GripThreadholdChange; static public event Action<float> GripThreadholdChange;
@ -93,7 +93,7 @@ namespace ml_lme
ms_category.CreateEntry(ModSetting.HeadY.ToString(), (int)(HeadOffset.y * 100f)), ms_category.CreateEntry(ModSetting.HeadY.ToString(), (int)(HeadOffset.y * 100f)),
ms_category.CreateEntry(ModSetting.HeadZ.ToString(), (int)(HeadOffset.z * 100f)), ms_category.CreateEntry(ModSetting.HeadZ.ToString(), (int)(HeadOffset.z * 100f)),
ms_category.CreateEntry(ModSetting.TrackElbows.ToString(), TrackElbows), ms_category.CreateEntry(ModSetting.TrackElbows.ToString(), TrackElbows),
ms_category.CreateEntry(ModSetting.Input.ToString(), Input), ms_category.CreateEntry(ModSetting.Interaction.ToString(), Interaction),
ms_category.CreateEntry(ModSetting.Gestures.ToString(), Gestures), ms_category.CreateEntry(ModSetting.Gestures.ToString(), Gestures),
ms_category.CreateEntry(ModSetting.InteractThreadhold.ToString(), (int)(InteractThreadhold * 100f)), ms_category.CreateEntry(ModSetting.InteractThreadhold.ToString(), (int)(InteractThreadhold * 100f)),
ms_category.CreateEntry(ModSetting.GripThreadhold.ToString(), (int)(GripThreadhold * 100f)), ms_category.CreateEntry(ModSetting.GripThreadhold.ToString(), (int)(GripThreadhold * 100f)),
@ -151,7 +151,7 @@ namespace ml_lme
(int)ms_entries[(int)ModSetting.HeadZ].BoxedValue (int)ms_entries[(int)ModSetting.HeadZ].BoxedValue
) * 0.01f; ) * 0.01f;
TrackElbows = (bool)ms_entries[(int)ModSetting.TrackElbows].BoxedValue; TrackElbows = (bool)ms_entries[(int)ModSetting.TrackElbows].BoxedValue;
Input = (bool)ms_entries[(int)ModSetting.Input].BoxedValue; Interaction = (bool)ms_entries[(int)ModSetting.Interaction].BoxedValue;
Gestures = (bool)ms_entries[(int)ModSetting.Gestures].BoxedValue; Gestures = (bool)ms_entries[(int)ModSetting.Gestures].BoxedValue;
InteractThreadhold = (int)ms_entries[(int)ModSetting.InteractThreadhold].BoxedValue * 0.01f; InteractThreadhold = (int)ms_entries[(int)ModSetting.InteractThreadhold].BoxedValue * 0.01f;
GripThreadhold = (int)ms_entries[(int)ModSetting.GripThreadhold].BoxedValue * 0.01f; GripThreadhold = (int)ms_entries[(int)ModSetting.GripThreadhold].BoxedValue * 0.01f;
@ -199,10 +199,10 @@ namespace ml_lme
} }
break; break;
case ModSetting.Input: case ModSetting.Interaction:
{ {
Input = bool.Parse(p_value); Interaction = bool.Parse(p_value);
InputChange?.Invoke(Input); InteractionChange?.Invoke(Interaction);
} }
break; break;

View file

@ -395,7 +395,7 @@ function inp_dropdown_mod_lme(_obj, _callbackName) {
<div class ="row-wrapper"> <div class ="row-wrapper">
<div class ="option-caption">Interaction input: </div> <div class ="option-caption">Interaction input: </div>
<div class ="option-input"> <div class ="option-input">
<div id="Input" class ="inp_toggle no-scroll" data-current="false"></div> <div id="Interaction" class ="inp_toggle no-scroll" data-current="false"></div>
</div> </div>
</div> </div>