public void Deform(int meshIndex) { if (meshIndex > bMeshes.Length - 1) { return; } thread_pts = new Vector3[bMeshes[meshIndex].origVerts.Length]; BendParameters bp = new BendParameters(); bp.N = ts_transform.TransformDirection(1, 0, 0); bp.BiN = ts_transform.TransformDirection(0, 0, -1); bp.T = ts_transform.TransformDirection(0, 1, 0); bp.bendEnd = ts_targetTransform.TransformPoint(0, length, 0); int start = (direction) ? 0 : bMeshes[meshIndex].seperatingIndex; int end = (direction) ? bMeshes[meshIndex].seperatingIndex : bMeshes[meshIndex].origVerts.Length; for (int i = start; i < end; i += maxWorkGroupSize) { int workgroupSize = (i + maxWorkGroupSize < bMeshes[meshIndex].origVerts.Length) ? maxWorkGroupSize : bMeshes[meshIndex].origVerts.Length - i; threads.Add(StartThread(i, i + workgroupSize, ts_transform, ts_targetTransform, bp, meshIndex)); } start = (direction) ? bMeshes[meshIndex].seperatingIndex : 0; end = (direction) ? bMeshes[meshIndex].origVerts.Length : bMeshes[meshIndex].seperatingIndex; for (int i = start; i < end; i++) { thread_pts[i] = bMeshes[meshIndex].origVerts[i]; } ThreadTools.WaitForThreads(ref threads); bMeshes[meshIndex].mesh.vertices = thread_pts; }
private Thread StartThread(int iStart, int iEnd, ts_Transform thisT, ts_Transform otherT, BendParameters bp, int meshIndex) { Thread t = new Thread(() => DeformThread(iStart, iEnd, thisT, otherT, bp, meshIndex)); t.Start(); return(t); }
private void DeformThread(int iStart, int iEnd, ts_Transform thisT, ts_Transform otherT, BendParameters bp, int meshIndex) { Vector3 v; Vector3 P2, N2, T2; for (int i = iStart; i < iEnd; i++) { Vector3 wsPt = otherT.TransformPoint(bMeshes[meshIndex].origVerts[i]); float u = PtLineProject(wsPt, thisT.TransformPoint(Vector3.zero), thisT.TransformPoint(0, 1 * length, 0)); u = Mathf.Min(1.0F, Mathf.Max(u, 0.0F)); float tmp = Vector3.Dot(wsPt, bp.bendEnd); tmp = Mathf.Min(Mathf.Max(tmp, 0), bp.bendEnd.magnitude); bp.P = thisT.TransformPoint(u * new Vector3(0, 1 * length, 0)); float dN, dBiN, dT; dN = PtLineProject(wsPt, bp.P, bp.P + bp.N); dBiN = PtLineProject(wsPt, bp.P, bp.P + bp.BiN); dT = PtLineProject(wsPt, bp.P, bp.P + bp.T); if (curvature != 0) { v.x = (Mathf.Cos(u * curvature / Mathf.PI) * Mathf.PI / curvature - Mathf.PI / curvature) * length; v.y = (Mathf.Sin(u * curvature / Mathf.PI) * Mathf.PI / curvature) * length; v.z = 0; P2 = thisT.TransformPoint(v); N2 = thisT.TransformDirection(Vector3.Normalize(v - new Vector3(-Mathf.PI / curvature * length, 0, 0))); if (curvature < 0) { N2 *= -1; } T2 = Vector3.Cross(N2, bp.BiN); } else { P2 = bp.P; N2 = bp.N; T2 = bp.T; } thread_pts[i] = Vector3.Lerp(bMeshes[meshIndex].origVerts[i], otherT.InverseTransformPoint(P2 + dN * N2 + dBiN * bp.BiN + dT * T2), amount); } }