public override MeshSelection Unselect(Material material) { MeshSelection selection = IMeshEditorExt.Select(material); selection.FacesToEdges(true); foreach (KeyValuePair <ProBuilderMesh, IList <Edge> > kvp in selection.UnselectedEdges.ToArray()) { m_edgeSelection.FindCoincidentEdges(kvp.Key); IList <Edge> edges = m_edgeSelection.GetCoincidentEdges(kvp.Value).ToList(); for (int i = edges.Count - 1; i >= 0; i--) { Edge edge = edges[i]; if (!m_edgeSelection.IsSelected(kvp.Key, edge)) { edges.Remove(edge); } } if (edges.Count == 0) { selection.UnselectedEdges.Remove(kvp.Key); } else { m_edgeSelection.Remove(kvp.Key, edges); } } if (selection.UnselectedEdges.Count == 0) { return(null); } return(selection); }
public MeshSelection ToEdges(bool invert, bool partial = false) { MeshSelection selection = new MeshSelection(this); if (selection.HasFaces) { selection.FacesToEdges(invert); } else if (selection.HasVertices) { selection.VerticesToEdges(invert, partial); } else { selection.SelectedFaces.Clear(); selection.UnselectedFaces.Clear(); selection.SelectedIndices.Clear(); selection.UnselectedIndices.Clear(); } return(selection); }
public void Merge(MeshSelection selection, bool partial) { if (HasFaces) { if (selection.HasEdges) { selection.EdgesToFaces(false, partial); } else if (selection.HasVertices) { selection.VerticesToFaces(false, partial); } foreach (KeyValuePair <ProBuilderMesh, IList <int> > kvp in selection.SelectedFaces) { ProBuilderMesh mesh = kvp.Key; IList <int> faces = kvp.Value; if (!SelectedFaces.ContainsKey(mesh)) { SelectedFaces.Add(mesh, faces); } else { IList <int> existingFaces = SelectedFaces[mesh].ToList(); MergeLists(faces, existingFaces); SelectedFaces[mesh] = existingFaces; } } foreach (KeyValuePair <ProBuilderMesh, IList <int> > kvp in selection.UnselectedFaces) { ProBuilderMesh mesh = kvp.Key; IList <int> faces = kvp.Value; if (!UnselectedFaces.ContainsKey(mesh)) { UnselectedFaces.Add(mesh, faces); } else { IList <int> existingFaces = UnselectedFaces[mesh].ToList(); MergeLists(faces, existingFaces); UnselectedFaces[mesh] = existingFaces; } } } else if (HasEdges) { if (selection.HasFaces) { selection.FacesToEdges(false); } else if (selection.HasVertices) { selection.VerticesToEdges(false, partial); } foreach (KeyValuePair <ProBuilderMesh, IList <Edge> > kvp in selection.SelectedEdges) { ProBuilderMesh mesh = kvp.Key; IList <Edge> edges = kvp.Value; if (!SelectedEdges.ContainsKey(mesh)) { SelectedEdges.Add(mesh, edges); } else { IList <Edge> existingEdges = SelectedEdges[mesh].ToList(); MergeLists(edges, existingEdges); SelectedEdges[mesh] = existingEdges; } } foreach (KeyValuePair <ProBuilderMesh, IList <Edge> > kvp in selection.UnselectedEdges) { ProBuilderMesh mesh = kvp.Key; IList <Edge> edges = kvp.Value; if (!UnselectedEdges.ContainsKey(mesh)) { UnselectedEdges.Add(mesh, edges); } else { IList <Edge> existingEdges = UnselectedEdges[mesh].ToList(); MergeLists(edges, existingEdges); UnselectedEdges[mesh] = existingEdges; } } } else if (HasVertices) { if (selection.HasFaces) { selection.FacesToVertices(false); } else if (selection.HasEdges) { selection.EdgesToVertices(false); } foreach (KeyValuePair <ProBuilderMesh, IList <int> > kvp in selection.SelectedIndices) { ProBuilderMesh mesh = kvp.Key; IList <int> indexes = kvp.Value; if (!SelectedIndices.ContainsKey(mesh)) { SelectedIndices.Add(mesh, indexes); } else { IList <int> existingIndexes = SelectedIndices[mesh].ToList(); MergeLists(indexes, existingIndexes); SelectedIndices[mesh] = existingIndexes; } } foreach (KeyValuePair <ProBuilderMesh, IList <int> > kvp in selection.SelectedIndices) { ProBuilderMesh mesh = kvp.Key; IList <int> indexes = kvp.Value; if (!UnselectedIndices.ContainsKey(mesh)) { UnselectedIndices.Add(mesh, indexes); } else { IList <int> existingIndexes = UnselectedIndices[mesh].ToList(); MergeLists(indexes, existingIndexes); UnselectedIndices[mesh] = existingIndexes; } } } }