public void Wrap(MeshFilter meshFilter, MeshCollider meshCollider, Axis axis, int[] curveIndices, int sliceCount) { if (curveIndices.Length < 1) { throw new ArgumentException("at least one curveIndex required", "curveIndices"); } CurveIndices = curveIndices; m_up = Up(axis); if (axis == Axis.Z) { m_axisRotation = Quaternion.identity; } else if (axis == Axis.X) { m_axisRotation = Quaternion.AngleAxis(-90.0f, Vector3.up); } else { m_axisRotation = Quaternion.AngleAxis(90.0f, Vector3.right); } if (meshFilter == null || meshFilter.sharedMesh == null) { m_meshFilter = null; m_meshCollider = null; m_slices = new Slice[curveIndices.Length * (sliceCount + 1)]; m_colliderSlices = new Slice[curveIndices.Length * (sliceCount + 1)]; for (int i = 0; i < m_slices.Length; ++i) { m_slices[i] = new Slice(Vector3.zero, -1, 0, new int[0]); m_colliderSlices[i] = new Slice(Vector3.zero, -1, 0, new int[0]); } return; } sliceCount = Math.Max(sliceCount / curveIndices.Length, 1); Vector3 boundsFrom; Vector3 boundsTo; meshFilter.sharedMesh.GetBounds(axis, out boundsFrom, out boundsTo); m_meshFilter = meshFilter; m_slices = CreateSlices(m_meshFilter.sharedMesh, boundsFrom, boundsTo, axis, curveIndices, sliceCount); if (meshCollider == null || meshCollider.sharedMesh == null) { m_meshCollider = null; m_colliderSlices = new Slice[curveIndices.Length * (sliceCount + 1)]; for (int i = 0; i < m_colliderSlices.Length; ++i) { m_colliderSlices[i] = new Slice(Vector3.zero, -1, 0, new int[0]); } } else { m_meshCollider = meshCollider; m_colliderSlices = CreateSlices(m_meshCollider.sharedMesh, boundsFrom, boundsTo, axis, curveIndices, sliceCount); } }
private Slice[] CreateSlices(Mesh mesh, Vector3 boundsFrom, Vector3 boundsTo, Axis axis, int[] curveIndices, int sliceCount) { Slice[] result = new Slice[curveIndices.Length * (sliceCount + 1)]; Vector3[] vertices = mesh.vertices; List <int>[,] slices = new List <int> [curveIndices.Length, sliceCount + 1]; for (int i = 0; i < curveIndices.Length; ++i) { for (int s = 0; s <= sliceCount; ++s) { slices[i, s] = new List <int>(vertices.Length / result.Length); } } Vector3 delta = (boundsTo - boundsFrom) / curveIndices.Length; for (int v = 0; v < vertices.Length; ++v) { Vector3 vertex = vertices[v]; int minI = -1; int minS = -1; float minMag = float.MaxValue; Vector3 offset = boundsFrom; for (int i = 0; i < curveIndices.Length; ++i) { float t = 0.0f; for (int s = 0; s <= sliceCount; ++s) { Vector3 point = Vector3.Lerp(offset, offset + delta, t); float sqrMag = (vertex - point).sqrMagnitude; if (sqrMag < minMag) { minMag = sqrMag; minI = i; minS = s; } t += 1.0f / sliceCount; } offset += delta; } slices[minI, minS].Add(v); } { Vector3 offset = boundsFrom; for (int i = 0; i < curveIndices.Length; ++i) { int curveIndex = curveIndices[i]; float t = 0.0f; for (int s = 0; s <= sliceCount; ++s) { result[i * (sliceCount + 1) + s] = new Slice(Vector3.Lerp(offset, offset + delta, t), curveIndex, t, slices[i, s].ToArray()); t += 1.0f / sliceCount; } offset += delta; } } return(result); }