Exemple #1
0
 PackData(int index, int width, int height, FrameImage frameImage)
 {
     this.Index  = index;
     this.Width  = width;
     this.Height = height;
     FrameImage  = frameImage;
 }
Exemple #2
0
 public PackPos(int index, int x, int y, int width, int height, FrameImage frameImage)
 {
     Width      = width;
     Height     = height;
     FrameImage = frameImage;
     this.Index = index;
     this.X     = x;
     this.Y     = y;
 }
Exemple #3
0
        public SpriteDefinition(SpriteMetaData metaData, FrameImage frame)
        {
            if (frame == null)
            {
                throw new ArgumentNullException(nameof(frame));
            }

            MetaData = metaData;
            Frame    = frame;
        }
Exemple #4
0
        static List <FrameImage> LoadFrameImage(string baseName,
                                                AseFile file,
                                                Frame frame)
        {
            var cels = frame.Cels.OrderBy(it => it.LayerIndex).ToList();

            var subImages = file.SubImages.ToList();
            var images    = new List <FrameImage>();

            for (var subImageIndex = 0; subImageIndex < subImages.Count; subImageIndex++)
            {
                var subImage   = subImages[subImageIndex];
                var spriteName = string.IsNullOrEmpty(subImage.ImageName) ? baseName : subImage.ImageName;
                var image      = new FrameImage(frame.FrameId, spriteName, subImageIndex, file.Width, file.Height);

                foreach (var cel in cels)
                {
                    var layer = subImage.FindLayer(cel.LayerIndex);
                    if (layer == null || layer.Type != LayerType.Content)
                    {
                        continue;
                    }

                    Debug.Log($"Cel size: {cel.X}, {cel.Y}, {cel.Width}, {cel.Height}");

                    // Cels can have data outside of the visible frame area.
                    // As we are manipulating image data, not cel data, this
                    // can cause problems if we dont check bounds carefully.
                    var maxX = Math.Min(image.Width - cel.X, cel.Width);
                    var maxY = Math.Min(image.Height - cel.Y, cel.Height);
                    var minX = Math.Max(0, -cel.X);
                    var minY = Math.Max(0, -cel.Y);

                    Debug.Log($"Cel processing: {minX}, {minY}, {maxX}, {maxY}");

                    for (int cy = minY; cy < maxY; ++cy)
                    {
                        for (int cx = minX; cx < maxX; ++cx)
                        {
                            var x          = cx + cel.X;
                            var y          = cy + cel.Y;
                            var layerColor = cel.GetPixel(x, y);
                            if (layerColor.a > 0f)
                            {
                                image[x, y] = AlphaBlend(image[x, y], layerColor);
                            }
                        }
                    }
                }

                images.Add(image);
            }

            return(images);
        }
Exemple #5
0
        public static Texture2D CreateTexture(FrameImage image)
        {
            var boundingBox = image.BoundingBox;
            var imageSize   = Math.Max(1, Math.Max(boundingBox.Width, boundingBox.Height));
            var textureSize = (int)Math.Pow(2, Math.Ceiling(Math.Log(imageSize, 2)));
            var texture     = CreateEmptyTexture(textureSize);

            for (var y = boundingBox.MinY; y < boundingBox.MaxY; ++y)
            {
                for (var x = boundingBox.MinX; x < boundingBox.MaxX; ++x)
                {
                    var texX = (x - boundingBox.MinX);
                    var texY = -(y - boundingBox.MinY) + boundingBox.Height - 1;
                    texture.SetPixel(texX, texY, image[x, y]);
                }
            }

            texture.Apply();
            return(texture);
        }
Exemple #6
0
        public static SpriteMetaData GenerateSpriteMetaData(FrameImage image,
                                                            string name,
                                                            Rect rect,
                                                            Vector2 normalisedPivotPoint)
        {
            var metadata = new SpriteMetaData();

            metadata.name      = name;
            metadata.alignment = (int)SpriteAlignment.Custom;
            metadata.rect      = rect;

            // calculate relative pivot
            var pivotPointInFrame = Vector2.Scale(normalisedPivotPoint, new Vector2(image.Width, image.Height));
            var newPivotTex       = pivotPointInFrame - new Vector2(image.BoundingBox.MinX, image.Height - image.BoundingBox.MaxY - 1);
            var newPivotNorm      = Vector2.Scale(newPivotTex, new Vector2(1.0f / rect.width, 1.0f / rect.height));

            metadata.pivot = newPivotNorm;

            Debug.Log("For Sprite " + name + " using pivot point at pixel " + pivotPointInFrame + " normalised to " + newPivotNorm + " (with bb: " + image.BoundingBox + ")");
            return(metadata);
        }
Exemple #7
0
 public static PackData AsLooselyPacked(FrameImage img, int index)
 {
     return(new PackData(index, img.Width, img.Height, img));
 }
Exemple #8
0
 public static PackData AsDenselyPacked(FrameImage img, int index)
 {
     return(new PackData(index, img.BoundingBox.Width, img.BoundingBox.Height, img));
 }