/// <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 } }