From 5fb4265197c7d0ca297ff29c6e4acc47bb894341 Mon Sep 17 00:00:00 2001 From: Frank Tovar Date: Fri, 8 May 2026 22:10:57 +0200 Subject: [PATCH] Round dual terrain tile corners --- .../MainWindow.xaml.cs | 39 +++++++++++++++++-- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/ReactorMaintenance.Win2D/MainWindow.xaml.cs b/src/ReactorMaintenance.Win2D/MainWindow.xaml.cs index 28d7f9a..557c037 100644 --- a/src/ReactorMaintenance.Win2D/MainWindow.xaml.cs +++ b/src/ReactorMaintenance.Win2D/MainWindow.xaml.cs @@ -4,6 +4,7 @@ using Windows.Storage; using Windows.Storage.Pickers; using Windows.UI; using Microsoft.Graphics.Canvas; +using Microsoft.Graphics.Canvas.Geometry; using Microsoft.Graphics.Canvas.Text; using Microsoft.Graphics.Canvas.UI.Xaml; using Microsoft.UI; @@ -228,22 +229,52 @@ public sealed partial class MainWindow var halfWidth = rect.Width / 2; var halfHeight = rect.Height / 2; if ((floorMask & c_TopLeftFloor) != 0) - drawing.FillRectangle(new(rect.X, rect.Y, halfWidth, halfHeight), floorColor); + DrawFloorCorner(drawing, rect, floorColor, c_TopLeftFloor); if ((floorMask & c_TopRightFloor) != 0) - drawing.FillRectangle(new(rect.X + halfWidth, rect.Y, halfWidth, halfHeight), floorColor); + DrawFloorCorner(drawing, rect, floorColor, c_TopRightFloor); if ((floorMask & c_BottomLeftFloor) != 0) - drawing.FillRectangle(new(rect.X, rect.Y + halfHeight, halfWidth, halfHeight), floorColor); + DrawFloorCorner(drawing, rect, floorColor, c_BottomLeftFloor); if ((floorMask & c_BottomRightFloor) != 0) - drawing.FillRectangle(new(rect.X + halfWidth, rect.Y + halfHeight, halfWidth, halfHeight), floorColor); + DrawFloorCorner(drawing, rect, floorColor, c_BottomRightFloor); var center = new Vector2((float)(rect.X + halfWidth), (float)(rect.Y + halfHeight)); if (floorMask is c_TopLeftFloor or c_TopRightFloor or c_BottomLeftFloor or c_BottomRightFloor) drawing.FillCircle(center, (float)Math.Min(rect.Width, rect.Height) * 0.18f, floorColor); } + private static void DrawFloorCorner(CanvasDrawingSession drawing, Rect rect, Color color, int corner) + { + var center = new Vector2((float)(rect.X + rect.Width / 2), (float)(rect.Y + rect.Height / 2)); + var radiusX = (float)rect.Width / 2; + var radiusY = (float)rect.Height / 2; + var start = corner switch { + c_TopLeftFloor => new Vector2(center.X, (float)rect.Y), + c_TopRightFloor => new Vector2((float)(rect.X + rect.Width), center.Y), + c_BottomRightFloor => new Vector2(center.X, (float)(rect.Y + rect.Height)), + c_BottomLeftFloor => new Vector2((float)rect.X, center.Y), + _ => center + }; + var end = corner switch { + c_TopLeftFloor => new Vector2((float)rect.X, center.Y), + c_TopRightFloor => new Vector2(center.X, (float)rect.Y), + c_BottomRightFloor => new Vector2((float)(rect.X + rect.Width), center.Y), + c_BottomLeftFloor => new Vector2(center.X, (float)(rect.Y + rect.Height)), + _ => center + }; + + using var builder = new CanvasPathBuilder(drawing); + builder.BeginFigure(center); + builder.AddLine(start); + builder.AddArc(end, radiusX, radiusY, 0, CanvasSweepDirection.CounterClockwise, CanvasArcSize.Small); + builder.EndFigure(CanvasFigureLoop.Closed); + + using var geometry = CanvasGeometry.CreatePath(builder); + drawing.FillGeometry(geometry, color); + } + private int GetDualTileMask(int x, int y) { var mask = 0;