1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2026-01-01 18:23:32 +00:00

Changed LUA Update and Draw event to work for every device type

This commit is contained in:
SpoinkyNL 2016-11-06 21:53:27 +01:00
parent a40728244a
commit 31196fb518
11 changed files with 108 additions and 68 deletions

View File

@ -438,13 +438,14 @@
</Compile> </Compile>
<Compile Include="Profiles\Layers\Types\Mousemat\MousematPropertiesViewModel.cs" /> <Compile Include="Profiles\Layers\Types\Mousemat\MousematPropertiesViewModel.cs" />
<Compile Include="Profiles\Layers\Types\Mousemat\MousematType.cs" /> <Compile Include="Profiles\Layers\Types\Mousemat\MousematType.cs" />
<Compile Include="Profiles\LuaMouseWrapper.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaBrush.cs" /> <Compile Include="Profiles\Lua\Brushes\LuaBrush.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaColor.cs" /> <Compile Include="Profiles\Lua\Brushes\LuaColor.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaLinearGradientBrush.cs" /> <Compile Include="Profiles\Lua\Brushes\LuaLinearGradientBrush.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaRadialGradientBrush.cs" /> <Compile Include="Profiles\Lua\Brushes\LuaRadialGradientBrush.cs" />
<Compile Include="Profiles\Lua\Events\LuaKeyPressEventArgs.cs" /> <Compile Include="Profiles\Lua\Events\LuaKeyPressEventArgs.cs" />
<Compile Include="Profiles\Lua\Events\LuaProfileDrawingEventArgs.cs" /> <Compile Include="Profiles\Lua\Events\LuaDeviceDrawingEventArgs.cs" />
<Compile Include="Profiles\Lua\Events\LuaProfileUpdatingEventArgs.cs" /> <Compile Include="Profiles\Lua\Events\LuaDeviceUpdatingEventArgs.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaBrushWrapper.cs" /> <Compile Include="Profiles\Lua\Brushes\LuaBrushWrapper.cs" />
<Compile Include="Profiles\Lua\LuaDrawWrapper.cs" /> <Compile Include="Profiles\Lua\LuaDrawWrapper.cs" />
<Compile Include="Profiles\Lua\Events\LuaEventsWrapper.cs" /> <Compile Include="Profiles\Lua\Events\LuaEventsWrapper.cs" />

View File

@ -75,32 +75,32 @@ namespace Artemis.Models
using (var g = Graphics.FromImage(frame.KeyboardBitmap)) using (var g = Graphics.FromImage(frame.KeyboardBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), 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 // Render mice layer-by-layer
var devRec = new Rect(0, 0, 40, 40); var devRec = new Rect(0, 0, 40, 40);
using (var g = Graphics.FromImage(frame.MouseBitmap)) using (var g = Graphics.FromImage(frame.MouseBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel, Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel,
devRec, false, true); devRec, false, true, "mouse");
} }
// Render headsets layer-by-layer // Render headsets layer-by-layer
using (var g = Graphics.FromImage(frame.HeadsetBitmap)) using (var g = Graphics.FromImage(frame.HeadsetBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset), 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 // Render generic devices layer-by-layer
using (var g = Graphics.FromImage(frame.GenericBitmap)) using (var g = Graphics.FromImage(frame.GenericBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic), 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 // Render mousemats layer-by-layer
using (var g = Graphics.FromImage(frame.MousematBitmap)) using (var g = Graphics.FromImage(frame.MousematBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat),
DataModel, devRec, false, true); DataModel, devRec, false, true, "mousemat");
} }
// Trace debugging // Trace debugging

View File

