private Rectangle[] PackTextures(Rectangle[] source, int width, int height, int maxSize, CancellationToken cancellationToken) { Trace.TraceInformation("Bin packing {0} rectangles", source.Length); Stopwatch stopwatch = Stopwatch.StartNew(); if (width > maxSize || height > maxSize) { return(null); } MaxRectanglesBinPack bp = new MaxRectanglesBinPack(width, height, false); Rectangle[] rects = new Rectangle[source.Length]; for (int i = 0; i < source.Length; i++) { Rectangle rect = bp.Insert(source[i].Width, source[i].Height, MaxRectanglesBinPack.FreeRectangleChoiceHeuristic.RectangleBestAreaFit, cancellationToken); if (rect.Width == 0 || rect.Height == 0) { return(PackTextures(source, width * (width <= height ? 2 : 1), height * (height < width ? 2 : 1), maxSize, cancellationToken)); } rects[i] = rect; } Trace.TraceInformation("Bin packing time for {0} by {1} texture: " + stopwatch.Elapsed.ToString(), width, height); return(rects); }
public void TestMaxRectsPackWithoutRotation() { var maxRectPacker = new MaxRectanglesBinPack(); maxRectPacker.Initialize(100, 100, false); // This data set remain only 1 rectangle that cant be packed var elementToPack = new List <AtlasTextureElement> { CreateElement(null, 80, 100), CreateElement(null, 100, 20), }; maxRectPacker.PackRectangles(elementToPack); Assert.Single(elementToPack); Assert.Single(maxRectPacker.PackedElements); }
public void TestMaxRectsPackWithRotation() { var maxRectPacker = new MaxRectanglesBinPack(); maxRectPacker.Initialize(100, 100, true); // This data set remain only 1 rectangle that cant be packed var packRectangles = new List <AtlasTextureElement> { CreateElement("A", 80, 100), CreateElement("B", 100, 20), }; maxRectPacker.PackRectangles(packRectangles); Assert.Empty(packRectangles); Assert.Equal(2, maxRectPacker.PackedElements.Count); Assert.True(maxRectPacker.PackedElements.Find(e => e.Name == "B").DestinationRegion.IsRotated); }
public void TestMaxRectsPackArbitaryRectangles() { var maxRectPacker = new MaxRectanglesBinPack(); maxRectPacker.Initialize(100, 100, true); // This data set remain only 1 rectangle that cant be packed var packRectangles = new List <AtlasTextureElement> { CreateElement(null, 55, 70), CreateElement(null, 55, 30), CreateElement(null, 25, 30), CreateElement(null, 20, 30), CreateElement(null, 45, 30), CreateElement(null, 25, 40), CreateElement(null, 20, 40), }; maxRectPacker.PackRectangles(packRectangles); Assert.Single(packRectangles); Assert.Equal(6, maxRectPacker.PackedElements.Count); }