diff --git a/Artemis/Artemis/InjectionFactories/ILayerEditorVmFactory.cs b/Artemis/Artemis/InjectionFactories/ILayerEditorVmFactory.cs index 67a0e6672..7171fbea1 100644 --- a/Artemis/Artemis/InjectionFactories/ILayerEditorVmFactory.cs +++ b/Artemis/Artemis/InjectionFactories/ILayerEditorVmFactory.cs @@ -7,6 +7,6 @@ namespace Artemis.InjectionFactories { public interface ILayerEditorVmFactory { - LayerEditorViewModel CreateLayerEditorVm(IGameDataModel gameDataModel, LayerModel layer); + LayerEditorViewModel CreateLayerEditorVm(IDataModel dataModel, LayerModel layer); } } \ No newline at end of file diff --git a/Artemis/Artemis/Managers/LoopManager.cs b/Artemis/Artemis/Managers/LoopManager.cs index 8126601c0..2d7b40e09 100644 --- a/Artemis/Artemis/Managers/LoopManager.cs +++ b/Artemis/Artemis/Managers/LoopManager.cs @@ -120,19 +120,29 @@ namespace Artemis.Managers renderEffect.Update(); // Get ActiveEffect's bitmap - var bitmap = renderEffect.Initialized - ? renderEffect.GenerateBitmap() - : null; + Bitmap bitmap = null; + System.Windows.Media.Brush mouseBrush = 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) { overlayModel.Update(); - bitmap = bitmap != null - ? overlayModel.GenerateBitmap(bitmap) - : overlayModel.GenerateBitmap(); + overlayModel.RenderOverlay(ref bitmap, ref mouseBrush, ref headsetBrush, mice.Any(), headsets.Any()); } + // 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) return; @@ -146,16 +156,8 @@ namespace Artemis.Managers bitmap = fixedBmp; - // If it exists, send bitmap to the device + // Update the keyboard _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)); } } } diff --git a/Artemis/Artemis/Managers/ProfileManager.cs b/Artemis/Artemis/Managers/ProfileManager.cs index 0bdf27565..06196cc0d 100644 --- a/Artemis/Artemis/Managers/ProfileManager.cs +++ b/Artemis/Artemis/Managers/ProfileManager.cs @@ -77,8 +77,8 @@ namespace Artemis.Managers // LoopManager might be running, this method won't do any harm in that case. _loopManager.Start(); - if (!ReferenceEquals(ProfilePreviewModel.SelectedProfile, activePreview.ProfileEditor.SelectedProfile)) - ProfilePreviewModel.SelectedProfile = activePreview.ProfileEditor.SelectedProfile; + if (!ReferenceEquals(ProfilePreviewModel.Profile, activePreview.ProfileEditor.SelectedProfile)) + ProfilePreviewModel.Profile = activePreview.ProfileEditor.SelectedProfile; } } } diff --git a/Artemis/Artemis/Models/EffectModel.cs b/Artemis/Artemis/Models/EffectModel.cs index b7a1a25fc..c230c97b0 100644 --- a/Artemis/Artemis/Models/EffectModel.cs +++ b/Artemis/Artemis/Models/EffectModel.cs @@ -1,6 +1,10 @@ using System; +using System.Collections.Generic; using System.Drawing; +using System.Linq; using Artemis.Managers; +using Artemis.Models.Interfaces; +using Artemis.Models.Profiles; using Brush = System.Windows.Media.Brush; namespace Artemis.Models @@ -13,9 +17,10 @@ namespace Artemis.Models public MainManager MainManager; public string Name; - protected EffectModel(MainManager mainManager) + protected EffectModel(MainManager mainManager, IDataModel dataModel) { MainManager = mainManager; + DataModel = dataModel; } public abstract void Dispose(); @@ -23,13 +28,33 @@ namespace Artemis.Models // Called on creation public abstract void Enable(); - // Called every iteration + // Called every frame public abstract void Update(); - // Called after every update - public abstract Bitmap GenerateBitmap(); + public IDataModel DataModel { get; set; } + public ProfileModel Profile { get; set; } - public abstract Brush GenerateMouseBrush(); - public abstract Brush GenerateHeadsetBrush(); + // Called after every update + 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 GetRenderLayers(bool renderMice, bool renderHeadsets); } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/GameModel.cs b/Artemis/Artemis/Models/GameModel.cs index e0569a0a5..c11e8747c 100644 --- a/Artemis/Artemis/Models/GameModel.cs +++ b/Artemis/Artemis/Models/GameModel.cs @@ -1,22 +1,19 @@ -using Artemis.Managers; +using System.Collections.Generic; +using Artemis.Managers; using Artemis.Models.Interfaces; using Artemis.Models.Profiles; -using Artemis.Modules.Games.RocketLeague; namespace Artemis.Models { 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; - GameDataModel = gameDataModel; } public GameSettings Settings { get; set; } public bool Enabled { get; set; } public string ProcessName { get; set; } - public IGameDataModel GameDataModel { get; set; } - public ProfileModel Profile { get; set; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/Interfaces/GameDataModel.cs b/Artemis/Artemis/Models/Interfaces/GameDataModel.cs index 3dd99c183..de39f4457 100644 --- a/Artemis/Artemis/Models/Interfaces/GameDataModel.cs +++ b/Artemis/Artemis/Models/Interfaces/GameDataModel.cs @@ -1,6 +1,6 @@ namespace Artemis.Models.Interfaces { - public interface IGameDataModel + public interface IDataModel { } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/OverlayModel.cs b/Artemis/Artemis/Models/OverlayModel.cs index 3e8369345..b579e3d4f 100644 --- a/Artemis/Artemis/Models/OverlayModel.cs +++ b/Artemis/Artemis/Models/OverlayModel.cs @@ -1,5 +1,6 @@ using System.Drawing; using Artemis.Managers; +using Brush = System.Windows.Media.Brush; namespace Artemis.Models { @@ -8,7 +9,7 @@ namespace Artemis.Models private bool _enabled; 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); } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs b/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs index f1480d999..7b6fc0fb1 100644 --- a/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerConditionModel.cs @@ -12,7 +12,7 @@ namespace Artemis.Models.Profiles public string Operator { get; set; } public string Type { get; set; } - public bool ConditionMet(IGameDataModel subject) + public bool ConditionMet(IDataModel subject) { if (string.IsNullOrEmpty(Field) || string.IsNullOrEmpty(Value) || string.IsNullOrEmpty(Type)) return false; diff --git a/Artemis/Artemis/Models/Profiles/LayerModel.cs b/Artemis/Artemis/Models/Profiles/LayerModel.cs index b0de10d36..f97563dd3 100644 --- a/Artemis/Artemis/Models/Profiles/LayerModel.cs +++ b/Artemis/Artemis/Models/Profiles/LayerModel.cs @@ -38,51 +38,31 @@ namespace Artemis.Models.Profiles [XmlIgnore] public GifImage GifImage { get; set; } - public bool ConditionsMet(IGameDataModel dataModel) + public bool ConditionsMet(IDataModel dataModel) { return Enabled && Properties.Conditions.All(cm => cm.ConditionMet(dataModel)); } - public void Draw(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 (!Enabled) + if (LayerType != LayerType.Keyboard && LayerType != LayerType.KeyboardGif) return; // Preview simply shows the properties as they are. When not previewing they are applied - AppliedProperties appliedProperties; - if (!preview) - { - if (!ConditionsMet(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); + var appliedProperties = !preview + ? Properties.GetAppliedProperties(dataModel) + : Properties.GetAppliedProperties(dataModel, true); - // Update animations on layer types that support them - if (LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) - { - AnimationUpdater.UpdateAnimation((KeyboardPropertiesModel) Properties, updateAnimations); - } - - switch (LayerType) - { - // Folders are drawn recursively - case LayerType.Folder: - foreach (var layerModel in Children.OrderByDescending(l => l.Order)) - layerModel.Draw(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; - } + // Update animations + AnimationUpdater.UpdateAnimation((KeyboardPropertiesModel) Properties, updateAnimations); + + if (LayerType == LayerType.Keyboard) + Drawer.Draw(c, (KeyboardPropertiesModel) Properties, appliedProperties); + else if (LayerType == LayerType.KeyboardGif) + GifImage = Drawer.DrawGif(c, (KeyboardPropertiesModel) Properties, appliedProperties, GifImage); } - public Brush GenerateBrush(LayerType type, IGameDataModel dataModel, bool preview, bool updateAnimations) + public Brush GenerateBrush(LayerType type, IDataModel dataModel, bool preview, bool updateAnimations) { if (!Enabled) return null; @@ -249,6 +229,39 @@ namespace Artemis.Models.Profiles } #endregion + + /// + /// 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 + /// + /// The game data model to base the conditions on + /// Instance of said game data model + /// Whether or not to include mice in the list + /// Whether or not to include headsets in the list + /// + /// A flat list containing all layers that must be rendered + public List GetRenderLayers(IDataModel dataModel, bool includeMice, bool includeHeadsets, bool ignoreConditions = false) + { + var layers = new List(); + 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(dataModel)) + continue; + } + + layers.Add(layerModel); + layers.AddRange(layerModel.GetRenderLayers(dataModel, includeMice, includeHeadsets, ignoreConditions)); + } + + return layers; + } } public enum LayerType diff --git a/Artemis/Artemis/Models/Profiles/ProfileModel.cs b/Artemis/Artemis/Models/Profiles/ProfileModel.cs index 69b0e48c1..beb86b4ec 100644 --- a/Artemis/Artemis/Models/Profiles/ProfileModel.cs +++ b/Artemis/Artemis/Models/Profiles/ProfileModel.cs @@ -66,7 +66,7 @@ namespace Artemis.Models.Profiles Layers[i].Order = i; } - public Bitmap GenerateBitmap(Rect keyboardRect, IGameDataModel gameDataModel, bool preview, + public Bitmap GenerateBitmap(Rect keyboardRect, IDataModel dataModel, bool preview, bool updateAnimations) { var visual = new DrawingVisual(); @@ -78,22 +78,22 @@ namespace Artemis.Models.Profiles // Draw the layers foreach (var layerModel in Layers.OrderByDescending(l => l.Order)) - layerModel.Draw(gameDataModel, c, preview, updateAnimations); + layerModel.Draw(dataModel, c, preview, updateAnimations); // Remove the clip c.Pop(); } - return ImageUtilities.DrawinVisualToBitmap(visual, keyboardRect); + return ImageUtilities.DrawinVisualToBitmap(visual, keyboardRect); } - public Brush GenerateBrush(IGameDataModel gameDataModel, LayerType type, bool preview, bool updateAnimations) + public Brush GenerateBrush(IDataModel dataModel, LayerType type, bool preview, bool updateAnimations) { Brush result = null; // Draw the layers foreach (var layerModel in Layers.OrderByDescending(l => l.Order)) { - var generated = layerModel.GenerateBrush(type, gameDataModel, preview, updateAnimations); + var generated = layerModel.GenerateBrush(type, dataModel, preview, updateAnimations); if (generated != null) result = generated; } @@ -116,6 +116,39 @@ namespace Artemis.Models.Profiles return layers; } + /// + /// 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 + /// + /// The game data model to base the conditions on + /// Instance of said game data model + /// Whether or not to include mice in the list + /// Whether or not to include headsets in the list + /// + /// A flat list containing all layers that must be rendered + public List GetRenderLayers(IDataModel dataModel, bool includeMice, bool includeHeadsets, bool ignoreConditions = false) + { + var layers = new List(); + 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(dataModel)) + continue; + } + + layers.Add(layerModel); + layers.AddRange(layerModel.GetRenderLayers(dataModel, includeMice, includeHeadsets, ignoreConditions)); + } + + return layers; + } + /// /// Looks at all the layers wthin the profile and makes sure they are within boundaries of the given rectangle /// @@ -137,5 +170,51 @@ namespace Artemis.Models.Profiles layer.Properties = props; } } + + /// + /// Generates a bitmap showing all the provided layers of type Keyboard and KeyboardGif + /// + /// The layers to render + /// The data model to base the layer's properties on + /// A rectangle matching the current keyboard's size on a scale of 4, used for clipping + /// Indicates wheter the layer is drawn as a preview, ignoring dynamic properties + /// Wheter or not to update the layer's animations + /// The generated bitmap + internal Bitmap GenerateBitmap(List 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); + } + + /// + /// Generates a brush out of the given layer, for usage with mice and headsets + /// + /// The layer to base the brush on + /// The game data model to base the layer's properties on + /// The generated brush + public Brush GenerateBrush(LayerModel layerModel, IDataModel dataModel) + { + return layerModel?.Properties.GetAppliedProperties(dataModel).Brush; + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/Profiles/Properties/DynamicPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/Properties/DynamicPropertiesModel.cs index 7b1552f95..c0b835b34 100644 --- a/Artemis/Artemis/Models/Profiles/Properties/DynamicPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/Properties/DynamicPropertiesModel.cs @@ -37,7 +37,7 @@ namespace Artemis.Models.Profiles.Properties /// public LayerPropertyOptions LayerPropertyOptions { get; set; } - internal void ApplyProperty(IGameDataModel dataModel, AppliedProperties properties) + internal void ApplyProperty(IDataModel dataModel, AppliedProperties properties) { if (LayerPropertyType == LayerPropertyType.PercentageOf) ApplyPercentageOf(dataModel, properties, PercentageSource); @@ -45,7 +45,7 @@ namespace Artemis.Models.Profiles.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) return; @@ -95,7 +95,7 @@ namespace Artemis.Models.Profiles.Properties properties.Opacity = 1.0 - properties.Opacity; } - private void ApplyPercentageOfProperty(IGameDataModel dataModel, AppliedProperties properties) + private void ApplyPercentageOfProperty(IDataModel dataModel, AppliedProperties properties) { var value = dataModel.GetPropValue(PercentageProperty); ApplyPercentageOf(dataModel, properties, value); diff --git a/Artemis/Artemis/Models/Profiles/Properties/FolderPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/Properties/FolderPropertiesModel.cs index c86b29c3c..27d35e496 100644 --- a/Artemis/Artemis/Models/Profiles/Properties/FolderPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/Properties/FolderPropertiesModel.cs @@ -5,7 +5,7 @@ namespace Artemis.Models.Profiles.Properties { 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(); } diff --git a/Artemis/Artemis/Models/Profiles/Properties/HeadsetPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/Properties/HeadsetPropertiesModel.cs index c58877d3c..c44226e99 100644 --- a/Artemis/Artemis/Models/Profiles/Properties/HeadsetPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/Properties/HeadsetPropertiesModel.cs @@ -4,9 +4,9 @@ namespace Artemis.Models.Profiles.Properties { 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}; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Models/Profiles/Properties/KeyboardPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/Properties/KeyboardPropertiesModel.cs index 540b78f80..5c964d4e9 100644 --- a/Artemis/Artemis/Models/Profiles/Properties/KeyboardPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/Properties/KeyboardPropertiesModel.cs @@ -35,7 +35,7 @@ namespace Artemis.Models.Profiles.Properties 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 { diff --git a/Artemis/Artemis/Models/Profiles/Properties/LayerPropertiesModel.cs b/Artemis/Artemis/Models/Profiles/Properties/LayerPropertiesModel.cs index bd96243b7..db003d39e 100644 --- a/Artemis/Artemis/Models/Profiles/Properties/LayerPropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/Properties/LayerPropertiesModel.cs @@ -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 diff --git a/Artemis/Artemis/Models/Profiles/Properties/MousePropertiesModel.cs b/Artemis/Artemis/Models/Profiles/Properties/MousePropertiesModel.cs index 95c63af21..92d2eb456 100644 --- a/Artemis/Artemis/Models/Profiles/Properties/MousePropertiesModel.cs +++ b/Artemis/Artemis/Models/Profiles/Properties/MousePropertiesModel.cs @@ -4,9 +4,9 @@ namespace Artemis.Models.Profiles.Properties { 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 }; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/AmbientLightning/AmbientLightningEffectModel.cs b/Artemis/Artemis/Modules/Effects/AmbientLightning/AmbientLightningEffectModel.cs index 3b6619e88..09e15e681 100644 --- a/Artemis/Artemis/Modules/Effects/AmbientLightning/AmbientLightningEffectModel.cs +++ b/Artemis/Artemis/Modules/Effects/AmbientLightning/AmbientLightningEffectModel.cs @@ -1,15 +1,12 @@ using System.Collections.Generic; using System.Drawing; using System.Drawing.Drawing2D; -using System.IO; using System.Linq; using System.Windows.Forms; using Artemis.Managers; using Artemis.Models; +using Artemis.Models.Profiles; using Artemis.Utilities.Keyboard; -using Kaliko.ImageLibrary; -using Kaliko.ImageLibrary.Filters; -using Brush = System.Windows.Media.Brush; namespace Artemis.Modules.Effects.AmbientLightning { @@ -22,7 +19,7 @@ namespace Artemis.Modules.Effects.AmbientLightning private KeyboardRectangle _topRect; public AmbientLightningEffectModel(MainManager mainManager, AmbientLightningEffectSettings settings) - : base(mainManager) + : base(mainManager, null) { Name = "Ambient Lightning"; Settings = settings; @@ -115,33 +112,7 @@ namespace Artemis.Modules.Effects.AmbientLightning } } - public override Bitmap GenerateBitmap() - { - 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() + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) { return null; } diff --git a/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs b/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs index bfb24e741..0c05a8a76 100644 --- a/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs +++ b/Artemis/Artemis/Modules/Effects/AudioVisualizer/AudioVisualizerModel.cs @@ -5,6 +5,7 @@ using System.Drawing.Drawing2D; using System.Linq; using Artemis.Managers; using Artemis.Models; +using Artemis.Models.Profiles; using Artemis.Modules.Effects.AudioVisualizer.Utilities; using Artemis.Utilities; using Artemis.Utilities.Keyboard; @@ -23,7 +24,7 @@ namespace Artemis.Modules.Effects.AudioVisualizer private int _sensitivity; private IWaveIn _waveIn; - public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager) + public AudioVisualizerModel(MainManager mainManager, AudioVisualizerSettings settings) : base(mainManager, null) { Settings = settings; Name = "Audiovisualizer"; @@ -137,38 +138,7 @@ namespace Artemis.Modules.Effects.AudioVisualizer } _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) { var buffer = e.Buffer; @@ -212,5 +182,32 @@ namespace Artemis.Modules.Effects.AudioVisualizer SpectrumData.Add((byte) y); } } + + public override List 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; + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/Debug/DebugEffectModel.cs b/Artemis/Artemis/Modules/Effects/Debug/DebugEffectModel.cs index c68bd1199..232f9daf4 100644 --- a/Artemis/Artemis/Modules/Effects/Debug/DebugEffectModel.cs +++ b/Artemis/Artemis/Modules/Effects/Debug/DebugEffectModel.cs @@ -3,6 +3,7 @@ using System.Drawing; using System.Drawing.Drawing2D; using Artemis.Managers; using Artemis.Models; +using Artemis.Models.Profiles; using Artemis.Utilities.Keyboard; using Brush = System.Windows.Media.Brush; @@ -11,7 +12,7 @@ namespace Artemis.Modules.Effects.Debug // TODO: Remove internal class DebugEffectModel : EffectModel { - public DebugEffectModel(MainManager mainManager, DebugEffectSettings settings) : base(mainManager) + public DebugEffectModel(MainManager mainManager, DebugEffectSettings settings) : base(mainManager, null) { Name = "Debug Effect"; Settings = settings; @@ -53,26 +54,22 @@ namespace Artemis.Modules.Effects.Debug Scale = Settings.Scale; } - public override Bitmap GenerateBitmap() + public override List 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); KeyboardRectangle.Draw(g); } - return bitmap; - } - - public override Brush GenerateMouseBrush() - { - return null; - } - - public override Brush GenerateHeadsetBrush() - { - return null; } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs index 3e9f97177..5253a333e 100644 --- a/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs +++ b/Artemis/Artemis/Modules/Effects/ProfilePreview/ProfilePreviewModel.cs @@ -1,4 +1,6 @@ -using System.Drawing; +using System.Collections.Generic; +using System.Drawing; +using System.Linq; using Artemis.Managers; using Artemis.Models; using Artemis.Models.Interfaces; @@ -9,20 +11,14 @@ namespace Artemis.Modules.Effects.ProfilePreview { public class ProfilePreviewModel : EffectModel { - private readonly ProfilePreviewDataModel _previewDataModel; - - public ProfilePreviewModel(MainManager mainManager) : base(mainManager) + public ProfilePreviewModel(MainManager mainManager) : base(mainManager, new ProfilePreviewDataModel()) { Name = "Profile Preview"; - _previewDataModel = new ProfilePreviewDataModel(); } - public ProfileModel SelectedProfile { get; set; } - public override void Dispose() { Initialized = false; - SelectedProfile = null; } public override void Enable() @@ -34,39 +30,33 @@ namespace Artemis.Modules.Effects.ProfilePreview { } - public override Bitmap GenerateBitmap() + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) { - if (MainManager.DeviceManager.ActiveKeyboard == null) - 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(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; + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets, true); } - public override Brush GenerateMouseBrush() + public override void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets) { - return SelectedProfile?.GenerateBrush(_previewDataModel, LayerType.Mouse, true, true); - } + keyboard = null; + mouse = null; + headset = null; - public override Brush GenerateHeadsetBrush() - { - return SelectedProfile?.GenerateBrush(_previewDataModel, LayerType.Headset, true, true); + 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), 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 { } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs index 6284fb5ca..7f92a2dba 100644 --- a/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs +++ b/Artemis/Artemis/Modules/Effects/TypeWave/TypeWaveModel.cs @@ -7,6 +7,7 @@ using Artemis.DeviceProviders.Corsair; using Artemis.DeviceProviders.Logitech.Utilities; using Artemis.Managers; using Artemis.Models; +using Artemis.Models.Profiles; using Artemis.Utilities; using Brush = System.Windows.Media.Brush; @@ -17,7 +18,7 @@ namespace Artemis.Modules.Effects.TypeWave private readonly List _waves; private Color _randomColor; - public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager) + public TypeWaveModel(MainManager mainManager, TypeWaveSettings settings) : base(mainManager, null) { Name = "TypeWave"; _waves = new List(); @@ -92,13 +93,22 @@ namespace Artemis.Modules.Effects.TypeWave } } - public override Bitmap GenerateBitmap() + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) { - if (_waves.Count == 0) - return null; + return null; + } - var bitmap = MainManager.DeviceManager.ActiveKeyboard.KeyboardBitmap(Scale); - using (var g = Graphics.FromImage(bitmap)) + public override void Render(out Bitmap keyboard, out Brush mouse, out Brush headset, bool renderMice, bool renderHeadsets) + { + 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.SmoothingMode = SmoothingMode.HighQuality; @@ -110,7 +120,7 @@ namespace Artemis.Modules.Effects.TypeWave if (_waves[i].Size == 0) continue; 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); Color fillColor; @@ -121,7 +131,7 @@ namespace Artemis.Modules.Effects.TypeWave var pthGrBrush = new PathGradientBrush(path) { - SurroundColors = new[] {_waves[i].Color}, + SurroundColors = new[] { _waves[i].Color }, CenterColor = fillColor }; @@ -129,21 +139,10 @@ namespace Artemis.Modules.Effects.TypeWave pthGrBrush.FocusScales = new PointF(0.3f, 0.8f); g.FillPath(pthGrBrush, path); - 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); + 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); } } - return bitmap; - } - - public override Brush GenerateMouseBrush() - { - return null; - } - - public override Brush GenerateHeadsetBrush() - { - return null; } } diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeDataModel.cs b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeDataModel.cs index de5d12920..20dd851d4 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeDataModel.cs +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeDataModel.cs @@ -2,7 +2,7 @@ namespace Artemis.Modules.Games.CounterStrike { - public class CounterStrikeDataModel : IGameDataModel + public class CounterStrikeDataModel : IDataModel { public Provider provider { get; set; } public Map map { get; set; } diff --git a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs index 03a7af263..437465e39 100644 --- a/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs +++ b/Artemis/Artemis/Modules/Games/CounterStrike/CounterStrikeModel.cs @@ -1,5 +1,7 @@ using System; +using System.Collections.Generic; using System.Drawing; +using System.Linq; using Artemis.Managers; using Artemis.Models; using Artemis.Models.Profiles; @@ -44,31 +46,6 @@ namespace Artemis.Modules.Games.CounterStrike // 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(keyboardRect, GameDataModel, false, true); - } - - public override Brush GenerateMouseBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Mouse, false, true); - } - - public override Brush GenerateHeadsetBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Headset, false, true); - } - public void HandleGameData(object sender, GameDataReceivedEventArgs e) { var jsonString = e.Json.ToString(); @@ -80,7 +57,7 @@ namespace Artemis.Modules.Games.CounterStrike // Parse the JSON try { - GameDataModel = JsonConvert.DeserializeObject(jsonString); + DataModel = JsonConvert.DeserializeObject(jsonString); } catch (Exception ex) { @@ -89,5 +66,10 @@ namespace Artemis.Modules.Games.CounterStrike } } + + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) + { + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs b/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs index d48a028c2..184d45f9e 100644 --- a/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs +++ b/Artemis/Artemis/Modules/Games/Dota2/Dota2DataModel.cs @@ -2,7 +2,7 @@ namespace Artemis.Modules.Games.Dota2 { - public class Dota2DataModel : IGameDataModel + public class Dota2DataModel : IDataModel { public Provider provider { get; set; } public Map map { get; set; } diff --git a/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs b/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs index bc383107e..6b3c77ce3 100644 --- a/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs +++ b/Artemis/Artemis/Modules/Games/Dota2/Dota2Model.cs @@ -1,10 +1,9 @@ -using System.Drawing; +using System.Collections.Generic; using Artemis.Managers; using Artemis.Models; using Artemis.Models.Profiles; using Artemis.Utilities.GameState; using Newtonsoft.Json; -using Brush = System.Windows.Media.Brush; namespace Artemis.Modules.Games.Dota2 { @@ -45,38 +44,12 @@ namespace Artemis.Modules.Games.Dota2 private void UpdateDay() { - var dataModel = GameDataModel as Dota2DataModel; + var dataModel = DataModel as Dota2DataModel; if (dataModel?.map?.daytime == null) return; var timeLeft = 240 - dataModel.map.clock_time%240; - 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(keyboardRect, GameDataModel, false, true); - } - - public override Brush GenerateMouseBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Mouse, false, true); - } - - public override Brush GenerateHeadsetBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Headset, false, true); + dataModel.map.dayCyclePercentage = (int) (100.00/240*timeLeft); } public void HandleGameData(object sender, GameDataReceivedEventArgs e) @@ -88,7 +61,12 @@ namespace Artemis.Modules.Games.Dota2 return; // Parse the JSON - GameDataModel = JsonConvert.DeserializeObject(jsonString); + DataModel = JsonConvert.DeserializeObject(jsonString); + } + + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) + { + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs index a8d866cb8..31bd573ee 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchDataModel.cs @@ -2,7 +2,7 @@ using Artemis.Models.Interfaces; namespace Artemis.Modules.Games.Overwatch { - public class OverwatchDataModel : IGameDataModel + public class OverwatchDataModel : IDataModel { public OverwatchStatus Status { get; set; } public OverwatchCharacter Character { get; set; } diff --git a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs index 0a3e5bb45..acab9c792 100644 --- a/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs +++ b/Artemis/Artemis/Modules/Games/Overwatch/OverwatchModel.cs @@ -4,11 +4,11 @@ using System.Linq; using Artemis.Events; using Artemis.Managers; using Artemis.Models; +using Artemis.Models.Interfaces; using Artemis.Models.Profiles; using Artemis.Utilities; using Artemis.Utilities.DataReaders; using Caliburn.Micro; -using Brush = System.Windows.Media.Brush; using Color = System.Windows.Media.Color; namespace Artemis.Modules.Games.Overwatch @@ -31,6 +31,11 @@ namespace Artemis.Modules.Games.Overwatch LoadOverwatchCharacters(); } + public OverwatchModel(MainManager mainManager, GameSettings settings, IDataModel dataModel) + : base(mainManager, settings, dataModel) + { + } + public List OverwatchCharacters { get; set; } public MmfReader MmfReader { get; set; } @@ -85,7 +90,7 @@ namespace Artemis.Modules.Games.Overwatch public override void Update() { - var gameDataModel = (OverwatchDataModel) GameDataModel; + var gameDataModel = (OverwatchDataModel) DataModel; var colors = MmfReader.GetColorArray(); if (colors == null) return; @@ -128,29 +133,9 @@ namespace Artemis.Modules.Games.Overwatch gameDataModel.UltimateReady = !characterMatch.Color.Equals(colors[2, 2]); } - public override Bitmap GenerateBitmap() + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) { - if (Profile == null || GameDataModel == null) - return null; - - var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale); - return Profile.GenerateBitmap(keyboardRect, GameDataModel, false, true); - } - - public override Brush GenerateMouseBrush() - { - if (Profile == null || GameDataModel == null) - return null; - return null; - return Profile.GenerateBrush(GameDataModel, LayerType.Mouse, false, true); - } - - public override Brush GenerateHeadsetBrush() - { - if (Profile == null || GameDataModel == null) - return null; - return null; - return Profile.GenerateBrush(GameDataModel, LayerType.Headset, false, true); + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets); } } diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs index 9b2cf86b8..d0196e16d 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueDataModel.cs @@ -2,7 +2,7 @@ namespace Artemis.Modules.Games.RocketLeague { - public class RocketLeagueDataModel : IGameDataModel + public class RocketLeagueDataModel : IDataModel { public int Boost { get; set; } } diff --git a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs index 0aeee17b3..4b93dc620 100644 --- a/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs +++ b/Artemis/Artemis/Modules/Games/RocketLeague/RocketLeagueModel.cs @@ -1,5 +1,5 @@ using System; -using System.Drawing; +using System.Collections.Generic; using System.Linq; using Artemis.Managers; using Artemis.Models; @@ -8,7 +8,6 @@ using Artemis.Settings; using Artemis.Utilities; using Artemis.Utilities.Memory; using Newtonsoft.Json; -using Brush = System.Windows.Media.Brush; namespace Artemis.Modules.Games.RocketLeague { @@ -45,7 +44,7 @@ namespace Artemis.Modules.Games.RocketLeague var tempProcess = MemoryHelpers.GetProcessIfRunning(ProcessName); if (tempProcess == null) return; - + _memory = new Memory(tempProcess); Initialized = true; @@ -53,45 +52,25 @@ namespace Artemis.Modules.Games.RocketLeague public override void Update() { - if (Profile == null || GameDataModel == null || _memory == null) + if (Profile == null || DataModel == null || _memory == null) return; var offsets = _pointer.GameAddresses.First(ga => ga.Description == "Boost").ToString(); var boostAddress = _memory.GetAddress("\"RocketLeague.exe\"" + offsets); 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 - if (((RocketLeagueDataModel) GameDataModel).Boost < 0) - ((RocketLeagueDataModel) GameDataModel).Boost = 0; - if (((RocketLeagueDataModel) GameDataModel).Boost > 100) - ((RocketLeagueDataModel) GameDataModel).Boost = 100; + if (((RocketLeagueDataModel) DataModel).Boost < 0) + ((RocketLeagueDataModel) DataModel).Boost = 0; + if (((RocketLeagueDataModel) DataModel).Boost > 100) + ((RocketLeagueDataModel) DataModel).Boost = 100; } - public override Bitmap GenerateBitmap() + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) { - if (Profile == null || GameDataModel == null) - return null; - - var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale); - return Profile.GenerateBitmap(keyboardRect, GameDataModel, false, true); - } - - public override Brush GenerateMouseBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Mouse, false, true); - } - - public override Brush GenerateHeadsetBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Headset, false, true); + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs index 5f2abb73b..f5a372e85 100644 --- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs +++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionDataModel.cs @@ -2,7 +2,7 @@ namespace Artemis.Modules.Games.TheDivision { - public class TheDivisionDataModel : IGameDataModel + public class TheDivisionDataModel : IDataModel { public TheDivisionDataModel() { diff --git a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs index a72bbd02c..245ab80d5 100644 --- a/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs +++ b/Artemis/Artemis/Modules/Games/TheDivision/TheDivisionModel.cs @@ -74,7 +74,7 @@ namespace Artemis.Modules.Games.TheDivision // Parses Division key data to game data private void InterpertrateDivisionKey(IReadOnlyList parts) { - var gameDataModel = (TheDivisionDataModel) GameDataModel; + var gameDataModel = (TheDivisionDataModel) DataModel; var keyCode = parts[1]; var rPer = parts[2]; var gPer = parts[3]; @@ -131,29 +131,9 @@ namespace Artemis.Modules.Games.TheDivision // DataModel updating is done whenever a pipe message is received } - public override Bitmap GenerateBitmap() - { - if (Profile == null || GameDataModel == null) - return null; - - var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale); - return Profile.GenerateBitmap(keyboardRect, GameDataModel, false, true); - } - - public override Brush GenerateMouseBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Mouse, false, true); - } - - public override Brush GenerateHeadsetBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Headset, false, true); + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) + { + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3DataModel.cs b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3DataModel.cs index a38c45e4b..c30f4fa28 100644 --- a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3DataModel.cs +++ b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3DataModel.cs @@ -2,7 +2,7 @@ using Artemis.Models.Interfaces; namespace Artemis.Modules.Games.Witcher3 { - public class Witcher3DataModel : IGameDataModel + public class Witcher3DataModel : IDataModel { public WitcherSign WitcherSign { get; set; } } diff --git a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs index b5d282c06..465aaca9f 100644 --- a/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs +++ b/Artemis/Artemis/Modules/Games/Witcher3/Witcher3Model.cs @@ -9,7 +9,6 @@ using Artemis.Managers; using Artemis.Models; using Artemis.Models.Profiles; using Artemis.Utilities.Keyboard; -using Brush = System.Windows.Media.Brush; namespace Artemis.Modules.Games.Witcher3 { @@ -67,7 +66,7 @@ namespace Artemis.Modules.Games.Witcher3 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. if (_updateSw.ElapsedMilliseconds < 500) return; @@ -106,29 +105,9 @@ namespace Artemis.Modules.Games.Witcher3 } } - public override Bitmap GenerateBitmap() + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) { - if (Profile == null || GameDataModel == null) - return null; - - var keyboardRect = MainManager.DeviceManager.ActiveKeyboard.KeyboardRectangle(Scale); - return Profile.GenerateBitmap(keyboardRect, GameDataModel, false, true); - } - - public override Brush GenerateMouseBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Mouse, false, true); - } - - public override Brush GenerateHeadsetBrush() - { - if (Profile == null || GameDataModel == null) - return null; - - return Profile.GenerateBrush(GameDataModel, LayerType.Headset, false, true); + return Profile.GetRenderLayers(DataModel, renderMice, renderHeadsets); } } } \ No newline at end of file diff --git a/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs b/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs index c7538681a..8159a3dfd 100644 --- a/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs +++ b/Artemis/Artemis/Modules/Overlays/VolumeDisplay/VolumeDisplayModel.cs @@ -1,8 +1,10 @@ -using System.Drawing; +using System.Collections.Generic; +using System.Drawing; using System.Runtime.InteropServices; using System.Windows.Forms; using Artemis.Managers; using Artemis.Models; +using Artemis.Models.Profiles; using NAudio.CoreAudioApi; using Brush = System.Windows.Media.Brush; @@ -62,24 +64,7 @@ namespace Artemis.Modules.Overlays.VolumeDisplay } } - public override Bitmap GenerateBitmap() - { - 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) + public Bitmap GenerateBitmap(Bitmap bitmap) { if (VolumeDisplay == null) return bitmap; @@ -92,6 +77,11 @@ namespace Artemis.Modules.Overlays.VolumeDisplay return bitmap; } + public override List GetRenderLayers(bool renderMice, bool renderHeadsets) + { + return null; + } + private void KeyPressTask(KeyEventArgs e) { if (e.KeyCode != Keys.VolumeUp && e.KeyCode != Keys.VolumeDown) @@ -100,5 +90,11 @@ namespace Artemis.Modules.Overlays.VolumeDisplay VolumeDisplay.Ttl = 1000; 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)); + } } } \ No newline at end of file diff --git a/Artemis/Artemis/Utilities/DataReaders/MmfReader.cs b/Artemis/Artemis/Utilities/DataReaders/MmfReader.cs index 7628374e1..c5c705bbc 100644 --- a/Artemis/Artemis/Utilities/DataReaders/MmfReader.cs +++ b/Artemis/Artemis/Utilities/DataReaders/MmfReader.cs @@ -31,7 +31,7 @@ namespace Artemis.Utilities.DataReaders if (string.IsNullOrEmpty(mffString)) return null; var intermediateArray = mffString.Split('|'); - if (intermediateArray[0] == "1") + if (intermediateArray[0] == "1" || intermediateArray.Length < 2) return null; var array = intermediateArray[1].Substring(1).Split(' '); if (!array.Any()) diff --git a/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs b/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs index c292d9542..486a8b810 100644 --- a/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs +++ b/Artemis/Artemis/ViewModels/Abstract/GameViewModel.cs @@ -96,7 +96,7 @@ namespace Artemis.ViewModels.Abstract if (e.PropertyName != "SelectedProfile" && IsActive) return; GameModel.Profile = ProfileEditor.SelectedProfile; - ProfilePreviewModel.SelectedProfile = ProfileEditor.SelectedProfile; + ProfilePreviewModel.Profile = ProfileEditor.SelectedProfile; if (e.PropertyName != "SelectedProfile" || !ProfileEditor.ProfileViewModel.Activated || ProfileEditor.ProfileViewModel.SelectedProfile == null) diff --git a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs index 6ce4208ae..7fe270433 100644 --- a/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/LayerEditorViewModel.cs @@ -17,16 +17,16 @@ namespace Artemis.ViewModels.Profiles { public sealed class LayerEditorViewModel : Screen { - private readonly IGameDataModel _gameDataModel; + private readonly IDataModel _dataModel; private LayerModel _layer; private LayerPropertiesViewModel _layerPropertiesViewModel; private LayerType _layerType; private LayerModel _proposedLayer; private LayerPropertiesModel _proposedProperties; - public LayerEditorViewModel(IGameDataModel gameDataModel, LayerModel layer) + public LayerEditorViewModel(IDataModel dataModel, LayerModel layer) { - _gameDataModel = gameDataModel; + _dataModel = dataModel; Layer = layer; ProposedLayer = GeneralHelpers.Clone(layer); @@ -35,7 +35,7 @@ namespace Artemis.ViewModels.Profiles Layer.SetupProperties(); DataModelProps = new BindableCollection(); - DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(gameDataModel)); + DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(dataModel)); LayerConditionVms = new BindableCollection(layer.Properties.Conditions .Select(c => new LayerConditionViewModel(this, c, DataModelProps))); @@ -106,7 +106,7 @@ namespace Artemis.ViewModels.Profiles LayerType = ProposedLayer.LayerType; 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) @@ -136,17 +136,17 @@ namespace Artemis.ViewModels.Profiles if ((LayerType == LayerType.Keyboard || LayerType == LayerType.KeyboardGif) && !(LayerPropertiesViewModel is KeyboardPropertiesViewModel)) { - LayerPropertiesViewModel = new KeyboardPropertiesViewModel(_gameDataModel, ProposedLayer.Properties) + LayerPropertiesViewModel = new KeyboardPropertiesViewModel(_dataModel, ProposedLayer.Properties) { IsGif = LayerType == LayerType.KeyboardGif }; } 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)) - LayerPropertiesViewModel = new HeadsetPropertiesViewModel(_gameDataModel, ProposedLayer.Properties); + LayerPropertiesViewModel = new HeadsetPropertiesViewModel(_dataModel, ProposedLayer.Properties); else if (LayerType == LayerType.Folder && !(LayerPropertiesViewModel is FolderPropertiesViewModel)) - LayerPropertiesViewModel = new FolderPropertiesViewModel(_gameDataModel, ProposedLayer.Properties); + LayerPropertiesViewModel = new FolderPropertiesViewModel(_dataModel, ProposedLayer.Properties); NotifyOfPropertyChange(() => LayerPropertiesViewModel); } diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs index 8067335f8..99699af32 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileEditorViewModel.cs @@ -267,7 +267,7 @@ namespace Artemis.ViewModels.Profiles public void EditLayer(LayerModel layer) { IWindowManager manager = new WindowManager(); - var editorVm = _layerEditorVmFactory.CreateLayerEditorVm(_gameModel.GameDataModel, layer); + var editorVm = _layerEditorVmFactory.CreateLayerEditorVm(_gameModel.DataModel, layer); dynamic settings = new ExpandoObject(); var iconImage = new Image { diff --git a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs index 2f0061d2e..c69378272 100644 --- a/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/ProfileViewModel.cs @@ -9,6 +9,7 @@ using Artemis.Events; using Artemis.Managers; using Artemis.Models.Profiles; using Artemis.Models.Profiles.Properties; +using Artemis.Modules.Effects.ProfilePreview; using Artemis.Utilities; using Caliburn.Micro; using MahApps.Metro; @@ -109,12 +110,10 @@ namespace Artemis.ViewModels.Profiles drawingContext.DrawRectangle(new SolidColorBrush(Color.FromArgb(0, 0, 0, 0)), null, keyboardRect); // Draw the layers - var drawLayers = SelectedProfile.Layers - .OrderByDescending(l => l.Order) - .Where(l => l.MustDraw() || (l.Enabled && l.LayerType == LayerType.Folder)) - .ToList(); + var drawLayers = SelectedProfile.GetRenderLayers( + new ProfilePreviewDataModel(), false, false, true); foreach (var layer in drawLayers) - layer.Draw(null, drawingContext, true, false); + layer.Draw(null, drawingContext, true, false); // Get the selection color var accentColor = ThemeManager.DetectAppStyle(Application.Current)?.Item2?.Resources["AccentColor"]; diff --git a/Artemis/Artemis/ViewModels/Profiles/Properties/FolderPropertiesViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/Properties/FolderPropertiesViewModel.cs index 94bdf9673..4a0cb16e1 100644 --- a/Artemis/Artemis/ViewModels/Profiles/Properties/FolderPropertiesViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/Properties/FolderPropertiesViewModel.cs @@ -8,8 +8,8 @@ namespace Artemis.ViewModels.Profiles.Properties { private LayerPropertiesModel _proposedProperties; - public FolderPropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) - : base(gameDataModel) + public FolderPropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties) + : base(dataModel) { ProposedProperties = GeneralHelpers.Clone(properties); } diff --git a/Artemis/Artemis/ViewModels/Profiles/Properties/HeadsetPropertiesViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/Properties/HeadsetPropertiesViewModel.cs index 2868cb19b..ab3d95981 100644 --- a/Artemis/Artemis/ViewModels/Profiles/Properties/HeadsetPropertiesViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/Properties/HeadsetPropertiesViewModel.cs @@ -10,8 +10,8 @@ namespace Artemis.ViewModels.Profiles.Properties private LayerPropertiesModel _proposedProperties; private Brush _brush; - public HeadsetPropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) - : base(gameDataModel) + public HeadsetPropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties) + : base(dataModel) { ProposedProperties = GeneralHelpers.Clone(properties); Brush = ProposedProperties.Brush.CloneCurrentValue(); diff --git a/Artemis/Artemis/ViewModels/Profiles/Properties/KeyboardPropertiesViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/Properties/KeyboardPropertiesViewModel.cs index e03338fba..1359dbed5 100644 --- a/Artemis/Artemis/ViewModels/Profiles/Properties/KeyboardPropertiesViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/Properties/KeyboardPropertiesViewModel.cs @@ -13,15 +13,15 @@ namespace Artemis.ViewModels.Profiles.Properties private bool _isGif; private KeyboardPropertiesModel _proposedProperties; - public KeyboardPropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) - : base(gameDataModel) + public KeyboardPropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties) + : base(dataModel) { var keyboardProperties = (KeyboardPropertiesModel) properties; ProposedProperties = GeneralHelpers.Clone(keyboardProperties); Brush = ProposedProperties.Brush.CloneCurrentValue(); DataModelProps = new BindableCollection(); - DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(gameDataModel)); + DataModelProps.AddRange(GeneralHelpers.GenerateTypeMap(dataModel)); HeightProperties = new LayerDynamicPropertiesViewModel("Height", DataModelProps, keyboardProperties); WidthProperties = new LayerDynamicPropertiesViewModel("Width", DataModelProps, keyboardProperties); diff --git a/Artemis/Artemis/ViewModels/Profiles/Properties/LayerPropertiesViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/Properties/LayerPropertiesViewModel.cs index f64a288bd..2b4ae0a11 100644 --- a/Artemis/Artemis/ViewModels/Profiles/Properties/LayerPropertiesViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/Properties/LayerPropertiesViewModel.cs @@ -7,11 +7,11 @@ namespace Artemis.ViewModels.Profiles.Properties { 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(); diff --git a/Artemis/Artemis/ViewModels/Profiles/Properties/MousePropertiesViewModel.cs b/Artemis/Artemis/ViewModels/Profiles/Properties/MousePropertiesViewModel.cs index 2dc66c7f0..e7892e573 100644 --- a/Artemis/Artemis/ViewModels/Profiles/Properties/MousePropertiesViewModel.cs +++ b/Artemis/Artemis/ViewModels/Profiles/Properties/MousePropertiesViewModel.cs @@ -11,8 +11,8 @@ namespace Artemis.ViewModels.Profiles.Properties private LayerPropertiesModel _proposedProperties; private Brush _brush; - public MousePropertiesViewModel(IGameDataModel gameDataModel, LayerPropertiesModel properties) - : base(gameDataModel) + public MousePropertiesViewModel(IDataModel dataModel, LayerPropertiesModel properties) + : base(dataModel) { ProposedProperties = GeneralHelpers.Clone(properties); Brush = ProposedProperties.Brush.CloneCurrentValue();