Пример #1
0
    /// <summary>
    /// 高级编辑模式
    /// </summary>
    private void SecondaryHandle()
    {
        if (_secondaryHandle)
        {
            #region 顶点模式
            if (_currentEditMode == EditMode.Vertex && _currentCheckedVertex != null)
            {
                switch (_secondaryHandleMode)
                {
                case SecondaryHandleMode.Delete:
                    _meshMaker.Vertexs.Remove(_currentCheckedVertex);
                    _meshMaker.Vertexs.RefreshID();
                    _meshMaker.Triangles.RemoveByVertex(_currentCheckedVertex);
                    _meshMaker.Triangles.RefreshID();
                    _meshMaker.GenerateMesh();
                    _currentCheckedVertex = null;
                    StopSecondaryHandle();
                    break;

                case SecondaryHandleMode.Welding:
                    Vector3 wv = _meshMaker.ScreenToWorldPointInScene(_sceneCamera, Event.current.mousePosition, _currentCheckedVertex.Vertex);
                    Handles.DrawDottedLine(_currentCheckedVertex.Vertex, wv, 0.2f);
                    Handles.Label(wv, "   请选择焊接目标");
                    if (Event.current.button == 1 && Event.current.isMouse && Event.current.type == EventType.MouseDown)
                    {
                        RaycastHit hit;
                        if (Physics.Raycast(HandleUtility.GUIPointToWorldRay(Event.current.mousePosition), out hit))
                        {
                            if (hit.triangleIndex >= 0 && hit.triangleIndex < _meshMaker.Triangles.Count)
                            {
                                MeshMakerVertex mmv = _meshMaker.Triangles[hit.triangleIndex].GetVertexByClick(hit.point);

                                if (mmv != _currentCheckedVertex)
                                {
                                    _meshMaker.Vertexs.Remove(_currentCheckedVertex);
                                    _meshMaker.Vertexs.RefreshID();
                                    _meshMaker.Triangles.RemoveByVertexs(_currentCheckedVertex, mmv);
                                    _meshMaker.Triangles.ReplaceVertex(_currentCheckedVertex, mmv);
                                    _meshMaker.Triangles.RefreshID();
                                    _meshMaker.GenerateMesh();
                                    _currentCheckedVertex = null;
                                }
                            }
                        }
                        StopSecondaryHandle();
                    }
                    break;

                case SecondaryHandleMode.Clone:
                    Vector3 cv = _meshMaker.ScreenToWorldPointInScene(_sceneCamera, Event.current.mousePosition, _currentCheckedVertex.Vertex);
                    Handles.DrawDottedLine(_currentCheckedVertex.Vertex, cv, 0.2f);
                    Handles.Label(cv, "   请选择参照目标");
                    if (Event.current.button == 1 && Event.current.isMouse && Event.current.type == EventType.MouseDown)
                    {
                        RaycastHit hit;
                        if (Physics.Raycast(HandleUtility.GUIPointToWorldRay(Event.current.mousePosition), out hit))
                        {
                            if (hit.triangleIndex >= 0 && hit.triangleIndex < _meshMaker.Triangles.Count)
                            {
                                MeshMakerVertex mmv = _meshMaker.Triangles[hit.triangleIndex].GetVertexByClick(hit.point);

                                if (mmv != _currentCheckedVertex && _meshMaker.Triangles.IsConnected(_currentCheckedVertex, mmv))
                                {
                                    Vector3         vertex = Vector3.Lerp(_currentCheckedVertex.Vertex, mmv.Vertex, 0.5f);
                                    Vector2         uv     = Vector2.Lerp(_currentCheckedVertex.UV, mmv.UV, 0.5f);
                                    MeshMakerVertex newMmv = new MeshMakerVertex(0, vertex, uv, _currentCheckedVertex.Normal, new List <int>());

                                    _meshMaker.Vertexs.Add(newMmv);
                                    _meshMaker.Vertexs.RefreshID();
                                    _meshMaker.Triangles.SegmentationTriangle(mmv, _currentCheckedVertex, newMmv);
                                    _meshMaker.Triangles.RefreshID();
                                    _meshMaker.GenerateMesh();
                                    _currentCheckedVertex = null;
                                }
                            }
                        }
                        StopSecondaryHandle();
                    }
                    break;
                }
            }
            #endregion
        }
    }