From dcd94ae90602aa2d3c38c8927b076f13047ba22c Mon Sep 17 00:00:00 2001 From: SDraw Date: Tue, 22 Nov 2022 15:33:17 +0300 Subject: [PATCH] Head tracking toggle option --- README.md | 6 +++--- ml_dht/HeadTracked.cs | 23 +++++++++++++++++------ ml_dht/Main.cs | 1 + ml_dht/Properties/AssemblyInfo.cs | 6 +++--- ml_dht/README.md | 3 ++- ml_dht/Settings.cs | 16 ++++++++++++++++ ml_dht/resources/menu.js | 7 +++++++ 7 files changed, 49 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index e2d2890..ddac16e 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Merged set of MelonLoader mods for ChilloutVR. | Full name | Short name | Latest version | Available in [CVRMA](https://github.com/knah/CVRMelonAssistant) | Current Status | Notes | |-----------|------------|----------------|-----------------------------------------------------------------|----------------|-------| | Avatar Change Info | ml_aci | 1.0.3 | Yes | Working | -| Avatar Motion Tweaker | ml_amt | 1.1.8 | Yes, pending update | Working | -| Desktop Head Tracking | ml_dht | 1.1.0 | Yes, pending update | Working | +| Avatar Motion Tweaker | ml_amt | 1.1.8 | Yes | Working | +| Desktop Head Tracking | ml_dht | 1.1.1 | 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.7 | Yes, pending update | Working | +| Leap Motion Extension | ml_lme | 1.2.7 | Yes | Working | | Server Connection Info | ml_sci | 1.0.2 | Yes | Working | diff --git a/ml_dht/HeadTracked.cs b/ml_dht/HeadTracked.cs index 5941844..df87e18 100644 --- a/ml_dht/HeadTracked.cs +++ b/ml_dht/HeadTracked.cs @@ -13,6 +13,7 @@ namespace ml_dht static FieldInfo ms_emotePlaying = typeof(PlayerSetup).GetField("_emotePlaying", BindingFlags.NonPublic | BindingFlags.Instance); bool m_enabled = false; + bool m_headTracking = true; bool m_blinking = true; bool m_eyeTracking = true; float m_smoothing = 0.5f; @@ -21,7 +22,6 @@ namespace ml_dht CVRAvatar m_avatarDescriptor = null; LookAtIK m_lookIK = null; - Transform m_camera = null; Transform m_headBone = null; Vector3 m_headPosition; @@ -36,9 +36,8 @@ namespace ml_dht void Start() { - m_camera = PlayerSetup.Instance.desktopCamera.transform; - Settings.EnabledChange += this.SetEnabled; + Settings.HeadTrackingChange += this.SetHeadTracking; Settings.EyeTrackingChange += this.SetEyeTracking; Settings.BlinkingChange += this.SetBlinking; Settings.SmoothingChange += this.SetSmoothing; @@ -49,6 +48,7 @@ namespace ml_dht void OnDestroy() { Settings.EnabledChange -= this.SetEnabled; + Settings.HeadTrackingChange -= this.SetHeadTracking; Settings.EyeTrackingChange -= this.SetEyeTracking; Settings.BlinkingChange -= this.SetBlinking; Settings.SmoothingChange -= this.SetSmoothing; @@ -68,7 +68,7 @@ namespace ml_dht void OnLookIKPostUpdate() { - if(m_enabled && (m_headBone != null)) + if(m_enabled && m_headTracking && (m_headBone != null)) { m_lastHeadRotation = Quaternion.Slerp(m_lastHeadRotation, m_avatarDescriptor.transform.rotation * (m_headRotation * m_bindRotation), m_smoothing); @@ -84,8 +84,10 @@ namespace ml_dht // Gaze if(m_eyeTracking) { + Transform l_camera = PlayerSetup.Instance.GetActiveCamera().transform; + p_component.manualViewTarget = true; - p_component.targetViewPosition = m_camera.position + m_camera.rotation * new Vector3((m_gazeDirection.x - 0.5f) * 2f, (m_gazeDirection.y - 0.5f) * 2f, 1f); + p_component.targetViewPosition = l_camera.position + l_camera.rotation * new Vector3((m_gazeDirection.x - 0.5f) * 2f, (m_gazeDirection.y - 0.5f) * 2f, 1f); } // Blink @@ -142,7 +144,16 @@ namespace ml_dht if(m_enabled != p_state) { m_enabled = p_state; - if(m_enabled) + if(m_enabled && m_headTracking) + m_lastHeadRotation = ((m_headBone != null) ? m_headBone.rotation : m_bindRotation); + } + } + public void SetHeadTracking(bool p_state) + { + if(m_headTracking != p_state) + { + m_headTracking = p_state; + if(m_enabled && m_headTracking) m_lastHeadRotation = ((m_headBone != null) ? m_headBone.rotation : m_bindRotation); } } diff --git a/ml_dht/Main.cs b/ml_dht/Main.cs index c60fcf1..8357b77 100644 --- a/ml_dht/Main.cs +++ b/ml_dht/Main.cs @@ -58,6 +58,7 @@ namespace ml_dht m_localTracked = PlayerSetup.Instance.gameObject.AddComponent(); m_localTracked.SetEnabled(Settings.Enabled); + m_localTracked.SetHeadTracking(Settings.HeadTracking); m_localTracked.SetEyeTracking(Settings.EyeTracking); m_localTracked.SetBlinking(Settings.Blinking); m_localTracked.SetMirrored(Settings.Mirrored); diff --git a/ml_dht/Properties/AssemblyInfo.cs b/ml_dht/Properties/AssemblyInfo.cs index e30b429..8ec9bbb 100644 --- a/ml_dht/Properties/AssemblyInfo.cs +++ b/ml_dht/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; [assembly: AssemblyTitle("DesktopHeadTracking")] -[assembly: AssemblyVersion("1.1.0")] -[assembly: AssemblyFileVersion("1.1.0")] +[assembly: AssemblyVersion("1.1.1")] +[assembly: AssemblyFileVersion("1.1.1")] -[assembly: MelonLoader.MelonInfo(typeof(ml_dht.DesktopHeadTracking), "DesktopHeadTracking", "1.1.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_dht.DesktopHeadTracking), "DesktopHeadTracking", "1.1.1", "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)] \ No newline at end of file diff --git a/ml_dht/README.md b/ml_dht/README.md index acc187a..ddfff6c 100644 --- a/ml_dht/README.md +++ b/ml_dht/README.md @@ -17,7 +17,8 @@ Refer to `TrackingData.cs` for reference in case of implementing own software. # Usage Available mod's settings in `Settings - Implementation - Desktop Head Tracking`: -* **Enabled:** enabled head tracking; default value - `false`. +* **Enabled:** enables mod's activity; default value - `false`. +* **Use head tracking:** enables head tracking; default value - `true`. * **Use eyes tracking:** uses eyes tracking from data; default value - `true`. * **Use blinking:** uses blinking from data; default value - `true`. * **Mirrored movement:** mirrors movement and gaze along 0YZ plane; default value - `false`. diff --git a/ml_dht/Settings.cs b/ml_dht/Settings.cs index df9f197..bb33b28 100644 --- a/ml_dht/Settings.cs +++ b/ml_dht/Settings.cs @@ -10,6 +10,7 @@ namespace ml_dht enum ModSetting { Enabled = 0, + HeadTracking, EyeTracking, Blinking, Mirrored, @@ -18,6 +19,7 @@ namespace ml_dht } static bool ms_enabled = false; + static bool ms_headTracking = true; static bool ms_eyeTracking = true; static bool ms_blinking = true; static bool ms_mirrored = false; @@ -28,6 +30,7 @@ namespace ml_dht static List ms_entries = null; static public event Action EnabledChange; + static public event Action HeadTrackingChange; static public event Action EyeTrackingChange; static public event Action BlinkingChange; static public event Action MirroredChange; @@ -40,6 +43,7 @@ namespace ml_dht ms_entries = new List(); ms_entries.Add(ms_category.CreateEntry(ModSetting.Enabled.ToString(), false)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.HeadTracking.ToString(), false)); ms_entries.Add(ms_category.CreateEntry(ModSetting.EyeTracking.ToString(), true)); ms_entries.Add(ms_category.CreateEntry(ModSetting.Blinking.ToString(), true)); ms_entries.Add(ms_category.CreateEntry(ModSetting.Mirrored.ToString(), false)); @@ -76,6 +80,7 @@ namespace ml_dht static void Load() { ms_enabled = (bool)ms_entries[(int)ModSetting.Enabled].BoxedValue; + ms_headTracking = (bool)ms_entries[(int)ModSetting.HeadTracking].BoxedValue; ms_eyeTracking = (bool)ms_entries[(int)ModSetting.EyeTracking].BoxedValue; ms_blinking = (bool)ms_entries[(int)ModSetting.Blinking].BoxedValue; ms_mirrored = (bool)ms_entries[(int)ModSetting.Mirrored].BoxedValue; @@ -114,6 +119,13 @@ namespace ml_dht } break; + case ModSetting.HeadTracking: + { + ms_headTracking = bool.Parse(p_value); + HeadTrackingChange?.Invoke(ms_headTracking); + } + break; + case ModSetting.EyeTracking: { ms_eyeTracking = bool.Parse(p_value); @@ -148,6 +160,10 @@ namespace ml_dht { get => ms_enabled; } + public static bool HeadTracking + { + get => ms_headTracking; + } public static bool EyeTracking { get => ms_eyeTracking; diff --git a/ml_dht/resources/menu.js b/ml_dht/resources/menu.js index d6364b0..38f2b5c 100644 --- a/ml_dht/resources/menu.js +++ b/ml_dht/resources/menu.js @@ -187,6 +187,13 @@ function inp_toggle_mod_dht(_obj, _callbackName) { +
+
Use head tracking:
+
+
+
+
+
Use eyes tracking: