1
0
mirror of https://github.com/Artemis-RGB/Artemis synced 2025-12-13 05:48:35 +00:00

Much more performance improvements

This commit is contained in:
SpoinkyNL 2016-06-06 14:55:34 +02:00
parent b7423ad6d6
commit 49ca507a5c
44 changed files with 382 additions and 432 deletions

View File

@ -7,6 +7,6 @@ namespace Artemis.InjectionFactories
{ {
public interface ILayerEditorVmFactory public interface ILayerEditorVmFactory
{ {
LayerEditorViewModel CreateLayerEditorVm(IGameDataModel gameDataModel, LayerModel layer); LayerEditorViewModel CreateLayerEditorVm(IDataModel dataModel, LayerModel layer);
} }
} }

View File

@ -120,19 +120,29 @@ namespace Artemis.Managers
renderEffect.Update(); renderEffect.Update();
// Get ActiveEffect's bitmap // Get ActiveEffect's bitmap
var bitmap = renderEffect.Initialized Bitmap bitmap = null;
? renderEffect.GenerateBitmap() System.Windows.Media.Brush mouseBrush = null;
: null; System.Windows.Media.Brush headsetBrush = null;
var mice = _deviceManager.MiceProviders.Where(m => m.CanUse).ToList();
var headsets = _deviceManager.HeadsetProviders.Where(m => m.CanUse).ToList();
// Draw enabled overlays on top if (renderEffect.Initialized)
renderEffect.Render(out bitmap, out mouseBrush, out headsetBrush, mice.Any(), headsets.Any());
// Draw enabled overlays on top of the renderEffect
foreach (var overlayModel in _effectManager.EnabledOverlays) foreach (var overlayModel in _effectManager.EnabledOverlays)
{ {
overlayModel.Update(); overlayModel.Update();
bitmap = bitmap != null overlayModel.RenderOverlay(ref bitmap, ref mouseBrush, ref headsetBrush, mice.Any(), headsets.Any());
? overlayModel.GenerateBitmap(bitmap)
: overlayModel.GenerateBitmap();
} }
// Update mice and headsets
foreach (var mouse in mice)
mouse.UpdateDevice(mouseBrush);
foreach (var headset in headsets)
headset.UpdateDevice(headsetBrush);
// If no bitmap was generated this frame is done
if (bitmap == null) if (bitmap == null)
return; return;
@ -146,16 +156,8 @@ namespace Artemis.Managers
bitmap = fixedBmp; bitmap = fixedBmp;
// If it exists, send bitmap to the device // Update the keyboard
_deviceManager.ActiveKeyboard?.DrawBitmap(bitmap); _deviceManager.ActiveKeyboard?.DrawBitmap(bitmap);
foreach (var mouse in _deviceManager.MiceProviders.Where(m => m.CanUse))
mouse.UpdateDevice(renderEffect.GenerateMouseBrush());
foreach (var headset in _deviceManager.HeadsetProviders.Where(h => h.CanUse))
headset.UpdateDevice(renderEffect.GenerateHeadsetBrush());
// debugging TODO: Disable when window isn't shown (in Debug VM, or get rid of it, w/e)
//_events.PublishOnUIThread(new ChangeBitmap(bitmap));
} }
} }
} }

View File

@ -77,8 +77,8 @@ namespace Artemis.Managers
// LoopManager might be running, this method won't do any harm in that case. // LoopManager might be running, this method won't do any harm in that case.
_loopManager.Start(); _loopManager.Start();
if (!ReferenceEquals(ProfilePreviewModel.SelectedProfile, activePreview.ProfileEditor.SelectedProfile)) if (!ReferenceEquals(ProfilePreviewModel.Profile, activePreview.ProfileEditor.SelectedProfile))
ProfilePreviewModel.SelectedProfile = activePreview.ProfileEditor.SelectedProfile; ProfilePreviewModel.Profile = activePreview.ProfileEditor.SelectedProfile;
} }
} }
} }

View File

@ -1,6 +1,10 @@
using System; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models.Interfaces;
using Artemis.Models.Profiles;
using Brush = System.Windows.Media.Brush; using Brush = System.Windows.Media.Brush;
namespace Artemis.Models namespace Artemis.Models
@ -13,9 +17,10 @@ namespace Artemis.Models
public MainManager MainManager; public MainManager MainManager;
public string Name; public string Name;
protected EffectModel(MainManager mainManager) protected EffectModel(MainManager mainManager, IDataModel dataModel)
{ {
MainManager = mainManager; MainManager = mainManager;
DataModel = dataModel;
} }
public abstract void Dispose(); public abstract void Dispose();
@ -23,13 +28,33 @@ namespace Artemis.Models
// Called on creation // Called on creation
public abstract void Enable(); public abstract void Enable();
// Called every iteration // Called every frame
public abstract void Update(); public abstract void Update();
// Called after every update public IDataModel DataModel { get; set; }
public abstract Bitmap GenerateBitmap(); public ProfileModel Profile { get; set; }
public abstract Brush GenerateMouseBrush(); // Called after every update
public abstract Brush GenerateHeadsetBrush(); public virtual void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets)
{
keyboard = null;
mouse = null;
headset = null;
if (Profile == null || DataModel == null)
return;
// Get all enabled layers who's conditions are met
var renderLayers = GetRenderLayers(renderMice, renderHeadsets);
// Render the keyboard layer-by-layer
keyboard = Profile.GenerateBitmap(renderLayers, DataModel, MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(4), false, true);
// Render the first enabled mouse (will default to null if renderMice was false)
mouse = Profile.GenerateBrush(renderLayers.FirstOrDefault(l => l.LayerType == LayerType.Mouse), DataModel);
// Render the first enabled headset (will default to null if renderHeadsets was false)
headset = Profile.GenerateBrush(renderLayers.FirstOrDefault(l => l.LayerType == LayerType.Headset), DataModel);
}
public abstract List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets);
} }
} }

View File

@ -1,22 +1,19 @@
using Artemis.Managers; using System.Collections.Generic;
using Artemis.Managers;
using Artemis.Models.Interfaces; using Artemis.Models.Interfaces;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
using Artemis.Modules.Games.RocketLeague;
namespace Artemis.Models namespace Artemis.Models
{ {
public abstract class GameModel : EffectModel public abstract class GameModel : EffectModel
{ {
protected GameModel(MainManager mainManager, GameSettings settings, IGameDataModel gameDataModel) : base(mainManager) protected GameModel(MainManager mainManager, GameSettings settings, IDataModel dataModel) : base(mainManager, dataModel)
{ {
Settings = settings; Settings = settings;
GameDataModel = gameDataModel;
} }
public GameSettings Settings { get; set; } public GameSettings Settings { get; set; }
public bool Enabled { get; set; } public bool Enabled { get; set; }
public string ProcessName { get; set; } public string ProcessName { get; set; }
public IGameDataModel GameDataModel { get; set; }
public ProfileModel Profile { get; set; }
} }
} }

View File

@ -1,6 +1,6 @@
namespace Artemis.Models.Interfaces namespace Artemis.Models.Interfaces
{ {
public interface IGameDataModel public interface IDataModel
{ {
} }
} }

View File

@ -1,5 +1,6 @@
using System.Drawing; using System.Drawing;
using Artemis.Managers; using Artemis.Managers;
using Brush = System.Windows.Media.Brush;
namespace Artemis.Models namespace Artemis.Models
{ {
@ -8,7 +9,7 @@ namespace Artemis.Models
private bool _enabled; private bool _enabled;
public string ProcessName; public string ProcessName;
protected OverlayModel(MainManager mainManager) : base(mainManager) protected OverlayModel(MainManager mainManager) : base(mainManager, null)
{ {
} }
@ -28,6 +29,7 @@ namespace Artemis.Models
} }
} }
public abstract Bitmap GenerateBitmap(Bitmap bitmap); public abstract void RenderOverlay(ref Bitmap keyboard, ref Brush mouse, ref Brush headset, bool renderMice,
bool renderHeadsets);
} }
} }

View File

@ -12,7 +12,7 @@ namespace Artemis.Models.Profiles
public string Operator { get; set; } public string Operator { get; set; }
public string Type { get; set; } public string Type { get; set; }
public bool ConditionMet<T>(IGameDataModel subject) public bool ConditionMet<T>(IDataModel subject)
{ {
if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type)) if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type))
return false; return false;

View File

@ -38,51 +38,31 @@ namespace Artemis.Models.Profiles
[XmlIgnore] [XmlIgnore]
public GifImage GifImage { get; set; } public GifImage GifImage { get; set; }
public bool ConditionsMet<T>(IGameDataModel dataModel) public bool ConditionsMet<T>(IDataModel dataModel)
{ {
return Enabled && Properties.Conditions.All(cm => cm.ConditionMet<T>(dataModel)); return Enabled && Properties.Conditions.All(cm => cm.ConditionMet<T>(dataModel));
} }
public void Draw<T>(IGameDataModel dataModel, DrawingContext c, bool preview, bool updateAnimations) public void Draw(IDataModel dataModel, DrawingContext c, bool preview, bool updateAnimations)
{ {
// Don't draw when the layer is disabled if (LayerType != LayerType.Keyboard && LayerType != LayerType.KeyboardGif)
if (!Enabled)
return; return;
// Preview simply shows the properties as they are. When not previewing they are applied // Preview simply shows the properties as they are. When not previewing they are applied
AppliedProperties appliedProperties; var appliedProperties = !preview
if (!preview) ? Properties.GetAppliedProperties(dataModel)
{ : Properties.GetAppliedProperties(dataModel, true);
if (!ConditionsMet<T>(dataModel))
return; // Don't draw the layer when not previewing and the conditions arent met
appliedProperties = Properties.GetAppliedProperties(dataModel);
}
else
appliedProperties = Properties.GetAppliedProperties(dataModel, true);
// Update animations on layer types that support them // Update animations
if (LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) AnimationUpdater.UpdateAnimation((KeyboardPropertiesModel) Properties, updateAnimations);
{
AnimationUpdater.UpdateAnimation((KeyboardPropertiesModel) Properties, updateAnimations); if (LayerType == LayerType.Keyboard)
} Drawer.Draw(c, (KeyboardPropertiesModel) Properties, appliedProperties);
else if (LayerType == LayerType.KeyboardGif)
switch (LayerType) GifImage = Drawer.DrawGif(c, (KeyboardPropertiesModel) Properties, appliedProperties, GifImage);
{
// Folders are drawn recursively
case LayerType.Folder:
foreach (var layerModel in Children.OrderByDescending(l => l.Order))
layerModel.Draw<T>(dataModel, c, preview, updateAnimations);
break;
case LayerType.Keyboard:
Drawer.Draw(c, (KeyboardPropertiesModel) Properties, appliedProperties);
break;
case LayerType.KeyboardGif:
GifImage = Drawer.DrawGif(c, (KeyboardPropertiesModel)Properties, appliedProperties, GifImage);
break;
}
} }
public Brush GenerateBrush<T>(LayerType type, IGameDataModel dataModel, bool preview, bool updateAnimations) public Brush GenerateBrush<T>(LayerType type, IDataModel dataModel, bool preview, bool updateAnimations)
{ {
if (!Enabled) if (!Enabled)
return null; return null;
@ -249,6 +229,39 @@ namespace Artemis.Models.Profiles
} }
#endregion #endregion
/// <summary>
/// Generates a flat list containing all layers that must be rendered on the keyboard,
/// the first mouse layer to be rendered and the first headset layer to be rendered
/// </summary>
/// <typeparam name="T">The game data model to base the conditions on</typeparam>
/// <param name="dataModel">Instance of said game data model</param>
/// <param name="includeMice">Whether or not to include mice in the list</param>
/// <param name="includeHeadsets">Whether or not to include headsets in the list</param>
/// <param name="ignoreConditions"></param>
/// <returns>A flat list containing all layers that must be rendered</returns>
public List<LayerModel> GetRenderLayers<T>(IDataModel dataModel, bool includeMice, bool includeHeadsets, bool ignoreConditions = false)
{
var layers = new List<LayerModel>();
foreach (var layerModel in Children.OrderByDescending(c => c.Order))
{
if (!layerModel.Enabled ||
!includeMice && layerModel.LayerType == LayerType.Mouse ||
!includeHeadsets && layerModel.LayerType == LayerType.Headset)
continue;
if (!ignoreConditions)
{
if (!layerModel.ConditionsMet<T>(dataModel))
continue;
}
layers.Add(layerModel);
layers.AddRange(layerModel.GetRenderLayers<T>(dataModel, includeMice, includeHeadsets, ignoreConditions));
}
return layers;
}
} }
public enum LayerType public enum LayerType

View File

@ -66,7 +66,7 @@ namespace Artemis.Models.Profiles
Layers[i].Order = i; Layers[i].Order = i;
} }
public Bitmap GenerateBitmap<T>(Rect keyboardRect, IGameDataModel gameDataModel, bool preview, public Bitmap GenerateBitmap<T>(Rect keyboardRect, IDataModel dataModel, bool preview,
bool updateAnimations) bool updateAnimations)
{ {
var visual = new DrawingVisual(); var visual = new DrawingVisual();
@ -78,22 +78,22 @@ namespace Artemis.Models.Profiles
// Draw the layers // Draw the layers
foreach (var layerModel in Layers.OrderByDescending(l => l.Order)) foreach (var layerModel in Layers.OrderByDescending(l => l.Order))
layerModel.Draw<T>(gameDataModel, c, preview, updateAnimations); layerModel.Draw(dataModel, c, preview, updateAnimations);
// Remove the clip // Remove the clip
c.Pop(); c.Pop();
} }
return ImageUtilities.DrawinVisualToBitmap(visual, keyboardRect); return ImageUtilities.DrawinVisualToBitmap(visual, keyboardRect);
} }
public Brush GenerateBrush<T>(IGameDataModel gameDataModel, LayerType type, bool preview, bool updateAnimations) public Brush GenerateBrush<T>(IDataModel dataModel, LayerType type, bool preview, bool updateAnimations)
{ {
Brush result = null; Brush result = null;
// Draw the layers // Draw the layers
foreach (var layerModel in Layers.OrderByDescending(l => l.Order)) foreach (var layerModel in Layers.OrderByDescending(l => l.Order))
{ {
var generated = layerModel.GenerateBrush<T>(type, gameDataModel, preview, updateAnimations); var generated = layerModel.GenerateBrush<T>(type, dataModel, preview, updateAnimations);
if (generated != null) if (generated != null)
result = generated; result = generated;
} }
@ -116,6 +116,39 @@ namespace Artemis.Models.Profiles
return layers; return layers;
} }
/// <summary>
/// Generates a flat list containing all layers that must be rendered on the keyboard,
/// the first mouse layer to be rendered and the first headset layer to be rendered
/// </summary>
/// <typeparam name="T">The game data model to base the conditions on</typeparam>
/// <param name="dataModel">Instance of said game data model</param>
/// <param name="includeMice">Whether or not to include mice in the list</param>
/// <param name="includeHeadsets">Whether or not to include headsets in the list</param>
/// <param name="ignoreConditions"></param>
/// <returns>A flat list containing all layers that must be rendered</returns>
public List<LayerModel> GetRenderLayers<T>(IDataModel dataModel, bool includeMice, bool includeHeadsets, bool ignoreConditions = false)
{
var layers = new List<LayerModel>();
foreach (var layerModel in Layers.OrderByDescending(l => l.Order))
{
if (!layerModel.Enabled ||
!includeMice && layerModel.LayerType == LayerType.Mouse ||
!includeHeadsets && layerModel.LayerType == LayerType.Headset)
continue;
if (!ignoreConditions)
{
if (!layerModel.ConditionsMet<T>(dataModel))
continue;
}
layers.Add(layerModel);
layers.AddRange(layerModel.GetRenderLayers<T>(dataModel, includeMice, includeHeadsets, ignoreConditions));
}
return layers;
}
/// <summary> /// <summary>
/// Looks at all the layers wthin the profile and makes sure they are within boundaries of the given rectangle /// Looks at all the layers wthin the profile and makes sure they are within boundaries of the given rectangle
/// </summary> /// </summary>
@ -137,5 +170,51 @@ namespace Artemis.Models.Profiles
layer.Properties = props; layer.Properties = props;
} }
} }
/// <summary>
/// Generates a bitmap showing all the provided layers of type Keyboard and KeyboardGif
/// </summary>
/// <param name="renderLayers">The layers to render</param>
/// <param name="dataModel">The data model to base the layer's properties on</param>
/// <param name="keyboardRect">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>
/// <returns>The generated bitmap</returns>
internal Bitmap GenerateBitmap(List<LayerModel> renderLayers, IDataModel dataModel, Rect keyboardRect,
bool preview,
bool updateAnimations)
{
var visual = new DrawingVisual();
using (var c = visual.RenderOpen())
{
// Setup the DrawingVisual's size
c.PushClip(new RectangleGeometry(keyboardRect));
c.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect);
// Draw the layers
foreach (var layerModel in renderLayers
.Where(l => l.LayerType == LayerType.Keyboard ||
l.LayerType == LayerType.KeyboardGif))
{
layerModel.Draw(dataModel, c, preview, updateAnimations);
}
// Remove the clip
c.Pop();
}
return ImageUtilities.DrawinVisualToBitmap(visual, keyboardRect);
}
/// <summary>
/// Generates a brush out of the given layer, for usage with mice and headsets
/// </summary>
/// <param name="layerModel">The layer to base the brush on</param>
/// <param name="dataModel">The game data model to base the layer's properties on</param>
/// <returns>The generated brush</returns>
public Brush GenerateBrush(LayerModel layerModel, IDataModel dataModel)
{
return layerModel?.Properties.GetAppliedProperties(dataModel).Brush;
}
} }
} }

View File

@ -37,7 +37,7 @@ namespace Artemis.Models.Profiles.Properties
/// </summary> /// </summary>
public LayerPropertyOptions LayerPropertyOptions { get; set; } public LayerPropertyOptions LayerPropertyOptions { get; set; }
internal void ApplyProperty(IGameDataModel dataModel, AppliedProperties properties) internal void ApplyProperty(IDataModel dataModel, AppliedProperties properties)
{ {
if (LayerPropertyType == LayerPropertyType.PercentageOf) if (LayerPropertyType == LayerPropertyType.PercentageOf)
ApplyPercentageOf(dataModel, properties, PercentageSource); ApplyPercentageOf(dataModel, properties, PercentageSource);
@ -45,7 +45,7 @@ namespace Artemis.Models.Profiles.Properties
ApplyPercentageOfProperty(dataModel, properties); ApplyPercentageOfProperty(dataModel, properties);
} }
private void ApplyPercentageOf(IGameDataModel dataModel, AppliedProperties properties, double src) private void ApplyPercentageOf(IDataModel dataModel, AppliedProperties properties, double src)
{ {
if (GameProperty == null) if (GameProperty == null)
return; return;
@ -95,7 +95,7 @@ namespace Artemis.Models.Profiles.Properties
properties.Opacity = 1.0 - properties.Opacity; properties.Opacity = 1.0 - properties.Opacity;
} }
private void ApplyPercentageOfProperty(IGameDataModel dataModel, AppliedProperties properties) private void ApplyPercentageOfProperty(IDataModel dataModel, AppliedProperties properties)
{ {
var value = dataModel.GetPropValue<int>(PercentageProperty); var value = dataModel.GetPropValue<int>(PercentageProperty);
ApplyPercentageOf(dataModel, properties, value); ApplyPercentageOf(dataModel, properties, value);

View File

@ -5,7 +5,7 @@ namespace Artemis.Models.Profiles.Properties
{ {
public class FolderPropertiesModel : LayerPropertiesModel public class FolderPropertiesModel : LayerPropertiesModel
{ {
public override AppliedProperties GetAppliedProperties(IGameDataModel dataModel, bool ignoreDynamic = false) public override AppliedProperties GetAppliedProperties(IDataModel dataModel, bool ignoreDynamic = false)
{ {
return new AppliedProperties(); return new AppliedProperties();
} }

View File

@ -4,9 +4,9 @@ namespace Artemis.Models.Profiles.Properties
{ {
public class HeadsetPropertiesModel : LayerPropertiesModel public class HeadsetPropertiesModel : LayerPropertiesModel
{ {
public override AppliedProperties GetAppliedProperties(IGameDataModel dataModel, bool ignoreDynamic = false) public override AppliedProperties GetAppliedProperties(IDataModel dataModel, bool ignoreDynamic = false)
{ {
return new AppliedProperties(); return new AppliedProperties {Brush = Brush};
} }
} }
} }

View File

@ -35,7 +35,7 @@ namespace Artemis.Models.Profiles.Properties
return new Rect(X*scale, Y*scale, Width*scale, Height*scale); return new Rect(X*scale, Y*scale, Width*scale, Height*scale);
} }
public override AppliedProperties GetAppliedProperties(IGameDataModel dataModel, bool ignoreDynamic = false) public override AppliedProperties GetAppliedProperties(IDataModel dataModel, bool ignoreDynamic = false)
{ {
var applied = new AppliedProperties var applied = new AppliedProperties
{ {

View File

@ -49,7 +49,7 @@ namespace Artemis.Models.Profiles.Properties
} }
} }
public abstract AppliedProperties GetAppliedProperties(IGameDataModel dataModel, bool ignoreDynamic = false); public abstract AppliedProperties GetAppliedProperties(IDataModel dataModel, bool ignoreDynamic = false);
} }
public struct AppliedProperties public struct AppliedProperties

View File

@ -4,9 +4,9 @@ namespace Artemis.Models.Profiles.Properties
{ {
public class MousePropertiesModel : LayerPropertiesModel public class MousePropertiesModel : LayerPropertiesModel
{ {
public override AppliedProperties GetAppliedProperties(IGameDataModel dataModel, bool ignoreDynamic = false) public override AppliedProperties GetAppliedProperties(IDataModel dataModel, bool ignoreDynamic = false)
{ {
return new AppliedProperties(); return new AppliedProperties { Brush = Brush };
} }
} }
} }

View File

@ -1,15 +1,12 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using System.IO;
using System.Linq; using System.Linq;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using Kaliko.ImageLibrary;
using Kaliko.ImageLibrary.Filters;
using Brush = System.Windows.Media.Brush;
namespace Artemis.Modules.Effects.AmbientLightning namespace Artemis.Modules.Effects.AmbientLightning
{ {
@ -22,7 +19,7 @@ namespace Artemis.Modules.Effects.AmbientLightning
private KeyboardRectangle _topRect; private KeyboardRectangle _topRect;
public AmbientLightningEffectModel(MainManager mainManager, AmbientLightningEffectSettings settings) public AmbientLightningEffectModel(MainManager mainManager, AmbientLightningEffectSettings settings)
: base(mainManager) : base(mainManager, null)
{ {
Name = "Ambient Lightning"; Name = "Ambient Lightning";
Settings = settings; Settings = settings;
@ -115,33 +112,7 @@ namespace Artemis.Modules.Effects.AmbientLightning
} }
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{
var bitmap = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap))
{
var i = 0;
foreach (var rectangle in _rectangles)
{
g.FillRectangle(new SolidBrush(_colors[i]), rectangle);
i++;
}
}
var test = new KalikoImage(bitmap);
test.ApplyFilter(new GaussianBlurFilter(8f));
var ms = new MemoryStream();
test.SaveBmp(ms);
ms.Position = 0;
return new Bitmap(ms);
}
public override Brush GenerateMouseBrush()
{
return null;
}
public override Brush GenerateHeadsetBrush()
{ {
return null; return null;
} }

View File

@ -5,6 +5,7 @@ using System.Drawing.Drawing2D;
using System.Linq; using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles;
using Artemis.Modules.Effects.AudioVisualizer.Utilities; using Artemis.Modules.Effects.AudioVisualizer.Utilities;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
@ -23,7 +24,7 @@ namespace Artemis.Modules.Effects.AudioVisualizer
private int _sensitivity; private int _sensitivity;
private IWaveIn _waveIn; private IWaveIn _waveIn;
public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager) public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager, null)
{ {
Settings = settings; Settings = settings;
Name = "Audiovisualizer"; Name = "Audiovisualizer";
@ -137,38 +138,7 @@ namespace Artemis.Modules.Effects.AudioVisualizer
} }
_generating = false; _generating = false;
} }
public override Bitmap GenerateBitmap()
{
if (SpectrumData == null || SoundRectangles == null)
return null;
// Lock the _spectrumData array while busy with it
_generating = true;
var bitmap = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(bitmap))
{
foreach (var soundRectangle in SoundRectangles)
soundRectangle.Draw(g);
}
_generating = false;
return bitmap;
}
// TODO: Brush according to avg volume
public override Brush GenerateMouseBrush()
{
return null;
}
// TODO: Brush according to avg volume left/right
public override Brush GenerateHeadsetBrush()
{
return null;
}
private void OnDataAvailable(object sender, WaveInEventArgs e) private void OnDataAvailable(object sender, WaveInEventArgs e)
{ {
var buffer = e.Buffer; var buffer = e.Buffer;
@ -212,5 +182,32 @@ namespace Artemis.Modules.Effects.AudioVisualizer
SpectrumData.Add((byte) y); SpectrumData.Add((byte) y);
} }
} }
public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{
return null;
}
public override void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets)
{
keyboard = null;
mouse = null;
headset = null;
if (SpectrumData == null || SoundRectangles == null)
return;
// Lock the _spectrumData array while busy with it
_generating = true;
keyboard = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(keyboard))
{
foreach (var soundRectangle in SoundRectangles)
soundRectangle.Draw(g);
}
_generating = false;
}
} }
} }

View File

@ -3,6 +3,7 @@ using System.Drawing;
using System.Drawing.Drawing2D; using System.Drawing.Drawing2D;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using Brush = System.Windows.Media.Brush; using Brush = System.Windows.Media.Brush;
@ -11,7 +12,7 @@ namespace Artemis.Modules.Effects.Debug
// TODO: Remove // TODO: Remove
internal class DebugEffectModel : EffectModel internal class DebugEffectModel : EffectModel
{ {
public DebugEffectModel(MainManager mainManager, DebugEffectSettings settings) : base(mainManager) public DebugEffectModel(MainManager mainManager, DebugEffectSettings settings) : base(mainManager, null)
{ {
Name = "Debug Effect"; Name = "Debug Effect";
Settings = settings; Settings = settings;
@ -53,26 +54,22 @@ namespace Artemis.Modules.Effects.Debug
Scale = Settings.Scale; Scale = Settings.Scale;
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
var bitmap = new Bitmap(21*Scale, 6*Scale); return null;
}
using (var g = Graphics.FromImage(bitmap)) public override void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets)
{
mouse = null;
headset = null;
keyboard = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(keyboard))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
KeyboardRectangle.Draw(g); KeyboardRectangle.Draw(g);
} }
return bitmap;
}
public override Brush GenerateMouseBrush()
{
return null;
}
public override Brush GenerateHeadsetBrush()
{
return null;
} }
} }
} }

View File

@ -1,4 +1,6 @@
using System.Drawing; using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Interfaces; using Artemis.Models.Interfaces;
@ -9,20 +11,14 @@ namespace Artemis.Modules.Effects.ProfilePreview
{ {
public class ProfilePreviewModel : EffectModel public class ProfilePreviewModel : EffectModel
{ {
private readonly ProfilePreviewDataModel _previewDataModel; public ProfilePreviewModel(MainManager mainManager) : base(mainManager, new ProfilePreviewDataModel())
public ProfilePreviewModel(MainManager mainManager) : base(mainManager)
{ {
Name = "Profile Preview"; Name = "Profile Preview";
_previewDataModel = new ProfilePreviewDataModel();
} }
public ProfileModel SelectedProfile { get; set; }
public override void Dispose() public override void Dispose()
{ {
Initialized = false; Initialized = false;
SelectedProfile = null;
} }
public override void Enable() public override void Enable()
@ -34,39 +30,33 @@ namespace Artemis.Modules.Effects.ProfilePreview
{ {
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
if (MainManager.DeviceManager.ActiveKeyboard == null) return Profile.GetRenderLayers<ProfilePreviewDataModel>(DataModel, renderMice, renderHeadsets, true);
return null;
var bitmap = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(4);
if (SelectedProfile == null)
return bitmap;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(4);
var image = SelectedProfile.GenerateBitmap<ProfilePreviewDataModel>(keyboardRect, _previewDataModel, true, true);
if (image == null)
return null;
// Draw on top of everything else
using (var g = Graphics.FromImage(bitmap))
g.DrawImage(image, 0, 0);
return bitmap;
} }
public override Brush GenerateMouseBrush() public override void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets)
{ {
return SelectedProfile?.GenerateBrush<ProfilePreviewDataModel>(_previewDataModel, LayerType.Mouse, true, true); keyboard = null;
} mouse = null;
headset = null;
public override Brush GenerateHeadsetBrush() if (Profile == null || DataModel == null)
{ return;
return SelectedProfile?.GenerateBrush<ProfilePreviewDataModel>(_previewDataModel, LayerType.Headset, true, true);
// Get all enabled layers who's conditions are met
var renderLayers = GetRenderLayers(renderMice, renderHeadsets);
// Render the keyboard layer-by-layer
keyboard = Profile.GenerateBitmap(renderLayers, DataModel, MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(4), true, true);
// Render the first enabled mouse (will default to null if renderMice was false)
mouse = Profile.GenerateBrush(renderLayers.FirstOrDefault(l => l.LayerType == LayerType.Mouse), DataModel);
// Render the first enabled headset (will default to null if renderHeadsets was false)
headset = Profile.GenerateBrush(renderLayers.FirstOrDefault(l => l.LayerType == LayerType.Headset), DataModel);
} }
} }
public class ProfilePreviewDataModel : IGameDataModel public class ProfilePreviewDataModel : IDataModel
{ {
} }
} }

View File

