コード例 #1
0
        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);
            });
        }
コード例 #2
0
        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);
        }
コード例 #3
0
ファイル: Face.cs プロジェクト: silky/sledge
        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);
        }
コード例 #4
0
        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;
            }
        }