Example #1
0
        public Texture2D GetTextureFromCel(CelChunk cel)
        {
            Texture2D texture = Texture2DUtil.CreateTransparentTexture(Header.Width, Header.Height);

            int i     = 0;
            int x     = 0;
            int y     = 0;
            int index = 0;

            int width  = Mathf.Min(cel.Width, Header.Width);
            int height = Mathf.Min(cel.Height, Header.Height);

            Color[] colors = new Color[width * height];

            for (y = 0; y < height; y++)
            {
                for (x = 0; x < width; x++)
                {
                    i     = y * cel.Width + x;
                    index = (height - (y + 1)) * width + x;


                    colors[index] = cel.RawPixelData[i].GetColor();
                }
            }

            texture.SetPixels(cel.X, Header.Height - cel.Y - Mathf.Min(cel.Height, Header.Height), Mathf.Min(cel.Width, Header.Width), Mathf.Min(cel.Height, Header.Height), colors);
            texture.Apply();

            return(texture);
        }
Example #2
0
        public MetaData[] GetMetaData(Vector2 spritePivot, int pixelsPerUnit)
        {
            Dictionary <int, MetaData> metadatas = new Dictionary <int, MetaData>();

            for (int index = 0; index < Frames.Count; index++)
            {
                List <LayerChunk> layers = GetChunks <LayerChunk>();
                List <CelChunk>   cels   = Frames[index].GetChunks <CelChunk>();

                cels.Sort((ca, cb) => ca.LayerIndex.CompareTo(cb.LayerIndex));

                for (int i = 0; i < cels.Count; i++)
                {
                    int        layerIndex = cels[i].LayerIndex;
                    LayerChunk layer      = layers[layerIndex];
                    if (!layer.LayerName.StartsWith(MetaData.MetaDataChar)) //read only metadata layer
                    {
                        continue;
                    }

                    if (!metadatas.ContainsKey(layerIndex))
                    {
                        metadatas[layerIndex] = new MetaData(layer.LayerName);
                    }
                    var metadata = metadatas[layerIndex];

                    CelChunk cel        = cels[i];
                    Vector2  center     = Vector2.zero;
                    int      pixelCount = 0;

                    for (int y = 0; y < cel.Height; ++y)
                    {
                        for (int x = 0; x < cel.Width; ++x)
                        {
                            int texX = cel.X + x;
                            int texY = -(cel.Y + y) + Header.Height - 1;
                            var col  = cel.RawPixelData[x + y * cel.Width];
                            if (col.GetColor().a > 0.1f)
                            {
                                center += new Vector2(texX, texY);
                                pixelCount++;
                            }
                        }
                    }

                    if (pixelCount > 0)
                    {
                        center /= pixelCount;
                        var pivot    = Vector2.Scale(spritePivot, new Vector2(Header.Width, Header.Height));
                        var posWorld = (center - pivot) / pixelsPerUnit + Vector2.one * 0.5f / pixelsPerUnit; //center pos in middle of pixels

                        metadata.Transforms.Add(index, posWorld);
                    }
                }
            }
            return(metadatas.Values.ToArray());
        }
Example #3
0
        public Texture2D GetTextureFromCel(CelChunk cel)
        {
            int canvasWidth  = Header.Width;
            int canvasHeight = Header.Height;

            Texture2D texture = Texture2DUtil.CreateTransparentTexture(canvasWidth, canvasHeight);

            // Sometimes cell width/height can be larger than image (pixels stored off-screen), adjust our rect to fit canvas viewport
            //有些贴图中像素会超过画布范围,裁剪到画布内
            int celWidth  = Mathf.Min(canvasWidth - cel.X, cel.Width);
            int celHeight = Mathf.Min(canvasHeight - cel.Y, cel.Height);

            // Only need to render as large as viewport or cel, whichever is smaller
            int renderRectWidth  = Math.Min(canvasWidth, celWidth);
            int renderRectHeight = Math.Min(canvasHeight, celHeight);

            // If cel offset is positive, displace the same amount on our texture
            int destX = Mathf.Max(0, cel.X);
            //renderRectWidth = celWidth - destX;
            int destY = Mathf.Max(0, canvasHeight - cel.Height - cel.Y); // Aseprite is upper left origin, Unity textures are lower left, so perform flip

            Color[] colors = new Color[renderRectWidth * renderRectHeight];

            // If cell offset is negative, displace the same same amount on cel data
            int celX = Mathf.Max(0, -cel.X);
            int celY = Mathf.Max(0, -cel.Y);

            //Debug.Log(renderRectWidth + "," + renderRectHeight);
            for (int y = 0; y < renderRectHeight; y++)
            {
                for (int x = 0; x < renderRectWidth; x++)
                {
                    int celDataIndex = (y + celY) * cel.Width + (x + celX);
                    int index        = (renderRectHeight - 1 - (y)) * renderRectWidth + (x);

                    if (cel.RawPixelData.Length <= celDataIndex)
                    {
                        continue;
                    }

                    colors[index] = cel.RawPixelData[celDataIndex].GetColor();
                }
            }

            //Debug.Log(destX + "," + destY + " . " + renderRectWidth + "," + renderRectHeight);

            texture.SetPixels(destX, destY, renderRectWidth, renderRectHeight, colors);
            texture.Apply();

            return(texture);
        }
