From d04cf447fd7cd4c91bbfa955a19b2312edbc6113 Mon Sep 17 00:00:00 2001 From: SDraw Date: Wed, 10 Aug 2022 15:09:12 +0300 Subject: [PATCH] Moved UI settings to MelonPreferences (I missed two lunches because of this) --- ml_fpt/Main.cs | 5 +- ml_fpt/Properties/AssemblyInfo.cs | 6 +- ml_fpt/Scripts.cs | 2 +- ml_fpt/menu.js | 6 - ml_fpt/ml_fpt.csproj | 2 +- ml_fpt/resources/menu.js | 8 + ml_lme/Main.cs | 72 +++--- ml_lme/Properties/AssemblyInfo.cs | 6 +- ml_lme/Scripts.cs | 2 +- ml_lme/Settings.cs | 338 ++++++++++++++++------------ ml_lme/menu.js | 106 --------- ml_lme/ml_lme.csproj | 2 +- ml_lme/resources/menu.js | 360 ++++++++++++++++++++++++++++++ 13 files changed, 595 insertions(+), 320 deletions(-) delete mode 100644 ml_fpt/menu.js create mode 100644 ml_fpt/resources/menu.js delete mode 100644 ml_lme/menu.js create mode 100644 ml_lme/resources/menu.js diff --git a/ml_fpt/Main.cs b/ml_fpt/Main.cs index 584ac0b..cb33c53 100644 --- a/ml_fpt/Main.cs +++ b/ml_fpt/Main.cs @@ -71,9 +71,6 @@ namespace ml_fpt PlayerSetup.Instance._trackerManager.trackers[m_hipsTrackerIndex].ShowLine(false); CVR_InteractableManager.enableInteractions = true; - if(PlayerSetup.Instance._avatar.GetComponent().avatarUsesAdvancedSettings) - PlayerSetup.Instance.LoadCurrentAvatarSettingsDefault(); - Reset(); ShowHudNotification("Calibration completed"); @@ -92,7 +89,7 @@ namespace ml_fpt ViewManager.Instance.gameMenuView.Listener.ReadyForBindings += () => { - ViewManager.Instance.gameMenuView.View.RegisterForEvent("MelonMod_Action_FPT_Calibrate", new System.Action(this.StartCalibration)); + ViewManager.Instance.gameMenuView.View.RegisterForEvent("MelonMod_FPT_Action_Calibrate", new System.Action(this.StartCalibration)); }; ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => diff --git a/ml_fpt/Properties/AssemblyInfo.cs b/ml_fpt/Properties/AssemblyInfo.cs index d5cb18a..a3576de 100644 --- a/ml_fpt/Properties/AssemblyInfo.cs +++ b/ml_fpt/Properties/AssemblyInfo.cs @@ -1,10 +1,10 @@ using System.Reflection; [assembly: AssemblyTitle("FourPointTracking")] -[assembly: AssemblyVersion("1.0.0")] -[assembly: AssemblyFileVersion("1.0.0")] +[assembly: AssemblyVersion("1.0.1")] +[assembly: AssemblyFileVersion("1.0.1")] -[assembly: MelonLoader.MelonInfo(typeof(ml_fpt.FourPointTracking), "FourPointTracking", "1.0.0", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_fpt.FourPointTracking), "FourPointTracking", "1.0.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_fpt/Scripts.cs b/ml_fpt/Scripts.cs index fa63c6e..a0b5f81 100644 --- a/ml_fpt/Scripts.cs +++ b/ml_fpt/Scripts.cs @@ -14,7 +14,7 @@ namespace ml_fpt try { - Stream l_libraryStream = l_assembly.GetManifestResourceStream(l_assemblyName + "." + p_name); + Stream l_libraryStream = l_assembly.GetManifestResourceStream(l_assemblyName + ".resources." + p_name); StreamReader l_streadReader = new StreamReader(l_libraryStream); l_result = l_streadReader.ReadToEnd(); } diff --git a/ml_fpt/menu.js b/ml_fpt/menu.js deleted file mode 100644 index 7381cc1..0000000 --- a/ml_fpt/menu.js +++ /dev/null @@ -1,6 +0,0 @@ -var l_block = document.createElement("fpt_block"); -l_block.innerHTML = ` -

4-Point Tracking

-
Calibrate
-`; -document.getElementById('settings-implementation').appendChild(l_block); diff --git a/ml_fpt/ml_fpt.csproj b/ml_fpt/ml_fpt.csproj index c8d3c3d..7803988 100644 --- a/ml_fpt/ml_fpt.csproj +++ b/ml_fpt/ml_fpt.csproj @@ -84,7 +84,7 @@ - + diff --git a/ml_fpt/resources/menu.js b/ml_fpt/resources/menu.js new file mode 100644 index 0000000..65cef40 --- /dev/null +++ b/ml_fpt/resources/menu.js @@ -0,0 +1,8 @@ +{ + var l_block = document.createElement('div'); + l_block.innerHTML = ` +

4-Point Tracking

+
Calibrate
+ `; + document.getElementById('settings-implementation').appendChild(l_block); +} \ No newline at end of file diff --git a/ml_lme/Main.cs b/ml_lme/Main.cs index af635bd..36fe3b5 100644 --- a/ml_lme/Main.cs +++ b/ml_lme/Main.cs @@ -28,7 +28,7 @@ namespace ml_lme DependenciesHandler.ExtractDependencies(); - Settings.Init(HarmonyInstance); + Settings.Init(); Settings.EnabledChange += this.OnSettingsEnableChange; Settings.DesktopOffsetChange += this.OnSettingsDesktopOffsetChange; Settings.FingersOnlyChange += this.OnSettingsFingersOptionChange; @@ -60,7 +60,6 @@ namespace ml_lme new HarmonyLib.HarmonyMethod(typeof(LeapMotionExtension).GetMethod(nameof(OnAvatarClear_Postfix), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)) ); - MelonLoader.MelonCoroutines.Start(WaitForMainMenuView()); MelonLoader.MelonCoroutines.Start(CreateTrackingObjects()); } @@ -98,29 +97,11 @@ namespace ml_lme m_leapControllerModel.transform.localRotation = Quaternion.identity; } - Settings.Reload(); - - OnSettingsEnableChange(); - OnSettingsFingersOptionChange(); - OnSettingsModelVisibilityChange(); - OnSettingsTrackingModeChange(); - OnSettingsHeadAttachChange(); // Includes offsets and parenting - } - - System.Collections.IEnumerator WaitForMainMenuView() - { - while(ViewManager.Instance == null) - yield return null; - while(ViewManager.Instance.gameMenuView == null) - yield return null; - while(ViewManager.Instance.gameMenuView.Listener == null) - yield return null; - - ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => - { - ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("menu.js")); - ViewManager.Instance.RequestCurrentSettings(); - }; + OnSettingsEnableChange(Settings.Enabled); + OnSettingsFingersOptionChange(Settings.FingersOnly); + OnSettingsModelVisibilityChange(Settings.ModelVisibility); + OnSettingsTrackingModeChange(Settings.TrackingMode); + OnSettingsHeadAttachChange(Settings.HeadAttach); // Includes offsets and parenting } public override void OnUpdate() @@ -157,9 +138,9 @@ namespace ml_lme } // Settings changes - void OnSettingsEnableChange() + void OnSettingsEnableChange(bool p_state) { - if(Settings.Enabled) + if(p_state) { m_leapController.StartConnection(); UpdateDeviceTrackingMode(); @@ -168,40 +149,40 @@ namespace ml_lme m_leapController.StopConnection(); if(m_leapTracked != null) - m_leapTracked.SetEnabled(Settings.Enabled); + m_leapTracked.SetEnabled(p_state); } - void OnSettingsDesktopOffsetChange() + void OnSettingsDesktopOffsetChange(Vector3 p_offset) { if((m_leapTrackingRoot != null) && !Settings.HeadAttach) { if(!PlayerSetup.Instance._inVr) - m_leapTrackingRoot.transform.localPosition = Settings.DesktopOffset * PlayerSetup.Instance.vrCameraRig.transform.localScale.x; + m_leapTrackingRoot.transform.localPosition = p_offset * PlayerSetup.Instance.vrCameraRig.transform.localScale.x; else - m_leapTrackingRoot.transform.localPosition = Settings.DesktopOffset; + m_leapTrackingRoot.transform.localPosition = p_offset; } } - void OnSettingsFingersOptionChange() + void OnSettingsFingersOptionChange(bool p_state) { if(m_leapTracked != null) - m_leapTracked.SetFingersOnly(Settings.FingersOnly); + m_leapTracked.SetFingersOnly(p_state); } - void OnSettingsModelVisibilityChange() + void OnSettingsModelVisibilityChange(bool p_state) { if(m_leapControllerModel != null) - m_leapControllerModel.SetActive(Settings.ModelVisibility); + m_leapControllerModel.SetActive(p_state); } - void OnSettingsTrackingModeChange() + void OnSettingsTrackingModeChange(Settings.LeapTrackingMode p_mode) { if(Settings.Enabled && (m_leapController != null)) UpdateDeviceTrackingMode(); if(m_leapControllerModel != null) { - switch(Settings.TrackingMode) + switch(p_mode) { case Settings.LeapTrackingMode.Screentop: m_leapControllerModel.transform.localRotation = Quaternion.Euler(0f, 0f, 180f); @@ -216,17 +197,17 @@ namespace ml_lme } } - void OnSettingsRootAngleChange() + void OnSettingsRootAngleChange(float p_angle) { if(m_leapTrackingRoot != null) - m_leapTrackingRoot.transform.localRotation = Quaternion.Euler(Settings.RootAngle, 0f, 0f); + m_leapTrackingRoot.transform.localRotation = Quaternion.Euler(p_angle, 0f, 0f); } - void OnSettingsHeadAttachChange() + void OnSettingsHeadAttachChange(bool p_state) { if(m_leapTrackingRoot != null) { - if(Settings.HeadAttach) + if(p_state) { if(!PlayerSetup.Instance._inVr) { @@ -261,14 +242,14 @@ namespace ml_lme } } - void OnSettingsHeadOffsetChange() + void OnSettingsHeadOffsetChange(Vector3 p_offset) { if((m_leapTrackingRoot != null) && Settings.HeadAttach) { if(!PlayerSetup.Instance._inVr) - m_leapTrackingRoot.transform.localPosition = Settings.HeadOffset * PlayerSetup.Instance.vrCameraRig.transform.localScale.x; + m_leapTrackingRoot.transform.localPosition = p_offset * PlayerSetup.Instance.vrCameraRig.transform.localScale.x; else - m_leapTrackingRoot.transform.localPosition = Settings.HeadOffset; + m_leapTrackingRoot.transform.localPosition = p_offset; } } @@ -338,7 +319,6 @@ namespace ml_lme } } - static void OnAvatarSetup_Postfix(ref PlayerSetup __instance) { if((__instance != null) && (__instance == PlayerSetup.Instance)) @@ -354,7 +334,7 @@ namespace ml_lme m_leapTracked.SetHands(m_leapHands[0].transform, m_leapHands[1].transform); m_leapTracked.SetFingersOnly(Settings.FingersOnly); - OnSettingsHeadAttachChange(); + OnSettingsHeadAttachChange(Settings.HeadAttach); } } diff --git a/ml_lme/Properties/AssemblyInfo.cs b/ml_lme/Properties/AssemblyInfo.cs index f98c0ec..1be5d69 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.1.1")] -[assembly: AssemblyFileVersion("1.1.1")] +[assembly: AssemblyVersion("1.1.2")] +[assembly: AssemblyFileVersion("1.1.2")] -[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.1.1", "SDraw", "https://github.com/SDraw/ml_mods_cvr")] +[assembly: MelonLoader.MelonInfo(typeof(ml_lme.LeapMotionExtension), "LeapMotionExtension", "1.1.2", "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)] diff --git a/ml_lme/Scripts.cs b/ml_lme/Scripts.cs index 76e5314..9f38c99 100644 --- a/ml_lme/Scripts.cs +++ b/ml_lme/Scripts.cs @@ -14,7 +14,7 @@ namespace ml_lme try { - Stream l_libraryStream = l_assembly.GetManifestResourceStream(l_assemblyName + "." + p_name); + Stream l_libraryStream = l_assembly.GetManifestResourceStream(l_assemblyName + ".resources." + p_name); StreamReader l_streadReader = new StreamReader(l_libraryStream); l_result = l_streadReader.ReadToEnd(); } diff --git a/ml_lme/Settings.cs b/ml_lme/Settings.cs index 77bab8c..23bf739 100644 --- a/ml_lme/Settings.cs +++ b/ml_lme/Settings.cs @@ -1,5 +1,7 @@ -using ABI_RC.Core.Savior; +using ABI_RC.Core.InteractionSystem; +using cohtml; using System; +using System.Collections.Generic; using UnityEngine; namespace ml_lme @@ -15,18 +17,18 @@ namespace ml_lme enum ModSetting { - InteractionLeapMotionTracking, - InteractionLeapMotionTrackingDesktopX, - InteractionLeapMotionTrackingDesktopY, - InteractionLeapMotionTrackingDesktopZ, - InteractionLeapMotionTrackingFingersOnly, - InteractionLeapMotionTrackingModel, - InteractionLeapMotionTrackingMode, - InteractionLeapMotionTrackingAngle, - InteractionLeapMotionTrackingHead, - InteractionLeapMotionTrackingHeadX, - InteractionLeapMotionTrackingHeadY, - InteractionLeapMotionTrackingHeadZ + Enabled, + DesktopX, + DesktopY, + DesktopZ, + FingersOnly, + Model, + Mode, + Angle, + Head, + HeadX, + HeadY, + HeadZ }; static bool ms_enabled = false; @@ -38,155 +40,195 @@ namespace ml_lme static bool ms_headAttach = false; static Vector3 ms_headOffset = new Vector3(0f, -0.3f, 0.15f); - static bool ms_initialized = false; + static MelonLoader.MelonPreferences_Category ms_category = null; + static List ms_entries = null; - static public event Action EnabledChange; - static public event Action DesktopOffsetChange; - static public event Action FingersOnlyChange; - static public event Action ModelVisibilityChange; - static public event Action TrackingModeChange; - static public event Action RootAngleChange; - static public event Action HeadAttachChange; - static public event Action HeadOffsetChange; + static public event Action EnabledChange; + static public event Action DesktopOffsetChange; + static public event Action FingersOnlyChange; + static public event Action ModelVisibilityChange; + static public event Action TrackingModeChange; + static public event Action RootAngleChange; + static public event Action HeadAttachChange; + static public event Action HeadOffsetChange; - public static void Init(HarmonyLib.Harmony p_instance) + public static void Init() { - p_instance.Patch( - typeof(CVRSettings).GetMethod(nameof(CVRSettings.LoadSerializedSettings)), - new HarmonyLib.HarmonyMethod(typeof(Settings).GetMethod(nameof(LoadSerializedSettings_Prefix), System.Reflection.BindingFlags.Static | System.Reflection.BindingFlags.NonPublic)), - null - ); + ms_category = MelonLoader.MelonPreferences.CreateCategory("LME"); + + ms_entries = new List(); + ms_entries.Add(ms_category.CreateEntry(ModSetting.Enabled.ToString(), ms_enabled)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.DesktopX.ToString(), 0)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.DesktopY.ToString(), -45)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.DesktopZ.ToString(), 30)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.FingersOnly.ToString(), ms_modelVisibility)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.Model.ToString(), ms_modelVisibility)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.Mode.ToString(), (int)ms_trackingMode)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.Angle.ToString(), 0)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.Head.ToString(), ms_headAttach)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.HeadX.ToString(), 0)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.HeadY.ToString(), -30)); + ms_entries.Add(ms_category.CreateEntry(ModSetting.HeadZ.ToString(), 15)); + + Load(); + + MelonLoader.MelonCoroutines.Start(WaitMainMenuUi()); } - static void LoadSerializedSettings_Prefix(ref CVRSettings __instance) + static System.Collections.IEnumerator WaitMainMenuUi() { - if(!ms_initialized && (__instance != null)) + while(ViewManager.Instance == null) + yield return null; + while(ViewManager.Instance.gameMenuView == null) + yield return null; + while(ViewManager.Instance.gameMenuView.Listener == null) + yield return null; + + ViewManager.Instance.gameMenuView.Listener.ReadyForBindings += () => { - var l_settings = HarmonyLib.Traverse.Create(__instance)?.Field("_settings")?.GetValue>(); - if(l_settings != null) + ViewManager.Instance.gameMenuView.View.BindCall("MelonMod_LME_Call_InpToggle", new Action(OnToggleUpdate)); + ViewManager.Instance.gameMenuView.View.BindCall("MelonMod_LME_Call_InpSlider", new Action(OnSliderUpdate)); + ViewManager.Instance.gameMenuView.View.BindCall("MelonMod_LME_Call_InpDropdown", new Action(OnDropdownUpdate)); + }; + ViewManager.Instance.gameMenuView.Listener.FinishLoad += (_) => + { + ViewManager.Instance.gameMenuView.View.ExecuteScript(Scripts.GetEmbeddedScript("menu.js")); + foreach(var l_entry in ms_entries) + ViewManager.Instance.gameMenuView.View.TriggerEvent("updateModSetting", l_entry.DisplayName, l_entry.GetValueAsString()); + }; + } + + static void Load() + { + ms_enabled = (bool)ms_entries[(int)ModSetting.Enabled].BoxedValue; + ms_desktopOffset = new Vector3( + (int)ms_entries[(int)ModSetting.DesktopX].BoxedValue, + (int)ms_entries[(int)ModSetting.DesktopY].BoxedValue, + (int)ms_entries[(int)ModSetting.DesktopZ].BoxedValue + ) * 0.01f; + ms_fingersOnly = (bool)ms_entries[(int)ModSetting.FingersOnly].BoxedValue; + ms_modelVisibility = (bool)ms_entries[(int)ModSetting.Model].BoxedValue; + ms_trackingMode = (LeapTrackingMode)(int)ms_entries[(int)ModSetting.Mode].BoxedValue; + ms_rootAngle = (int)ms_entries[(int)ModSetting.Angle].BoxedValue; + ms_headAttach = (bool)ms_entries[(int)ModSetting.Head].BoxedValue; + ms_headOffset = new Vector3( + (int)ms_entries[(int)ModSetting.HeadX].BoxedValue, + (int)ms_entries[(int)ModSetting.HeadY].BoxedValue, + (int)ms_entries[(int)ModSetting.HeadZ].BoxedValue + ) * 0.01f; + } + + static void OnToggleUpdate(string p_name, string p_value) + { + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) { - l_settings.Add(new CVRSettingsBool(ModSetting.InteractionLeapMotionTracking.ToString(), false)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingDesktopX.ToString(), 0)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingDesktopY.ToString(), -45)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingDesktopZ.ToString(), 30)); - l_settings.Add(new CVRSettingsBool(ModSetting.InteractionLeapMotionTrackingFingersOnly.ToString(), false)); - l_settings.Add(new CVRSettingsBool(ModSetting.InteractionLeapMotionTrackingModel.ToString(), false)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingMode.ToString(), 1)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingAngle.ToString(), 0)); - l_settings.Add(new CVRSettingsBool(ModSetting.InteractionLeapMotionTrackingHead.ToString(), false)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingHeadX.ToString(), 0)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingHeadY.ToString(), 0)); - l_settings.Add(new CVRSettingsInt(ModSetting.InteractionLeapMotionTrackingHeadZ.ToString(), 0)); + case ModSetting.Enabled: + { + ms_enabled = bool.Parse(p_value); + EnabledChange?.Invoke(ms_enabled); + } + break; + + case ModSetting.FingersOnly: + { + ms_fingersOnly = bool.Parse(p_value); + FingersOnlyChange?.Invoke(ms_fingersOnly); + } + break; + + case ModSetting.Model: + { + ms_modelVisibility = bool.Parse(p_value); + ModelVisibilityChange?.Invoke(ms_modelVisibility); + } + break; + + case ModSetting.Head: + { + ms_headAttach = bool.Parse(p_value); + HeadAttachChange?.Invoke(ms_headAttach); + } + break; } - __instance.settingBoolChanged.AddListener((name, value) => - { - if(Enum.TryParse(name, out ModSetting l_setting)) - { - switch(l_setting) - { - case ModSetting.InteractionLeapMotionTracking: - { - ms_enabled = value; - EnabledChange?.Invoke(); - } - break; - - case ModSetting.InteractionLeapMotionTrackingFingersOnly: - { - ms_fingersOnly = value; - FingersOnlyChange?.Invoke(); - } - break; - - case ModSetting.InteractionLeapMotionTrackingModel: - { - ms_modelVisibility = value; - ModelVisibilityChange?.Invoke(); - } - break; - - case ModSetting.InteractionLeapMotionTrackingHead: - { - ms_headAttach = value; - HeadAttachChange?.Invoke(); - } - break; - } - } - }); - - __instance.settingIntChanged.AddListener((name, value) => - { - if(Enum.TryParse(name, out ModSetting l_setting)) - { - switch(l_setting) - { - case ModSetting.InteractionLeapMotionTrackingDesktopX: - case ModSetting.InteractionLeapMotionTrackingDesktopY: - case ModSetting.InteractionLeapMotionTrackingDesktopZ: - { - ms_desktopOffset = new Vector3( - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingDesktopX.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingDesktopY.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingDesktopZ.ToString()) - ) * 0.01f; - DesktopOffsetChange?.Invoke(); - } - break; - - case ModSetting.InteractionLeapMotionTrackingMode: - { - ms_trackingMode = (LeapTrackingMode)value; - TrackingModeChange?.Invoke(); - } - break; - - case ModSetting.InteractionLeapMotionTrackingAngle: - { - ms_rootAngle = value; - RootAngleChange?.Invoke(); - } - break; - - case ModSetting.InteractionLeapMotionTrackingHeadX: - case ModSetting.InteractionLeapMotionTrackingHeadY: - case ModSetting.InteractionLeapMotionTrackingHeadZ: - { - ms_headOffset = new Vector3( - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingHeadX.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingHeadY.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingHeadZ.ToString()) - ) * 0.01f; - HeadOffsetChange?.Invoke(); - } - break; - } - } - }); - - ms_initialized = true; + ms_entries[(int)l_setting].BoxedValue = bool.Parse(p_value); } } - static public void Reload() + static void OnSliderUpdate(string p_name, string p_value) { - ms_enabled = MetaPort.Instance.settings.GetSettingsBool(ModSetting.InteractionLeapMotionTracking.ToString()); - ms_desktopOffset = new Vector3( - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingDesktopX.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingDesktopY.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingDesktopZ.ToString()) - ) * 0.01f; - ms_fingersOnly = MetaPort.Instance.settings.GetSettingsBool(ModSetting.InteractionLeapMotionTrackingFingersOnly.ToString()); - ms_modelVisibility = MetaPort.Instance.settings.GetSettingsBool(ModSetting.InteractionLeapMotionTrackingModel.ToString()); - ms_trackingMode = (LeapTrackingMode)MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingMode.ToString()); - ms_rootAngle = MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingAngle.ToString()); - ms_headAttach = MetaPort.Instance.settings.GetSettingsBool(ModSetting.InteractionLeapMotionTrackingHead.ToString()); - ms_headOffset = new Vector3( - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingHeadX.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingHeadY.ToString()), - MetaPort.Instance.settings.GetSettingInt(ModSetting.InteractionLeapMotionTrackingHeadZ.ToString()) - ) * 0.01f; + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) + { + case ModSetting.DesktopX: + { + ms_desktopOffset.x = int.Parse(p_value) * 0.01f; + DesktopOffsetChange?.Invoke(ms_desktopOffset); + } + break; + case ModSetting.DesktopY: + { + ms_desktopOffset.y = int.Parse(p_value) * 0.01f; + DesktopOffsetChange?.Invoke(ms_desktopOffset); + } + break; + case ModSetting.DesktopZ: + { + ms_desktopOffset.z = int.Parse(p_value) * 0.01f; + DesktopOffsetChange?.Invoke(ms_desktopOffset); + } + break; + + case ModSetting.Angle: + { + ms_rootAngle = int.Parse(p_value); + RootAngleChange?.Invoke(ms_rootAngle); + } + break; + + case ModSetting.HeadX: + { + ms_headOffset.x = int.Parse(p_value) * 0.01f; + HeadOffsetChange?.Invoke(ms_headOffset); + } + break; + case ModSetting.HeadY: + { + ms_headOffset.y = int.Parse(p_value) * 0.01f; + HeadOffsetChange?.Invoke(ms_headOffset); + } + break; + case ModSetting.HeadZ: + { + ms_headOffset.z = int.Parse(p_value) * 0.01f; + HeadOffsetChange?.Invoke(ms_headOffset); + } + break; + } + + ms_entries[(int)l_setting].BoxedValue = int.Parse(p_value); + } + } + + static void OnDropdownUpdate(string p_name, string p_value) + { + if(Enum.TryParse(p_name, out ModSetting l_setting)) + { + switch(l_setting) + { + case ModSetting.Mode: + { + ms_trackingMode = (LeapTrackingMode)int.Parse(p_value); + TrackingModeChange?.Invoke(ms_trackingMode); + } + break; + } + + ms_entries[(int)l_setting].BoxedValue = int.Parse(p_value); + } } public static bool Enabled diff --git a/ml_lme/menu.js b/ml_lme/menu.js deleted file mode 100644 index 32e09b4..0000000 --- a/ml_lme/menu.js +++ /dev/null @@ -1,106 +0,0 @@ -var l_block = document.createElement("lme_block"); -l_block.innerHTML = ` -

Leap Motion tracking

-
-
Enable tracking:
-
-
-
-
- -
-
Tracking mode:
-
-
-
-
- -
-
Desktop offset X:
-
-
-
-
- -
-
Desktop offset Y:
-
-
-
-
- -
-
Desktop offset Z:
-
-
-
-
- -
-
Attach to head:
-
-
-
-
- -
-
Head offset X:
-
-
-
-
- -
-
Head offset Y:
-
-
-
-
- -
-
Head offset Z:
-
-
-
-
- -
-
Offset angle:
-
-
-
-
- -
-
Fingers tracking only:
-
-
-
-
- -
-
Model visibility:
-
-
-
-
-`; -document.getElementById('settings-implementation').appendChild(l_block); - -// Update toggles in new menu block -var l_toggles = l_block.querySelectorAll('.inp_toggle'); -for (var i = 0; i < l_toggles.length; i++) { - settings[settings.length] = new inp_toggle(l_toggles[i]); -} - -//Update dropdowns in new menu block -var l_dropdowns = l_block.querySelectorAll('.inp_dropdown'); -for (var i = 0; i < l_dropdowns.length; i++) { - settings[settings.length] = new inp_dropdown(l_dropdowns[i]); -} - -// Update sliders in new menu block -var l_sliders = l_block.querySelectorAll('.inp_slider'); -for (var i = 0; i < l_sliders.length; i++) { - settings[settings.length] = new inp_slider(l_sliders[i]); -} diff --git a/ml_lme/ml_lme.csproj b/ml_lme/ml_lme.csproj index 7ee97b2..9b50b5d 100644 --- a/ml_lme/ml_lme.csproj +++ b/ml_lme/ml_lme.csproj @@ -133,7 +133,7 @@ - + diff --git a/ml_lme/resources/menu.js b/ml_lme/resources/menu.js new file mode 100644 index 0000000..7a599ef --- /dev/null +++ b/ml_lme/resources/menu.js @@ -0,0 +1,360 @@ +// Add settings +var g_modSettings = []; + +engine.on('updateModSetting', function (_name, _value) { + for (var i = 0; i < g_modSettings.length; i++) { + if (g_modSettings[i].name == _name) { + g_modSettings[i].updateValue(_value); + break; + } + } +}); + +// Modified from original `inp` types +function inp_toggle_mod(_obj) { + this.obj = _obj; + this.value = _obj.getAttribute('data-current'); + this.name = _obj.id; + this.type = _obj.getAttribute('data-type'); + + var self = this; + + this.mouseDown = function (_e) { + self.value = self.value == "True" ? "False" : "True"; + self.updateState(); + } + + this.updateState = function () { + self.obj.classList.remove("checked"); + if (self.value == "True") { + self.obj.classList.add("checked"); + } + + engine.call('MelonMod_LME_Call_InpToggle', self.name, self.value); + } + + _obj.addEventListener('mousedown', this.mouseDown); + + this.getValue = function () { + return self.value; + } + + this.updateValue = function (value) { + self.value = value; + + self.obj.classList.remove("checked"); + if (self.value == "True") { + self.obj.classList.add("checked"); + } + } + + this.updateValue(this.value); + + return { + name: this.name, + value: this.getValue, + updateValue: this.updateValue + } +} + +function inp_slider_mod(_obj) { + this.obj = _obj; + this.minValue = parseFloat(_obj.getAttribute('data-min')); + this.maxValue = parseFloat(_obj.getAttribute('data-max')); + this.percent = 0; + this.value = parseFloat(_obj.getAttribute('data-current')); + this.dragActive = false; + this.name = _obj.id; + this.type = _obj.getAttribute('data-type'); + this.caption = _obj.getAttribute('data-caption'); + this.continuousUpdate = _obj.getAttribute('data-continuousUpdate'); + + var self = this; + + this.valueBar = document.createElement('div'); + this.valueBar.className = 'valueBar'; + this.valueBar.setAttribute('style', 'width: ' + (((this.value - this.minValue) / (this.maxValue - this.minValue)) * 100) + '%;'); + this.obj.appendChild(this.valueBar); + + this.valueLabel = document.createElement('div'); + this.valueLabel.className = 'valueLabel'; + this.valueLabel.innerHTML = this.caption + Math.round(this.value); + this.obj.appendChild(this.valueLabel); + + this.mouseDown = function (_e) { + self.dragActive = true; + self.mouseMove(_e, false); + } + + this.mouseMove = function (_e, _write) { + if (self.dragActive) { + var rect = _obj.getBoundingClientRect(); + var start = rect.left; + var end = rect.right; + self.percent = Math.min(Math.max((_e.clientX - start) / rect.width, 0), 1); + var value = self.percent; + value *= (self.maxValue - self.minValue); + value += self.minValue; + self.value = Math.round(value); + + self.valueBar.setAttribute('style', 'width: ' + (self.percent * 100) + '%;'); + self.valueLabel.innerHTML = self.caption + self.value; + + if (_write === true || self.continuousUpdate == 'true') { + engine.call('MelonMod_LME_Call_InpSlider', self.name, "" + self.value); + self.displayImperial(); + } + } + } + + this.mouseUp = function (_e) { + self.mouseMove(_e, true); + self.dragActive = false; + } + + _obj.addEventListener('mousedown', this.mouseDown); + document.addEventListener('mousemove', this.mouseMove); + document.addEventListener('mouseup', this.mouseUp); + + this.getValue = function () { + return self.value; + } + + this.updateValue = function (value) { + self.value = Math.round(value); + self.percent = (self.value - self.minValue) / (self.maxValue - self.minValue); + self.valueBar.setAttribute('style', 'width: ' + (self.percent * 100) + '%;'); + self.valueLabel.innerHTML = self.caption + self.value; + self.displayImperial(); + } + + this.displayImperial = function () { + var displays = document.querySelectorAll('.imperialDisplay'); + for (var i = 0; i < displays.length; i++) { + var binding = displays[i].getAttribute('data-binding'); + if (binding == self.name) { + var realFeet = ((self.value * 0.393700) / 12); + var feet = Math.floor(realFeet); + var inches = Math.floor((realFeet - feet) * 12); + displays[i].innerHTML = feet + "'" + inches + ''''; + } + } + } + + return { + name: this.name, + value: this.getValue, + updateValue: this.updateValue + } +} + +function inp_dropdown_mod(_obj) { + this.obj = _obj; + this.value = _obj.getAttribute('data-current'); + this.options = _obj.getAttribute('data-options').split(','); + this.name = _obj.id; + this.opened = false; + this.keyValue = []; + this.type = _obj.getAttribute('data-type'); + + this.optionElements = []; + + var self = this; + + this.SelectValue = function (_e) { + self.value = _e.target.getAttribute('data-key'); + self.valueElement.innerHTML = _e.target.getAttribute('data-value'); + self.globalClose(); + + engine.call('MelonMod_LME_Call_InpDropdown', self.name, self.value); + } + + this.openClick = function (_e) { + if (self.obj.classList.contains('open')) { + self.obj.classList.remove('open'); + self.list.setAttribute('style', 'display: none;'); + } else { + self.obj.classList.add('open'); + self.list.setAttribute('style', 'display: block;'); + self.opened = true; + window.setTimeout(function () { self.opened = false; }, 10); + } + } + + this.globalClose = function (_e) { + if (self.opened) return; + self.obj.classList.remove('open'); + self.list.setAttribute('style', 'display: none;'); + } + + this.list = document.createElement('div'); + this.list.className = 'valueList'; + + this.updateOptions = function () { + self.list.innerHTML = ""; + for (var i = 0; i < self.options.length; i++) { + self.optionElements[i] = document.createElement('div'); + self.optionElements[i].className = 'listValue'; + var valuePair = Array.isArray(self.options[i]) ? self.options[i] : self.options[i].split(':'); + var key = ""; + var value = ""; + if (valuePair.length == 1) { + key = valuePair[0]; + value = valuePair[0]; + } else { + key = valuePair[0]; + value = valuePair[1]; + } + self.keyValue[key] = value; + self.optionElements[i].innerHTML = value; + self.optionElements[i].setAttribute('data-value', value); + self.optionElements[i].setAttribute('data-key', key); + self.list.appendChild(self.optionElements[i]); + self.optionElements[i].addEventListener('mousedown', self.SelectValue); + } + + self.valueElement.innerHTML = self.keyValue[self.value]; + } + + this.valueElement = document.createElement('div'); + this.valueElement.className = 'dropdown-value'; + + this.updateOptions(); + + this.obj.appendChild(this.valueElement); + this.obj.appendChild(this.list); + this.valueElement.addEventListener('mousedown', this.openClick); + document.addEventListener('mousedown', this.globalClose); + + this.getValue = function () { + return self.value; + } + + this.updateValue = function (value) { + self.value = value; + self.valueElement.innerHTML = self.keyValue[value]; + } + + this.setOptions = function (options) { + self.options = options; + } + + return { + name: this.name, + value: this.getValue, + updateValue: this.updateValue, + updateOptions: this.updateOptions, + setOptions: this.setOptions + } +} + +// Add own menu +{ + var l_block = document.createElement('div'); + l_block.innerHTML = ` +

Leap Motion tracking

+
+
Enable tracking:
+
+
+
+
+ +
+
Tracking mode:
+
+
+
+
+ +
+
Desktop offset X:
+
+
+
+
+ +
+
Desktop offset Y:
+
+
+
+
+ +
+
Desktop offset Z:
+
+
+
+
+ +
+
Attach to head:
+
+ +
+
+ +
+
Head offset X:
+
+
+
+
+ +
+
Head offset Y:
+
+
+
+
+ +
+
Head offset Z:
+
+
+
+
+ +
+
Offset angle:
+
+
+
+
+ +
+
Fingers tracking only:
+
+
+
+
+ +
+
Model visibility:
+
+
+
+
+ `; + document.getElementById('settings-implementation').appendChild(l_block); + + // Update toggles in new menu block + var l_toggles = l_block.querySelectorAll('.inp_toggle'); + for (var i = 0; i < l_toggles.length; i++) { + g_modSettings[g_modSettings.length] = new inp_toggle_mod(l_toggles[i]); + } + + //Update dropdowns in new menu block + var l_dropdowns = l_block.querySelectorAll('.inp_dropdown'); + for (var i = 0; i < l_dropdowns.length; i++) { + g_modSettings[g_modSettings.length] = new inp_dropdown_mod(l_dropdowns[i]); + } + + // Update sliders in new menu block + var l_sliders = l_block.querySelectorAll('.inp_slider'); + for (var i = 0; i < l_sliders.length; i++) { + g_modSettings[g_modSettings.length] = new inp_slider_mod(l_sliders[i]); + } +} +