diff --git a/.editorconfig b/.editorconfig
new file mode 100644
index 0000000..133fb32
--- /dev/null
+++ b/.editorconfig
@@ -0,0 +1,5 @@
+root = true
+
+[*]
+indent_style = tab
+indent_size = 4
diff --git a/Classes/BoxPainter.uc b/Classes/BoxPainter.uc
new file mode 100644
index 0000000..73cbddd
--- /dev/null
+++ b/Classes/BoxPainter.uc
@@ -0,0 +1,595 @@
+class BoxPainter extends BoxPainterBase;
+
+public final function DrawBox(float X, float Y, float Width, float Height, float Edge, optional byte Shape = 0)
+{
+ Edge = FMin(FMin(Edge, Width * 0.5), Height * 0.5);
+
+ switch (Shape)
+ {
+ case 100:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 110:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 111:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 120:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\____/|
+ ECS_VerticalCorner, // TopLeft // | |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | ____ |
+ ECS_VerticalCorner // BottomRight // |/ \|
+ );
+ break;
+
+ case 121:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // | |
+ ECS_HorisontalCorner // BottomRight // /_____\
+ );
+ break;
+
+ case 130:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 131:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 132:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 133:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 140:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 141:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_Corner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 142:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 143:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 150:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | ____ |
+ ECS_VerticalCorner // BottomRight // |/ \|
+ );
+ break;
+
+ case 151:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_BeveledCorner, // TopLeft // / /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 152:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\____/|
+ ECS_VerticalCorner, // TopLeft // | |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 153:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 160:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \_____/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 161:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\_____
+ ECS_VerticalCorner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 162:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 163:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \_____ |
+ ECS_VerticalCorner // BottomRight // \|
+ );
+ break;
+
+ case 170:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 171:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _____/|
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 172:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 173:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | _____/
+ ECS_BeveledCorner // BottomRight // |/
+ );
+ break;
+
+ case 180:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_Corner, // TopLeft // | /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 181:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\_____
+ ECS_VerticalCorner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 182:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 183:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |_____ |
+ ECS_VerticalCorner // BottomRight // \|
+ );
+ break;
+
+ case 190:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 191:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _____/|
+ ECS_Corner, // TopLeft // | |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 192:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 193:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | _____|
+ ECS_Corner // BottomRight // |/
+ );
+ break;
+
+ case 200:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | ____ |
+ ECS_VerticalCorner // BottomRight // |/ \|
+ );
+ break;
+
+ case 201:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_Corner, // TopLeft // | /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 202:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\____/|
+ ECS_VerticalCorner, // TopLeft // | |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 203:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ |
+ ECS_Corner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 210:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ________
+ ECS_HorisontalCorner, // TopLeft // \ /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 211:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\_____
+ ECS_VerticalCorner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | _____/
+ ECS_BeveledCorner // BottomRight // |/
+ );
+ break;
+
+ case 212:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 213:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _____/|
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \_____ |
+ ECS_VerticalCorner // BottomRight // \|
+ );
+ break;
+
+ case 220:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ________
+ ECS_HorisontalCorner, // TopLeft // \ /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 221:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\_____
+ ECS_VerticalCorner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | _____|
+ ECS_Corner // BottomRight // |/
+ );
+ break;
+
+ case 222:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 223:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _____/|
+ ECS_Corner, // TopLeft // | |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |_____ |
+ ECS_VerticalCorner // BottomRight // \|
+ );
+ break;
+
+ case 230:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_BeveledCorner, // TopLeft // / /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 231:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\_____
+ ECS_VerticalCorner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \_____ |
+ ECS_VerticalCorner // BottomRight // \|
+ );
+ break;
+
+ case 232:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 233:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _____/|
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | _____/
+ ECS_BeveledCorner // BottomRight // |/
+ );
+ break;
+
+ case 240:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_Corner, // TopLeft // | /
+ ECS_HorisontalCorner, // TopRight // | |
+ ECS_HorisontalCorner, // BottomLeft // /______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 241:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // |\_____
+ ECS_VerticalCorner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |_____ |
+ ECS_VerticalCorner // BottomRight // \|
+ );
+ break;
+
+ case 242:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _______
+ ECS_HorisontalCorner, // TopLeft // \ |
+ ECS_Corner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______\
+ ECS_HorisontalCorner // BottomRight //
+ );
+ break;
+
+ case 243:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // _____/|
+ ECS_Corner, // TopLeft // | |
+ ECS_VerticalCorner, // TopRight // | |
+ ECS_VerticalCorner, // BottomLeft // | _____|
+ ECS_Corner // BottomRight // |/
+ );
+ break;
+
+ case 250:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 251:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_BeveledCorner, // TopLeft // / |
+ ECS_Corner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______|
+ ECS_Corner // BottomRight //
+ );
+ break;
+
+ case 252:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | |
+ ECS_Corner, // TopRight // | |
+ ECS_BeveledCorner, // BottomLeft // \______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 253:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, // ______
+ ECS_Corner, // TopLeft // | \
+ ECS_BeveledCorner, // TopRight // | |
+ ECS_Corner, // BottomLeft // |______/
+ ECS_BeveledCorner // BottomRight //
+ );
+ break;
+
+ case 0:
+ default:
+ DrawShapedBox(
+ X, Y, Width, Height, Edge, //
+ ECS_BeveledCorner, // TopLeft // ______
+ ECS_BeveledCorner, // TopRight // / \
+ ECS_BeveledCorner, // BottomLeft // | |
+ ECS_BeveledCorner // BottomRight // \______/
+ );
+ break;
+ }
+}
+
+defaultproperties
+{
+
+}
\ No newline at end of file
diff --git a/Classes/BoxPainterBase.uc b/Classes/BoxPainterBase.uc
new file mode 100644
index 0000000..274f8e5
--- /dev/null
+++ b/Classes/BoxPainterBase.uc
@@ -0,0 +1,185 @@
+class BoxPainterBase extends Object;
+
+const Texture = Texture2D'UI_LevelChevrons_TEX.UI_LevelChevron_Icon_02';
+
+enum EPosition
+{
+ ECP_TopLeft,
+ ECP_TopRight,
+ ECP_BottomLeft,
+ ECP_BottomRight
+};
+
+enum EShape
+{
+ ECS_Corner,
+ ECS_BeveledCorner,
+ ECS_VerticalCorner,
+ ECS_HorisontalCorner
+};
+
+var public Canvas Canvas;
+
+private final function DrawBoxTexture(float X, float Y)
+{
+ Canvas.DrawTile(Texture, X, Y, 19, 45, 1, 1);
+}
+
+private final function DrawCornerTexture(float Size, byte Position)
+{
+ switch (Position)
+ {
+ case ECP_TopLeft: Canvas.DrawTile(Texture, Size, Size, 77, 15, -66, 58); return;
+ case ECP_TopRight: Canvas.DrawTile(Texture, Size, Size, 11, 15, 66, 58); return;
+ case ECP_BottomLeft: Canvas.DrawTile(Texture, Size, Size, 77, 73, -66, -58); return;
+ case ECP_BottomRight: Canvas.DrawTile(Texture, Size, Size, 11, 73, 66, -58); return;
+ }
+}
+
+private final function DrawCorner(float X, float Y, float Edge, byte Position, byte Shape)
+{
+ switch (Position)
+ {
+ case ECP_TopLeft: switch (Shape)
+ {
+ case ECS_Corner:
+ return;
+
+ case ECS_BeveledCorner:
+ Canvas.SetPos(X, Y);
+ DrawCornerTexture(Edge, ECP_TopLeft);
+ return;
+
+ case ECS_VerticalCorner:
+ Canvas.SetPos(X, Y - Edge);
+ DrawCornerTexture(Edge, ECP_TopRight);
+ return;
+
+ case ECS_HorisontalCorner:
+ Canvas.SetPos(X - Edge, Y);
+ DrawCornerTexture(Edge, ECP_BottomLeft);
+ return;
+ }
+
+ case ECP_TopRight: switch (Shape)
+ {
+ case ECS_Corner:
+ return;
+
+ case ECS_BeveledCorner:
+ Canvas.SetPos(X - Edge, Y);
+ DrawCornerTexture(Edge, ECP_TopRight);
+ return;
+
+ case ECS_VerticalCorner:
+ Canvas.SetPos(X - Edge, Y - Edge);
+ DrawCornerTexture(Edge, ECP_TopLeft);
+ return;
+
+ case ECS_HorisontalCorner:
+ Canvas.SetPos(X, Y);
+ DrawCornerTexture(Edge, ECP_BottomRight);
+ return;
+ }
+
+ case ECP_BottomLeft: switch (Shape)
+ {
+ case ECS_Corner:
+ return;
+
+ case ECS_BeveledCorner:
+ Canvas.SetPos(X, Y - Edge);
+ DrawCornerTexture(Edge, ECP_BottomLeft);
+ return;
+
+ case ECS_VerticalCorner:
+ Canvas.SetPos(X, Y);
+ DrawCornerTexture(Edge, ECP_BottomRight);
+ return;
+
+ case ECS_HorisontalCorner:
+ Canvas.SetPos(X - Edge, Y - Edge);
+ DrawCornerTexture(Edge, ECP_TopLeft);
+ return;
+ }
+
+ case ECP_BottomRight: switch (Shape)
+ {
+ case ECS_Corner:
+ return;
+
+ case ECS_BeveledCorner:
+ Canvas.SetPos(X - Edge, Y - Edge);
+ DrawCornerTexture(Edge, ECP_BottomRight);
+ return;
+
+ case ECS_VerticalCorner:
+ Canvas.SetPos(X - Edge, Y);
+ DrawCornerTexture(Edge, ECP_BottomLeft);
+ return;
+
+ case ECS_HorisontalCorner:
+ Canvas.SetPos(X, Y - Edge);
+ DrawCornerTexture(Edge, ECP_TopRight);
+ return;
+ }
+ }
+}
+
+public final function DrawShapedBox(float X, float Y, float W, float H, float Edge, byte TopLeftShape, byte TopRightShape, byte BottomLeftShape, byte BottomRightShape)
+{
+ local float BoxX, BoxW;
+
+ Canvas.PreOptimizeDrawTiles((
+ 3 // x3 DrawBoxTexture(...) + x1..x4 DrawCornerTexture(...)
+ + (TopLeftShape == ECS_Corner ? 0 : 1)
+ + (TopRightShape == ECS_Corner ? 0 : 1)
+ + (BottomLeftShape == ECS_Corner ? 0 : 1)
+ + (BottomRightShape == ECS_Corner ? 0 : 1)
+ ), Texture);
+
+ // Top Line
+ DrawCorner(X, Y, Edge, ECP_TopLeft, TopLeftShape);
+
+ BoxX = X; BoxW = W;
+ if (TopLeftShape == ECS_BeveledCorner)
+ {
+ BoxX += Edge;
+ BoxW -= Edge;
+ }
+ if (TopRightShape == ECS_BeveledCorner)
+ {
+ BoxW -= Edge;
+ }
+ Canvas.SetPos(BoxX, Y);
+ DrawBoxTexture(BoxW, Edge);
+
+ DrawCorner(X + W, Y, Edge, ECP_TopRight, TopRightShape);
+
+ // Mid Line
+ Canvas.SetPos(X, Y + Edge);
+ DrawBoxTexture(W, H - Edge * 2);
+
+ // Bottom Line
+ DrawCorner(X, Y + H, Edge, ECP_BottomLeft, BottomLeftShape);
+
+ BoxX = X; BoxW = W;
+ if (BottomLeftShape == ECS_BeveledCorner)
+ {
+ BoxX += Edge;
+ BoxW -= Edge;
+ }
+ if (BottomRightShape == ECS_BeveledCorner)
+ {
+ BoxW -= Edge;
+ }
+ Canvas.SetPos(BoxX, Y + H - Edge);
+ DrawBoxTexture(BoxW, Edge);
+
+ DrawCorner(X + W, Y + H, Edge, ECP_BottomRight, BottomRightShape);
+}
+
+defaultproperties
+{
+
+}
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..0a04128
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,165 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library.
diff --git a/README.md b/README.md
index 34037be..9770201 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,47 @@
# KF2-BoxPainterLib
-2D Box Drawing Library
+
+[![GitHub tag (latest by date)](https://img.shields.io/github/v/tag/GenZmeY/KF2-BoxPainterLib)](https://github.com/GenZmeY/KF2-BoxPainterLib/tags)
+[![GitHub top language](https://img.shields.io/github/languages/top/GenZmeY/KF2-BoxPainterLib)](https://docs.unrealengine.com/udk/Three/WebHome.html)
+[![GitHub](https://img.shields.io/github/license/GenZmeY/KF2-BoxPainterLib)](LICENSE)
+
+**2D box drawing library**
+
+# Add to your project
+There are two ways to add BoxPainterLib to your project:
+### 1. As [git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules)
+Open git-bash and go to your project: `cd `
+Add submodule: `git submodule add https://github.com/GenZmeY/KF2-BoxPainterLib BoxPainterLib`
+
+**updating library:**
+Get updates: `pushd BoxPainterLib && git pull && popd`
+Commit the changes: `git add BoxPainterLib && git commit -m 'update box painter lib'`
+
+### 2. As standalone sources
+Create a `BoxPainterLib` folder and put [this repo](https://github.com/GenZmeY/KF2-BoxPainterLib) there.
+
+# Using
+1. Create `BoxPainter` object: `BoxPainter = new class'BoxPainterLib.BoxPainter';`
+2. Initialize the canvas: `BoxPainter.Canvas = ;`
+3. `BoxPainter` is ready! Use functions [DrawBox(...)](https://github.com/GenZmeY/KF2-BoxPainterLib/blob/master/Classes/BoxPainter.uc#L3) and [DrawShapedBox(...)](https://github.com/GenZmeY/KF2-BoxPainterLib/blob/master/Classes/BoxPainterBase.uc#L129) to draw cool interface boxes.
+
+# Available Functions
+#### DrawShapedBox(float X, float Y, float W, float H, float Edge, byte TopLeftShape, byte TopRightShape, byte BottomLeftShape, byte BottomRightShape)
+Draws a box using the [shape code](https://github.com/GenZmeY/KF2-BoxPainterLib/blob/master/Classes/BoxPainterBase.uc#L13) for each corner:
+- ECS_Corner
+- ECS_BeveledCorner
+- ECS_VerticalCorner
+- ECS_HorisontalCorner
+
+#### DrawBox(float X, float Y, float Width, float Height, float Edge, optional byte Shape = 0)
+Draws a box using the shape code:
+![](rect_shapes.png)
+
+# Build
+If you are using [KF2-BuildTools](https://github.com/GenZmeY/KF2-BuildTools) open `builder.cfg` and add `BoxPainterLib` **first** in `PackageBuildOrder` and `PackageUpload` parameters
+
+If you are building manually add line `ModPackages=BoxPainterLib` to your `KFEditor.ini` before all other `ModPackages`
+
+Now build the mod. `BoxPainterLib.u` library will be next to your `*.u` files
+
+# License
+[GNU LGPLv3](LICENSE)
diff --git a/rect_shapes.png b/rect_shapes.png
new file mode 100644
index 0000000..185b61f
Binary files /dev/null and b/rect_shapes.png differ