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()); }
public Rect CalcSize(XdObjectJson xdObject, Rect rect) { var svg = SvgUtil.CreateSvg(xdObject, null); var bounds = SvgUtil.CalcBounds(svg); return(bounds); }
public static Rect CalcSize(XdObjectJson xdObject) { var position = Vector2.zero; var size = Vector2.zero; var scaleBehavior = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.ScaleBehavior ?? "fill"; var xdObjectShape = xdObject.Shape; var shapeType = xdObjectShape.Type; if (SvgUtil.Types.Contains(shapeType)) { var svg = SvgUtil.CreateSvg(xdObject, null, true); var bounds = SvgUtil.CalcBounds(svg); if (bounds.width > 0.0001f && bounds.height > 0.0001f) { size = new Vector2(bounds.width, bounds.height); position = new Vector2(bounds.x, bounds.y); } } if (scaleBehavior == "cover" && size.x > 0.0001f && size.y > 0.0001f) { var imageWidth = xdObject.Style?.Fill?.Pattern?.Width ?? 1f; var imageHeight = xdObject.Style?.Fill?.Pattern?.Height ?? 1f; var imageSize = new Vector2(imageWidth, imageHeight); var imageAspect = imageSize.x / imageSize.y; var offsetX = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.OffsetX ?? 0f; var offsetY = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.OffsetY ?? 0f; var scale = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.Scale ?? 1.0f; // Widthに対するスケール var originalSize = size; var originalPosition = position; size = new Vector2( originalSize.x * scale, originalSize.x * scale / imageAspect ); position = new Vector2( originalPosition.x + (originalSize.x / 2f - size.x / 2f) + originalSize.x * offsetX, originalPosition.y + (originalSize.y / 2f - size.y / 2f) + originalSize.x / imageAspect * offsetY ); } return(new Rect(position, size)); }
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()); }
public Rect CalcSize(XdObjectJson xdObject) { var position = Vector2.zero; var size = new Vector2(xdObject.Shape.Width, xdObject.Shape.Height); var scaleBehavior = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.ScaleBehavior ?? "fill"; var spriteUid = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.Uid; var shapeType = xdObject.Shape?.Type; if (!string.IsNullOrWhiteSpace(spriteUid)) { // nothing } else if (SvgUtil.Types.Contains(shapeType)) { var svg = SvgUtil.CreateSvg(xdObject); using (var reader = new StringReader(svg)) { var sceneInfo = SVGParser.ImportSVG(reader, ViewportOptions.DontPreserve); var tessOptions = SvgToPng.TessellationOptions; var geometry = VectorUtils.TessellateScene(sceneInfo.Scene, tessOptions, sceneInfo.NodeOpacity); var vertices = geometry.SelectMany(geom => geom.Vertices.Select(x => (geom.WorldTransform * x))).ToArray(); var bounds = VectorUtils.Bounds(vertices); if (bounds.width > 0.0001f && bounds.height > 0.0001f) { size = new Vector2(bounds.width, bounds.height); position = new Vector2(bounds.x, bounds.y); } } } if (scaleBehavior == "cover" && size.x > 0.0001f && size.y > 0.0001f) { var imageWidth = xdObject.Style?.Fill?.Pattern?.Width ?? 0f; var imageHeight = xdObject.Style?.Fill?.Pattern?.Height ?? 0f; var imageSize = new Vector2(imageWidth, imageHeight); var imageAspect = imageSize.x / imageSize.y; var instanceAspect = size.x / size.y; var offsetX = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.OffsetX ?? 0f; var offsetY = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.OffsetY ?? 0f; var scale = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.Scale ?? 1.0f; if (imageAspect > instanceAspect) { var prev = size.x; size.x = size.y * (imageSize.x / imageSize.y); position.x -= (size.x - prev) / 2f; position.x += offsetX * xdObject.Shape.Width * imageAspect / instanceAspect; position.y += offsetY * xdObject.Shape.Height; } else { var prev = size.y; size.y = size.x * (imageSize.y / imageSize.x); position.y -= (size.y - prev) / 2f; position.x += offsetX * xdObject.Shape.Width; position.y += offsetY * xdObject.Shape.Height * imageAspect / instanceAspect; } { var prev = size; size *= scale; position -= (size - prev) / 2f; } } return(new Rect(position, size)); }
public static Rect CalcSize(XdObjectJson xdObject) { var position = Vector2.zero; var size = Vector2.zero; var scaleBehavior = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.ScaleBehavior ?? "fill"; var shapeType = xdObject.Shape?.Type; if (shapeType == "rect") { size = new Vector2(xdObject.Shape.Width, xdObject.Shape.Height); } else if (SvgUtil.Types.Contains(shapeType)) { var svg = SvgUtil.CreateSvg(xdObject, null); var bounds = SvgUtil.CalcBounds(svg); if (bounds.width > 0.0001f && bounds.height > 0.0001f) { size = new Vector2(bounds.width, bounds.height); position = new Vector2(bounds.x, bounds.y); } } if (scaleBehavior == "cover" && size.x > 0.0001f && size.y > 0.0001f) { var imageWidth = xdObject.Style?.Fill?.Pattern?.Width ?? 0f; var imageHeight = xdObject.Style?.Fill?.Pattern?.Height ?? 0f; var imageSize = new Vector2(imageWidth, imageHeight); var imageAspect = imageSize.x / imageSize.y; var instanceAspect = size.x / size.y; var offsetX = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.OffsetX ?? 0f; var offsetY = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.OffsetY ?? 0f; var scale = xdObject.Style?.Fill?.Pattern?.Meta?.Ux?.Scale ?? 1.0f; if (imageAspect > instanceAspect) { var prev = size.x; size.x = size.y * (imageSize.x / imageSize.y); position.x -= (size.x - prev) / 2f; position.x += offsetX * xdObject.Shape.Width * imageAspect / instanceAspect; position.y += offsetY * xdObject.Shape.Height; } else { var prev = size.y; size.y = size.x * (imageSize.y / imageSize.x); position.y -= (size.y - prev) / 2f; position.x += offsetX * xdObject.Shape.Width; position.y += offsetY * xdObject.Shape.Height * imageAspect / instanceAspect; } { var prev = size; size *= scale; position -= (size - prev) / 2f; } } return(new Rect(position, size)); }