From 31196fb518ba7ad6bb5f454ae9135966ad0b2ed7 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sun, 6 Nov 2016 21:53:27 +0100 Subject: [PATCH] Changed LUA Update and Draw event to work for every device type --- Artemis/Artemis/Artemis.csproj | 5 +- Artemis/Artemis/Models/EffectModel.cs | 10 ++-- .../ProfilePreview/ProfilePreviewModel.cs | 13 ++--- .../WindowsProfile/WindowsProfileModel.cs | 2 +- ...ntArgs.cs => LuaDeviceDrawingEventArgs.cs} | 6 +- ...tArgs.cs => LuaDeviceUpdatingEventArgs.cs} | 6 +- .../Profiles/Lua/Events/LuaEventsWrapper.cs | 28 +++++----- Artemis/Artemis/Profiles/Lua/LuaWrapper.cs | 55 ++++++++++--------- Artemis/Artemis/Profiles/LuaMouseWrapper.cs | 33 +++++++++++ Artemis/Artemis/Profiles/ProfileModel.cs | 11 ++-- .../ViewModels/Profiles/ProfileViewModel.cs | 7 ++- 11 files changed, 108 insertions(+), 68 deletions(-) rename Artemis/Artemis/Profiles/Lua/Events/{LuaProfileDrawingEventArgs.cs => LuaDeviceDrawingEventArgs.cs} (60%) rename Artemis/Artemis/Profiles/Lua/Events/{LuaProfileUpdatingEventArgs.cs => LuaDeviceUpdatingEventArgs.cs} (57%) create mode 100644 Artemis/Artemis/Profiles/LuaMouseWrapper.cs diff --git a/Artemis/Artemis/Artemis.csproj b/Artemis/Artemis/Artemis.csproj index d2fc48833..dbc607650 100644 --- a/Artemis/Artemis/Artemis.csproj +++ b/Artemis/Artemis/Artemis.csproj @@ -438,13 +438,14 @@ + - - + + diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index 5a455f702..ee14df07a 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -75,32 +75,32 @@ namespace Artemis.Models using (var g = Graphics.FromImage(frame.KeyboardBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), - DataModel, keyboardRect, false, true, true); + DataModel, keyboardRect, false, true, "keyboard"); } // Render mice layer-by-layer var devRec = new Rect(0, 0, 40, 40); using (var g = Graphics.FromImage(frame.MouseBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel, - devRec, false, true); + devRec, false, true, "mouse"); } // Render headsets layer-by-layer using (var g = Graphics.FromImage(frame.HeadsetBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset), - DataModel, devRec, false, true); + DataModel, devRec, false, true, "headset"); } // Render generic devices layer-by-layer using (var g = Graphics.FromImage(frame.GenericBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic), - DataModel, devRec, false, true); + DataModel, devRec, false, true, "generic"); } // Render mousemats layer-by-layer using (var g = Graphics.FromImage(frame.MousematBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat), - DataModel, devRec, false, true); + DataModel, devRec, false, true, "mousemat"); } // Trace debugging diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 7fb9fa7b0..d25ce2bf5 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -62,35 +62,32 @@ namespace Artemis.Modules.Effects.ProfilePreview using (var g = Graphics.FromImage(frame.KeyboardBitmap)) { Profile.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), - DataModel, keyboardRect, true, true, true); + DataModel, keyboardRect, true, true, "keyboard"); } // Render mice layer-by-layer var devRec = new Rect(0, 0, 40, 40); using (var g = Graphics.FromImage(frame.MouseBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel, - devRec, true, true); + devRec, true, true, "mouse"); } // Render headsets layer-by-layer using (var g = Graphics.FromImage(frame.HeadsetBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset), - DataModel, - devRec, true, true); + DataModel, devRec, true, true, "headset"); } // Render generic devices layer-by-layer using (var g = Graphics.FromImage(frame.GenericBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic), - DataModel, - devRec, true, true); + DataModel, devRec, true, true, "generic"); } // Render mousemats layer-by-layer using (var g = Graphics.FromImage(frame.MousematBitmap)) { Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat), - DataModel, - devRec, true, true); + DataModel, devRec, true, true, "mousemat"); } } } diff --git a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs index e967b4608..53fe4b775 100644 --- a/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs +++ b/Artemis/Artemis/Modules/Effects/WindowsProfile/WindowsProfileModel.cs @@ -161,7 +161,7 @@ namespace Artemis.Modules.Effects.WindowsProfile #endregion - #region Spotify + #region Music public void SetupSpotify() { diff --git a/Artemis/Artemis/Profiles/Lua/Events/LuaProfileDrawingEventArgs.cs b/Artemis/Artemis/Profiles/Lua/Events/LuaDeviceDrawingEventArgs.cs similarity index 60% rename from Artemis/Artemis/Profiles/Lua/Events/LuaProfileDrawingEventArgs.cs rename to Artemis/Artemis/Profiles/Lua/Events/LuaDeviceDrawingEventArgs.cs index 8043af8e2..3e6b03f81 100644 --- a/Artemis/Artemis/Profiles/Lua/Events/LuaProfileDrawingEventArgs.cs +++ b/Artemis/Artemis/Profiles/Lua/Events/LuaDeviceDrawingEventArgs.cs @@ -5,15 +5,17 @@ using MoonSharp.Interpreter; namespace Artemis.Profiles.Lua.Events { [MoonSharpUserData] - public class LuaProfileDrawingEventArgs : EventArgs + public class LuaDeviceDrawingEventArgs : EventArgs { - public LuaProfileDrawingEventArgs(IDataModel dataModel, bool preview, LuaDrawWrapper luaDrawWrapper) + public LuaDeviceDrawingEventArgs(string deviceType, IDataModel dataModel, bool preview, LuaDrawWrapper luaDrawWrapper) { + DeviceType = deviceType; DataModel = dataModel; Preview = preview; Drawing = luaDrawWrapper; } + public string DeviceType { get; set; } public IDataModel DataModel { get; } public bool Preview { get; } public LuaDrawWrapper Drawing { get; set; } diff --git a/Artemis/Artemis/Profiles/Lua/Events/LuaProfileUpdatingEventArgs.cs b/Artemis/Artemis/Profiles/Lua/Events/LuaDeviceUpdatingEventArgs.cs similarity index 57% rename from Artemis/Artemis/Profiles/Lua/Events/LuaProfileUpdatingEventArgs.cs rename to Artemis/Artemis/Profiles/Lua/Events/LuaDeviceUpdatingEventArgs.cs index 04da54a97..1b9c3b256 100644 --- a/Artemis/Artemis/Profiles/Lua/Events/LuaProfileUpdatingEventArgs.cs +++ b/Artemis/Artemis/Profiles/Lua/Events/LuaDeviceUpdatingEventArgs.cs @@ -5,14 +5,16 @@ using MoonSharp.Interpreter; namespace Artemis.Profiles.Lua.Events { [MoonSharpUserData] - public class LuaProfileUpdatingEventArgs : EventArgs + public class LuaDeviceUpdatingEventArgs : EventArgs { - public LuaProfileUpdatingEventArgs(IDataModel dataModel, bool preview) + public LuaDeviceUpdatingEventArgs(string deviceType, IDataModel dataModel, bool preview) { + DeviceType = deviceType; DataModel = dataModel; Preview = preview; } + public string DeviceType { get; set; } public IDataModel DataModel { get; } public bool Preview { get; } } diff --git a/Artemis/Artemis/Profiles/Lua/Events/LuaEventsWrapper.cs b/Artemis/Artemis/Profiles/Lua/Events/LuaEventsWrapper.cs index 6924c3ff2..fd48f066f 100644 --- a/Artemis/Artemis/Profiles/Lua/Events/LuaEventsWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/Events/LuaEventsWrapper.cs @@ -12,16 +12,17 @@ namespace Artemis.Profiles.Lua.Events { private readonly Logger _logger = LogManager.GetCurrentClassLogger(); public readonly string InvokeLock = string.Empty; - public event EventHandler ProfileUpdating; - public event EventHandler ProfileDrawing; + public event EventHandler DeviceUpdating; + public event EventHandler DeviceDrawing; public event EventHandler KeyboardKeyPressed; - internal void InvokeProfileUpdate(ProfileModel profileModel, IDataModel dataModel, bool preview) + internal void InvokeDeviceUpdate(ProfileModel profileModel, string deviceType, IDataModel dataModel, + bool preview) { try { - LuaInvoke(profileModel, () => OnProfileUpdating(new LuaProfileWrapper(profileModel), - new LuaProfileUpdatingEventArgs(dataModel, preview))); + LuaInvoke(profileModel, () => OnDeviceUpdating(new LuaProfileWrapper(profileModel), + new LuaDeviceUpdatingEventArgs(deviceType, dataModel, preview))); } catch (Exception) { @@ -29,12 +30,13 @@ namespace Artemis.Profiles.Lua.Events } } - internal void InvokeProfileDraw(ProfileModel profileModel, IDataModel dataModel, bool preview, DrawingContext c) + internal void InvokeDeviceDraw(ProfileModel profileModel, string deviceType, IDataModel dataModel, bool preview, + DrawingContext c) { try { - LuaInvoke(profileModel, () => OnProfileDrawing(new LuaProfileWrapper(profileModel), - new LuaProfileDrawingEventArgs(dataModel, preview, new LuaDrawWrapper(c)))); + LuaInvoke(profileModel, () => OnDeviceDrawing(new LuaProfileWrapper(profileModel), + new LuaDeviceDrawingEventArgs(deviceType, dataModel, preview, new LuaDrawWrapper(c)))); } catch (Exception) { @@ -46,7 +48,7 @@ namespace Artemis.Profiles.Lua.Events { try { - LuaInvoke(profileModel, () => OnKeyboardKeyPressed(new LuaProfileWrapper(profileModel), + LuaInvoke(profileModel, () => OnKeyboardKeyPressed(new LuaProfileWrapper(profileModel), keyboard, new LuaKeyPressEventArgs(key, x, y))); } catch (Exception) @@ -78,14 +80,14 @@ namespace Artemis.Profiles.Lua.Events } } - protected virtual void OnProfileUpdating(LuaProfileWrapper profileModel, LuaProfileUpdatingEventArgs e) + protected virtual void OnDeviceUpdating(LuaProfileWrapper profileModel, LuaDeviceUpdatingEventArgs e) { - ProfileUpdating?.Invoke(profileModel, e); + DeviceUpdating?.Invoke(profileModel, e); } - protected virtual void OnProfileDrawing(LuaProfileWrapper profileModel, LuaProfileDrawingEventArgs e) + protected virtual void OnDeviceDrawing(LuaProfileWrapper profileModel, LuaDeviceDrawingEventArgs e) { - ProfileDrawing?.Invoke(profileModel, e); + DeviceDrawing?.Invoke(profileModel, e); } protected virtual void OnKeyboardKeyPressed(LuaProfileWrapper profileModel, LuaKeyboardWrapper keyboard, diff --git a/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs b/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs index 72aa1457c..d38332f0a 100644 --- a/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs +++ b/Artemis/Artemis/Profiles/Lua/LuaWrapper.cs @@ -16,28 +16,30 @@ namespace Artemis.Profiles.Lua { private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Script LuaScript = new Script(CoreModules.Preset_SoftSandbox); - private static KeyboardProvider _keyboardProvider; private static FileSystemWatcher _watcher; public static ProfileModel ProfileModel { get; private set; } + public static KeyboardProvider KeyboardProvider { get; private set; } public static LuaProfileWrapper LuaProfileWrapper { get; private set; } public static LuaBrushWrapper LuaBrushWrapper { get; private set; } public static LuaKeyboardWrapper LuaKeyboardWrapper { get; private set; } + public static LuaMouseWrapper LuaMouseWrapper { get; set; } public static LuaEventsWrapper LuaEventsWrapper { get; private set; } public static void SetupLua(ProfileModel profileModel, KeyboardProvider keyboardProvider) { Clear(); - if (profileModel == null || keyboardProvider == null) + if ((profileModel == null) || (keyboardProvider == null)) return; // Setup a new environment - _keyboardProvider = keyboardProvider; + KeyboardProvider = keyboardProvider; ProfileModel = profileModel; LuaProfileWrapper = new LuaProfileWrapper(ProfileModel); LuaBrushWrapper = new LuaBrushWrapper(); LuaKeyboardWrapper = new LuaKeyboardWrapper(keyboardProvider); + LuaMouseWrapper = new LuaMouseWrapper(); LuaEventsWrapper = new LuaEventsWrapper(); LuaScript.Options.DebugPrint = LuaPrint; @@ -45,7 +47,10 @@ namespace Artemis.Profiles.Lua LuaScript.Globals["Events"] = LuaEventsWrapper; LuaScript.Globals["Brushes"] = LuaBrushWrapper; LuaScript.Globals["Keyboard"] = LuaKeyboardWrapper; - + LuaScript.Globals["Mouse"] = LuaMouseWrapper; + + if (ProfileModel == null) + return; if (ProfileModel.LuaScript.IsNullOrEmpty()) return; @@ -82,6 +87,25 @@ namespace Artemis.Profiles.Lua #endregion + public static void Clear() + { + lock (LuaScript) + { + // Clear old fields/properties + KeyboardProvider = null; + ProfileModel = null; + LuaKeyboardWrapper?.Dispose(); + LuaKeyboardWrapper = null; + + LuaScript.Globals.Clear(); + LuaScript.Registry.Clear(); + LuaScript.Registry.RegisterConstants(); + LuaScript.Registry.RegisterCoreModules(CoreModules.Preset_SoftSandbox); + LuaScript.Globals.RegisterConstants(); + LuaScript.Globals.RegisterCoreModules(CoreModules.Preset_SoftSandbox); + } + } + #region Editor public static void OpenEditor() @@ -134,29 +158,10 @@ namespace Artemis.Profiles.Lua ProfileProvider.AddOrUpdate(ProfileModel); - if (_keyboardProvider != null) - SetupLua(ProfileModel, _keyboardProvider); + if (KeyboardProvider != null) + SetupLua(ProfileModel, KeyboardProvider); } #endregion - - public static void Clear() - { - lock (LuaScript) - { - // Clear old fields/properties - _keyboardProvider = null; - ProfileModel = null; - LuaKeyboardWrapper?.Dispose(); - LuaKeyboardWrapper = null; - - LuaScript.Globals.Clear(); - LuaScript.Registry.Clear(); - LuaScript.Registry.RegisterConstants(); - LuaScript.Registry.RegisterCoreModules(CoreModules.Preset_SoftSandbox); - LuaScript.Globals.RegisterConstants(); - LuaScript.Globals.RegisterCoreModules(CoreModules.Preset_SoftSandbox); - } - } } } \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/LuaMouseWrapper.cs b/Artemis/Artemis/Profiles/LuaMouseWrapper.cs new file mode 100644 index 000000000..acc0fdc81 --- /dev/null +++ b/Artemis/Artemis/Profiles/LuaMouseWrapper.cs @@ -0,0 +1,33 @@ +using System.Runtime.InteropServices; +using System.Windows; +using MoonSharp.Interpreter; + +namespace Artemis.Profiles +{ + [MoonSharpUserData] + public class LuaMouseWrapper + { + public int Y => (int) GetMousePosition().Y; + + public int X => (int) GetMousePosition().X; + + + [DllImport("user32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + internal static extern bool GetCursorPos(ref Win32Point pt); + + public static Point GetMousePosition() + { + var w32Mouse = new Win32Point(); + GetCursorPos(ref w32Mouse); + return new Point(w32Mouse.X, w32Mouse.Y); + } + + [StructLayout(LayoutKind.Sequential)] + internal struct Win32Point + { + public int X; + public int Y; + } + } +} \ No newline at end of file diff --git a/Artemis/Artemis/Profiles/ProfileModel.cs b/Artemis/Artemis/Profiles/ProfileModel.cs index 162fcbbd3..5c70ddc1e 100644 --- a/Artemis/Artemis/Profiles/ProfileModel.cs +++ b/Artemis/Artemis/Profiles/ProfileModel.cs @@ -99,8 +99,9 @@ namespace Artemis.Profiles /// A rectangle matching the current keyboard's size on a scale of 4, used for clipping /// Indicates wheter the layer is drawn as a preview, ignoring dynamic properties /// Wheter or not to update the layer's animations + /// The type of layers that are being updated, for reference in LUA internal void DrawLayers(Graphics g, IEnumerable renderLayers, IDataModel dataModel, Rect rect, - bool preview, bool updateAnimations, bool triggerLua = false) + bool preview, bool updateAnimations, string updateType) { var visual = new DrawingVisual(); var layerModels = renderLayers.ToList(); @@ -113,16 +114,12 @@ namespace Artemis.Profiles // Update the layers foreach (var layerModel in layerModels) layerModel.Update(dataModel, preview, updateAnimations); - - if (triggerLua) - LuaWrapper.LuaEventsWrapper?.InvokeProfileUpdate(this, dataModel, preview); + LuaWrapper.LuaEventsWrapper?.InvokeDeviceUpdate(this, updateType, dataModel, preview); // Draw the layers foreach (var layerModel in layerModels) layerModel.Draw(dataModel, c, preview, updateAnimations); - - if (triggerLua) - LuaWrapper.LuaEventsWrapper?.InvokeProfileDraw(this, dataModel, preview, c); + LuaWrapper.LuaEventsWrapper?.InvokeDeviceDraw(this, updateType, dataModel, preview, c); // Remove the clip c.Pop(); diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 4786ea954..13028c138 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -53,7 +53,7 @@ namespace Artemis.ViewModels.Profiles if (_blurProgress > 2) _blurProgress = 0; _blurProgress = _blurProgress + 0.025; - BlurRadius = (Math.Sin(_blurProgress * Math.PI) + 1) * 10 + 10; + BlurRadius = (Math.Sin(_blurProgress*Math.PI) + 1)*10 + 10; if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || (!ShowAll && SelectedLayer == null)) { @@ -92,7 +92,7 @@ namespace Artemis.ViewModels.Profiles return; } - var pen = new Pen(new SolidColorBrush((Color)accentColor), 0.4); + var pen = new Pen(new SolidColorBrush((Color) accentColor), 0.4); // Draw the selection outline and resize indicator if (SelectedLayer != null && SelectedLayer.MustDraw()) @@ -115,7 +115,8 @@ namespace Artemis.ViewModels.Profiles new Point(layerRect.BottomRight.X - 0.7, layerRect.BottomRight.Y - 0.7)); } - LuaWrapper.LuaEventsWrapper?.InvokeProfileDraw(SelectedProfile, new ProfilePreviewDataModel(), true, drawingContext); + LuaWrapper.LuaEventsWrapper?.InvokeDeviceDraw(SelectedProfile, "preview", new ProfilePreviewDataModel(), + true, drawingContext); // Remove the clip drawingContext.Pop();