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); }
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()); }
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); }
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); }
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); }
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); }