Beispiel #1
0
        public static string CreateSvg(XdObjectJson xdObject, [CanBeNull] Obb obb)
        {
            var defs = new List <IDefElement>();
            var body = CreateSvgLine(xdObject, defs);

            body.Parameter.Transform = new Transform();
            if (obb != null)
            {
                var rootForCalc = new RootElement
                {
                    Defs = defs.ToArray(),
                    Body = body,
                    Size = null,
                };
                var bounds = CalcBounds(rootForCalc.ToSvg());
                if (bounds.width > 0.0001f && bounds.height > 0.0001f)
                {
                    body.Parameter.Transform.Value.Tx = -bounds.x;
                    body.Parameter.Transform.Value.Ty = -bounds.y;
                }
            }

            var root = new RootElement
            {
                Defs = defs.ToArray(),
                Body = body,
                Size = obb?.Size,
            };

            body.Parameter.Opacity = 1.0f;
            return(root.ToSvg());
        }
Beispiel #2
0
            private XdObjectJson GetRefObject(XdObjectJson xdObject, AkyuiXdImportTrigger[] triggers)
            {
                IXdJsonElement Copy(Type type, IXdJsonElement instance, IXdJsonElement source)
                {
                    if (instance == null || source == null)
                    {
                        return(source);
                    }

                    var @new = (IXdJsonElement)Activator.CreateInstance(type);

                    var propertyInfos = type.GetProperties();

                    foreach (var propertyInfo in propertyInfos)
                    {
                        var instanceValue = propertyInfo.GetValue(instance);
                        var sourceValue   = propertyInfo.GetValue(source);
                        var t             = propertyInfo.PropertyType;

                        if (typeof(IXdJsonElement).IsAssignableFrom(t))
                        {
                            var value = Copy(t, (IXdJsonElement)instanceValue, (IXdJsonElement)sourceValue);
                            propertyInfo.SetValue(@new, value);
                        }
                        else
                        {
                            var value = instanceValue;
                            if (value == null)
                            {
                                value = sourceValue;
                            }
                            propertyInfo.SetValue(@new, value);
                        }
                    }

                    return(@new);
                }

                var newXdObjectJson = xdObject;

                if (xdObject.Type == "syncRef")
                {
                    var source = _sourceGuidToObject[xdObject.SyncSourceGuid];
                    newXdObjectJson       = (XdObjectJson)Copy(typeof(XdObjectJson), xdObject, source);
                    newXdObjectJson.Name  = source.Name;
                    newXdObjectJson.Type  = source.Type;
                    newXdObjectJson.Shape = source.Shape; // compoundのchildrenだけ上書きされるケースがあるが計算出来ないので戻す
                }

                foreach (var trigger in triggers)
                {
                    newXdObjectJson = trigger.OnCreateXdObject(newXdObjectJson);
                    if (newXdObjectJson == null)
                    {
                        break;
                    }
                }

                return(newXdObjectJson);
            }
Beispiel #3
0
        public static bool IsAlphaOnly(XdObjectJson xdObject)
        {
            if (xdObject.Group != null)
            {
                if (xdObject.Group.Children.Any(x => !IsAlphaOnly(x)))
                {
                    return(false);
                }
            }

            var stroke = xdObject.Style?.Stroke;

            if (stroke != null && stroke.Type != "none")
            {
                return(false);
            }

            var fill = xdObject.Style?.Fill;

            if (fill != null && fill.Type != "none")
            {
                return(false);
            }

            return(true);
        }
        public static Color GetFillUnityColor(this XdObjectJson xdObjectJson)
        {
            var color = xdObjectJson.Style.Fill.ToUnityColor();

            color.a *= xdObjectJson.Style?.Opacity ?? 1f;
            return(color);
        }
