mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 19:36:28 +00:00
Rendering improvements
This commit is contained in:
1 parent
9e16605e6b
commit
8795be2cde
11 files changed
+71
-99
No files matched your search
@@ -45,7 +45,7 @@ namespace Artemis.Core.Models.Profile.Abstract
|
||||
/// <summary>
|
||||
/// Renders the element
|
||||
/// </summary>
|
||||
public abstract void Render(double deltaTime, ArtemisSurface surface, SKCanvas canvas);
|
||||
public abstract void Render(double deltaTime, SKCanvas canvas);
|
||||
|
||||
/// <summary>
|
||||
/// Applies the profile element's properties to the underlying storage entity
|
||||
|
||||
@@ -56,11 +56,11 @@ namespace Artemis.Core.Models.Profile
|
||||
profileElement.Update(deltaTime);
|
||||
}
|
||||
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, SKCanvas canvas)
|
||||
public override void Render(double deltaTime, SKCanvas canvas)
|
||||
{
|
||||
// Folders don't render but their children do
|
||||
foreach (var profileElement in Children)
|
||||
profileElement.Render(deltaTime, surface, canvas);
|
||||
profileElement.Render(deltaTime, canvas);
|
||||
}
|
||||
|
||||
public Folder AddFolder(string name)
|
||||
|
||||
@@ -6,7 +6,6 @@ using Artemis.Core.Extensions;
|
||||
using Artemis.Core.Models.Profile.Abstract;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using Artemis.Core.Plugins.LayerElement;
|
||||
using Artemis.Core.Services.Interfaces;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
using Newtonsoft.Json;
|
||||
using SkiaSharp;
|
||||
@@ -17,8 +16,6 @@ namespace Artemis.Core.Models.Profile
|
||||
{
|
||||
private readonly List<LayerElement> _layerElements;
|
||||
private List<ArtemisLed> _leds;
|
||||
private SKBitmap _renderBitmap;
|
||||
private SKCanvas _renderCanvas;
|
||||
|
||||
public Layer(Profile profile, ProfileElement parent, string name)
|
||||
{
|
||||
@@ -58,47 +55,33 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
public override void Update(double deltaTime)
|
||||
{
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.Update(deltaTime);
|
||||
lock (_layerElements)
|
||||
{
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.Update(deltaTime);
|
||||
}
|
||||
}
|
||||
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, SKCanvas canvas)
|
||||
public override void Render(double deltaTime, SKCanvas canvas)
|
||||
{
|
||||
if (RenderPath == null)
|
||||
return;
|
||||
|
||||
// TODO Just lock the whole thing, this is asking for deadlock
|
||||
lock (_renderBitmap)
|
||||
lock (_layerElements)
|
||||
{
|
||||
lock (LayerElements)
|
||||
canvas.Save();
|
||||
using (var framePath = new SKPath(RenderPath))
|
||||
{
|
||||
canvas.Save();
|
||||
canvas.ClipPath(framePath);
|
||||
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.RenderPreProcess(surface, canvas);
|
||||
|
||||
_renderCanvas.Clear();
|
||||
layerElement.RenderPreProcess(framePath, canvas);
|
||||
foreach (var layerElement in LayerElements)
|
||||
layerElement.Render(surface, _renderCanvas);
|
||||
|
||||
var baseShader = SKShader.CreateBitmap(_renderBitmap, SKShaderTileMode.Repeat, SKShaderTileMode.Repeat, SKMatrix.MakeTranslation(RenderRectangle.Left, RenderRectangle.Top));
|
||||
layerElement.Render(framePath, canvas);
|
||||
foreach (var layerElement in LayerElements)
|
||||
{
|
||||
var newBaseShader = layerElement.RenderPostProcess(surface, _renderBitmap, baseShader);
|
||||
if (newBaseShader == null)
|
||||
continue;
|
||||
|
||||
// Dispose the old base shader if the layer element provided a new one
|
||||
if (!ReferenceEquals(baseShader, newBaseShader))
|
||||
baseShader.Dispose();
|
||||
|
||||
baseShader = newBaseShader;
|
||||
}
|
||||
|
||||
canvas.ClipPath(RenderPath);
|
||||
canvas.DrawRect(RenderRectangle, new SKPaint {Shader = baseShader, FilterQuality = SKFilterQuality.Low});
|
||||
baseShader.Dispose();
|
||||
canvas.Restore();
|
||||
layerElement.RenderPostProcess(framePath, canvas);
|
||||
}
|
||||
canvas.Restore();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -165,7 +148,7 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
internal void AddLayerElement(LayerElement layerElement)
|
||||
{
|
||||
lock (LayerElements)
|
||||
lock (_layerElements)
|
||||
{
|
||||
_layerElements.Add(layerElement);
|
||||
}
|
||||
@@ -173,7 +156,7 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
internal void RemoveLayerElement(LayerElement layerElement)
|
||||
{
|
||||
lock (LayerElements)
|
||||
lock (_layerElements)
|
||||
{
|
||||
_layerElements.Remove(layerElement);
|
||||
}
|
||||
@@ -216,25 +199,6 @@ namespace Artemis.Core.Models.Profile
|
||||
path.AddRect(artemisLed.AbsoluteRenderRectangle);
|
||||
|
||||
RenderPath = path;
|
||||
|
||||
if (_renderBitmap != null)
|
||||
{
|
||||
lock (_renderBitmap)
|
||||
{
|
||||
var oldBitmap = _renderBitmap;
|
||||
var oldCanvas = _renderCanvas;
|
||||
_renderBitmap = new SKBitmap(new SKImageInfo((int) RenderRectangle.Width, (int) RenderRectangle.Height));
|
||||
_renderCanvas = new SKCanvas(_renderBitmap);
|
||||
oldBitmap?.Dispose();
|
||||
oldCanvas?.Dispose();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
_renderBitmap = new SKBitmap(new SKImageInfo((int) RenderRectangle.Width, (int) RenderRectangle.Height));
|
||||
_renderCanvas = new SKCanvas(_renderBitmap);
|
||||
}
|
||||
|
||||
OnRenderPropertiesUpdated();
|
||||
}
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@ namespace Artemis.Core.Models.Profile
|
||||
}
|
||||
}
|
||||
|
||||
public override void Render(double deltaTime, ArtemisSurface surface, SKCanvas canvas)
|
||||
public override void Render(double deltaTime, SKCanvas canvas)
|
||||
{
|
||||
lock (this)
|
||||
{
|
||||
@@ -64,7 +64,7 @@ namespace Artemis.Core.Models.Profile
|
||||
throw new ArtemisCoreException($"Cannot render inactive profile: {this}");
|
||||
|
||||
foreach (var profileElement in Children)
|
||||
profileElement.Render(deltaTime, surface, canvas);
|
||||
profileElement.Render(deltaTime, canvas);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -31,7 +31,7 @@ namespace Artemis.Core.Plugins.Abstract
|
||||
lock (this)
|
||||
{
|
||||
// Render the profile
|
||||
ActiveProfile?.Render(deltaTime, surface, canvas);
|
||||
ActiveProfile?.Render(deltaTime, canvas);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
using System;
|
||||
using Artemis.Core.Models.Profile;
|
||||
using Artemis.Core.Models.Surface;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace Artemis.Core.Plugins.LayerElement
|
||||
@@ -20,6 +19,10 @@ namespace Artemis.Core.Plugins.LayerElement
|
||||
public LayerElementSettings Settings { get; }
|
||||
public LayerElementDescriptor Descriptor { get; }
|
||||
|
||||
public virtual void Dispose()
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Called by the profile editor to populate the layer element properties panel
|
||||
/// </summary>
|
||||
@@ -38,9 +41,9 @@ namespace Artemis.Core.Plugins.LayerElement
|
||||
/// Allows you to perform rendering on the surface <see cref="SKCanvas" /> before any layer-clipping is applied
|
||||
/// <para>Called before rendering, in the order configured on the layer</para>
|
||||
/// </summary>
|
||||
/// <param name="surface">The surface the layer is rendered on</param>
|
||||
/// <param name="framePath"></param>
|
||||
/// <param name="canvas">The entire surface canvas</param>
|
||||
public virtual void RenderPreProcess(ArtemisSurface surface, SKCanvas canvas)
|
||||
public virtual void RenderPreProcess(SKPath framePath, SKCanvas canvas)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -49,9 +52,9 @@ namespace Artemis.Core.Plugins.LayerElement
|
||||
/// and matches it's width and height.
|
||||
/// <para>Called during rendering, in the order configured on the layer</para>
|
||||
/// </summary>
|
||||
/// <param name="surface">The surface the layer is rendered on</param>
|
||||
/// <param name="framePath"></param>
|
||||
/// <param name="canvas">The layer canvas</param>
|
||||
public virtual void Render(ArtemisSurface surface, SKCanvas canvas)
|
||||
public virtual void Render(SKPath framePath, SKCanvas canvas)
|
||||
{
|
||||
}
|
||||
|
||||
@@ -60,16 +63,12 @@ namespace Artemis.Core.Plugins.LayerElement
|
||||
/// <see cref="SKCanvas" />.
|
||||
/// <para>Called after rendering, in the order configured on the layer.</para>
|
||||
/// </summary>
|
||||
/// <param name="surface">The surface the layer is rendered on</param>
|
||||
/// <param name="framePath"></param>
|
||||
/// <param name="canvas"></param>
|
||||
/// <param name="bitmap">The bitmap created from the layer canvas</param>
|
||||
/// <param name="shader">The current shader used to draw the bitmap on the surface canvas</param>
|
||||
/// <returns>The resulting shader used to draw the bitmap on the surface canvas</returns>
|
||||
public virtual SKShader RenderPostProcess(ArtemisSurface surface, SKBitmap bitmap, SKShader shader)
|
||||
{
|
||||
return shader;
|
||||
}
|
||||
|
||||
public virtual void Dispose()
|
||||
public virtual void RenderPostProcess(SKPath framePath, SKCanvas canvas)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user