// returns false when the packing failed. private bool TryPack(int sheet_w, int sheet_h) { SpriteAtlas.Clear(); // load all sprites into list and sort var spritesToPack = new List <Sprite>( sprites.Select(sprite => new Sprite { Bitmap = sprite.Item2, Name = sprite.Item1 })); spritesToPack.Sort((sprite1, sprite2) => sprite2.Area.CompareTo(sprite1.Area)); var packer = new MaxRectsBinPack.MaxRectsBinPack(sheet_w, sheet_h, false); foreach (var sprite in spritesToPack) { var rect = packer.Insert(sprite.Width, sprite.Height, FreeRectChoiceHeuristic.RectBestShortSideFit); if (rect.GetArea() == 0) { return(false); } SpriteAtlas.Add(new PackedSprite(rect.X, rect.Y, sprite)); } SpriteSheet = new Bitmap(sheet_w, sheet_h); return(true); }
private static PackedSprite[] TryPack(Sprite[] sprites, int sheet_w, int sheet_h) { List <PackedSprite> packedSprites = new List <PackedSprite>(); // load all sprites into list and sort var spritesToPack = new List <Sprite>(sprites); spritesToPack.Sort((sprite1, sprite2) => sprite2.Area.CompareTo(sprite1.Area)); var packer = new MaxRectsBinPack.MaxRectsBinPack(sheet_w, sheet_h, false); foreach (var sprite in spritesToPack) { var rect = packer.Insert(sprite.Width, sprite.Height, FreeRectChoiceHeuristic.RectBestShortSideFit); if (rect.Width == 0 || rect.Height == 0) { return(null); } packedSprites.Add(new PackedSprite(sprite, rect.Location)); } return(packedSprites.ToArray()); }