Beispiel #5
0
        public static Rect CalcSizeAutoHeight(XdObjectJson xdObject)
        {
            var calcSizeFromText = CalcSizeFromText(xdObject);
            var size             = new Vector2(xdObject.Text.Frame.Width, calcSizeFromText.height);

            return(new Rect(Vector2.zero, size));
        }
        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());
        }
        private static (XdObjectJson[], float Spacing) ExpandRepeatGridGroup(XdObjectJson xdObject, XdObjectJson repeatGrid, string scrollingType, IObbGetter obbGetter, ref List <SpecialSpacing> specialSpacings)
        {
            var listElement = repeatGrid.Group.Children[0].Group.Children[0];
            var listItems   = new[] { listElement };
            var childSize   = obbGetter.Get(listElement).Size;

            float spacing;

            if (scrollingType == "vertical")
            {
                spacing = (repeatGrid.Meta?.Ux?.RepeatGrid?.PaddingY ?? 0f) + (repeatGrid.Meta?.Ux?.RepeatGrid?.CellHeight ?? 0f) - childSize.y;
            }
            else
            {
                spacing = (repeatGrid.Meta?.Ux?.RepeatGrid?.PaddingX ?? 0f) + (repeatGrid.Meta?.Ux?.RepeatGrid?.CellWidth ?? 0f) - childSize.x;
            }

            if (xdObject.HasParameter("multiitems"))
            {
                listItems = ExpandMultiItemsList(listElement, scrollingType, obbGetter, ref specialSpacings);
            }

            foreach (var listItem in listItems)
            {
                listItem.RemoveConstraint();
            }

            return(listItems.ToArray(), spacing);
        }
Beispiel #8
0
 public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
 {
     return(new IComponent[]
     {
         new InputFieldComponent()
     }, new IAsset[] { });
 }
Beispiel #9
0
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
        {
            var repeatGrid = xdObject.Meta?.Ux?.RepeatGrid ?? new XdRepeatGridJson();

            var item = xdObject.Group.Children[0].Group.Children[0];

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

            if (repeatGrid.Columns > 1 && repeatGrid.Rows > 1)
            {
                return(new IComponent[]
                {
                    new GridLayoutComponent(repeatGrid.PaddingX, repeatGrid.PaddingY)
                }, new IAsset[] { });
            }
            else if (repeatGrid.Columns > 1)
            {
                return(new IComponent[]
                {
                    new HorizontalLayoutComponent(repeatGrid.PaddingX)
                }, new IAsset[] { });
            }
            else
            {
                return(new IComponent[]
                {
                    new VerticalLayoutComponent(repeatGrid.PaddingY)
                }, new IAsset[] { });
            }

            throw new Exception();
        }
Beispiel #10
0
        public Rect CalcSize(XdObjectJson xdObject, Rect rect)
        {
            var svg    = SvgUtil.CreateSvg(xdObject, null);
            var bounds = SvgUtil.CalcBounds(svg);

            return(bounds);
        }
Beispiel #11
0
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
        {
            var repeatGrid = xdObject.Meta?.Ux?.RepeatGrid ?? new XdRepeatGridJson();

            var item = xdObject.Group.Children[0].Group.Children[0];

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

            // Visible設定によりSpacingが変わってくるので計算しなおす
            var childSize = obbGetter.Get(item).Size;

            if (repeatGrid.Columns > 1 && repeatGrid.Rows > 1)
            {
                return(new IComponent[]
                {
                    new GridLayoutComponent(repeatGrid.PaddingX, repeatGrid.PaddingY)
                }, new IAsset[] { });
            }
            else if (repeatGrid.Columns > 1)
            {
                var spacing = repeatGrid.PaddingX + repeatGrid.CellWidth - childSize.x;
                return(new IComponent[]
                {
                    new HorizontalLayoutComponent(spacing)
                }, new IAsset[] { });
            }
            else
            {
                var spacing = repeatGrid.PaddingY + repeatGrid.CellHeight - childSize.y;
                return(new IComponent[]
                {
                    new VerticalLayoutComponent(spacing)
                }, new IAsset[] { });
            }
        }
