public TileShape(byte flags, TileEdge top, TileEdge right, TileEdge bottom, TileEdge left) { Flags = flags; Clip = ExpandClip(top, right, bottom, left); Top = top; Right = right; Bottom = bottom; Left = left; }
private static Point[] ExpandClip(TileEdge top, TileEdge right, TileEdge bottom, TileEdge left) { var ret = new List<Point>(); if (top != null) { ret.Add(new Point(top.X1, top.Y1)); ret.Add(new Point(top.X2, top.Y2)); } if (right != null) { if (ret.Count == 0) ret.Add(new Point(right.X1, right.Y1)); else Debug.Assert(ret[ret.Count - 1] == new Point(right.X1, right.Y1)); ret.Add(new Point(right.X2, right.Y2)); } if (bottom != null) { Debug.Assert(ret[ret.Count - 1] == new Point(bottom.X1, bottom.Y1)); ret.Add(new Point(bottom.X2, bottom.Y2)); } if (left != null) { Debug.Assert(ret[ret.Count - 1] == new Point(left.X1, left.Y1)); ret.Add(new Point(left.X2, left.Y2)); } Debug.Assert(ret[0] == ret[ret.Count - 1]); return ret.Take(ret.Count - 1).ToArray(); }
private void DrawFilth(Graphics canvas, Tile tile, TileEdge edge, int center, int caps) { if (center == 0 || edge == null) return; var transform = new Matrix(); transform.Translate(tile.X * App.PixelsPerTile + edge.X1 + sliceOverdraw, tile.Y * App.PixelsPerTile + edge.Y1 + sliceOverdraw); transform.Rotate(edge.Angle); canvas.Transform = transform; var length = edge.Length; if (center != 0) { var sprite = sprites.LoadFilth(center & 7, (center & 8) != 0, 2 + (tile.X + tile.Y) % 5); canvas.DrawImage(sprite.Image, new Rectangle(sprite.Hitbox.Left, sprite.Hitbox.Top, length, sprite.Hitbox.Height)); } if ((caps & 1) != 0) { var sprite = sprites.LoadFilth(center & 7, (center & 8) != 0, 1); canvas.DrawImage(sprite.Image, sprite.Hitbox); } if ((caps & 2) != 0) { var sprite = sprites.LoadFilth(center & 7, (center & 8) != 0, 7); canvas.DrawImage(sprite.Image, new Rectangle(sprite.Hitbox.Left + length, sprite.Hitbox.Top, sprite.Hitbox.Width, sprite.Hitbox.Height)); } canvas.ResetTransform(); }