@ -62,35 +62,32 @@ namespace Artemis.Modules.Effects.ProfilePreview
using (var g = Graphics.FromImage(frame.KeyboardBitmap)) using (var g = Graphics.FromImage(frame.KeyboardBitmap))
{ {
Profile.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Keyboard), 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 // Render mice layer-by-layer
var devRec = new Rect(0, 0, 40, 40); var devRec = new Rect(0, 0, 40, 40);
using (var g = Graphics.FromImage(frame.MouseBitmap)) using (var g = Graphics.FromImage(frame.MouseBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel, Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mouse), DataModel,
devRec, true, true); devRec, true, true, "mouse");
} }
// Render headsets layer-by-layer // Render headsets layer-by-layer
using (var g = Graphics.FromImage(frame.HeadsetBitmap)) using (var g = Graphics.FromImage(frame.HeadsetBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Headset),
DataModel, DataModel, devRec, true, true, "headset");
devRec, true, true);
} }
// Render generic devices layer-by-layer // Render generic devices layer-by-layer
using (var g = Graphics.FromImage(frame.GenericBitmap)) using (var g = Graphics.FromImage(frame.GenericBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Generic),
DataModel, DataModel, devRec, true, true, "generic");
devRec, true, true);
} }
// Render mousemats layer-by-layer // Render mousemats layer-by-layer
using (var g = Graphics.FromImage(frame.MousematBitmap)) using (var g = Graphics.FromImage(frame.MousematBitmap))
{ {
Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat), Profile?.DrawLayers(g, renderLayers.Where(rl => rl.LayerType.DrawType == DrawType.Mousemat),
DataModel, DataModel, devRec, true, true, "mousemat");
devRec, true, true);
} }
} }
} }

View File

