/// <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); } }
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(); } }
/// <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); }
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(); }