public void FreeArea(TexArea area) { if (Slices.Count <= area.Data.Slice || area.Data.Slice < 0) { return; } Slices[area.Data.Slice].FreeArea(area); }
public TexSlice(int w, int h, int slice) { Width = w; Height = h; Slice = slice; var full = new TexArea(); full.Data.Slice = Slice; full.Data.X = 0; full.Data.Y = 0; full.Data.Width = w; full.Data.Height = h; full.IsFree = true; FreeAreas.Add(full); }
public void FreeArea(TexArea area) { if (ValidAreas.Contains(area)) { FreeAreas.Add(area); //sort free areas FreeAreas.Sort((left, right) => { return(left.GetArea() - right.GetArea()); }); } else { Profiler.Log.WriteLine(Profiler.ELogTag.Warning, "TextureAtlas", $"TexArea {area} free failed"); } }
public TexArea SplitArea(TexArea area, int w, int h) { if (area.Data.Width == w && area.Data.Height == h) { return(area); } var result = new TexArea(); result.Data.Slice = Slice; result.Data.X = area.Data.X; result.Data.Y = area.Data.Y; result.Data.Width = w; result.Data.Height = h; result.IsFree = false; if (area.Data.Width - w >= area.Data.Height - h) { var n1 = new TexArea(); n1.Data.Slice = Slice; n1.Data.X = area.Data.X + w; n1.Data.Y = area.Data.Y; n1.Data.Width = area.Data.Width - w; n1.Data.Height = area.Data.Height; n1.IsFree = true; var n2 = new TexArea(); n2.Data.Slice = Slice; n2.Data.X = area.Data.X; n2.Data.Y = area.Data.Y + h; n2.Data.Width = w; n2.Data.Height = area.Data.Height - h; n2.IsFree = true; if (n1.Data.Width > 0) { FreeAreas.Add(n1); } if (n2.Data.Height > 0) { FreeAreas.Add(n2); } } else { var n1 = new TexArea(); n1.Data.Slice = Slice; n1.Data.X = area.Data.X + w; n1.Data.Y = area.Data.Y; n1.Data.Width = area.Data.Width - w; n1.Data.Height = h; n1.IsFree = true; var n2 = new TexArea(); n2.Data.Slice = Slice; n2.Data.X = area.Data.X; n2.Data.Y = area.Data.Y + h; n2.Data.Width = area.Data.Width; n2.Data.Height = area.Data.Height - h; n2.IsFree = true; if (n1.Data.Width > 0) { FreeAreas.Add(n1); } if (n2.Data.Height > 0) { FreeAreas.Add(n2); } } return(result); }