public bool PackSpriteSheet(SpriteSheet originalSpriteSheet, bool requirePowTwo, bool requireSquare, int padding, bool generateMap, int maxWidth, int maxHeight, out SpriteSheet packed) { tempSpriteSheet = originalSpriteSheet.BlankClone(); finalSpriteSheetWidth = maxWidth; finalSpriteSheetHeight = maxHeight; this.requirePowTwo = requirePowTwo; this.requireSquare = requireSquare; this.padding = padding; var sprites = originalSpriteSheet.Frames; sprites.Sort( (i1, i2) => { Size b1 = new Size(i1.Width, i1.Height); Size b2 = new Size(i2.Width, i2.Height); int c = -b1.Width.CompareTo(b2.Width); if (c != 0) { return(c); } c = -b1.Height.CompareTo(b2.Height); if (c != 0) { return(c); } return(0); } ); if (!PackBruteForce(originalSpriteSheet.Frames)) { packed = null; return(false); } Bitmap packedTexture = BuildPackedTexture(originalSpriteSheet); tempSpriteSheet.ResetTextureFromBitmap(packedTexture); if (generateMap) { int[] keys = new int[finalSpriteMapping.Keys.Count]; finalSpriteMapping.Keys.CopyTo(keys, 0); foreach (var key in keys) { Rect r = finalSpriteMapping[key]; r.Right -= padding; r.Bottom -= padding; finalSpriteMapping[key] = r; } foreach (var map in finalSpriteMapping) { SpriteSheetFrame newFrame = new SpriteSheetFrame(map.Value, tempSpriteSheet); newFrame.Id = map.Key; newFrame.TagName = originalSpriteSheet.Frames[newFrame.Id].TagName; tempSpriteSheet.Frames.Add(newFrame); } } packed = tempSpriteSheet; testSpriteMapping.Clear(); finalSpriteMapping.Clear(); return(true); }