using System.Numerics; using Raylib_cs; namespace OnekoOnline; static class MathExt { public static Vector2 LimitLength(this Vector2 toLimit, float lengthLimit) { float length = toLimit.Length(); if (toLimit == Vector2.Zero) return Vector2.Zero; return Vector2.Normalize(toLimit) * MathF.Min(length, lengthLimit); } public static Vector2 Round(this Vector2 toRound) { return new(MathF.Round(toRound.X), MathF.Round(toRound.Y)); } } static class StringExt { public static string LimitLength(this string value, int maxLength) { if (string.IsNullOrEmpty(value)) return value; return value.Length <= maxLength ? value : value[..maxLength]; } } static class RaylibExt { public static int TextureLength(int width, int height, PixelFormat format, int mipmaps) { int size = 0; for (int i = 0; i < mipmaps; i++) { size += Raylib.GetPixelDataSize(width, height, format); //Max is a security check for NPOT textures width = Math.Max(width/2, 1); height = Math.Max(height/2, 1); } return size; } public static int DataLength(this Image img) => TextureLength(img.Width, img.Height, img.Format, img.Mipmaps); public static int DataLength(this Texture2D tex) => TextureLength(tex.Width, tex.Height, tex.Format, tex.Mipmaps); public unsafe static Span DataSpan(this Image img) => new(img.Data, img.DataLength()); } public static class Directions { public static readonly Vector2 Up = new(0,-1); public static readonly Vector2 Down = new(0,1); public static readonly Vector2 Left = new(-1,0); public static readonly Vector2 Right = new(1,0); public static readonly Vector2 UpLeft = Vector2.Normalize(Up+Left); public static readonly Vector2 UpRight = Vector2.Normalize(Up+Right); public static readonly Vector2 DownLeft = Vector2.Normalize(Down+Left); public static readonly Vector2 DownRight = Vector2.Normalize(Down+Right); }