private async Task Justify(BoxAlignMode mode, bool fit) { var sel = GetFaceSelection(); if (sel.IsEmpty) { return; } Cloud cloud = null; if (ShouldTreatAsOne()) { cloud = new Cloud(sel.GetSelectedFaces().SelectMany(x => x.Value.Vertices)); } var tc = await Document.Environment.GetTextureCollection(); if (tc == null) { return; } await ApplyChanges(async (mo, f) => { var tex = await tc.GetTextureItem(f.Texture.Name); if (tex == null) { return(false); } if (fit) { f.Texture.FitToPointCloud(tex.Width, tex.Height, cloud ?? new Cloud(f.Vertices), 1, 1); } else { f.Texture.AlignWithPointCloud(tex.Width, tex.Height, cloud ?? new Cloud(f.Vertices), mode); } return(true); }); }
public void AlignTextureWithPointCloud(Cloud cloud, BoxAlignMode mode) { if (Texture.Texture == null) { return; } var xvals = cloud.GetExtents().Select(x => x.Dot(Texture.UAxis) / Texture.XScale).ToList(); var yvals = cloud.GetExtents().Select(x => x.Dot(Texture.VAxis) / Texture.YScale).ToList(); var minU = xvals.Min(); var minV = yvals.Min(); var maxU = xvals.Max(); var maxV = yvals.Max(); switch (mode) { case BoxAlignMode.Left: Texture.XShift = -minU; break; case BoxAlignMode.Right: Texture.XShift = -maxU + Texture.Texture.Width; break; case BoxAlignMode.Center: var avgU = (minU + maxU) / 2; var avgV = (minV + maxV) / 2; Texture.XShift = -avgU + Texture.Texture.Width / 2m; Texture.YShift = -avgV + Texture.Texture.Height / 2m; break; case BoxAlignMode.Top: Texture.YShift = -minV; break; case BoxAlignMode.Bottom: Texture.YShift = -maxV + Texture.Texture.Height; break; } CalculateTextureCoordinates(true); }
public void AlignTextureWithPointCloud(Cloud cloud, BoxAlignMode mode) { if (Texture.Texture == null) return; var xvals = cloud.GetExtents().Select(x => x.Dot(Texture.UAxis) / Texture.XScale).ToList(); var yvals = cloud.GetExtents().Select(x => x.Dot(Texture.VAxis) / Texture.YScale).ToList(); var minU = xvals.Min(); var minV = yvals.Min(); var maxU = xvals.Max(); var maxV = yvals.Max(); switch (mode) { case BoxAlignMode.Left: Texture.XShift = -minU; break; case BoxAlignMode.Right: Texture.XShift = -maxU + Texture.Texture.Width; break; case BoxAlignMode.Center: var avgU = (minU + maxU) / 2; var avgV = (minV + maxV) / 2; Texture.XShift = -avgU + Texture.Texture.Width / 2m; Texture.YShift = -avgV + Texture.Texture.Height / 2m; break; case BoxAlignMode.Top: Texture.YShift = -minV; break; case BoxAlignMode.Bottom: Texture.YShift = -maxV + Texture.Texture.Height; break; } CalculateTextureCoordinates(true); }
public static void AlignWithPointCloud(this Texture tex, int width, int height, Cloud cloud, BoxAlignMode mode) { if (width <= 0 || height <= 0) { return; } var xvals = cloud.GetExtents().Select(x => x.Dot(tex.UAxis) / tex.XScale).ToList(); var yvals = cloud.GetExtents().Select(x => x.Dot(tex.VAxis) / tex.YScale).ToList(); var minU = xvals.Min(); var minV = yvals.Min(); var maxU = xvals.Max(); var maxV = yvals.Max(); switch (mode) { case BoxAlignMode.Left: tex.XShift = -minU; break; case BoxAlignMode.Right: tex.XShift = -maxU + width; break; case BoxAlignMode.Center: var avgU = (minU + maxU) / 2; var avgV = (minV + maxV) / 2; tex.XShift = -avgU + width / 2f; tex.YShift = -avgV + height / 2f; break; case BoxAlignMode.Top: tex.YShift = -minV; break; case BoxAlignMode.Bottom: tex.YShift = -maxV + height; break; } }