Beispiel #12
0
            private Obb CalcPosition(XdObjectJson xdObject, Obb parentObb, XdObjectJson[] parents)
            {
                var obb = new Obb
                {
                    Parent = parentObb,
                    LocalLeftTopPosition = new Vector2(xdObject.Transform?.Tx ?? 0f, xdObject.Transform?.Ty ?? 0f),
                    Rotation             = xdObject.Meta?.Ux?.Rotation ?? 0f
                                           // サイズは子供のサイズが無いと決まらない
                };

                var children = new Obb[] { };

                if (xdObject.Group != null)
                {
                    children = CalcPosition(xdObject.Group.Children, obb, parents.Concat(new[] { xdObject }).ToArray());
                }

                foreach (var parser in _objectParsers)
                {
                    if (!parser.Is(xdObject))
                    {
                        continue;
                    }
                    var rect = parser.CalcSize(xdObject);

                    obb.ApplyRect(rect);
                    foreach (var child in children)
                    {
                        child.LocalLeftTopPosition -= rect.position;
                    }
                    _obbHolder.Set(xdObject, obb);
                    return(obb);
                }

                if (xdObject.Type == "group")
                {
                    var rect = Obb.MinMaxRect(children);

                    foreach (var parser in _groupParsers)
                    {
                        if (!parser.Is(xdObject, parents))
                        {
                            continue;
                        }
                        rect = parser.CalcSize(xdObject, rect);
                        break;
                    }

                    obb.ApplyRect(rect);
                    foreach (var child in children)
                    {
                        child.LocalLeftTopPosition -= rect.position;
                    }
                    _obbHolder.Set(xdObject, obb);
                    return(obb);
                }

                throw new Exception($"Unknown object type {xdObject.Type}");
            }
        public Rect CalcSize(XdObjectJson xdObject, Rect rect)
        {
            var clipPath  = xdObject.Meta.Ux.ClipPathResources.Children[0];
            var shapeRect = ShapeObjectParser.CalcSize(clipPath);

            shapeRect.position += new Vector2(clipPath.Transform?.Tx ?? 0f, clipPath.Transform?.Ty ?? 0f);
            return(shapeRect);
        }
Beispiel #14
0
 public static string GetSimpleName(this XdObjectJson xdObjectJson)
 {
     if (xdObjectJson.Name == null)
     {
         return(string.Empty);
     }
     return(AkyuiEditorUtil.ValidFileName(xdObjectJson.Name.Split('@')[0]));
 }
Beispiel #15
0
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
        {
            var spacing         = 0f;
            var scrollingType   = xdObject.Meta?.Ux?.ScrollingType;
            var specialSpacings = new List <SpecialSpacing>();
            var repeatGrid      = xdObject.Group?.Children?.FirstOrDefault(x => RepeatGridGroupParser.Is(x));

            if (scrollingType == "vertical")
            {
                var paddingTop    = 0f;
                var paddingBottom = GetSpacerSize(xdObject, obbGetter);

                if (repeatGrid != null)
                {
                    XdObjectJson[] newChildren;
                    (newChildren, spacing) = ExpandRepeatGridGroup(xdObject, repeatGrid, scrollingType, obbGetter, ref specialSpacings);

                    xdObject.Group.Children = xdObject.Group.Children.Where(x => x != repeatGrid).Concat(newChildren).ToArray();

                    var rootObb = obbGetter.Get(xdObject);
                    paddingTop = newChildren.Select(x => obbGetter.Get(x).CalcObbInWorld(rootObb).CalcLocalRect().yMin).Min();
                    if (paddingTop < 0f)
                    {
                        paddingTop = 0f;
                    }
                }

                return(new IComponent[]
                {
                    new VerticalListComponent(spacing, paddingTop, paddingBottom, specialSpacings.ToArray()),
                }, new IAsset[] { });
            }
            else
            {
                var paddingLeft  = 0f;
                var paddingRight = GetSpacerSize(xdObject, obbGetter);

                if (repeatGrid != null)
                {
                    XdObjectJson[] newChildren;
                    (newChildren, spacing) = ExpandRepeatGridGroup(xdObject, repeatGrid, scrollingType, obbGetter, ref specialSpacings);

                    xdObject.Group.Children = xdObject.Group.Children.Where(x => x != repeatGrid).Concat(newChildren).ToArray();

                    var rootObb = obbGetter.Get(xdObject);
                    paddingLeft = newChildren.Select(x => obbGetter.Get(x).CalcObbInWorld(rootObb).CalcLocalRect().xMin).Min();
                    if (paddingLeft < 0f)
                    {
                        paddingLeft = 0f;
                    }
                }

                return(new IComponent[]
                {
                    new HorizontalListComponent(spacing, paddingLeft, paddingRight, specialSpacings.ToArray()),
                }, new IAsset[] { });
            }
        }
        public static Rect CalcSizeFromText(XdObjectJson xdObject, float?width)
        {
            var rawText = xdObject.Text.RawText;

            var font      = xdObject.Style.Font;
            var fontAsset = AssetDatabase.FindAssets($"{font.PostscriptName}")
                            .Select(guid => AssetDatabase.GUIDToAssetPath(guid))
                            .Select(path => AssetDatabase.LoadAssetAtPath <Object>(path))
                            .OfType <TMP_FontAsset>()
                            .Select(x =>
            {
                x.HasCharacters(rawText, out var missingCharacters);
                return(missingCharacters.Count, x);
            })
                            .OrderBy(x => x.Count)
                            .FirstOrDefault()
                            .x;

            if (fontAsset == null)
            {
                Debug.LogWarning($"TextMeshPro Asset {font.PostscriptName} is not found");
                var textParser = new TextObjectParser();
                return(textParser.CalcSize(xdObject));
            }

            var position = Vector2.zero;
            var fontSize = font.Size;

            position.y -= fontAsset.faceInfo.ascentLine * (fontSize / fontAsset.faceInfo.pointSize);

            var dummyObject        = new GameObject("Dummy");
            var dummyRectTransform = dummyObject.AddComponent <RectTransform>();

            dummyRectTransform.sizeDelta = new Vector2(width ?? 0f, 0f);

            var textMeshPro = dummyObject.AddComponent <TextMeshProUGUI>();

            textMeshPro.font     = fontAsset;
            textMeshPro.fontSize = fontSize;
            textMeshPro.text     = rawText;
            if (width != null)
            {
                textMeshPro.enableWordWrapping = true;
            }

            var size = new Vector2(LayoutUtility.GetPreferredSize(dummyRectTransform, 0), LayoutUtility.GetPreferredSize(dummyRectTransform, 1));

            DestroyImmediate(dummyObject);

            var lines    = xdObject.Text.Paragraphs.SelectMany(x => x.Lines).ToArray();
            var lineMinX = lines.Min(x => x[0].X); // xは1要素目にだけ入っている
            var lineMinY = lines.SelectMany(l => l).Min(x => x.Y);

            position.x += lineMinX;
            position.y += lineMinY;

            return(new Rect(position, size));
        }
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
        {
            var opacity = xdObject.Style?.Opacity ?? 1.0f;

            return(new IComponent[]
            {
                new AlphaComponent(opacity)
            }, new IAsset[] { });
        }