@ -7,6 +7,7 @@ using Artemis.DeviceProviders.Corsair;
using Artemis.DeviceProviders.Logitech.Utilities; using Artemis.DeviceProviders.Logitech.Utilities;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles;
using Artemis.Utilities; using Artemis.Utilities;
using Brush = System.Windows.Media.Brush; using Brush = System.Windows.Media.Brush;
@ -17,7 +18,7 @@ namespace Artemis.Modules.Effects.TypeWave
private readonly List<Wave> _waves; private readonly List<Wave> _waves;
private Color _randomColor; private Color _randomColor;
public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager) public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager, null)
{ {
Name = "TypeWave"; Name = "TypeWave";
_waves = new List<Wave>(); _waves = new List<Wave>();
@ -92,13 +93,22 @@ namespace Artemis.Modules.Effects.TypeWave
} }
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
if (_waves.Count == 0) return null;
return null; }
var bitmap = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale); public override void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets)
using (var g = Graphics.FromImage(bitmap)) {
keyboard = null;
mouse = null;
headset = null;
if (_waves.Count == 0)
return;
keyboard = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale);
using (var g = Graphics.FromImage(keyboard))
{ {
g.Clear(Color.Transparent); g.Clear(Color.Transparent);
g.SmoothingMode = SmoothingMode.HighQuality; g.SmoothingMode = SmoothingMode.HighQuality;
@ -110,7 +120,7 @@ namespace Artemis.Modules.Effects.TypeWave
if (_waves[i].Size == 0) if (_waves[i].Size == 0)
continue; continue;
var path = new GraphicsPath(); var path = new GraphicsPath();
path.AddEllipse(_waves[i].Point.X - _waves[i].Size/2, _waves[i].Point.Y - _waves[i].Size/2, path.AddEllipse(_waves[i].Point.X - _waves[i].Size / 2, _waves[i].Point.Y - _waves[i].Size / 2,
_waves[i].Size, _waves[i].Size); _waves[i].Size, _waves[i].Size);
Color fillColor; Color fillColor;
@ -121,7 +131,7 @@ namespace Artemis.Modules.Effects.TypeWave
var pthGrBrush = new PathGradientBrush(path) var pthGrBrush = new PathGradientBrush(path)
{ {
SurroundColors = new[] {_waves[i].Color}, SurroundColors = new[] { _waves[i].Color },
CenterColor = fillColor CenterColor = fillColor
}; };
@ -129,21 +139,10 @@ namespace Artemis.Modules.Effects.TypeWave
pthGrBrush.FocusScales = new PointF(0.3f, 0.8f); pthGrBrush.FocusScales = new PointF(0.3f, 0.8f);
g.FillPath(pthGrBrush, path); g.FillPath(pthGrBrush, path);
g.DrawEllipse(new Pen(pthGrBrush, 1), _waves[i].Point.X - _waves[i].Size/2, g.DrawEllipse(new Pen(pthGrBrush, 1), _waves[i].Point.X - _waves[i].Size / 2,
_waves[i].Point.Y - _waves[i].Size/2, _waves[i].Size, _waves[i].Size); _waves[i].Point.Y - _waves[i].Size / 2, _waves[i].Size, _waves[i].Size);
} }
} }
return bitmap;
}
public override Brush GenerateMouseBrush()
{
return null;
}
public override Brush GenerateHeadsetBrush()
{
return null;
} }
} }

View File

@ -2,7 +2,7 @@
namespace Artemis.Modules.Games.CounterStrike namespace Artemis.Modules.Games.CounterStrike
{ {
public class CounterStrikeDataModel : IGameDataModel public class CounterStrikeDataModel : IDataModel
{ {
public Provider provider { get; set; } public Provider provider { get; set; }
public Map map { get; set; } public Map map { get; set; }

View File

@ -1,5 +1,7 @@
using System; using System;
using System.Collections.Generic;
using System.Drawing; using System.Drawing;
using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
@ -44,31 +46,6 @@ namespace Artemis.Modules.Games.CounterStrike
// TODO: Set up active weapon in the datamodel // TODO: Set up active weapon in the datamodel
} }
public override Bitmap GenerateBitmap()
{
if (Profile == null || GameDataModel == null)
return null;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale);
return Profile.GenerateBitmap<CounterStrikeDataModel>(keyboardRect, GameDataModel, false, true);
}
public override Brush GenerateMouseBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<CounterStrikeDataModel>(GameDataModel, LayerType.Mouse, false, true);
}
public override Brush GenerateHeadsetBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<CounterStrikeDataModel>(GameDataModel, LayerType.Headset, false, true);
}
public void HandleGameData(object sender, GameDataReceivedEventArgs e) public void HandleGameData(object sender, GameDataReceivedEventArgs e)
{ {
var jsonString = e.Json.ToString(); var jsonString = e.Json.ToString();
@ -80,7 +57,7 @@ namespace Artemis.Modules.Games.CounterStrike
// Parse the JSON // Parse the JSON
try try
{ {
GameDataModel = JsonConvert.DeserializeObject<CounterStrikeDataModel>(jsonString); DataModel = JsonConvert.DeserializeObject<CounterStrikeDataModel>(jsonString);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -89,5 +66,10 @@ namespace Artemis.Modules.Games.CounterStrike
} }
} }
public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{
return Profile.GetRenderLayers<CounterStrikeDataModel>(DataModel, renderMice, renderHeadsets);
}
} }
} }

View File

@ -2,7 +2,7 @@
namespace Artemis.Modules.Games.Dota2 namespace Artemis.Modules.Games.Dota2
{ {
public class Dota2DataModel : IGameDataModel public class Dota2DataModel : IDataModel
{ {
public Provider provider { get; set; } public Provider provider { get; set; }
public Map map { get; set; } public Map map { get; set; }

View File

@ -1,10 +1,9 @@
using System.Drawing; using System.Collections.Generic;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
using Artemis.Utilities.GameState; using Artemis.Utilities.GameState;
using Newtonsoft.Json; using Newtonsoft.Json;
using Brush = System.Windows.Media.Brush;
namespace Artemis.Modules.Games.Dota2 namespace Artemis.Modules.Games.Dota2
{ {
@ -45,38 +44,12 @@ namespace Artemis.Modules.Games.Dota2
private void UpdateDay() private void UpdateDay()
{ {
var dataModel = GameDataModel as Dota2DataModel; var dataModel = DataModel as Dota2DataModel;
if (dataModel?.map?.daytime == null) if (dataModel?.map?.daytime == null)
return; return;
var timeLeft = 240 - dataModel.map.clock_time%240; var timeLeft = 240 - dataModel.map.clock_time%240;
dataModel.map.dayCyclePercentage = (int) (100.00 / 240 * timeLeft); dataModel.map.dayCyclePercentage = (int) (100.00/240*timeLeft);
}
public override Bitmap GenerateBitmap()
{
if (Profile == null || GameDataModel == null)
return null;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale);
return Profile.GenerateBitmap<Dota2DataModel>(keyboardRect, GameDataModel, false, true);
}
public override Brush GenerateMouseBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<Dota2DataModel>(GameDataModel, LayerType.Mouse, false, true);
}
public override Brush GenerateHeadsetBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<Dota2DataModel>(GameDataModel, LayerType.Headset, false, true);
} }
public void HandleGameData(object sender, GameDataReceivedEventArgs e) public void HandleGameData(object sender, GameDataReceivedEventArgs e)
@ -88,7 +61,12 @@ namespace Artemis.Modules.Games.Dota2
return; return;
// Parse the JSON // Parse the JSON
GameDataModel = JsonConvert.DeserializeObject<Dota2DataModel>(jsonString); DataModel = JsonConvert.DeserializeObject<Dota2DataModel>(jsonString);
}
public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{
return Profile.GetRenderLayers<Dota2DataModel>(DataModel, renderMice, renderHeadsets);
} }
} }
} }

View File

