Пример #1
0
        /// <summary>
        /// 引数をコピーして新しいインスタンスを作る。参照は保持しない
        /// </summary>
        internal PatchMesh(List <PatchVertex> vertices, List <PatchControlPoint> controls, List <PatchTriangle> mesh, List <int> path)
        {
            foreach (var v in vertices)
            {
                this.vertices.Add(new PatchVertex(v));
            }
            foreach (var t in mesh)
            {
                this.triangles.Add(new PatchTriangle(t));
            }
            foreach (int p in path)
            {
                this.pathIndices.Add(p);
            }

            var rawVertices = new List <PointF>();

            foreach (var v in this.vertices)
            {
                rawVertices.Add(v.orgPosition);
            }
//            .Select(v => v.orgPosition).ToList();
            var vert2part = new List <int>();// this.vertices.Select(v => v.part).ToList();

            foreach (var v in this.vertices)
            {
                vert2part.Add(v.part);
            }

            arap = new ARAPDeform(rawVertices, vert2part);
            foreach (var c in controls)
            {
                AddControlPoint(c.position, c.orgPosition);
            }
        }
Пример #2
0
        internal void FreezeMesh(bool recreateARAP)
        {
            for (int i = 0; i < vertices.Count; i++)
            {
                vertices[i].orgPosition = vertices[i].position;
            }
            if (recreateARAP)
            {
                // 制御点もフリーズして
                for (int i = 0; i < controlPoints.Count; i++)
                {
                    controlPoints[i].orgPosition = controlPoints[i].position;
                }

                // ARAPをつくりなおす
                arap = new ARAPDeform(vertices.Select(v => v.orgPosition).ToList(), vertices.Select(v => v.part).ToList());
                foreach (var c in controlPoints)
                {
                    arap.AddControlPoint(c.position, c.orgPosition, c.part);
                }

                BalancePartCount();
                arap.BeginDeformation();
            }
        }
Пример #3
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="rawVertices"></param>
        /// <param name="rawPathIndices"></param>
        /// <param name="vert2part">nullならすべての頂点が"-1"に所属する</param>
        /// <param name="patchKey"></param>
        /// <param name="textureSize"></param>
        internal PatchMesh(List <PointF> rawVertices, List <int> rawTriangleIndices, List <int> rawPathIndices, List <int> vert2part, string patchKey, SizeF textureSize)
        {
            if (rawVertices == null || rawPathIndices == null)
            {
                return;
            }

            vertices.Clear();

            for (int i = 0; i < rawVertices.Count; i++)
            {
                int part = -1;
                if (vert2part != null && vert2part.Count > i)
                {
                    part = vert2part[i];
                }
                PointF coord = new PointF(rawVertices[i].X / textureSize.Width, rawVertices[i].Y / textureSize.Height);
                vertices.Add(new PatchVertex(rawVertices[i], part, patchKey, coord));
            }
            pathIndices = new List <int>(rawPathIndices);

            for (int i = 0; i + 2 < rawTriangleIndices.Count; i += 3)
            {
                triangles.Add(new PatchTriangle(rawTriangleIndices[i], rawTriangleIndices[i + 1], rawTriangleIndices[i + 2], patchKey));
            }

            arap = new ARAPDeform(rawVertices, vert2part);
        }
Пример #4
0
        internal void ScaleByRatio(float rx, float ry)
        {
            for (int i = 0; i < vertices.Count; i++)
            {
                vertices[i].ScaleByRatio(rx, ry);
            }

            for (int i = 0; i < controlPoints.Count; i++)
            {
                controlPoints[i].ScaleByRatio(rx, ry);
            }

            arap = new ARAPDeform(vertices.Select(v => v.orgPosition).ToList(), vertices.Select(v => v.part).ToList());
            foreach (var c in controlPoints)
            {
                arap.AddControlPoint(c.position, c.orgPosition, c.part);
            }

            BalancePartCount();
            arap.BeginDeformation();
        }