@ -161,7 +161,7 @@ namespace Artemis.Modules.Effects.WindowsProfile
#endregion #endregion
#region Spotify #region Music
public void SetupSpotify() public void SetupSpotify()
{ {

View File

@ -5,15 +5,17 @@ using MoonSharp.Interpreter;
namespace Artemis.Profiles.Lua.Events namespace Artemis.Profiles.Lua.Events
{ {
[MoonSharpUserData] [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; DataModel = dataModel;
Preview = preview; Preview = preview;
Drawing = luaDrawWrapper; Drawing = luaDrawWrapper;
} }
public string DeviceType { get; set; }
public IDataModel DataModel { get; } public IDataModel DataModel { get; }
public bool Preview { get; } public bool Preview { get; }
public LuaDrawWrapper Drawing { get; set; } public LuaDrawWrapper Drawing { get; set; }

View File

@ -5,14 +5,16 @@ using MoonSharp.Interpreter;
namespace Artemis.Profiles.Lua.Events namespace Artemis.Profiles.Lua.Events
{ {
[MoonSharpUserData] [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; DataModel = dataModel;
Preview = preview; Preview = preview;
} }
public string DeviceType { get; set; }
public IDataModel DataModel { get; } public IDataModel DataModel { get; }
public bool Preview { get; } public bool Preview { get; }
} }

View File

@ -12,16 +12,17 @@ namespace Artemis.Profiles.Lua.Events
{ {
private readonly Logger _logger = LogManager.GetCurrentClassLogger(); private readonly Logger _logger = LogManager.GetCurrentClassLogger();
public readonly string InvokeLock = string.Empty; public readonly string InvokeLock = string.Empty;
public event EventHandler<LuaProfileUpdatingEventArgs> ProfileUpdating; public event EventHandler<LuaDeviceUpdatingEventArgs> DeviceUpdating;
public event EventHandler<LuaProfileDrawingEventArgs> ProfileDrawing; public event EventHandler<LuaDeviceDrawingEventArgs> DeviceDrawing;
public event EventHandler<LuaKeyPressEventArgs> KeyboardKeyPressed; public event EventHandler<LuaKeyPressEventArgs> KeyboardKeyPressed;
internal void InvokeProfileUpdate(ProfileModel profileModel, IDataModel dataModel, bool preview) internal void InvokeDeviceUpdate(ProfileModel profileModel, string deviceType, IDataModel dataModel,
bool preview)
{ {
try try
{ {
LuaInvoke(profileModel, () => OnProfileUpdating(new LuaProfileWrapper(profileModel), LuaInvoke(profileModel, () => OnDeviceUpdating(new LuaProfileWrapper(profileModel),
new LuaProfileUpdatingEventArgs(dataModel, preview))); new LuaDeviceUpdatingEventArgs(deviceType, dataModel, preview)));
} }
catch (Exception) 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 try
{ {
LuaInvoke(profileModel, () => OnProfileDrawing(new LuaProfileWrapper(profileModel), LuaInvoke(profileModel, () => OnDeviceDrawing(new LuaProfileWrapper(profileModel),
new LuaProfileDrawingEventArgs(dataModel, preview, new LuaDrawWrapper(c)))); new LuaDeviceDrawingEventArgs(deviceType, dataModel, preview, new LuaDrawWrapper(c))));
} }
catch (Exception) 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, protected virtual void OnKeyboardKeyPressed(LuaProfileWrapper profileModel, LuaKeyboardWrapper keyboard,

View File

@ -16,28 +16,30 @@ namespace Artemis.Profiles.Lua
{ {
private static readonly Logger Logger = LogManager.GetCurrentClassLogger(); private static readonly Logger Logger = LogManager.GetCurrentClassLogger();
private static readonly Script LuaScript = new Script(CoreModules.Preset_SoftSandbox); private static readonly Script LuaScript = new Script(CoreModules.Preset_SoftSandbox);
private static KeyboardProvider _keyboardProvider;
private static FileSystemWatcher _watcher; private static FileSystemWatcher _watcher;
public static ProfileModel ProfileModel { get; private set; } public static ProfileModel ProfileModel { get; private set; }
public static KeyboardProvider KeyboardProvider { get; private set; }
public static LuaProfileWrapper LuaProfileWrapper { get; private set; } public static LuaProfileWrapper LuaProfileWrapper { get; private set; }
public static LuaBrushWrapper LuaBrushWrapper { get; private set; } public static LuaBrushWrapper LuaBrushWrapper { get; private set; }
public static LuaKeyboardWrapper LuaKeyboardWrapper { 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 LuaEventsWrapper LuaEventsWrapper { get; private set; }
public static void SetupLua(ProfileModel profileModel, KeyboardProvider keyboardProvider) public static void SetupLua(ProfileModel profileModel, KeyboardProvider keyboardProvider)
{ {
Clear(); Clear();
if (profileModel == null || keyboardProvider == null) if ((profileModel == null) || (keyboardProvider == null))
return; return;
// Setup a new environment // Setup a new environment
_keyboardProvider = keyboardProvider; KeyboardProvider = keyboardProvider;
ProfileModel = profileModel; ProfileModel = profileModel;
LuaProfileWrapper = new LuaProfileWrapper(ProfileModel); LuaProfileWrapper = new LuaProfileWrapper(ProfileModel);
LuaBrushWrapper = new LuaBrushWrapper(); LuaBrushWrapper = new LuaBrushWrapper();
LuaKeyboardWrapper = new LuaKeyboardWrapper(keyboardProvider); LuaKeyboardWrapper = new LuaKeyboardWrapper(keyboardProvider);
LuaMouseWrapper = new LuaMouseWrapper();
LuaEventsWrapper = new LuaEventsWrapper(); LuaEventsWrapper = new LuaEventsWrapper();
LuaScript.Options.DebugPrint = LuaPrint; LuaScript.Options.DebugPrint = LuaPrint;
@ -45,7 +47,10 @@ namespace Artemis.Profiles.Lua
LuaScript.Globals["Events"] = LuaEventsWrapper; LuaScript.Globals["Events"] = LuaEventsWrapper;
LuaScript.Globals["Brushes"] = LuaBrushWrapper; LuaScript.Globals["Brushes"] = LuaBrushWrapper;
LuaScript.Globals["Keyboard"] = LuaKeyboardWrapper; LuaScript.Globals["Keyboard"] = LuaKeyboardWrapper;
LuaScript.Globals["Mouse"] = LuaMouseWrapper;
if (ProfileModel == null)
return;
if (ProfileModel.LuaScript.IsNullOrEmpty()) if (ProfileModel.LuaScript.IsNullOrEmpty())
return; return;
@ -82,6 +87,25 @@ namespace Artemis.Profiles.Lua
#endregion #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 #region Editor
public static void OpenEditor() public static void OpenEditor()
@ -134,29 +158,10 @@ namespace Artemis.Profiles.Lua
ProfileProvider.AddOrUpdate(ProfileModel); ProfileProvider.AddOrUpdate(ProfileModel);
if (_keyboardProvider != null) if (KeyboardProvider != null)
SetupLua(ProfileModel, _keyboardProvider); SetupLua(ProfileModel, KeyboardProvider);
} }
#endregion #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);
}
}
} }
} }

View File

@ -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;
}
}
}

View File

@ -99,8 +99,9 @@ namespace Artemis.Profiles
/// <param name="rect">A rectangle matching the current keyboard's size on a scale of 4, used for clipping</param> /// <param name="rect">A rectangle matching the current keyboard's size on a scale of 4, used for clipping</param>
/// <param name="preview">Indicates wheter the layer is drawn as a preview, ignoring dynamic properties</param> /// <param name="preview">Indicates wheter the layer is drawn as a preview, ignoring dynamic properties</param>
/// <param name="updateAnimations">Wheter or not to update the layer's animations</param> /// <param name="updateAnimations">Wheter or not to update the layer's animations</param>
/// <param name="updateType">The type of layers that are being updated, for reference in LUA</param>
internal void DrawLayers(Graphics g, IEnumerable<LayerModel> renderLayers, IDataModel dataModel, Rect rect, internal void DrawLayers(Graphics g, IEnumerable<LayerModel> renderLayers, IDataModel dataModel, Rect rect,
bool preview, bool updateAnimations, bool triggerLua = false) bool preview, bool updateAnimations, string updateType)
{ {
var visual = new DrawingVisual(); var visual = new DrawingVisual();
var layerModels = renderLayers.ToList(); var layerModels = renderLayers.ToList();
@ -113,16 +114,12 @@ namespace Artemis.Profiles
// Update the layers // Update the layers
foreach (var layerModel in layerModels) foreach (var layerModel in layerModels)
layerModel.Update(dataModel, preview, updateAnimations); layerModel.Update(dataModel, preview, updateAnimations);
LuaWrapper.LuaEventsWrapper?.InvokeDeviceUpdate(this, updateType, dataModel, preview);
if (triggerLua)
LuaWrapper.LuaEventsWrapper?.InvokeProfileUpdate(this, dataModel, preview);
// Draw the layers // Draw the layers
foreach (var layerModel in layerModels) foreach (var layerModel in layerModels)
layerModel.Draw(dataModel, c, preview, updateAnimations); layerModel.Draw(dataModel, c, preview, updateAnimations);
LuaWrapper.LuaEventsWrapper?.InvokeDeviceDraw(this, updateType, dataModel, preview, c);
if (triggerLua)
LuaWrapper.LuaEventsWrapper?.InvokeProfileDraw(this, dataModel, preview, c);
// Remove the clip // Remove the clip
c.Pop(); c.Pop();

View File

@ -53,7 +53,7 @@ namespace Artemis.ViewModels.Profiles
if (_blurProgress > 2) if (_blurProgress > 2)
_blurProgress = 0; _blurProgress = 0;
_blurProgress = _blurProgress + 0.025; _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)) if (SelectedProfile == null || _deviceManager.ActiveKeyboard == null || (!ShowAll && SelectedLayer == null))
{ {
@ -92,7 +92,7 @@ namespace Artemis.ViewModels.Profiles
return; 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 // Draw the selection outline and resize indicator
if (SelectedLayer != null && SelectedLayer.MustDraw()) 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)); 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 // Remove the clip
drawingContext.Pop(); drawingContext.Pop();