Ejemplo n.º 1
0
        private (LayoutInfo, AssetsInfo) Create(XdArtboard xdArtboard, XdAssetHolder assetHolder, string name, Dictionary <string, string> userData)
        {
            var renderer = new XdRenderer(xdArtboard, assetHolder, _objectParsers, _groupParsers, _triggers);

            var layoutInfoForCalcHash = new LayoutInfo(
                name,
                0,
                renderer.Meta,
                new Dictionary <string, string>(),
                renderer.Root,
                renderer.Elements.ToArray()
                );
            var hash = FastHash.CalculateHash(JsonConvert.SerializeObject(AkyuiCompressor.ToSerializable(layoutInfoForCalcHash)));

            var layoutInfo = new LayoutInfo(
                name,
                hash,
                renderer.Meta,
                userData,
                renderer.Root,
                renderer.Elements.ToArray()
                );

            var assetsInfo = new AssetsInfo(
                renderer.Assets.ToArray()
                );

            return(layoutInfo, assetsInfo);
        }
Ejemplo n.º 2
0
        private static (int Imported, int Skipped) ImportedArtboards(XdImportSettings xdSettings, AkyuiLogger logger, string xdFilePath, IAkyuiProgress progress, List <IAkyuiLoader> loaders)
        {
            logger.Log($"Xd Import Start");
            var file     = new XdFile(xdFilePath);
            var imported = 0;
            var skipped  = 0;

            var targets = new List <XdArtboard>();

            foreach (var artwork in file.Artworks)
            {
                if (artwork.Artboard.Children.Length == 0)
                {
                    continue;
                }
                var markForExport = artwork.Artboard.Children[0].Meta?.Ux?.MarkedForExport ?? false;
                if (!markForExport)
                {
                    continue;
                }
                targets.Add(artwork);
            }

            progress.SetTotal(targets.Count);
            foreach (var artwork in targets)
            {
                using (progress.TaskStart(artwork.Name))
                {
                    var akyuiXdObjectParsers = xdSettings.ObjectParsers ?? new AkyuiXdObjectParser[] { };
                    var akyuiXdGroupParsers  = xdSettings.GroupParsers ?? new AkyuiXdGroupParser[] { };
                    var triggers             = xdSettings.XdTriggers ?? new AkyuiXdImportTrigger[] { };

                    var name     = artwork.Name;
                    var xdHash   = FastHash.CalculateHash(JsonConvert.SerializeObject(artwork.Artboard) + JsonConvert.SerializeObject(artwork.Resources));
                    var userData = new Dictionary <string, string>
                    {
                        { "xd_hash", xdHash.ToString() }
                    };

                    var pathGetter         = new PathGetter(xdSettings, name);
                    var prevMetaGameObject = AssetDatabase.LoadAssetAtPath <GameObject>(pathGetter.MetaSavePath);
                    var prevMeta           = prevMetaGameObject != null?prevMetaGameObject.GetComponent <AkyuiMeta>() : null;

                    var prevMetaUserData = prevMeta != null?prevMeta.FindUserData("xd_hash") : null;

                    if (!xdSettings.ReimportLayout && !xdSettings.ReimportAsset && prevMetaUserData != null && prevMetaUserData.value == xdHash.ToString())
                    {
                        logger.Log("Skip", ("hash", xdHash));
                        skipped++;
                        continue;
                    }

                    loaders.Add(new XdAkyuiLoader(file, artwork, name, userData, akyuiXdObjectParsers, akyuiXdGroupParsers, triggers));
                    imported++;
                }
            }

            logger.Log($"Xd Import Finish", ("imported", imported), ("skipped", skipped));
            return(imported, skipped);
        }
Ejemplo n.º 3
0
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
        {
            var components = new List <IComponent>();
            var assets     = new List <IAsset>();

            var color = xdObject.GetFillUnityColor();
            var svg   = SvgUtil.CreateSvg(xdObject);

            xdObject.Group.Children = new XdObjectJson[] { };

            var size      = obbGetter.Get(xdObject).Size;
            var spriteUid = $"{xdObject.GetSimpleName()}_{xdObject.Id.Substring(0, 8)}.png";
            var svgHash   = FastHash.CalculateHash(svg);

            var cachedSvg = assetHolder.GetCachedSvg(svgHash);

            if (cachedSvg != null)
            {
                spriteUid = cachedSvg.SpriteUid;
            }
            else
            {
                assets.Add(new SpriteAsset(spriteUid, svgHash, size, null, null));
                var xdImportSettings = XdImporter.Settings;
                assetHolder.Save(spriteUid, () => SvgToPng.Convert(svg, size, xdImportSettings));
                assetHolder.SaveCacheSvg(spriteUid, svgHash);
            }
            components.Add(new ImageComponent(
                               spriteUid,
                               new Color(1f, 1f, 1f, color.a),
                               Vector2Int.one
                               ));

            return(components.ToArray(), assets.ToArray());
        }
