Exemplo n.º 1
0
        public object Process(object asset, AssetInfo info)
        {
            if (asset == null)
            {
                throw new ArgumentNullException(nameof(asset));
            }
            if (info == null)
            {
                throw new ArgumentNullException(nameof(info));
            }

            var sprite      = (IReadOnlyTexture <byte>)asset;
            var layout      = SpriteSheetUtil.ArrangeSpriteSheet(sprite.Regions.Count, 1, sprite.GetRegionBuffer);
            var totalHeight = ApiUtil.NextPowerOfTwo(layout.Height);

            byte[] pixelData = new byte[layout.Width * totalHeight];
            var    subImages = new Region[sprite.Regions.Count];

            for (int n = 0; n < sprite.Regions.Count; n++)
            {
                var frame      = sprite.GetRegionBuffer(n);
                var destWidth  = frame.Width + 2 * MarginPixels;
                var destHeight = frame.Height + 2 * MarginPixels;
                var(x, y) = layout.Positions[n];
                for (int j = 0; j < destHeight; j++)
                {
                    for (int i = 0; i < destWidth; i++)
                    {
                        var  sourceX = Math.Clamp(i - MarginPixels, 0, frame.Width - 1);
                        var  sourceY = Math.Clamp(j - MarginPixels, 0, frame.Height - 1);
                        int  src     = sourceX + sourceY * sprite.Width;
                        int  dest    = x + i + (y + j) * layout.Width;
                        byte pixel   = frame.Buffer[src];
                        pixelData[dest] = pixel;
                    }
                }

                subImages[n] = new Region(
                    new Vector2(x + MarginPixels, y + MarginPixels),
                    new Vector2(frame.Width, frame.Height),
                    new Vector2(layout.Width, totalHeight),
                    0);
            }

            return(new SimpleTexture <byte>(
                       info.AssetId, sprite.Id.ToString(),
                       layout.Width, totalHeight,
                       pixelData,
                       subImages));
        }
Exemplo n.º 2
0
        public static Image <Rgba32> PackSpriteSheet(uint[] palette, int frameCount, GetFrameDelegate <byte> getFrame)
        {
            var            layout = SpriteSheetUtil.ArrangeSpriteSheet(frameCount, 0, getFrame);
            Image <Rgba32> image  = new Image <Rgba32>(layout.Width, layout.Height);

            if (!image.TryGetSinglePixelSpan(out var rgbaSpan))
            {
                throw new InvalidOperationException("Could not retrieve single span from Image");
            }

            Span <uint> pixels = MemoryMarshal.Cast <Rgba32, uint>(rgbaSpan);

            for (var i = 0; i < frameCount; i++)
            {
                var frame = getFrame(i);
                var(toX, toY) = layout.Positions[i];
                var target = pixels[(toX + toY * layout.Width)..];