Beispiel #18
0
        public static Color GetFillUnityColor(this XdObjectJson xdObjectJson)
        {
            var   colorJson = xdObjectJson.GetFillColor();
            Color color     = new Color32((byte)colorJson.R, (byte)colorJson.G, (byte)colorJson.B, 255);

            color.a  = xdObjectJson.Style?.Fill?.Color?.Alpha ?? 1f;
            color.a *= xdObjectJson.Style?.Opacity ?? 1f;
            return(color);
        }
Beispiel #19
0
 public static XdColorValueJson GetFillColor(this XdObjectJson xdObject)
 {
     if (xdObject.Style != null)
     {
         return(xdObject.Style.GetFillColor());
     }
     return(new XdColorValueJson {
         R = 255, G = 255, B = 255
     });
 }
 public static void RemoveConstraint(this XdObjectJson xdObjectJson)
 {
     if (xdObjectJson?.Meta?.Ux != null)
     {
         xdObjectJson.Meta.Ux.ConstraintRight  = false;
         xdObjectJson.Meta.Ux.ConstraintLeft   = false;
         xdObjectJson.Meta.Ux.ConstraintTop    = false;
         xdObjectJson.Meta.Ux.ConstraintBottom = false;
     }
 }
Beispiel #21
0
        public void Set(XdObjectJson xdObject, Obb obb)
        {
            var key = xdObject.Guid ?? xdObject.Id;

            if (_obb.ContainsKey(key))
            {
                throw new Exception($"{key} already exists");
            }
            _obb[key] = obb;
        }
        public bool Is(XdObjectJson xdObject)
        {
            var opacity = xdObject.Style?.Opacity ?? 1.0f;

            if (Mathf.Abs(opacity - 1.0f) < 0.0001f)
            {
                return(false);
            }
            return(true);
        }
        public override XdObjectJson OnCreateXdObject(XdObjectJson xdObject)
        {
            var xdObjectName = xdObject?.Name ?? "";

            if (xdObjectName.StartsWith(startsWith))
            {
                return(null);
            }

            return(xdObject);
        }
