1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +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 Include="Profiles\Layers\Types\Mousemat\MousematPropertiesViewModel.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\LuaColor.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaLinearGradientBrush.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaRadialGradientBrush.cs" />
<Compile Include="Profiles\Lua\Events\LuaKeyPressEventArgs.cs" />
<Compile Include="Profiles\Lua\Events\LuaProfileDrawingEventArgs.cs" />
<Compile Include="Profiles\Lua\Events\LuaProfileUpdatingEventArgs.cs" />
<Compile Include="Profiles\Lua\Events\LuaDeviceDrawingEventArgs.cs" />
<Compile Include="Profiles\Lua\Events\LuaDeviceUpdatingEventArgs.cs" />
<Compile Include="Profiles\Lua\Brushes\LuaBrushWrapper.cs" />
<Compile Include="Profiles\Lua\LuaDrawWrapper.cs" />
<Compile Include="Profiles\Lua\Events\LuaEventsWrapper.cs" />

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -12,16 +12,17 @@ namespace Artemis.Profiles.Lua.Events
{
private readonly Logger _logger = LogManager.GetCurrentClassLogger();
public readonly string InvokeLock = string.Empty;
public event EventHandler<LuaProfileUpdatingEventArgs> ProfileUpdating;
public event EventHandler<LuaProfileDrawingEventArgs> ProfileDrawing;
public event EventHandler<LuaDeviceUpdatingEventArgs> DeviceUpdating;
public event EventHandler<LuaDeviceDrawingEventArgs> DeviceDrawing;
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
{
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,

View File

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

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="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="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,
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();

View File

@ -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();