using System;
using System.Drawing;
namespace SpriteWave
{
public enum EdgeKind
{
TL,
Top,
TR,
Left,
None,
Right,
BL,
Bottom,
BR
}
public class Edge : IPiece
{
private EdgeKind _kind;
public EdgeKind EdgeKind { get { return _kind; } }
private PointF[] _shape;
public PointF[] Shape { get { return _shape; } }
private Position _dist;
public Position Distance
{
get {
return _dist;
}
set {
_dist = value;
int x, y;
GetCoords(_kind, out x, out y);
if (x == 0)
_dist.col = 0;
if (y == 0)
_dist.row = 0;
}
}
public Edge(EdgeKind kind)
{
_kind = kind;
_dist = new Position(0, 0);
}
public static EdgeKind Direction(int x, int y)
{
if (x < -1 || x > 1 || y < -1 || y > 1)
return EdgeKind.None;
return (EdgeKind)((y + 1) * 3 + (x + 1));
}
public static void GetCoords(EdgeKind e, out int x, out int y)
{
x = ((int)e % 3) - 1;
y = ((int)e / 3) - 1;
}
private PointF[] ReflectTriangle(PointF[] input, Collage cl, bool rfX, bool rfY)
{
int clW = cl.Width;
int clH = cl.Height;
int offW = _dist.col * cl.TileW;
int offH = _dist.row * cl.TileH;
var output = new PointF[3];
for (int i = 0; i < 3; i++)
{
if (rfX)
output[i].X = offW + clW - input[i].X;
else
output[i].X = offW + input[i].X;
if (rfY)
output[i].Y = offH + clH - input[i].Y;
else
output[i].Y = offH + input[i].Y;
}
return output;
}
public void Render(Collage cl)
{
if (_kind == EdgeKind.None)
return;
float clWidth = cl.Width;
float clHeight = cl.Height;
float taperW = (float)cl.TileW / 2f;
float taperH = (float)cl.TileH / 2f;
float gapW = taperW / 2f;
float gapH = taperH / 2f;
float fitW = gapW / 2f;
float fitH = gapH / 2f;
int x, y;
GetCoords(_kind, out x, out y);
// Corner Edge
if (x != 0 && y != 0)
{
_shape = new[] {
new PointF(-taperW, fitH),
new PointF(fitW, -taperH),
new PointF(-taperW, -taperH)
};
}
// Vertical Edge
else if (x != 0)
{
_shape = new[] {
new PointF(-gapW, taperH),
new PointF(-gapW, clHeight - taperH),
new PointF(-gapW - taperW, clHeight / 2f)
};
}
// Horizontal Edge
else
{
_shape = new[] {
new PointF(taperW, -gapH),
new PointF(clWidth - taperW, -gapH),
new PointF(clWidth / 2f, -taperH - gapH)
};
}
_shape = ReflectTriangle(_shape, cl, x == 1, y == 1);
}
}
}