@ -2,7 +2,7 @@ using Artemis.Models.Interfaces;
namespace Artemis.Modules.Games.Overwatch namespace Artemis.Modules.Games.Overwatch
{ {
public class OverwatchDataModel : IGameDataModel public class OverwatchDataModel : IDataModel
{ {
public OverwatchStatus Status { get; set; } public OverwatchStatus Status { get; set; }
public OverwatchCharacter Character { get; set; } public OverwatchCharacter Character { get; set; }

View File

@ -4,11 +4,11 @@ using System.Linq;
using Artemis.Events; using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Interfaces;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.DataReaders; using Artemis.Utilities.DataReaders;
using Caliburn.Micro; using Caliburn.Micro;
using Brush = System.Windows.Media.Brush;
using Color = System.Windows.Media.Color; using Color = System.Windows.Media.Color;
namespace Artemis.Modules.Games.Overwatch namespace Artemis.Modules.Games.Overwatch
@ -31,6 +31,11 @@ namespace Artemis.Modules.Games.Overwatch
LoadOverwatchCharacters(); LoadOverwatchCharacters();
} }
public OverwatchModel(MainManager mainManager, GameSettings settings, IDataModel dataModel)
: base(mainManager, settings, dataModel)
{
}
public List<CharacterColor> OverwatchCharacters { get; set; } public List<CharacterColor> OverwatchCharacters { get; set; }
public MmfReader MmfReader { get; set; } public MmfReader MmfReader { get; set; }
@ -85,7 +90,7 @@ namespace Artemis.Modules.Games.Overwatch
public override void Update() public override void Update()
{ {
var gameDataModel = (OverwatchDataModel) GameDataModel; var gameDataModel = (OverwatchDataModel) DataModel;
var colors = MmfReader.GetColorArray(); var colors = MmfReader.GetColorArray();
if (colors == null) if (colors == null)
return; return;
@ -128,29 +133,9 @@ namespace Artemis.Modules.Games.Overwatch
gameDataModel.UltimateReady = !characterMatch.Color.Equals(colors[2, 2]); gameDataModel.UltimateReady = !characterMatch.Color.Equals(colors[2, 2]);
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
if (Profile == null || GameDataModel == null) return Profile.GetRenderLayers<OverwatchDataModel>(DataModel, renderMice, renderHeadsets);
return null;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale);
return Profile.GenerateBitmap<OverwatchDataModel>(keyboardRect, GameDataModel, false, true);
}
public override Brush GenerateMouseBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return null;
return Profile.GenerateBrush<OverwatchDataModel>(GameDataModel, LayerType.Mouse, false, true);
}
public override Brush GenerateHeadsetBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return null;
return Profile.GenerateBrush<OverwatchDataModel>(GameDataModel, LayerType.Headset, false, true);
} }
} }

View File

@ -2,7 +2,7 @@
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
{ {
public class RocketLeagueDataModel : IGameDataModel public class RocketLeagueDataModel : IDataModel
{ {
public int Boost { get; set; } public int Boost { get; set; }
} }

View File

@ -1,5 +1,5 @@
using System; using System;
using System.Drawing; using System.Collections.Generic;
using System.Linq; using System.Linq;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
@ -8,7 +8,6 @@ using Artemis.Settings;
using Artemis.Utilities; using Artemis.Utilities;
using Artemis.Utilities.Memory; using Artemis.Utilities.Memory;
using Newtonsoft.Json; using Newtonsoft.Json;
using Brush = System.Windows.Media.Brush;
namespace Artemis.Modules.Games.RocketLeague namespace Artemis.Modules.Games.RocketLeague
{ {
@ -45,7 +44,7 @@ namespace Artemis.Modules.Games.RocketLeague
var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName); var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName);
if (tempProcess == null) if (tempProcess == null)
return; return;
_memory = new Memory(tempProcess); _memory = new Memory(tempProcess);
Initialized = true; Initialized = true;
@ -53,45 +52,25 @@ namespace Artemis.Modules.Games.RocketLeague
public override void Update() public override void Update()
{ {
if (Profile == null || GameDataModel == null || _memory == null) if (Profile == null || DataModel == null || _memory == null)
return; return;
var offsets = _pointer.GameAddresses.First(ga => ga.Description == "Boost").ToString(); var offsets = _pointer.GameAddresses.First(ga => ga.Description == "Boost").ToString();
var boostAddress = _memory.GetAddress("\"RocketLeague.exe\"" + offsets); var boostAddress = _memory.GetAddress("\"RocketLeague.exe\"" + offsets);
var boostFloat = _memory.ReadFloat(boostAddress)*100/3; var boostFloat = _memory.ReadFloat(boostAddress)*100/3;
((RocketLeagueDataModel) GameDataModel).Boost = (int) Math.Ceiling(boostFloat); ((RocketLeagueDataModel) DataModel).Boost = (int) Math.Ceiling(boostFloat);
// Take care of any reading errors resulting in an OutOfMemory on draw // Take care of any reading errors resulting in an OutOfMemory on draw
if (((RocketLeagueDataModel) GameDataModel).Boost < 0) if (((RocketLeagueDataModel) DataModel).Boost < 0)
((RocketLeagueDataModel) GameDataModel).Boost = 0; ((RocketLeagueDataModel) DataModel).Boost = 0;
if (((RocketLeagueDataModel) GameDataModel).Boost > 100) if (((RocketLeagueDataModel) DataModel).Boost > 100)
((RocketLeagueDataModel) GameDataModel).Boost = 100; ((RocketLeagueDataModel) DataModel).Boost = 100;
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
if (Profile == null || GameDataModel == null) return Profile.GetRenderLayers<RocketLeagueDataModel>(DataModel, renderMice, renderHeadsets);
return null;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale);
return Profile.GenerateBitmap<RocketLeagueDataModel>(keyboardRect, GameDataModel, false, true);
}
public override Brush GenerateMouseBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<RocketLeagueDataModel>(GameDataModel, LayerType.Mouse, false, true);
}
public override Brush GenerateHeadsetBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<RocketLeagueDataModel>(GameDataModel, LayerType.Headset, false, true);
} }
} }
} }

View File

@ -2,7 +2,7 @@
namespace Artemis.Modules.Games.TheDivision namespace Artemis.Modules.Games.TheDivision
{ {
public class TheDivisionDataModel : IGameDataModel public class TheDivisionDataModel : IDataModel
{ {
public TheDivisionDataModel() public TheDivisionDataModel()
{ {

View File

@ -74,7 +74,7 @@ namespace Artemis.Modules.Games.TheDivision
// Parses Division key data to game data // Parses Division key data to game data
private void InterpertrateDivisionKey(IReadOnlyList<int> parts) private void InterpertrateDivisionKey(IReadOnlyList<int> parts)
{ {
var gameDataModel = (TheDivisionDataModel) GameDataModel; var gameDataModel = (TheDivisionDataModel) DataModel;
var keyCode = parts[1]; var keyCode = parts[1];
var rPer = parts[2]; var rPer = parts[2];
var gPer = parts[3]; var gPer = parts[3];
@ -131,29 +131,9 @@ namespace Artemis.Modules.Games.TheDivision
// DataModel updating is done whenever a pipe message is received // DataModel updating is done whenever a pipe message is received
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
if (Profile == null || GameDataModel == null) return Profile.GetRenderLayers<TheDivisionDataModel>(DataModel, renderMice, renderHeadsets);
return null;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale);
return Profile.GenerateBitmap<TheDivisionDataModel>(keyboardRect, GameDataModel, false, true);
}
public override Brush GenerateMouseBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<TheDivisionDataModel>(GameDataModel, LayerType.Mouse, false, true);
}
public override Brush GenerateHeadsetBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<TheDivisionDataModel>(GameDataModel, LayerType.Headset, false, true);
} }
} }
} }

View File

@ -2,7 +2,7 @@ using Artemis.Models.Interfaces;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
public class Witcher3DataModel : IGameDataModel public class Witcher3DataModel : IDataModel
{ {
public WitcherSign WitcherSign { get; set; } public WitcherSign WitcherSign { get; set; }
} }

View File

