mirror of
https://github.com/Artemis-RGB/Artemis
synced 2026-11-11 19:36:28 +00:00
Removed separate shape size
This commit is contained in:
1 parent
436994129a
commit
2c60a42315
34 files changed
+81
-862
No files matched your search
@@ -158,8 +158,6 @@
|
||||
<Compile Include="Models\Profile\LayerProperties\Keyframe.cs" />
|
||||
<Compile Include="Models\Profile\LayerProperties\BaseLayerProperty.cs" />
|
||||
<Compile Include="Models\Profile\LayerShapes\Ellipse.cs" />
|
||||
<Compile Include="Models\Profile\LayerShapes\Fill.cs" />
|
||||
<Compile Include="Models\Profile\LayerShapes\Polygon.cs" />
|
||||
<Compile Include="Models\Profile\LayerShapes\Rectangle.cs" />
|
||||
<Compile Include="Models\Profile\LayerShapes\LayerShape.cs" />
|
||||
<Compile Include="Models\Surface\ArtemisLed.cs" />
|
||||
|
||||
@@ -72,7 +72,7 @@ namespace Artemis.Core.Models.Profile
|
||||
public Layer AddLayer(string name)
|
||||
{
|
||||
var layer = new Layer(Profile, this, name) {Order = Children.LastOrDefault()?.Order ?? 1};
|
||||
layer.LayerShape = new Fill(layer);
|
||||
layer.LayerShape = new Rectangle(layer);
|
||||
AddChild(layer);
|
||||
return layer;
|
||||
}
|
||||
|
||||
@@ -51,22 +51,13 @@ namespace Artemis.Core.Models.Profile
|
||||
|
||||
CreateDefaultProperties();
|
||||
|
||||
switch (layerEntity.ShapeEntity?.Type)
|
||||
switch (layerEntity.ShapeType)
|
||||
{
|
||||
case ShapeEntityType.Ellipse:
|
||||
LayerShape = new Ellipse(this, layerEntity.ShapeEntity);
|
||||
break;
|
||||
case ShapeEntityType.Fill:
|
||||
LayerShape = new Fill(this, layerEntity.ShapeEntity);
|
||||
break;
|
||||
case ShapeEntityType.Polygon:
|
||||
LayerShape = new Polygon(this, layerEntity.ShapeEntity);
|
||||
LayerShape = new Ellipse(this);
|
||||
break;
|
||||
case ShapeEntityType.Rectangle:
|
||||
LayerShape = new Rectangle(this, layerEntity.ShapeEntity);
|
||||
break;
|
||||
case null:
|
||||
LayerShape = null;
|
||||
LayerShape = new Rectangle(this);
|
||||
break;
|
||||
default:
|
||||
throw new ArgumentOutOfRangeException();
|
||||
@@ -175,18 +166,18 @@ namespace Artemis.Core.Models.Profile
|
||||
var sizeProperty = SizeProperty.CurrentValue;
|
||||
var rotationProperty = RotationProperty.CurrentValue;
|
||||
|
||||
var anchorPosition = GetLayerAnchorPosition() + Bounds.Location;
|
||||
var anchorPosition = GetLayerAnchorPosition();
|
||||
var anchorProperty = AnchorPointProperty.CurrentValue;
|
||||
|
||||
// Translation originates from the unscaled center of the shape and is tied to the anchor
|
||||
var x = anchorPosition.X - LayerShape.Bounds.MidX - anchorProperty.X * Bounds.Width;
|
||||
var y = anchorPosition.Y - LayerShape.Bounds.MidY - anchorProperty.Y * Bounds.Height;
|
||||
// Translation originates from the unscaled center of the layer and is tied to the anchor
|
||||
var x = anchorPosition.X - Bounds.MidX - anchorProperty.X * Bounds.Width;
|
||||
var y = anchorPosition.Y - Bounds.MidY - anchorProperty.Y * Bounds.Height;
|
||||
|
||||
// Apply these before translation because anchorPosition takes translation into account
|
||||
// Rotation is always applied on the canvas
|
||||
canvas.RotateDegrees(rotationProperty, anchorPosition.X, anchorPosition.Y);
|
||||
canvas.Scale(sizeProperty.Width, sizeProperty.Height, anchorPosition.X, anchorPosition.Y);
|
||||
// canvas.Scale(sizeProperty.Width, sizeProperty.Height, anchorPosition.X, anchorPosition.Y);
|
||||
// Once the other transformations are done it is save to translate
|
||||
canvas.Translate(x, y);
|
||||
// canvas.Translate(x, y);
|
||||
|
||||
// Placeholder
|
||||
if (LayerShape?.Path != null)
|
||||
@@ -200,8 +191,12 @@ namespace Artemis.Core.Models.Profile
|
||||
testColors.Add(SKColor.FromHsv(0, 100, 100));
|
||||
}
|
||||
|
||||
var shader = SKShader.CreateSweepGradient(new SKPoint(LayerShape.Bounds.MidX, LayerShape.Bounds.MidY), testColors.ToArray());
|
||||
canvas.DrawPath(LayerShape.Path, new SKPaint {Shader = shader, Color = new SKColor(0, 0, 0, (byte) (OpacityProperty.CurrentValue * 2.55f))});
|
||||
var path = new SKPath(LayerShape.Path);
|
||||
path.Transform(SKMatrix.MakeTranslation(x, y));
|
||||
path.Transform(SKMatrix.MakeScale(sizeProperty.Width, sizeProperty.Height, anchorPosition.X, anchorPosition.Y));
|
||||
|
||||
var shader = SKShader.CreateSweepGradient(new SKPoint(path.Bounds.MidX, path.Bounds.MidY), testColors.ToArray());
|
||||
canvas.DrawPath(path, new SKPaint {Shader = shader, Color = new SKColor(0, 0, 0, (byte) (OpacityProperty.CurrentValue * 2.55f))});
|
||||
}
|
||||
|
||||
LayerBrush?.Render(canvas);
|
||||
@@ -213,7 +208,7 @@ namespace Artemis.Core.Models.Profile
|
||||
var positionProperty = PositionProperty.CurrentValue;
|
||||
|
||||
// Start at the center of the shape
|
||||
var position = new SKPoint(LayerShape.Bounds.MidX, LayerShape.Bounds.MidY);
|
||||
var position = new SKPoint(Bounds.MidX, Bounds.MidY);
|
||||
|
||||
// Apply translation
|
||||
position.X += positionProperty.X * Bounds.Width;
|
||||
|
||||
@@ -9,21 +9,16 @@ namespace Artemis.Core.Models.Profile.LayerShapes
|
||||
{
|
||||
}
|
||||
|
||||
internal Ellipse(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity)
|
||||
{
|
||||
}
|
||||
|
||||
public override void CalculateRenderProperties()
|
||||
{
|
||||
var path = new SKPath();
|
||||
path.AddOval(GetUnscaledRectangle());
|
||||
path.AddOval(Layer.Bounds);
|
||||
Path = path;
|
||||
}
|
||||
|
||||
internal override void ApplyToEntity()
|
||||
public override void ApplyToEntity()
|
||||
{
|
||||
base.ApplyToEntity();
|
||||
Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Ellipse;
|
||||
Layer.LayerEntity.ShapeType = ShapeEntityType.Ellipse;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,28 +0,0 @@
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace Artemis.Core.Models.Profile.LayerShapes
|
||||
{
|
||||
public class Fill : LayerShape
|
||||
{
|
||||
public Fill(Layer layer) : base(layer)
|
||||
{
|
||||
}
|
||||
|
||||
internal Fill(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity)
|
||||
{
|
||||
}
|
||||
|
||||
public override void CalculateRenderProperties()
|
||||
{
|
||||
// Shape originates from the center so compensate the path for that
|
||||
Path = new SKPath(Layer.Path);
|
||||
}
|
||||
|
||||
internal override void ApplyToEntity()
|
||||
{
|
||||
base.ApplyToEntity();
|
||||
Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Fill;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,97 +1,26 @@
|
||||
using System.Linq;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
using SkiaSharp;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace Artemis.Core.Models.Profile.LayerShapes
|
||||
{
|
||||
public abstract class LayerShape
|
||||
{
|
||||
private SKPath _path;
|
||||
|
||||
protected LayerShape(Layer layer)
|
||||
{
|
||||
Layer = layer;
|
||||
}
|
||||
|
||||
protected LayerShape(Layer layer, ShapeEntity shapeEntity)
|
||||
{
|
||||
Layer = layer;
|
||||
ScaledRectangle = SKRect.Create(shapeEntity.X, shapeEntity.Y, shapeEntity.Width, shapeEntity.Height);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The layer this shape is attached to
|
||||
/// </summary>
|
||||
public Layer Layer { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A relative and scaled rectangle that defines where the shape is located in relation to the layer's size
|
||||
/// <para>Note: scaled means a range of 0.0 to 1.0. 1.0 being full width/height, 0.5 being half</para>
|
||||
/// </summary>
|
||||
public SKRect ScaledRectangle { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// A path outlining the shape
|
||||
/// </summary>
|
||||
public SKPath Path
|
||||
{
|
||||
get => _path;
|
||||
protected set
|
||||
{
|
||||
_path = value;
|
||||
Bounds = value?.Bounds ?? SKRect.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The bounds of this shape
|
||||
/// </summary>
|
||||
public SKRect Bounds { get; private set; }
|
||||
public SKPath Path { get; protected set; }
|
||||
|
||||
public abstract void CalculateRenderProperties();
|
||||
|
||||
/// <summary>
|
||||
/// Updates Position and Size using the provided unscaled rectangle
|
||||
/// </summary>
|
||||
/// <param name="rect">An unscaled rectangle where 1px = 1mm</param>
|
||||
public void SetFromUnscaledRectangle(SKRect rect)
|
||||
{
|
||||
if (!Layer.Leds.Any())
|
||||
{
|
||||
ScaledRectangle = SKRect.Empty;
|
||||
return;
|
||||
}
|
||||
|
||||
ScaledRectangle = SKRect.Create(
|
||||
100f / Layer.Bounds.Width * rect.Left / 100f,
|
||||
100f / Layer.Bounds.Height * rect.Top / 100f,
|
||||
100f / Layer.Bounds.Width * rect.Width / 100f,
|
||||
100f / Layer.Bounds.Height * rect.Height / 100f
|
||||
);
|
||||
}
|
||||
|
||||
public SKRect GetUnscaledRectangle()
|
||||
{
|
||||
if (!Layer.Leds.Any())
|
||||
return SKRect.Empty;
|
||||
|
||||
return SKRect.Create(
|
||||
Layer.Bounds.Width * ScaledRectangle.Left,
|
||||
Layer.Bounds.Height * ScaledRectangle.Top,
|
||||
Layer.Bounds.Width * ScaledRectangle.Width,
|
||||
Layer.Bounds.Height * ScaledRectangle.Height
|
||||
);
|
||||
}
|
||||
|
||||
internal virtual void ApplyToEntity()
|
||||
{
|
||||
Layer.LayerEntity.ShapeEntity = new ShapeEntity
|
||||
{
|
||||
X = ScaledRectangle.Left,
|
||||
Y = ScaledRectangle.Top,
|
||||
Width = ScaledRectangle.Width,
|
||||
Height = ScaledRectangle.Height
|
||||
};
|
||||
}
|
||||
public abstract void ApplyToEntity();
|
||||
}
|
||||
}
|
||||
@@ -1,45 +0,0 @@
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using Artemis.Storage.Entities.Profile;
|
||||
using SkiaSharp;
|
||||
|
||||
namespace Artemis.Core.Models.Profile.LayerShapes
|
||||
{
|
||||
public class Polygon : LayerShape
|
||||
{
|
||||
public Polygon(Layer layer) : base(layer)
|
||||
{
|
||||
}
|
||||
|
||||
internal Polygon(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The points of this polygon
|
||||
/// </summary>
|
||||
public List<SKPoint> Points { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// The points of this polygon where they need to be rendered inside the layer
|
||||
/// </summary>
|
||||
public List<SKPoint> RenderPoints
|
||||
{
|
||||
get { return Points.Select(p => new SKPoint(p.X * Layer.Bounds.Width, p.Y * Layer.Bounds.Height)).ToList(); }
|
||||
}
|
||||
|
||||
public override void CalculateRenderProperties()
|
||||
{
|
||||
var path = new SKPath();
|
||||
path.AddPoly(RenderPoints.ToArray());
|
||||
Path = path;
|
||||
}
|
||||
|
||||
internal override void ApplyToEntity()
|
||||
{
|
||||
base.ApplyToEntity();
|
||||
Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Polygon;
|
||||
Layer.LayerEntity.ShapeEntity.Points = Points.Select(p => new ShapePointEntity {X = p.X, Y = p.Y}).ToList();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,21 +9,16 @@ namespace Artemis.Core.Models.Profile.LayerShapes
|
||||
{
|
||||
}
|
||||
|
||||
internal Rectangle(Layer layer, ShapeEntity shapeEntity) : base(layer, shapeEntity)
|
||||
{
|
||||
}
|
||||
|
||||
public override void CalculateRenderProperties()
|
||||
{
|
||||
var path = new SKPath();
|
||||
path.AddRect(GetUnscaledRectangle());
|
||||
path.AddRect(Layer.Bounds);
|
||||
Path = path;
|
||||
}
|
||||
|
||||
internal override void ApplyToEntity()
|
||||
public override void ApplyToEntity()
|
||||
{
|
||||
base.ApplyToEntity();
|
||||
Layer.LayerEntity.ShapeEntity.Type = ShapeEntityType.Rectangle;
|
||||
Layer.LayerEntity.ShapeType = ShapeEntityType.Rectangle;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user