using Azimuth; using Blacklight.Core; using Blacklight.Core.Drawables; using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Text; using System.Threading.Tasks; namespace Glass.Blacklight { public class SpriteSheetRenderer { public SpriteSheetAttribute Source; public SpriteSheet SpriteSheet; public static Vector MirrorY(Vector vector) { return new Vector(vector.X, -vector.Y); } public void Render(Cel cel, SpriteMaterial material, Rect rect, AffineMatrix transform) { var sprite = new Shard { Sheet = SpriteSheet, Frame = material.CellLocation, Vertices = new Vector[4] { MirrorY(rect.BottomLeft), MirrorY(rect.BottomRight), MirrorY(rect.TopRight), MirrorY(rect.TopLeft), }, }; cel.AddEntity(new Entity(sprite, transform)); } public static SpriteSheet LoadSpriteSheet(SpriteSheetAttribute spriteSheetAttribute, WindowHandle window) { var assembly = Assembly.GetEntryAssembly(); using (var stream = assembly.GetManifestResourceStream(spriteSheetAttribute.SpriteSheetSource)) { if (stream == null) { return null; } return window.CreateSpriteSheet(stream, new System.Drawing.Size(spriteSheetAttribute.SpriteSize.X, spriteSheetAttribute.SpriteSize.Y), spriteSheetAttribute.BorderSize); } } public static SpriteSheetRenderer SpriteSheetBuilder( Type type, WindowHandle windowHandle, SpriteSheetAttribute spriteSheetAttribute) { string source = spriteSheetAttribute.SpriteSheetSource; if (source == null) { throw new ArgumentException( $"Type {type} had a MaterialLibraryAttribute with a null PackSheetSource."); } SpriteSheet spriteSheet = LoadSpriteSheet(spriteSheetAttribute, windowHandle); if (spriteSheet == null) { throw new ArgumentException( $"Could not load the pack sheet {spriteSheetAttribute.SpriteSheetSource} for Type {type}."); } return new SpriteSheetRenderer { Source = spriteSheetAttribute, SpriteSheet = spriteSheet, }; } } }