void OnDrawGizmos() { if (m_Anchors.Length < 2 || m_SourceMeshRenderer == null) { return; } var sourceMesh = m_SourceMeshRenderer.GetComponent <MeshFilter>().sharedMesh; if (sourceMesh == null) { return; } var bounds = sourceMesh.bounds; var unitLength = 0f; switch (m_Axis) { case Axis.X: unitLength = bounds.size.x; break; case Axis.Y: unitLength = bounds.size.y; break; case Axis.Z: unitLength = bounds.size.z; break; default: throw new System.ArgumentOutOfRangeException(nameof(m_Axis)); } Gizmos.color = Color.blue; for (var i = 0; i < m_Anchors.Length - 1; ++i) { if (m_Anchors[i] == null || m_Anchors[i + 1] == null) { continue; } var startPos = m_Anchors[i].position; var endPos = m_Anchors[i + 1].position; var curve = new CatenaryCurve(startPos, endPos, m_Catenary, unitLength); foreach (var line in curve) { Gizmos.DrawLine(line.from, line.to); } } }
void RecalculateMesh() { if (m_Anchors.Length < 2 || m_SourceMeshRenderer == null) { return; } var sourceMesh = m_SourceMeshRenderer.GetComponent <MeshFilter>().sharedMesh; if (sourceMesh == null) { return; } using (var so = new SerializedObject(this)) using (var sp = so.FindProperty(nameof(m_MeshObjects))) { DestroyAllCurves(); var bounds = sourceMesh.bounds; var unitLength = 0f; switch (m_Axis) { case Axis.X: unitLength = bounds.size.x; break; case Axis.Y: unitLength = bounds.size.y; break; case Axis.Z: unitLength = bounds.size.z; break; default: throw new System.ArgumentOutOfRangeException(nameof(m_Axis)); } sp.ClearArray(); for (var i = 0; i < m_Anchors.Length - 1; ++i) { if (m_Anchors[i] == null || m_Anchors[i + 1] == null) { continue; } var startPos = m_Anchors[i].position; var endPos = m_Anchors[i + 1].position; var curve = new CatenaryCurve(startPos, endPos, m_Catenary, unitLength); var combines = new List <CombineInstance>(); foreach (var line in curve) { var scale = (line.to - line.from).magnitude / unitLength; var matrix = Matrix4x4.LookAt((line.from + line.to) * 0.5f, line.to, Vector3.up) * Matrix4x4.Scale(Vector3.one + Vector3.forward * (scale - 1f)); switch (m_Axis) { case Axis.X: matrix *= Matrix4x4.Rotate(Quaternion.Euler(0, 90f, 0)); break; case Axis.Y: matrix *= Matrix4x4.Rotate(Quaternion.Euler(90f, 0, 0)); break; } combines.Add(new CombineInstance() { mesh = sourceMesh, transform = matrix }); } var mesh = new Mesh(); mesh.CombineMeshes(combines.ToArray(), true, true, true); MeshUtility.Optimize(mesh); mesh.UploadMeshData(true); var go = new GameObject($"ProcedualMesh{i}") { hideFlags = HideFlags.HideInHierarchy | HideFlags.NotEditable }; ++sp.arraySize; using (var element = sp.GetArrayElementAtIndex(sp.arraySize - 1)) element.objectReferenceValue = go; var meshFilter = go.AddComponent <MeshFilter>(); var renderer = go.AddComponent <MeshRenderer>(); meshFilter.sharedMesh = mesh; renderer.sharedMaterials = m_SourceMeshRenderer.sharedMaterials; Undo.RegisterCreatedObjectUndo(mesh, "Create Mesh"); Undo.RegisterCreatedObjectUndo(go, "Create GameObject"); } so.ApplyModifiedProperties(); } }