@ -9,7 +9,6 @@ using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
using Artemis.Utilities.Keyboard; using Artemis.Utilities.Keyboard;
using Brush = System.Windows.Media.Brush;
namespace Artemis.Modules.Games.Witcher3 namespace Artemis.Modules.Games.Witcher3
{ {
@ -67,7 +66,7 @@ namespace Artemis.Modules.Games.Witcher3
public override void Update() public override void Update()
{ {
var gameDataModel = (Witcher3DataModel) GameDataModel; var gameDataModel = (Witcher3DataModel) DataModel;
// Witcher effect is very static and reads from disk, don't want to update too often. // Witcher effect is very static and reads from disk, don't want to update too often.
if (_updateSw.ElapsedMilliseconds < 500) if (_updateSw.ElapsedMilliseconds < 500)
return; return;
@ -106,29 +105,9 @@ namespace Artemis.Modules.Games.Witcher3
} }
} }
public override Bitmap GenerateBitmap() public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{ {
if (Profile == null || GameDataModel == null) return Profile.GetRenderLayers<Witcher3DataModel>(DataModel, renderMice, renderHeadsets);
return null;
var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale);
return Profile.GenerateBitmap<Witcher3DataModel>(keyboardRect, GameDataModel, false, true);
}
public override Brush GenerateMouseBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<Witcher3DataModel>(GameDataModel, LayerType.Mouse, false, true);
}
public override Brush GenerateHeadsetBrush()
{
if (Profile == null || GameDataModel == null)
return null;
return Profile.GenerateBrush<Witcher3DataModel>(GameDataModel, LayerType.Headset, false, true);
} }
} }
} }

View File

@ -1,8 +1,10 @@
using System.Drawing; using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices; using System.Runtime.InteropServices;
using System.Windows.Forms; using System.Windows.Forms;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models; using Artemis.Models;
using Artemis.Models.Profiles;
using NAudio.CoreAudioApi; using NAudio.CoreAudioApi;
using Brush = System.Windows.Media.Brush; using Brush = System.Windows.Media.Brush;
@ -62,24 +64,7 @@ namespace Artemis.Modules.Overlays.VolumeDisplay
} }
} }
public override Bitmap GenerateBitmap() public Bitmap GenerateBitmap(Bitmap bitmap)
{
return GenerateBitmap(MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(4));
}
// TODO: Color according to volume
public override Brush GenerateMouseBrush()
{
return null;
}
// TODO: Color according to volume
public override Brush GenerateHeadsetBrush()
{
return null;
}
public override Bitmap GenerateBitmap(Bitmap bitmap)
{ {
if (VolumeDisplay == null) if (VolumeDisplay == null)
return bitmap; return bitmap;
@ -92,6 +77,11 @@ namespace Artemis.Modules.Overlays.VolumeDisplay
return bitmap; return bitmap;
} }
public override List<LayerModel> GetRenderLayers(bool renderMice, bool renderHeadsets)
{
return null;
}
private void KeyPressTask(KeyEventArgs e) private void KeyPressTask(KeyEventArgs e)
{ {
if (e.KeyCode != Keys.VolumeUp && e.KeyCode != Keys.VolumeDown) if (e.KeyCode != Keys.VolumeUp && e.KeyCode != Keys.VolumeDown)
@ -100,5 +90,11 @@ namespace Artemis.Modules.Overlays.VolumeDisplay
VolumeDisplay.Ttl = 1000; VolumeDisplay.Ttl = 1000;
VolumeDisplay.Transparancy = 255; VolumeDisplay.Transparancy = 255;
} }
public override void RenderOverlay(ref Bitmap keyboard, ref Brush mouse, ref Brush headset, bool renderMice,
bool renderHeadsets)
{
keyboard= GenerateBitmap(keyboard ?? MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(4));
}
} }
} }

View File

@ -31,7 +31,7 @@ namespace Artemis.Utilities.DataReaders
if (string.IsNullOrEmpty(mffString)) if (string.IsNullOrEmpty(mffString))
return null; return null;
var intermediateArray = mffString.Split('|'); var intermediateArray = mffString.Split('|');
if (intermediateArray[0] == "1") if (intermediateArray[0] == "1" || intermediateArray.Length < 2)
return null; return null;
var array = intermediateArray[1].Substring(1).Split(' '); var array = intermediateArray[1].Substring(1).Split(' ');
if (!array.Any()) if (!array.Any())

View File

@ -96,7 +96,7 @@ namespace Artemis.ViewModels.Abstract
if (e.PropertyName != "SelectedProfile" && IsActive) if (e.PropertyName != "SelectedProfile" && IsActive)
return; return;
GameModel.Profile = ProfileEditor.SelectedProfile; GameModel.Profile = ProfileEditor.SelectedProfile;
ProfilePreviewModel.SelectedProfile = ProfileEditor.SelectedProfile; ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile;
if (e.PropertyName != "SelectedProfile" || !ProfileEditor.ProfileViewModel.Activated || if (e.PropertyName != "SelectedProfile" || !ProfileEditor.ProfileViewModel.Activated ||
ProfileEditor.ProfileViewModel.SelectedProfile == null) ProfileEditor.ProfileViewModel.SelectedProfile == null)

View File

@ -17,16 +17,16 @@ namespace Artemis.ViewModels.Profiles
{ {
public sealed class LayerEditorViewModel : Screen public sealed class LayerEditorViewModel : Screen
{ {
private readonly IGameDataModel _gameDataModel; private readonly IDataModel _dataModel;
private LayerModel _layer; private LayerModel _layer;
private LayerPropertiesViewModel _layerPropertiesViewModel; private LayerPropertiesViewModel _layerPropertiesViewModel;
private LayerType _layerType; private LayerType _layerType;
private LayerModel _proposedLayer; private LayerModel _proposedLayer;
private LayerPropertiesModel _proposedProperties; private LayerPropertiesModel _proposedProperties;
public LayerEditorViewModel(IGameDataModel gameDataModel, LayerModel layer) public LayerEditorViewModel(IDataModel dataModel, LayerModel layer)
{ {
_gameDataModel = gameDataModel; _dataModel = dataModel;
Layer = layer; Layer = layer;
ProposedLayer = GeneralHelpers.Clone(layer); ProposedLayer = GeneralHelpers.Clone(layer);
@ -35,7 +35,7 @@ namespace Artemis.ViewModels.Profiles
Layer.SetupProperties(); Layer.SetupProperties();
DataModelProps = new BindableCollection<GeneralHelpers.PropertyCollection>(); DataModelProps = new BindableCollection<GeneralHelpers.PropertyCollection>();
DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(gameDataModel)); DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(dataModel));
LayerConditionVms = new BindableCollection<LayerConditionViewModel>(layer.Properties.Conditions LayerConditionVms = new BindableCollection<LayerConditionViewModel>(layer.Properties.Conditions
.Select(c => new LayerConditionViewModel(this, c, DataModelProps))); .Select(c => new LayerConditionViewModel(this, c, DataModelProps)));
@ -106,7 +106,7 @@ namespace Artemis.ViewModels.Profiles
LayerType = ProposedLayer.LayerType; LayerType = ProposedLayer.LayerType;
if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel)) if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel))
LayerPropertiesViewModel = new FolderPropertiesViewModel(_gameDataModel, ProposedLayer.Properties); LayerPropertiesViewModel = new FolderPropertiesViewModel(_dataModel, ProposedLayer.Properties);
} }
private void PropertiesViewModelHandler(object sender, PropertyChangedEventArgs e) private void PropertiesViewModelHandler(object sender, PropertyChangedEventArgs e)
@ -136,17 +136,17 @@ namespace Artemis.ViewModels.Profiles
if ((LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) && if ((LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) &&
!(LayerPropertiesViewModel is KeyboardPropertiesViewModel)) !(LayerPropertiesViewModel is KeyboardPropertiesViewModel))
{ {
LayerPropertiesViewModel = new KeyboardPropertiesViewModel(_gameDataModel, ProposedLayer.Properties) LayerPropertiesViewModel = new KeyboardPropertiesViewModel(_dataModel, ProposedLayer.Properties)
{ {
IsGif = LayerType == LayerType.KeyboardGif IsGif = LayerType == LayerType.KeyboardGif
}; };
} }
else if (LayerType == LayerType.Mouse && !(LayerPropertiesViewModel is MousePropertiesViewModel)) else if (LayerType == LayerType.Mouse && !(LayerPropertiesViewModel is MousePropertiesViewModel))
LayerPropertiesViewModel = new MousePropertiesViewModel(_gameDataModel, ProposedLayer.Properties); LayerPropertiesViewModel = new MousePropertiesViewModel(_dataModel, ProposedLayer.Properties);
else if (LayerType == LayerType.Headset && !(LayerPropertiesViewModel is HeadsetPropertiesViewModel)) else if (LayerType == LayerType.Headset && !(LayerPropertiesViewModel is HeadsetPropertiesViewModel))
LayerPropertiesViewModel = new HeadsetPropertiesViewModel(_gameDataModel, ProposedLayer.Properties); LayerPropertiesViewModel = new HeadsetPropertiesViewModel(_dataModel, ProposedLayer.Properties);
else if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel)) else if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel))
LayerPropertiesViewModel = new FolderPropertiesViewModel(_gameDataModel, ProposedLayer.Properties); LayerPropertiesViewModel = new FolderPropertiesViewModel(_dataModel, ProposedLayer.Properties);
NotifyOfPropertyChange(() => LayerPropertiesViewModel); NotifyOfPropertyChange(() => LayerPropertiesViewModel);
} }

