Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }
Пример #4
0
        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);
        }