using System; using System.Numerics; using Raylib_cs; namespace PhysicsEngine { public static class DrawHelper { public static Color GetDarkerColor(Color color, float factor = 0.5f) { return new Color( (byte)(color.R * factor), (byte)(color.G * factor), (byte)(color.B * factor), color.A ); } public static void DrawRotatedBox(Vector2 position, Vector2 size, float rotationRadians, Color fillColor, float pixelsPerMeter = 100.0f, float outlineThickness = 3.0f) { Vector2 sizePixels = size * pixelsPerMeter; Vector2 positionPixels = position * pixelsPerMeter; float rotationDegrees = rotationRadians * (180.0f / MathF.PI); Color outlineColor = GetDarkerColor(fillColor); // 1. Draw the outer outline rectangle (exact original size, outline colour) Vector2 outerSizePixels = sizePixels; Vector2 outerOrigin = outerSizePixels * 0.5f; Rectangle outerRec = new Rectangle(positionPixels.X, positionPixels.Y, outerSizePixels.X, outerSizePixels.Y); Raylib.DrawRectanglePro(outerRec, outerOrigin, rotationDegrees, outlineColor); // 2. Draw the inner fill rectangle, reduced by outlineThickness on all sides Vector2 innerSizePixels = new Vector2( MathF.Max(0, sizePixels.X - outlineThickness), MathF.Max(0, sizePixels.Y - outlineThickness) ); Vector2 innerOrigin = innerSizePixels * 0.5f; Rectangle innerRec = new Rectangle(positionPixels.X, positionPixels.Y, innerSizePixels.X, innerSizePixels.Y); Raylib.DrawRectanglePro(innerRec, innerOrigin, rotationDegrees, fillColor); } public static void DrawCircleBody(Vector2 position, float radius, float rotationRadians, Color fillColor, float pixelsPerMeter = 100.0f, float outlineThickness = 3.0f) { Vector2 positionPixels = position * pixelsPerMeter; float radiusPixels = radius * pixelsPerMeter; Color outlineColor = GetDarkerColor(fillColor); // 1. Draw outer circle (outline colour, exact radius) Raylib.DrawCircleV(positionPixels, radiusPixels, outlineColor); // 2. Draw inner circle (fill colour, radius reduced by outlineThickness) float innerRadius = MathF.Max(0, radiusPixels - outlineThickness); Raylib.DrawCircleV(positionPixels, innerRadius, fillColor); // Draw rotation indicator line inside the fill (same as before, but from centre to inner edge) float cos = MathF.Cos(rotationRadians); float sin = MathF.Sin(rotationRadians); Vector2 edge = positionPixels + new Vector2(cos, sin) * innerRadius; Raylib.DrawLineEx(positionPixels, edge, 2.0f, outlineColor); } } }