public override MeshSelection Unselect(Material material) { MeshSelection selection = IMeshEditorExt.Select(material); selection.FacesToVertices(true); foreach (KeyValuePair <ProBuilderMesh, IList <int> > kvp in selection.UnselectedIndices.ToArray()) { IList <int> indices = kvp.Value; for (int i = indices.Count - 1; i >= 0; i--) { int index = indices[i]; if (!m_vertexSelection.IsSelected(kvp.Key, index)) { indices.Remove(index); } } if (indices.Count == 0) { selection.UnselectedIndices.Remove(kvp.Key); } else { m_vertexSelection.Remove(kvp.Key, indices); } } if (selection.UnselectedIndices.Count == 0) { return(null); } return(selection); }
public MeshSelection ToVertices(bool invert) { MeshSelection selection = new MeshSelection(this); if (selection.HasFaces) { selection.FacesToVertices(invert); } else if (selection.HasEdges) { selection.EdgesToVertices(invert); } else { selection.SelectedFaces.Clear(); selection.UnselectedFaces.Clear(); selection.SelectedEdges.Clear(); selection.UnselectedEdges.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; } } } }