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()); }
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); }
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); }
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); }
public (IComponent[], IAsset[]) Render(XdObjectJson xdObject, XdAssetHolder assetHolder, IObbGetter obbGetter) { return(new IComponent[] { new InputFieldComponent() }, new IAsset[] { }); }
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(); }
public Rect CalcSize(XdObjectJson xdObject, Rect rect) { var svg = SvgUtil.CreateSvg(xdObject, null); var bounds = SvgUtil.CalcBounds(svg); return(bounds); }
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[] { }); } }
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); }
public static string GetSimpleName(this XdObjectJson xdObjectJson) { if (xdObjectJson.Name == null) { return(string.Empty); } return(AkyuiEditorUtil.ValidFileName(xdObjectJson.Name.Split('@')[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[] { }); }
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); }
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; } }
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); }
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[] { }); }
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); }
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); }
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); }
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()); }