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 FitTextureToPointCloud(Cloud cloud, int tileX, int tileY) { if (Texture.Texture == null) return; if (tileX <= 0) tileX = 1; if (tileY <= 0) tileY = 1; // Scale will change, no need to use it in the calculations var xvals = cloud.GetExtents().Select(x => x.Dot(Texture.UAxis)).ToList(); var yvals = cloud.GetExtents().Select(x => x.Dot(Texture.VAxis)).ToList(); var minU = xvals.Min(); var minV = yvals.Min(); var maxU = xvals.Max(); var maxV = yvals.Max(); Texture.XScale = (maxU - minU) / (Texture.Texture.Width * tileX); Texture.YScale = (maxV - minV) / (Texture.Texture.Height * tileY); Texture.XShift = -minU / Texture.XScale; Texture.YShift = -minV / Texture.YScale; CalculateTextureCoordinates(true); }
private void TextureJustified(JustifyMode justifymode, bool treatasone, int tileX, int tileY) { if (Document.Selection.IsEmpty()) return; var boxAlignMode = (justifymode == JustifyMode.Fit) ? Face.BoxAlignMode.Center // Don't care about the align mode when centering : (Face.BoxAlignMode) Enum.Parse(typeof (Face.BoxAlignMode), justifymode.ToString()); Cloud cloud = null; Action<Document, Face> action; if (treatasone) { // If we treat as one, it means we want to align to one great big cloud cloud = new Cloud(Document.Selection.GetSelectedFaces().SelectMany(x => x.Vertices).Select(x => x.Location)); } if (justifymode == JustifyMode.Fit) { action = (d, x) => x.FitTextureToPointCloud(cloud ?? new Cloud(x.Vertices.Select(y => y.Location)), tileX, tileY); } else { action = (d, x) => x.AlignTextureWithPointCloud(cloud ?? new Cloud(x.Vertices.Select(y => y.Location)), boxAlignMode); } Document.PerformAction("Align texture", new EditFace(Document.Selection.GetSelectedFaces(), action, false)); }