private void OnMeshSelected(ManualUVSelection uvSelection) { PBMesh mesh = uvSelection.Mesh; PBEdge[] meshEdges = mesh.Edges; Dictionary <int, List <int> > faceToEdge = new Dictionary <int, List <int> >(); Tuple <int, int>[] edges = new Tuple <int, int> [meshEdges.Length]; for (int i = 0; i < meshEdges.Length; ++i) { PBEdge edge = meshEdges[i]; edges[i] = new Tuple <int, int>(edge.A, edge.B); List <int> edgeIndices; if (!faceToEdge.TryGetValue(edge.FaceIndex, out edgeIndices)) { edgeIndices = new List <int>(); faceToEdge.Add(edge.FaceIndex, edgeIndices); } edgeIndices.Add(i); } ManualUVRenderer uvRenderer = m_meshToRenderer[mesh]; uvRenderer.UV = mesh.Textures; uvRenderer.IsSelected = new bool[uvRenderer.UV.Length]; uvRenderer.Edges = edges; uvRenderer.FaceToEdges = faceToEdge; uvRenderer.Faces = mesh.Faces.Select(f => f.Indexes).ToArray(); uvRenderer.Refresh(false, false); }
private void GetIndexes() { if (m_tool.Mode == ProBuilderToolMode.Vertex) { m_indexes = m_selection.Select(s => s.Vertices.ToArray()).ToArray(); } else if (m_tool.Mode == ProBuilderToolMode.Face) { m_indexes = m_selection.Select(s => { HashSet <int> indexes = new HashSet <int>(); PBFace[] faces = s.Mesh.Faces; foreach (int faceIndex in s.Faces) { PBFace face = faces[faceIndex]; for (int i = 0; i < face.Indexes.Length; ++i) { if (!indexes.Contains(face.Indexes[i])) { indexes.Add(face.Indexes[i]); } } } return(indexes.ToArray()); }).ToArray(); } else { m_indexes = m_selection.Select(s => { HashSet <int> indexes = new HashSet <int>(); PBEdge[] edges = s.Mesh.Edges; foreach (int edgeIndex in s.Edges) { PBEdge edge = edges[edgeIndex]; if (!indexes.Contains(edge.A)) { indexes.Add(edge.A); } if (!indexes.Contains(edge.B)) { indexes.Add(edge.B); } } return(indexes.ToArray()); }).ToArray(); } }
private void OnUVSelectionChanged(ManualUVSelection selection) { ManualUVRenderer renderer = m_meshToRenderer[selection.Mesh]; if (m_tool.Mode == ProBuilderToolMode.Vertex) { Color[] vertexColors = renderer.VertexColors; bool[] isSelected = renderer.IsSelected; for (int i = 0; i < vertexColors.Length; ++i) { bool selected = selection.Vertices.Contains(i); vertexColors[i] = selected ? m_selectionColor : Color.white; isSelected[i] = selected; } } else if (m_tool.Mode == ProBuilderToolMode.Edge) { PBEdge[] edges = selection.Mesh.Edges; Color[] edgeColors = renderer.EdgeColors; bool[] isSelected = renderer.IsSelected; for (int i = 0; i < isSelected.Length; ++i) { isSelected[i] = false; } for (int i = 0; i < edgeColors.Length; ++i) { int edgeIndex = i / 2; bool selected = selection.Edges.Contains(edgeIndex); edgeColors[i] = selected ? m_selectionColor : Color.white; PBEdge edge = edges[edgeIndex]; isSelected[edge.A] = selected; isSelected[edge.B] = selected; } } else { Color[] vertexColors = renderer.VertexColors; int[][] faces = renderer.Faces; bool[] isSelected = renderer.IsSelected; for (int i = 0; i < isSelected.Length; ++i) { isSelected[i] = false; } for (int i = 0; i < vertexColors.Length; ++i) { bool selected = selection.Faces.Contains(i); vertexColors[i] = selected ? m_selectionColor : Color.white; if (selected) { int[] faceIdexes = faces[i]; for (int j = 0; j < faceIdexes.Length; ++j) { int faceIndex = faceIdexes[j]; isSelected[faceIndex] = true; } } } Color[] edgeColors = renderer.EdgeColors; for (int i = 0; i < edgeColors.Length; ++i) { edgeColors[i] = Color.white; } Dictionary <int, List <int> > faceToEdges = renderer.FaceToEdges; foreach (int faceIndex in selection.Faces) { List <int> edgeIndices = faceToEdges[faceIndex]; for (int i = 0; i < edgeIndices.Count; ++i) { int edgeIndex = edgeIndices[i]; edgeColors[edgeIndex * 2 + 0] = m_selectionColor; edgeColors[edgeIndex * 2 + 1] = m_selectionColor; } } } renderer.Refresh(true, true); }
public void RefreshPivotPoint() { Vector2 pivotPosition = Vector2.zero; int count = 0; switch (m_tool.Mode) { case ProBuilderToolMode.Vertex: foreach (ManualUVSelection selection in m_selection) { PBMesh mesh = selection.Mesh; Vector2[] uvs = mesh.Textures; foreach (int index in selection.Vertices) { count++; if (count == 1) { pivotPosition = uvs[index]; } else { pivotPosition *= (count - 1) / (float)count; pivotPosition += uvs[index] / count; } } } break; case ProBuilderToolMode.Face: foreach (ManualUVSelection selection in m_selection) { PBMesh mesh = selection.Mesh; Vector2[] uvs = mesh.Textures; PBFace[] faces = mesh.Faces; foreach (int index in selection.Faces) { PBFace face = faces[index]; int[] faceIndexes = face.Indexes; Vector2 faceUV = uvs[faceIndexes[0]]; for (int i = 1; i < faceIndexes.Length; ++i) { faceUV += uvs[faceIndexes[i]]; } faceUV /= faceIndexes.Length; count++; if (count == 1) { pivotPosition = faceUV; } else { pivotPosition *= (count - 1) / (float)count; pivotPosition += faceUV / count; } } } break; default: foreach (ManualUVSelection selection in m_selection) { PBMesh mesh = selection.Mesh; Vector2[] uvs = mesh.Textures; PBEdge[] edges = mesh.Edges; foreach (int index in selection.Edges) { PBEdge edge = edges[index]; Vector2 edgeUV = (uvs[edge.A] + uvs[edge.B]) * 0.5f; count++; if (count == 1) { pivotPosition = edgeUV; } else { pivotPosition *= (count - 1) / (float)count; pivotPosition += edgeUV / count; } } } break; } pivotPosition *= ManualUVRenderer.Scale; m_pivotPoint.position = new Vector3(pivotPosition.x, pivotPosition.y, -1); m_pivotPoint.rotation = Quaternion.identity; m_pivotPoint.localScale = Vector3.one; m_prevPivotPoint = m_pivotPoint.position; if (count == 0) { m_pivotPointSelection.Select(null, null); } else { m_pivotPointSelection.Select(m_pivotPoint.gameObject, new[] { m_pivotPoint.gameObject }); } }
public void SelectEdges(Func <Vector2, Vector2, float> canSelect, bool selectClosest, bool clearSelection) { m_editor.Undo.BeginRecord(); for (int index = 0; index < m_selection.Count; ++index) { ManualUVSelection selection = m_selection[index]; ManualUVSelection oldSelection = new ManualUVSelection(selection); if (clearSelection) { selection.Clear(); } PBMesh mesh = selection.Mesh; Vector2[] uvs = mesh.Textures; PBEdge[] edges = mesh.Edges; float minDistance = float.PositiveInfinity; int closestEdgeIndex = -1; for (int i = 0; i < edges.Length; ++i) { PBEdge edge = edges[i]; float distance = canSelect(uvs[edge.A], uvs[edge.B]); if (selectClosest) { if (distance < minDistance) { closestEdgeIndex = i; minDistance = distance; } } else { if (distance <= 0) { if (!selection.Edges.Contains(i)) { selection.Edges.Add(i); } } } } if (closestEdgeIndex >= 0) { if (!selection.Edges.Contains(closestEdgeIndex)) { selection.Edges.Add(closestEdgeIndex); } } RecordSelection(index, oldSelection, new ManualUVSelection(selection)); if (SelectionChanged != null) { SelectionChanged(selection); } } m_editor.Undo.EndRecord(); }