Beispiel #24
0
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, Obb obb, XdAssetHolder assetHolder)
        {
            var components = new List <IComponent>();

            var font     = xdObject.Style.Font;
            var fontSize = font.Size;
            var color    = xdObject.GetFillUnityColor();
            var rawText  = xdObject.Text.RawText;

            var textAlign      = TextComponent.TextAlign.MiddleLeft;
            var wrap           = false;
            var paragraphAlign = xdObject.Style?.TextAttributes?.ParagraphAlign ?? "left";

            if (xdObject.Text?.Frame?.Type == "positioned")
            {
                wrap = false;
                if (paragraphAlign == "left")
                {
                    textAlign = TextComponent.TextAlign.MiddleLeft;
                }
                if (paragraphAlign == "center")
                {
                    textAlign = TextComponent.TextAlign.MiddleCenter;
                }
                if (paragraphAlign == "right")
                {
                    textAlign = TextComponent.TextAlign.MiddleRight;
                }
            }

            if (xdObject.Text?.Frame?.Type == "area" || xdObject.Text?.Frame?.Type == "autoHeight")
            {
                wrap = true;
                if (paragraphAlign == "left")
                {
                    textAlign = TextComponent.TextAlign.UpperLeft;
                }
                if (paragraphAlign == "center")
                {
                    textAlign = TextComponent.TextAlign.UpperCenter;
                }
                if (paragraphAlign == "right")
                {
                    textAlign = TextComponent.TextAlign.UpperRight;
                }
            }

            var lineHeight = xdObject.Style?.TextAttributes?.LineHeight;

            components.Add(new TextComponent(rawText, fontSize, color, textAlign, font.PostscriptName, wrap, lineHeight));

            return(components.ToArray(), new IAsset[] { });
        }
Beispiel #25
0
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, Obb obb, XdAssetHolder assetHolder)
        {
            var(imageComponent, assets) = ShapeObjectParser.RenderImage(xdObject, obb, assetHolder);

            IComponent scrollbar = new VerticalScrollbarComponent(imageComponent);

            if (xdObject.HasParameter("horizontal"))
            {
                scrollbar = new HorizontalScrollbarComponent(imageComponent);
            }
            return(new[] { scrollbar }, assets);
        }
Beispiel #26
0
        private static float GetSpacerSize(XdObjectJson xdObject, IObbGetter obbGetter)
        {
            var spacerSize = 0f;
            var spacer     = xdObject.Group?.Children?.FirstOrDefault(x => x.NameEndsWith("spacer"));

            if (spacer != null)
            {
                spacerSize = Mathf.Max(obbGetter.Get(spacer).Size.y, 0f);
                xdObject.Group.Children = xdObject.Group.Children.Where(x => x != spacer).ToArray();
            }
            return(spacerSize);
        }
        public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter)
        {
            var obb      = obbGetter.Get(xdObject);
            var clipPath = xdObject.Meta.Ux.ClipPathResources.Children[0];

            if (SvgUtil.IsAlphaOnly(clipPath))
            {
                return(new IComponent[] { }, new IAsset[] { });
            }

            var(imageComponent, assets) = ShapeObjectParser.RenderImage(clipPath, obb, assetHolder);
            return(new IComponent[] { new MaskComponent(imageComponent.Sprite) }, assets);
        }
Beispiel #28
0
            private XdObjectJson ConvertRefObject(XdObjectJson xdObject, AkyuiXdImportTrigger[] triggers)
            {
                var newXdObjectJson = GetRefObject(xdObject, triggers);

                if (newXdObjectJson?.Group != null)
                {
                    newXdObjectJson.Group = new XdObjectGroupJson {
                        Children = ConvertRefObject(newXdObjectJson.Group.Children, triggers)
                    };
                }

                return(newXdObjectJson);
            }
        public static float GetRepeatGridSpacing(this XdObjectJson xdObjectJson, string scrollingType)
        {
            float spacing;

            if (scrollingType == "vertical")
            {
                spacing = xdObjectJson.Meta?.Ux?.RepeatGrid?.PaddingY ?? 0f;
            }
            else
            {
                spacing = xdObjectJson.Meta?.Ux?.RepeatGrid?.PaddingX ?? 0f;
            }

            return(spacing);
        }
Beispiel #30
0
        public static string CreateSvg(XdObjectJson xdObject)
        {
            var defs = new List <IDefElement>();
            var body = CreateSvgLine(xdObject, defs);

            body.Parameter.Transform = new Transform();
            body.Parameter.Opacity   = 1.0f;

            var root = new RootElement
            {
                Defs = defs.ToArray(),
                Body = body,
            };

            return(root.ToSvg());
        }