Ejemplo n.º 4
0
        public XdFile(string xdFilePath)
        {
            _zipFile = ZipFile.Open(xdFilePath, ZipArchiveMode.Read, Encoding.UTF8);
            var jsonObjectCache    = new Dictionary <string, object>();
            var jsonTextCache      = new Dictionary <string, string>();
            var manifestJsonString = _zipFile.ReadString("manifest");
            var xdManifestJson     = JsonSerializer.Deserialize <XdManifestJson>(manifestJsonString);

            var artworks = new List <XdArtboard>();

            foreach (var xdManifestArtwork in xdManifestJson.Children.Single(x => x.Path == "artwork").Children)
            {
                var artworkJsonFilePath = $"artwork/{xdManifestArtwork.Path}/graphics/graphicContent.agc";
                if (!jsonTextCache.ContainsKey(artworkJsonFilePath))
                {
                    jsonTextCache.Add(artworkJsonFilePath, _zipFile.ReadString(artworkJsonFilePath));
                }
                var artworkJsonString = jsonTextCache[artworkJsonFilePath];
                if (!jsonObjectCache.ContainsKey(artworkJsonFilePath))
                {
                    jsonObjectCache.Add(artworkJsonFilePath, JsonSerializer.Deserialize <XdArtboardJson>(artworkJsonString));
                }
                var artworkJson = (XdArtboardJson)jsonObjectCache[artworkJsonFilePath];

                var resourceJsonFilePath = artworkJson.Resources.Href.TrimStart('/');
                if (!jsonTextCache.ContainsKey(resourceJsonFilePath))
                {
                    jsonTextCache.Add(resourceJsonFilePath, _zipFile.ReadString(resourceJsonFilePath));
                }
                var resourcesJsonString = jsonTextCache[resourceJsonFilePath];
                if (!jsonObjectCache.ContainsKey(resourceJsonFilePath))
                {
                    jsonObjectCache.Add(resourceJsonFilePath, JsonSerializer.Deserialize <XdResourcesJson>(resourcesJsonString));
                }
                var resourceJson = (XdResourcesJson)jsonObjectCache[resourceJsonFilePath];

                var xdHash = FastHash.CalculateHash(artworkJsonString + resourcesJsonString);
                artworks.Add(new XdArtboard(xdManifestArtwork.Name, xdManifestArtwork, artworkJson, resourceJson, xdHash));
            }
            Artworks = artworks.ToArray();
        }
Ejemplo n.º 5
0
        public override void OnPreprocessAllAssets(IAkyuiLoader akyuiLoader, ref List <IAsset> assets)
        {
            _map = new Dictionary <string, string>();

            var removed = new List <IAsset>();
            var cache   = new Dictionary <ulong, IAsset>();

            foreach (var asset in assets)
            {
                if (!(asset is SpriteAsset spriteAsset))
                {
                    continue;
                }

                var hash = FastHash.CalculateHash(akyuiLoader.LoadAsset(spriteAsset.FileName).Select(x => (uint)x).ToArray());
                if (!cache.ContainsKey(hash))
                {
                    cache.Add(hash, asset);
                    continue;
                }

                var hit = cache[hash];
                removed.Add(asset);
                _map[asset.FileName] = hit.FileName;
            }

            foreach (var r in removed)
            {
                assets.Remove(r);
            }

            if (removed.Count > 0)
            {
                Debug.Log($"[SameSpriteDetect] Remove {removed.Count} assets");
            }
        }
Ejemplo n.º 6
0
        public static (ImageComponent, IAsset[]) RenderImage(XdObjectJson xdObject, Obb obb, XdAssetHolder assetHolder)
        {
            ImageComponent imageComponent = null;
            SpriteAsset    asset          = null;

            var color     = xdObject.GetFillUnityColor();
            var ux        = xdObject.Style?.Fill?.Pattern?.Meta?.Ux;
            var flipX     = ux?.FlipX ?? false;
            var flipY     = ux?.FlipY ?? false;
            var direction = new Vector2Int(flipX ? -1 : 1, flipY ? -1 : 1);
            var shapeType = xdObject.Shape?.Type;

            if (!string.IsNullOrWhiteSpace(ux?.Uid))
            {
                var spriteUid = $"{xdObject.GetSimpleName()}_{ux?.Uid.Substring(0, 8)}.png";
                asset          = new SpriteAsset(spriteUid, xdObject.Style.Fill.Pattern.Meta.Ux.HrefLastModifiedDate, obb.Size, null, null);
                imageComponent = new ImageComponent(
                    spriteUid,
                    color,
                    direction
                    );
                assetHolder.Save(spriteUid, xdObject.Style.Fill.Pattern.Meta);
            }
            else if (SvgUtil.Types.Contains(shapeType))
            {
                var spriteUid = $"{xdObject.GetSimpleName()}_{xdObject.Id.Substring(0, 8)}.png";
                var svg       = SvgUtil.CreateSvg(xdObject);
                var svgHash   = FastHash.CalculateHash(svg);

                var cachedSvg = assetHolder.GetCachedSvg(svgHash);
                if (cachedSvg != null)
                {
                    spriteUid = cachedSvg.SpriteUid;
                }
                else
                {
                    asset = new SpriteAsset(spriteUid, svgHash, obb.Size, null, null);
                    var xdImportSettings = XdImporter.Settings;
                    assetHolder.Save(spriteUid, () => SvgToPng.Convert(svg, obb.Size, xdImportSettings));
                    assetHolder.SaveCacheSvg(spriteUid, svgHash);
                }

                imageComponent = new ImageComponent(
                    spriteUid,
                    new Color(1f, 1f, 1f, color.a),
                    direction
                    );
            }
            else
            {
                Debug.LogError($"Unknown shape type {shapeType} in {xdObject.Name}({xdObject.Id}, {xdObject.Guid})");
            }

            var assets = new List <IAsset>();

            if (!xdObject.HasParameter("placeholder") && asset != null)
            {
                assets.Add(asset);
            }
            return(imageComponent, assets.ToArray());
        }
