Merge pull request #5 from NotAKidOnSteam/lme-gestures

Add gesture recognition setting
This commit is contained in:
SDraw 2023-07-17 22:44:23 +03:00 committed by GitHub
commit 777a4fdb1c
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 150 additions and 5 deletions

View file

@ -40,6 +40,7 @@ namespace ml_lme
m_handRayLeft.isInteractionRay = true;
m_handRayLeft.triggerGazeEvents = false;
m_handRayLeft.holderRoot = m_handRayLeft.gameObject;
m_handRayLeft.attachmentDistance = 0f;
m_handRayRight = LeapTracking.GetInstance().GetRightHand().gameObject.AddComponent<ControllerRay>();
m_handRayRight.hand = false;
@ -47,6 +48,7 @@ namespace ml_lme
m_handRayRight.isInteractionRay = true;
m_handRayRight.triggerGazeEvents = false;
m_handRayRight.holderRoot = m_handRayRight.gameObject;
m_handRayRight.attachmentDistance = 0f;
m_lineLeft = m_handRayLeft.gameObject.AddComponent<LineRenderer>();
m_lineLeft.endWidth = 1f;
@ -74,9 +76,11 @@ namespace ml_lme
Settings.EnabledChange += this.OnEnableChange;
Settings.InputChange += this.OnInputChange;
Settings.GesturesChange += this.OnGesturesChange;
OnEnableChange(Settings.Enabled);
OnInputChange(Settings.Input);
OnGesturesChange(Settings.Gestures);
MelonLoader.MelonCoroutines.Start(WaitForSettings());
MelonLoader.MelonCoroutines.Start(WaitForMaterial());
@ -133,6 +137,8 @@ namespace ml_lme
{
ResetFingers(true);
m_handVisibleLeft = false;
if (Settings.Gestures)
ResetGestures(true);
}
}
@ -147,6 +153,8 @@ namespace ml_lme
{
ResetFingers(false);
m_handVisibleRight = false;
if (Settings.Gestures)
ResetGestures(false);
}
}
@ -169,10 +177,13 @@ namespace ml_lme
public override void UpdateInput()
{
if(Settings.Enabled && Settings.Input)
{
if (!Settings.Enabled)
return;
GestureMatcher.LeapData l_data = LeapManager.GetInstance().GetLatestData();
if(Settings.Input)
{
if(l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly))
{
float l_strength = l_data.m_leftHand.m_grabStrength;
@ -229,6 +240,99 @@ namespace ml_lme
}
}
}
if (Settings.Gestures)
{
// Left hand gestures
if (l_data.m_leftHand.m_present && (!m_inVR || !Utils.IsLeftHandTracked() || !Settings.FingersOnly))
{
m_inputManager.gestureLeftRaw = 0f;
// Finger Point & Finger Gun
if (m_inputManager.fingerCurlLeftIndex < 0.2f && m_inputManager.fingerCurlLeftMiddle > 0.75f &&
m_inputManager.fingerCurlLeftRing > 0.75f && m_inputManager.fingerCurlLeftPinky > 0.75f)
{
m_inputManager.gestureLeftRaw = m_inputManager.fingerCurlLeftThumb >= 0.5f ? 4f : 3f;
}
// Peace Sign
if (m_inputManager.fingerCurlLeftIndex < 0.2f && m_inputManager.fingerCurlLeftMiddle < 0.2f &&
m_inputManager.fingerCurlLeftRing > 0.75f && m_inputManager.fingerCurlLeftPinky > 0.75f)
{
m_inputManager.gestureLeftRaw = 5f;
}
// Rock and Roll
if (m_inputManager.fingerCurlLeftIndex < 0.2f && m_inputManager.fingerCurlLeftMiddle > 0.75f &&
m_inputManager.fingerCurlLeftRing > 0.75f && m_inputManager.fingerCurlLeftPinky < 0.5f)
{
m_inputManager.gestureLeftRaw = 6f;
}
// Fist & Thumbs Up
if (m_inputManager.fingerCurlLeftIndex > 0.5f && m_inputManager.fingerCurlLeftMiddle > 0.5f &&
m_inputManager.fingerCurlLeftRing > 0.5f && m_inputManager.fingerCurlLeftPinky > 0.5f)
{
m_inputManager.gestureLeftRaw = m_inputManager.fingerCurlLeftThumb >= 0.5f
? (l_data.m_rightHand.m_grabStrength - 0.5f) * 2f
: 2f;
}
// Open Hand
if (m_inputManager.fingerCurlLeftIndex < 0.2f && m_inputManager.fingerCurlLeftMiddle < 0.2f &&
m_inputManager.fingerCurlLeftRing < 0.2f && m_inputManager.fingerCurlLeftPinky < 0.2f)
{
m_inputManager.gestureLeftRaw = -1f;
}
m_inputManager.gestureLeft = m_inputManager.gestureLeftRaw;
}
// Right hand gestures
if (l_data.m_rightHand.m_present && (!m_inVR || !Utils.IsRightHandTracked() || !Settings.FingersOnly))
{
m_inputManager.gestureRightRaw = 0f;
// Finger Point & Finger Gun
if (m_inputManager.fingerCurlRightIndex < 0.2f && m_inputManager.fingerCurlRightMiddle > 0.75f &&
m_inputManager.fingerCurlRightRing > 0.75f && m_inputManager.fingerCurlRightPinky > 0.75f)
{
m_inputManager.gestureRightRaw = m_inputManager.fingerCurlRightThumb >= 0.5f ? 4f : 3f;
}
// Peace Sign
if (m_inputManager.fingerCurlRightIndex < 0.2f && m_inputManager.fingerCurlRightMiddle < 0.2f &&
m_inputManager.fingerCurlRightRing > 0.75f && m_inputManager.fingerCurlRightPinky > 0.75f)
{
m_inputManager.gestureRightRaw = 5f;
}
// Rock and Roll
if (m_inputManager.fingerCurlRightIndex < 0.2f && m_inputManager.fingerCurlRightMiddle > 0.75f &&
m_inputManager.fingerCurlRightRing > 0.75f && m_inputManager.fingerCurlRightPinky < 0.5f)
{
m_inputManager.gestureRightRaw = 6f;
}
// Fist & Thumbs Up
if (m_inputManager.fingerCurlRightIndex > 0.5f && m_inputManager.fingerCurlRightMiddle > 0.5f &&
m_inputManager.fingerCurlRightRing > 0.5f && m_inputManager.fingerCurlRightPinky > 0.5f)
{
m_inputManager.gestureRightRaw = m_inputManager.fingerCurlRightThumb >= 0.5f
? (l_data.m_rightHand.m_grabStrength - 0.5f) * 2f
: 2f;
}
// Open Hand
if (m_inputManager.fingerCurlRightIndex < 0.2f && m_inputManager.fingerCurlRightMiddle < 0.2f &&
m_inputManager.fingerCurlRightRing < 0.2f && m_inputManager.fingerCurlRightPinky < 0.2f)
{
m_inputManager.gestureRightRaw = -1f;
}
m_inputManager.gestureRight = m_inputManager.gestureRightRaw;
}
}
}
// Settings changes
@ -262,6 +366,14 @@ namespace ml_lme
}
}
void OnGesturesChange(bool p_state)
{
m_inputManager.gestureLeft = 0f;
m_inputManager.gestureLeftRaw = 0f;
m_inputManager.gestureRight = 0f;
m_inputManager.gestureRightRaw = 0f;
}
// Game events
internal void OnAvatarSetup()
{
@ -348,6 +460,20 @@ namespace ml_lme
}
}
void ResetGestures(bool p_left)
{
if (p_left)
{
m_inputManager.gestureLeft = 0f;
m_inputManager.gestureLeftRaw = 0f;
}
else
{
m_inputManager.gestureRight = 0f;
m_inputManager.gestureRightRaw = 0f;
}
}
// Game settings
void OnGameSettingBoolChange(string p_name, bool p_state)
{

View file

@ -33,6 +33,7 @@ namespace ml_lme
HeadZ,
TrackElbows,
Input,
Gestures,
InteractThreadhold,
GripThreadhold,
VisualHands
@ -48,6 +49,7 @@ namespace ml_lme
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 Input { get; private set; } = true;
public static bool Gestures { get; private set; } = false;
public static float InteractThreadhold { get; private set; } = 0.8f;
public static float GripThreadhold { get; private set; } = 0.4f;
public static bool VisualHands { get; private set; } = false;
@ -65,6 +67,7 @@ namespace ml_lme
static public event Action<Vector3> HeadOffsetChange;
static public event Action<bool> TrackElbowsChange;
static public event Action<bool> InputChange;
static public event Action<bool> GesturesChange;
static public event Action<float> InteractThreadholdChange;
static public event Action<float> GripThreadholdChange;
static public event Action<bool> VisualHandsChange;
@ -91,6 +94,7 @@ namespace ml_lme
ms_category.CreateEntry(ModSetting.HeadZ.ToString(), (int)(HeadOffset.z * 100f)),
ms_category.CreateEntry(ModSetting.TrackElbows.ToString(), TrackElbows),
ms_category.CreateEntry(ModSetting.Input.ToString(), Input),
ms_category.CreateEntry(ModSetting.Gestures.ToString(), Gestures),
ms_category.CreateEntry(ModSetting.InteractThreadhold.ToString(), (int)(InteractThreadhold * 100f)),
ms_category.CreateEntry(ModSetting.GripThreadhold.ToString(), (int)(GripThreadhold * 100f)),
ms_category.CreateEntry(ModSetting.VisualHands.ToString(), VisualHands)
@ -148,6 +152,7 @@ namespace ml_lme
) * 0.01f;
TrackElbows = (bool)ms_entries[(int)ModSetting.TrackElbows].BoxedValue;
Input = (bool)ms_entries[(int)ModSetting.Input].BoxedValue;
Gestures = (bool)ms_entries[(int)ModSetting.Gestures].BoxedValue;
InteractThreadhold = (int)ms_entries[(int)ModSetting.InteractThreadhold].BoxedValue * 0.01f;
GripThreadhold = (int)ms_entries[(int)ModSetting.GripThreadhold].BoxedValue * 0.01f;
VisualHands = (bool)ms_entries[(int)ModSetting.VisualHands].BoxedValue;
@ -201,6 +206,13 @@ namespace ml_lme
}
break;
case ModSetting.Gestures:
{
Gestures = bool.Parse(p_value);
GesturesChange?.Invoke(Gestures);
}
break;
case ModSetting.VisualHands:
{
VisualHands = bool.Parse(p_value);

View file

@ -399,6 +399,13 @@ function inp_dropdown_mod_lme(_obj, _callbackName) {
</div>
</div>
<div class ="row-wrapper">
<div class ="option-caption">Recognize Gestures: </div>
<div class ="option-input">
<div id="Gestures" class ="inp_toggle no-scroll" data-current="false"></div>
</div>
</div>
<div class ="row-wrapper">
<div class ="option-caption">Interact gesture threadhold: </div>
<div class ="option-input">