Example #4
0
        public Texture2D GetTextureFromCel(CelChunk cel)
        {
            int canvasWidth  = Header.Width;
            int canvasHeight = Header.Height;

            Texture2D texture = Texture2DUtil.CreateTransparentTexture(canvasWidth, canvasHeight);

            Color[] colors = new Color[canvasWidth * canvasHeight];

            int pixelIndex = 0;
            int celXEnd    = cel.Width + cel.X;
            int celYEnd    = cel.Height + cel.Y;


            for (int y = cel.Y; y < celYEnd; y++)
            {
                if (y < 0 || y >= canvasHeight)
                {
                    pixelIndex += cel.Width;
                    continue;
                }

                for (int x = cel.X; x < celXEnd; x++)
                {
                    if (x >= 0 && x < canvasWidth)
                    {
                        int index = (canvasHeight - 1 - y) * canvasWidth + x;
                        colors[index] = cel.RawPixelData[pixelIndex].GetColor();
                    }

                    ++pixelIndex;
                }
            }

            texture.SetPixels(0, 0, canvasWidth, canvasHeight, colors);
            texture.Apply();

            return(texture);
        }
Example #5
0
        public static Chunk ReadChunk(Frame frame, BinaryReader reader)
        {
            uint      length = reader.ReadUInt32();
            ChunkType type   = (ChunkType)reader.ReadUInt16();

            switch (type)
            {
            case ChunkType.Cel:
                return(CelChunk.ReadCelChunk(length, reader, frame));

            case ChunkType.CelExtra:
                return(new CelExtraChunk(length, reader)
                {
                    Frame = frame
                });

            case ChunkType.Layer:
                return(new LayerChunk(length, reader)
                {
                    Frame = frame
                });

            case ChunkType.FrameTags:
                return(new FrameTagsChunk(length, reader)
                {
                    Frame = frame
                });

            case ChunkType.Palette:
                return(new PaletteChunk(length, reader)
                {
                    Frame = frame
                });
            }

            reader.BaseStream.Position += length - Chunk.HEADER_SIZE;
            return(null);
        }
Example #6
0
        public Texture2D GetTextureFromCel(CelChunk cel)
        {
            Texture2D texture = Texture2DUtil.CreateTransparentTexture(Header.Width, Header.Height);

            int i = 0;
            int x = 0;
            int y = 0;

            int destX   = 0;
            int destY   = 0;
            int offsetX = 0;
            int offsetY = 0;

            int index = 0;

            int width  = Mathf.Min(cel.Width, Header.Width);
            int height = Mathf.Min(cel.Height, Header.Height);

            bool overlappingX = cel.Width + cel.X > Header.Width;
            bool overlappingY = cel.Height + cel.Y > Header.Height;

            if (overlappingX)
            {
                width -= (cel.X + cel.Width) - Header.Width;
            }

            if (overlappingY)
            {
                height -= (cel.Y + cel.Height) - Header.Height;
            }

            if (cel.X < 0)
            {
                offsetX = cel.X * -1;
            }

            if (cel.Y < 0)
            {
                offsetY = cel.Y * -1;
            }


            Color[] colors = new Color[width * height];


            for (y = offsetY; y < height; y++)
            {
                destX = 0;
                for (x = offsetX; x < width; x++)
                {
                    i     = y * cel.Width + x;
                    index = (height - (y + 1)) * width + x;

                    colors[index] = cel.RawPixelData[i].GetColor();
                    destX++;
                }

                destY++;
            }

            texture.SetPixels(cel.X + offsetX, Header.Height - (cel.Y + offsetY) - height, width, height, colors);
            texture.Apply();

            return(texture);
        }