private Image CreateAtlasImage(Atlas _Atlas) { Image img = new Bitmap(_Atlas.Width, _Atlas.Height, System.Drawing.Imaging.PixelFormat.Format32bppArgb); System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(img); if (DebugMode) { g.FillRectangle(Brushes.Green, new Rectangle(0, 0, _Atlas.Width, _Atlas.Height)); } foreach (Node n in _Atlas.Nodes) { if (n.Texture != null) { Image sourceImg = Image.FromFile(n.Texture.Source); g.DrawImage(sourceImg, n.Bounds); if (DebugMode) { string label = Path.GetFileNameWithoutExtension(n.Texture.Source); SizeF labelBox = g.MeasureString(label, SystemFonts.MenuFont, new SizeF(n.Bounds.Size)); RectangleF rectBounds = new Rectangle(n.Bounds.Location, new Size((int)labelBox.Width, (int)labelBox.Height)); g.FillRectangle(Brushes.Black, rectBounds); g.DrawString(label, SystemFonts.MenuFont, Brushes.White, rectBounds); } } else { g.FillRectangle(Brushes.DarkMagenta, n.Bounds); if (DebugMode) { string label = n.Bounds.Width.ToString() + "x" + n.Bounds.Height.ToString(); SizeF labelBox = g.MeasureString(label, SystemFonts.MenuFont, new SizeF(n.Bounds.Size)); RectangleF rectBounds = new Rectangle(n.Bounds.Location, new Size((int)labelBox.Width, (int)labelBox.Height)); g.FillRectangle(Brushes.Black, rectBounds); g.DrawString(label, SystemFonts.MenuFont, Brushes.White, rectBounds); } } } return(img); }
public void Process(string _SourceDir, string _Pattern, int _AtlasSize, int _Padding, bool _DebugMode) { Padding = _Padding; AtlasSize = _AtlasSize; DebugMode = _DebugMode; //1: scan for all the textures we need to pack ScanForTextures(_SourceDir, _Pattern); List <ImageInfo> textures = new List <ImageInfo>(); textures = SourceTextures.ToList(); //2: generate as many atlasses as needed (with the latest one as small as possible) Atlasses = new List <Atlas>(); while (textures.Count > 0) { Atlas atlas = new Atlas(); atlas.Width = _AtlasSize; atlas.Height = _AtlasSize; List <ImageInfo> leftovers = LayoutAtlas(textures, atlas); if (leftovers.Count == 0) { // we reached the last atlas. Check if this last atlas could have been twice smaller while (leftovers.Count == 0) { atlas.Width /= 2; atlas.Height /= 2; leftovers = LayoutAtlas(textures, atlas); } // we need to go 1 step larger as we found the first size that is to small atlas.Width *= 2; atlas.Height *= 2; leftovers = LayoutAtlas(textures, atlas); } Atlasses.Add(atlas); textures = leftovers; } }
public void Process(int WidthPixels, int PaddingPixels, bool _DebugMode) { List <ImageInfo> textures = new List <ImageInfo>(); textures = SourceTextures.ToList(); //2: generate as many atlasses as needed (with the latest one as small as possible) Atlasses = new List <Atlas>(); while (textures.Count > 0) { Atlas atlas = new Atlas(); atlas.Width = WidthPixels; atlas.Height = WidthPixels; List <ImageInfo> leftovers = LayoutAtlas(textures, atlas); if (leftovers.Count == 0) { // we reached the last atlas. Check if this last atlas could have been twice smaller while (leftovers.Count == 0) { atlas.Width /= 2; atlas.Height /= 2; leftovers = LayoutAtlas(textures, atlas); } // we need to go 1 step larger as we found the first size that is to small atlas.Width *= 2; atlas.Height *= 2; leftovers = LayoutAtlas(textures, atlas); } Atlasses.Add(atlas); textures = leftovers; } }