Exemplo n.º 1
0
        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);
                }
            }
        }
Exemplo n.º 2
0
        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();
                }
        }