View File

@ -267,7 +267,7 @@ namespace Artemis.ViewModels.Profiles
public void EditLayer(LayerModel layer) public void EditLayer(LayerModel layer)
{ {
IWindowManager manager = new WindowManager(); IWindowManager manager = new WindowManager();
var editorVm = _layerEditorVmFactory.CreateLayerEditorVm(_gameModel.GameDataModel, layer); var editorVm = _layerEditorVmFactory.CreateLayerEditorVm(_gameModel.DataModel, layer);
dynamic settings = new ExpandoObject(); dynamic settings = new ExpandoObject();
var iconImage = new Image var iconImage = new Image
{ {

View File

@ -9,6 +9,7 @@ using Artemis.Events;
using Artemis.Managers; using Artemis.Managers;
using Artemis.Models.Profiles; using Artemis.Models.Profiles;
using Artemis.Models.Profiles.Properties; using Artemis.Models.Profiles.Properties;
using Artemis.Modules.Effects.ProfilePreview;
using Artemis.Utilities; using Artemis.Utilities;
using Caliburn.Micro; using Caliburn.Micro;
using MahApps.Metro; using MahApps.Metro;
@ -109,12 +110,10 @@ namespace Artemis.ViewModels.Profiles
drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect); drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect);
// Draw the layers // Draw the layers
var drawLayers = SelectedProfile.Layers var drawLayers = SelectedProfile.GetRenderLayers<ProfilePreviewDataModel>(
.OrderByDescending(l => l.Order) new ProfilePreviewDataModel(), false, false, true);
.Where(l => l.MustDraw() || (l.Enabled && l.LayerType == LayerType.Folder))
.ToList();
foreach (var layer in drawLayers) foreach (var layer in drawLayers)
layer.Draw<object>(null, drawingContext, true, false); layer.Draw(null, drawingContext, true, false);
// Get the selection color // Get the selection color
var accentColor = ThemeManager.DetectAppStyle(Application.Current)?.Item2?.Resources["AccentColor"]; var accentColor = ThemeManager.DetectAppStyle(Application.Current)?.Item2?.Resources["AccentColor"];

View File

@ -8,8 +8,8 @@ namespace Artemis.ViewModels.Profiles.Properties
{ {
private LayerPropertiesModel _proposedProperties; private LayerPropertiesModel _proposedProperties;
public FolderPropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) public FolderPropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties)
: base(gameDataModel) : base(dataModel)
{ {
ProposedProperties = GeneralHelpers.Clone(properties); ProposedProperties = GeneralHelpers.Clone(properties);
} }

View File

@ -10,8 +10,8 @@ namespace Artemis.ViewModels.Profiles.Properties
private LayerPropertiesModel _proposedProperties; private LayerPropertiesModel _proposedProperties;
private Brush _brush; private Brush _brush;
public HeadsetPropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) public HeadsetPropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties)
: base(gameDataModel) : base(dataModel)
{ {
ProposedProperties = GeneralHelpers.Clone(properties); ProposedProperties = GeneralHelpers.Clone(properties);
Brush = ProposedProperties.Brush.CloneCurrentValue(); Brush = ProposedProperties.Brush.CloneCurrentValue();

View File

@ -13,15 +13,15 @@ namespace Artemis.ViewModels.Profiles.Properties
private bool _isGif; private bool _isGif;
private KeyboardPropertiesModel _proposedProperties; private KeyboardPropertiesModel _proposedProperties;
public KeyboardPropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) public KeyboardPropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties)
: base(gameDataModel) : base(dataModel)
{ {
var keyboardProperties = (KeyboardPropertiesModel) properties; var keyboardProperties = (KeyboardPropertiesModel) properties;
ProposedProperties = GeneralHelpers.Clone(keyboardProperties); ProposedProperties = GeneralHelpers.Clone(keyboardProperties);
Brush = ProposedProperties.Brush.CloneCurrentValue(); Brush = ProposedProperties.Brush.CloneCurrentValue();
DataModelProps = new BindableCollection<GeneralHelpers.PropertyCollection>(); DataModelProps = new BindableCollection<GeneralHelpers.PropertyCollection>();
DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(gameDataModel)); DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(dataModel));
HeightProperties = new LayerDynamicPropertiesViewModel("Height", DataModelProps, keyboardProperties); HeightProperties = new LayerDynamicPropertiesViewModel("Height", DataModelProps, keyboardProperties);
WidthProperties = new LayerDynamicPropertiesViewModel("Width", DataModelProps, keyboardProperties); WidthProperties = new LayerDynamicPropertiesViewModel("Width", DataModelProps, keyboardProperties);

View File

@ -7,11 +7,11 @@ namespace Artemis.ViewModels.Profiles.Properties
{ {
public abstract class LayerPropertiesViewModel : PropertyChangedBase public abstract class LayerPropertiesViewModel : PropertyChangedBase
{ {
public IGameDataModel GameDataModel { get; set; } public IDataModel DataModel { get; set; }
protected LayerPropertiesViewModel(IGameDataModel gameDataModel) protected LayerPropertiesViewModel(IDataModel dataModel)
{ {
GameDataModel = gameDataModel; DataModel = dataModel;
} }
public abstract LayerPropertiesModel GetAppliedProperties(); public abstract LayerPropertiesModel GetAppliedProperties();

View File

@ -11,8 +11,8 @@ namespace Artemis.ViewModels.Profiles.Properties
private LayerPropertiesModel _proposedProperties; private LayerPropertiesModel _proposedProperties;
private Brush _brush; private Brush _brush;
public MousePropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) public MousePropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties)
: base(gameDataModel) : base(dataModel)
{ {
ProposedProperties = GeneralHelpers.Clone(properties); ProposedProperties = GeneralHelpers.Clone(properties);
Brush = ProposedProperties.Brush.CloneCurrentValue(); Brush = ProposedProperties.Brush.CloneCurrentValue();