Ejemplo n.º 7
0
            // Renderは親から子供の順番
            private IElement[] Render(XdObjectJson xdObject, [CanBeNull] Obb parentObb, XdObjectJson[] parents)
            {
                var eid         = FastHash.CalculateHash(xdObject.Guid ?? xdObject.Id);
                var originalObb = _obbHolder.Get(xdObject);
                var obb         = originalObb.CalcObbInWorld(parentObb);
                var position    = obb.CalcLocalRect().center - (parentObb?.Size ?? Vector2.zero) / 2f;
                var size        = obb.Size;
                var anchorX     = AnchorXType.Center;
                var anchorY     = AnchorYType.Middle;
                var rotation    = obb.Rotation;

                if (Mathf.Abs(rotation) < 0.0001f)
                {
                    rotation = 0f;
                }
                var constRight = xdObject.Meta.Ux.ConstraintRight;
                var constLeft  = xdObject.Meta.Ux.ConstraintLeft;

                if (constRight && constLeft)
                {
                    anchorX = AnchorXType.Stretch;
                }
                else if (constRight)
                {
                    anchorX = AnchorXType.Right;
                }
                else if (constLeft)
                {
                    anchorX = AnchorXType.Left;
                }

                var constTop    = xdObject.Meta.Ux.ConstraintTop;
                var constBottom = xdObject.Meta.Ux.ConstraintBottom;

                if (constTop && constBottom)
                {
                    anchorY = AnchorYType.Stretch;
                }
                else if (constTop)
                {
                    anchorY = AnchorYType.Top;
                }
                else if (constBottom)
                {
                    anchorY = AnchorYType.Bottom;
                }

                foreach (var parser in _objectParsers)
                {
                    if (!parser.Is(xdObject))
                    {
                        continue;
                    }
                    var(components, assets) = parser.Render(xdObject, obb, _xdAssetHolder);

                    var children = new IElement[] { };
                    if (xdObject.Group != null)
                    {
                        children = Render(xdObject.Group.Children, originalObb, parents.Concat(new[] { xdObject }).ToArray());
                    }

                    var element = new ObjectElement(
                        eid,
                        xdObject.GetSimpleName(),
                        position,
                        size,
                        anchorX,
                        anchorY,
                        rotation,
                        xdObject.Visible ?? true,
                        components,
                        children.Select(x => x.Eid).ToArray()
                        );

                    foreach (var asset in assets)
                    {
                        if (Assets.Any(x => x.FileName == asset.FileName))
                        {
                            continue;
                        }
                        Assets.Add(asset);
                    }

                    Elements.Add(element);
                    return(new IElement[] { element });
                }

                if (xdObject.Type == "group")
                {
                    var components = new List <IComponent>();
                    foreach (var parser in _groupParsers)
                    {
                        if (!parser.Is(xdObject, parents))
                        {
                            continue;
                        }
                        var(c, assets) = parser.Render(xdObject, _xdAssetHolder, _obbHolder);
                        components.AddRange(c);

                        foreach (var asset in assets)
                        {
                            if (Assets.Any(x => x.FileName == asset.FileName))
                            {
                                continue;
                            }
                            Assets.Add(asset);
                        }

                        break;
                    }

                    var generatedChildren = new IElement[] { };
                    if (xdObject.Group != null)
                    {
                        generatedChildren = Render(xdObject.Group.Children, originalObb, parents.Concat(new[] { xdObject }).ToArray());
                    }

                    var group = new ObjectElement(
                        eid,
                        xdObject.GetSimpleName(),
                        position,
                        size,
                        anchorX,
                        anchorY,
                        rotation,
                        xdObject.Visible ?? true,
                        components.ToArray(),
                        generatedChildren.Select(x => x.Eid).ToArray()
                        );

                    Elements.Add(group);
                    return(new IElement[] { group });
                }

                throw new Exception($"Unknown object type {xdObject.Type}");
            }