コード例 #1
0
        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);
        }
コード例 #2
0
 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();
     }
 }
コード例 #3
0
        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);
        }
コード例 #4
0
        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 });
            }
        }
コード例 #5
0
        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();
        }