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); }
public XdAkyuiLoader(XdFile xdFile, XdArtboard xdArtboard, string name, Dictionary <string, string> userData, AkyuiXdObjectParser[] objectParsers, AkyuiXdGroupParser[] groupParsers, AkyuiXdImportTrigger[] triggers) { _xdFile = xdFile; _objectParsers = objectParsers.Concat(DefaultObjectParsers).ToArray(); _groupParsers = groupParsers.Concat(DefaultGroupParsers).ToArray(); _triggers = triggers; _assetHolder = new XdAssetHolder(_xdFile); (LayoutInfo, AssetsInfo) = Create(xdArtboard, _assetHolder, name, userData); }
public XdRenderer(XdArtboard xdArtboard, XdAssetHolder xdAssetHolder, IXdObjectParser[] objectParsers, IXdGroupParser[] groupParsers, AkyuiXdImportTrigger[] triggers) { var resources = xdArtboard.Resources; _xdAssetHolder = xdAssetHolder; _objectParsers = objectParsers; _groupParsers = groupParsers; Elements = new List <IElement>(); Assets = new List <IAsset>(); _obbHolder = new ObbHolder(); CreateRefObjectMap(resources.Resources); var xdResourcesArtboardsJson = resources.Artboards[xdArtboard.Manifest.Path.Replace("artboard-", "")]; var rootObb = new Obb { Size = new Vector2(xdResourcesArtboardsJson.Width, xdResourcesArtboardsJson.Height) }; var rootArtboard = xdArtboard.Artboard.Children[0]; var xdObjectJsons = rootArtboard.Artboard.Children; var convertedXdObjectJsons = ConvertRefObject(xdObjectJsons, triggers); var childrenObbs = CalcPosition(convertedXdObjectJsons, rootObb); foreach (var childObb in childrenObbs) { childObb.LocalLeftTopPosition -= new Vector2(xdResourcesArtboardsJson.X, xdResourcesArtboardsJson.Y); } var children = Render(convertedXdObjectJsons, rootObb); var rootComponents = new List <IComponent>(); if (rootArtboard.Style?.Fill != null && rootArtboard.Style.Fill.Type == "solid") { var color = rootArtboard.GetFillUnityColor(); rootComponents.Add(new ImageComponent(null, color, Vector2Int.one)); } var root = new ObjectElement( 0, xdArtboard.Name, Vector2.zero, rootObb.Size, AnchorXType.Center, AnchorYType.Middle, 0f, true, rootComponents.ToArray(), children.Select(x => x.Eid).ToArray() ); Elements.Add(root); }
public static bool HasParameter(this XdArtboard xdObjectJson, string name) => HasParameter(xdObjectJson.Name, name);
public static string GetSimpleName(this XdArtboard xdObjectJson) => GetSimpleName(xdObjectJson.Name);
private static (int Imported, int Skipped) ImportedArtboards(XdImportSettings xdSettings, AkyuiLogger logger, string xdFilePath, IAkyuiProgress progress, List <IAkyuiLoader> loaders) { var stopWatch = Stopwatch.StartNew(); var file = new XdFile(xdFilePath); XdFile = file; using (Disposable.Create(() => XdFile = null)) { 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); var akyuiXdObjectParsers = xdSettings.ObjectParsers ?? new AkyuiXdObjectParser[] { }; var akyuiXdGroupParsers = xdSettings.GroupParsers ?? new AkyuiXdGroupParser[] { }; var triggers = xdSettings.XdTriggers ?? new AkyuiXdImportTrigger[] { }; var expandTargets = new List <XdArtboard>(); foreach (var artwork in targets) { if (!artwork.HasParameter("expand")) { expandTargets.Add(artwork); continue; } foreach (var child in artwork.Artboard.Children.SelectMany(x => x.Artboard.Children)) { var childArtboardJson = new XdArtboardJson { Version = artwork.Artboard.Version, Artboards = artwork.Artboard.Artboards, Resources = artwork.Artboard.Resources, Children = new[] { new XdArtboardChildJson { Artboard = new XdArtboardChildArtboardJson { Children = new[] { child } } } } }; var childArtboard = new XdArtboard($"{artwork.GetSimpleName()}{child.GetSimpleName()}", artwork.Manifest, childArtboardJson, artwork.Resources, artwork.Hash); expandTargets.Add(childArtboard); } } foreach (var artwork in expandTargets) { using (progress.TaskStart(artwork.Name)) using (var _ = logger.SetCategory(artwork.Name)) { var name = artwork.Name.ToSafeString(); var xdHash = artwork.Hash; 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", ("Name", artwork.Name), ("Hash", xdHash)); skipped++; continue; } loaders.Add(new XdAkyuiLoader(file, artwork, name, userData, akyuiXdObjectParsers, akyuiXdGroupParsers, triggers)); imported++; } } stopWatch.Stop(); logger.Log($"Xd Parse Finish", ("ImportArtboard", imported), ("SkipArtboard", skipped), ("Time", $"{stopWatch.Elapsed.TotalSeconds:0.00}s")); return(imported, skipped); } }