From 31e9eb511b5f05fb9943578f975a1c65d95ebe48 Mon Sep 17 00:00:00 2001 From: SpoinkyNL Date: Sat, 7 Apr 2018 14:24:49 +0200 Subject: [PATCH] More core rendering --- .../Plugins/Abstract/ProfileModule.cs | 36 +++++++- .../Plugins/Interfaces/ILayerType.cs | 4 +- .../Plugins/Interfaces/IModule.cs | 4 +- src/Artemis.Core/Plugins/Models/PluginInfo.cs | 5 + src/Artemis.Core/ProfileElements/Folder.cs | 27 ++++-- .../Interfaces/IProfileElement.cs | 5 +- src/Artemis.Core/ProfileElements/Layer.cs | 24 +++-- src/Artemis.Core/ProfileElements/Profile.cs | 92 ++++++++++++++++--- src/Artemis.Core/Services/CoreService.cs | 2 +- 9 files changed, 155 insertions(+), 44 deletions(-) diff --git a/src/Artemis.Core/Plugins/Abstract/ProfileModule.cs b/src/Artemis.Core/Plugins/Abstract/ProfileModule.cs index f7c16eeda..93208c413 100644 --- a/src/Artemis.Core/Plugins/Abstract/ProfileModule.cs +++ b/src/Artemis.Core/Plugins/Abstract/ProfileModule.cs @@ -1,10 +1,14 @@ using System; using Artemis.Core.Plugins.Interfaces; +using Artemis.Core.ProfileElements; +using RGB.NET.Core; namespace Artemis.Core.Plugins.Abstract { public abstract class ProfileModule : IModule { + public Profile ActiveProfile { get; private set; } + /// public abstract Type ViewModelType { get; } @@ -17,16 +21,38 @@ namespace Artemis.Core.Plugins.Abstract // Load and activate the last active profile } - /// - public virtual void Update(double deltaTime) + public void ChangeActiveProfile(Profile profile) { - // Update the profile + lock (this) + { + if (profile == null) + throw new ArgumentNullException(nameof(profile)); + + ActiveProfile?.Deactivate(); + + ActiveProfile = profile; + ActiveProfile.Activate(); + } } /// - public virtual void Render(double deltaTime) + public virtual void Update(double deltaTime) { - // Render the profile + lock (this) + { + // Update the profile + ActiveProfile?.Update(deltaTime); + } + } + + /// + public virtual void Render(double deltaTime, RGBSurface surface) + { + lock (this) + { + // Render the profile + ActiveProfile?.Render(deltaTime, surface); + } } /// diff --git a/src/Artemis.Core/Plugins/Interfaces/ILayerType.cs b/src/Artemis.Core/Plugins/Interfaces/ILayerType.cs index c7f9b29d3..9c55e4315 100644 --- a/src/Artemis.Core/Plugins/Interfaces/ILayerType.cs +++ b/src/Artemis.Core/Plugins/Interfaces/ILayerType.cs @@ -18,8 +18,6 @@ namespace Artemis.Core.Plugins.Interfaces /// /// Renders the layer type /// - void Render(Layer device, IRGBDevice rgbDevice); - - ILayerType ApplyToLayer(Layer layer); + void Render(Layer device, RGBSurface surface); } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Interfaces/IModule.cs b/src/Artemis.Core/Plugins/Interfaces/IModule.cs index ebb3e5e91..f750590b9 100644 --- a/src/Artemis.Core/Plugins/Interfaces/IModule.cs +++ b/src/Artemis.Core/Plugins/Interfaces/IModule.cs @@ -1,4 +1,5 @@ using System; +using RGB.NET.Core; namespace Artemis.Core.Plugins.Interfaces { @@ -29,6 +30,7 @@ namespace Artemis.Core.Plugins.Interfaces /// Called each frame when the module must render /// /// Time since the last render - void Render(double deltaTime); + /// The RGB Surface to render to + void Render(double deltaTime, RGBSurface surface); } } \ No newline at end of file diff --git a/src/Artemis.Core/Plugins/Models/PluginInfo.cs b/src/Artemis.Core/Plugins/Models/PluginInfo.cs index 332c0cd71..3d6cac61e 100644 --- a/src/Artemis.Core/Plugins/Models/PluginInfo.cs +++ b/src/Artemis.Core/Plugins/Models/PluginInfo.cs @@ -123,5 +123,10 @@ namespace Artemis.Core.Plugins.Models vm.PluginInfo = this; return vm; } + + public override string ToString() + { + return $"{nameof(Guid)}: {Guid}, {nameof(Name)}: {Name}, {nameof(Version)}: {Version}"; + } } } \ No newline at end of file diff --git a/src/Artemis.Core/ProfileElements/Folder.cs b/src/Artemis.Core/ProfileElements/Folder.cs index f4afb3d84..faacc6482 100644 --- a/src/Artemis.Core/ProfileElements/Folder.cs +++ b/src/Artemis.Core/ProfileElements/Folder.cs @@ -8,45 +8,52 @@ namespace Artemis.Core.ProfileElements { public class Folder : IProfileElement { - public Folder() + public Folder(Profile profile) { + Profile = profile; Children = new List(); } + public Profile Profile { get; } public List Children { get; set; } public int Order { get; set; } public string Name { get; set; } - public void Update() + public void Update(double deltaTime) { // Folders don't update but their children do foreach (var profileElement in Children) - profileElement.Update(); + profileElement.Update(deltaTime); } - public void Render(IRGBDevice rgbDevice) + public void Render(double deltaTime, RGBSurface surface) { // Folders don't render but their children do foreach (var profileElement in Children) - profileElement.Render(rgbDevice); + profileElement.Render(deltaTime, surface); } - public static Folder FromFolderEntity(FolderEntity folderEntity, IPluginService pluginService) + public static Folder FromFolderEntity(Profile profile, FolderEntity folderEntity, IPluginService pluginService) { - var folder = new Folder + var folder = new Folder(profile) { Name = folderEntity.Name, Order = folderEntity.Order }; - + // Load child folders foreach (var childFolder in folderEntity.Folders) - folder.Children.Add(FromFolderEntity(childFolder, pluginService)); + folder.Children.Add(FromFolderEntity(profile, childFolder, pluginService)); // Load child layers foreach (var childLayer in folderEntity.Layers) - folder.Children.Add(Layer.FromLayerEntity(childLayer, pluginService)); + folder.Children.Add(Layer.FromLayerEntity(profile, childLayer, pluginService)); return folder; } + + public override string ToString() + { + return $"{nameof(Profile)}: {Profile}, {nameof(Order)}: {Order}, {nameof(Name)}: {Name}"; + } } } \ No newline at end of file diff --git a/src/Artemis.Core/ProfileElements/Interfaces/IProfileElement.cs b/src/Artemis.Core/ProfileElements/Interfaces/IProfileElement.cs index 7493c4c28..2371aa2a0 100644 --- a/src/Artemis.Core/ProfileElements/Interfaces/IProfileElement.cs +++ b/src/Artemis.Core/ProfileElements/Interfaces/IProfileElement.cs @@ -23,11 +23,12 @@ namespace Artemis.Core.ProfileElements.Interfaces /// /// Updates the element /// - void Update(); + /// + void Update(double deltaTime); /// /// Renders the element /// - void Render(IRGBDevice rgbDevice); + void Render(double deltaTime, RGBSurface surface); } } \ No newline at end of file diff --git a/src/Artemis.Core/ProfileElements/Layer.cs b/src/Artemis.Core/ProfileElements/Layer.cs index f05e4b0f5..7cd75b832 100644 --- a/src/Artemis.Core/ProfileElements/Layer.cs +++ b/src/Artemis.Core/ProfileElements/Layer.cs @@ -10,18 +10,19 @@ namespace Artemis.Core.ProfileElements { public class Layer : IProfileElement { - public Layer() + public Layer(Profile profile) { + Profile = profile; Children = new List(); } + public Profile Profile { get; } public ILayerType LayerType { get; private set; } - public List Children { get; set; } public int Order { get; set; } public string Name { get; set; } - public void Update() + public void Update(double deltaTime) { if (LayerType == null) return; @@ -32,40 +33,43 @@ namespace Artemis.Core.ProfileElements } } - public void Render(IRGBDevice rgbDevice) + public void Render(double deltaTime, RGBSurface surface) { if (LayerType == null) return; lock (LayerType) { - LayerType.Render(this, rgbDevice); + LayerType.Render(this, surface); } } - public static Layer FromLayerEntity(LayerEntity layerEntity, IPluginService pluginService) + public static Layer FromLayerEntity(Profile profile, LayerEntity layerEntity, IPluginService pluginService) { - var layer = new Layer + var layer = new Layer(profile) { Name = layerEntity.Name, Order = layerEntity.Order, LayerType = pluginService.GetLayerTypeByGuid(Guid.Parse(layerEntity.Guid)) }; - + return layer; } public void UpdateLayerType(ILayerType layerType) { if (LayerType != null) - { lock (LayerType) { LayerType.Dispose(); } - } LayerType = layerType; } + + public override string ToString() + { + return $"{nameof(Profile)}: {Profile}, {nameof(Order)}: {Order}, {nameof(Name)}: {Name}"; + } } } \ No newline at end of file diff --git a/src/Artemis.Core/ProfileElements/Profile.cs b/src/Artemis.Core/ProfileElements/Profile.cs index a79ec0bf6..4e542d324 100644 --- a/src/Artemis.Core/ProfileElements/Profile.cs +++ b/src/Artemis.Core/ProfileElements/Profile.cs @@ -1,4 +1,6 @@ -using System.Collections.Generic; +using System; +using System.Collections.Generic; +using Artemis.Core.Exceptions; using Artemis.Core.Plugins.Models; using Artemis.Core.ProfileElements.Interfaces; using Artemis.Core.Services.Interfaces; @@ -14,31 +16,97 @@ namespace Artemis.Core.ProfileElements PluginInfo = pluginInfo; } + public PluginInfo PluginInfo { get; } + public bool IsActivated { get; private set; } public int Order { get; set; } public string Name { get; set; } - public PluginInfo PluginInfo { get; } public List Children { get; set; } - public void Update() + public void Update(double deltaTime) { - foreach (var profileElement in Children) - profileElement.Update(); + lock (this) + { + if (!IsActivated) + throw new ArtemisCoreException($"Cannot update inactive profile: {this}"); + + foreach (var profileElement in Children) + profileElement.Update(deltaTime); + } } - public void Render(IRGBDevice rgbDevice) + public void Render(double deltaTime, RGBSurface surface) { - foreach (var profileElement in Children) - profileElement.Render(rgbDevice); + lock (this) + { + if (!IsActivated) + throw new ArtemisCoreException($"Cannot render inactive profile: {this}"); + + foreach (var profileElement in Children) + profileElement.Render(deltaTime, surface); + } } public static Profile FromProfileEntity(PluginInfo pluginInfo, ProfileEntity profileEntity, IPluginService pluginService) { var profile = new Profile(pluginInfo) {Name = profileEntity.Name}; + lock (profile) + { + // Populate the profile starting at the root, the rest is populated recursively + profile.Children.Add(Folder.FromFolderEntity(profile, profileEntity.RootFolder, pluginService)); - // Populate the profile starting at the root, the rest is populated recursively - profile.Children.Add(Folder.FromFolderEntity(profileEntity.RootFolder, pluginService)); - - return profile; + return profile; + } } + + public void Activate() + { + lock (this) + { + if (IsActivated) return; + + OnActivated(); + IsActivated = true; + } + } + + public void Deactivate() + { + lock (this) + { + if (!IsActivated) return; + + IsActivated = false; + OnDeactivated(); + } + } + + public override string ToString() + { + return $"{nameof(Order)}: {Order}, {nameof(Name)}: {Name}, {nameof(PluginInfo)}: {PluginInfo}"; + } + + #region Events + + /// + /// Occurs when the profile is being activated. + /// + public event EventHandler Activated; + + /// + /// Occurs when the profile is being deactivated. + /// + public event EventHandler Deactivated; + + private void OnActivated() + { + Activated?.Invoke(this, EventArgs.Empty); + } + + private void OnDeactivated() + { + Deactivated?.Invoke(this, EventArgs.Empty); + } + + #endregion } } \ No newline at end of file diff --git a/src/Artemis.Core/Services/CoreService.cs b/src/Artemis.Core/Services/CoreService.cs index f776eedf5..cb17a0f81 100644 --- a/src/Artemis.Core/Services/CoreService.cs +++ b/src/Artemis.Core/Services/CoreService.cs @@ -51,7 +51,7 @@ namespace Artemis.Core.Services module.Update(args.DeltaTime); // Render all active modules foreach (var module in _pluginService.Plugins.OfType()) - module.Render(args.DeltaTime); + module.Render(args.DeltaTime, _rgbService.Surface); } catch (Exception e) {