コード例 #1
0
 protected static void Start()
 {
     uvSaveWindow = (WindowUVSave)EditorWindow.GetWindow(typeof(WindowUVSave));
 }
コード例 #2
0
    private void OnGUI()
    {
        selectedObject = Selection.activeGameObject;

        if (selectedObject == null)
        {
            GUI.color = Color.gray;
            EditorGUILayout.HelpBox("Select the object...", MessageType.Warning);
            canDrawView = false;
        }
        else
        {
            if (selectedObject.GetComponent <MeshFilter>() != null | selectedObject.GetComponent <SkinnedMeshRenderer>() != null)
            {
                GUI.color = Color.green;
                EditorGUILayout.HelpBox("Selected object: " + selectedObject.name, MessageType.None);
                GUI.color = Color.white;

                if (selectedObject.GetComponent <SkinnedMeshRenderer>() == null)
                {
                    m = selectedObject.GetComponent <MeshFilter>().sharedMesh;

                    if (selectedObject.GetComponent <MeshRenderer>().sharedMaterial.mainTexture != null)
                    {
                        List <Texture> TexList    = new List <Texture>();
                        List <string>  StringList = new List <string>();
                        List <int>     IntList    = new List <int>();
                        for (int i = 0; i < selectedObject.GetComponent <MeshRenderer>().sharedMaterials.Length; i++)
                        {
                            TexList.Add(selectedObject.GetComponent <MeshRenderer>().sharedMaterials[i].mainTexture);
                            StringList.Add(selectedObject.GetComponent <MeshRenderer>().sharedMaterials[i].mainTexture.name);
                            IntList.Add(i);
                        }
                        Tex      = TexList.ToArray();
                        TexName  = StringList.ToArray();
                        IntIndex = IntList.ToArray();
                    }
                    else
                    {
                        List <Texture> TexList    = new List <Texture>();
                        List <string>  StringList = new List <string>();
                        List <int>     IntList    = new List <int>();

                        TexList.Add((Texture)CreateFillTexture(1, 1, new Color(0, 0, 0, 0.1f)));
                        StringList.Add("empty");
                        IntList.Add(0);
                        Tex      = TexList.ToArray();
                        TexName  = StringList.ToArray();
                        IntIndex = IntList.ToArray();
                    }
                }
                else
                {
                    m = selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMesh;
                    if (selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMaterial.mainTexture != null)
                    {
                        List <Texture> TexList    = new List <Texture>();
                        List <string>  StringList = new List <string>();
                        List <int>     IntList    = new List <int>();
                        for (int i = 0; i < selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMaterials.Length; i++)
                        {
                            TexList.Add(selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMaterials[i].mainTexture);
                            StringList.Add(selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMaterials[i].mainTexture.name);
                            IntList.Add(i);
                        }
                        Tex      = TexList.ToArray();
                        TexName  = StringList.ToArray();
                        IntIndex = IntList.ToArray();
                    }
                    else
                    {
                        List <Texture> TexList    = new List <Texture>();
                        List <string>  StringList = new List <string>();
                        List <int>     IntList    = new List <int>();

                        TexList.Add((Texture)CreateFillTexture(1, 1, new Color(0, 0, 0, 0.1f)));
                        StringList.Add("empty");
                        IntList.Add(0);
                        Tex      = TexList.ToArray();
                        TexName  = StringList.ToArray();
                        IntIndex = IntList.ToArray();
                    }
                }
                if (m != null)
                {
                    GUILayout.BeginHorizontal();
                    selectedUV   = GUILayout.Toolbar(selectedUV, selectedUVStrings);
                    canDrawView  = true;
                    SubMeshIndex = EditorGUILayout.IntPopup(SubMeshIndex, TexName, IntIndex);

                    //Debug.Log("SubMeshIndex"+SubMeshIndex);
                    //BackgroundTexture = (BackgroundTextureMode)EditorGUILayout.EnumPopup(BackgroundTexture, GUILayout.Width(85));
                    GUILayout.EndHorizontal();
                    //GUILayout.Space(10f);
                    GUILayout.BeginHorizontal();
                    if (GUILayout.Button("Save To PNG"))
                    {
                        WindowUVSave uvSave = (WindowUVSave)EditorWindow.GetWindow(typeof(WindowUVSave));
                        uvSave.titleContent      = new GUIContent("Save to PNG");
                        uvSave.maxSize           = new Vector2(256, 125);
                        uvSave.minSize           = new Vector2(256, 124);
                        uvSave.uvsToRender       = uvs;
                        uvSave.trianglesToRender = tris;
                    }

                    //画笔设置
                    UVColor = EditorGUILayout.ColorField(UVColor, GUILayout.Width(85));

                    GUILayout.EndHorizontal();

                    switch (selectedUV)
                    {
                    case 0:
                        if (m.uv.Length > 0)
                        {
                            GUILayout.BeginHorizontal();
                            EditorGUILayout.HelpBox("Mesh UV 1 缩略图:", MessageType.None);
                            //if (Mat.Count > 0)
                            //{

                            //    List<string> matsName = null;
                            //    int[] matsInt = new int[Mat.Count];
                            //    foreach (var item in Mat)
                            //    {
                            //        matsName.Add(item.name);
                            //    }
                            //    Textureindex = EditorGUILayout.IntPopup(Textureindex, matsName.ToArray(), matsInt);
                            //}

                            uvs = m.uv;
                            GUILayout.EndHorizontal();
                        }
                        else
                        {
                            EditorGUILayout.HelpBox("Mesh无UV 1", MessageType.None);
                        }
                        break;

                    case 1:
                        GUILayout.BeginHorizontal();
                        if (m.uv2.Length > 0)
                        {
                            EditorGUILayout.HelpBox("Mesh UV2 缩略图:", MessageType.None);
                            uvs = m.uv2;
                        }
                        else
                        {
                            EditorGUILayout.HelpBox("Mesh没有UV2. 点击Generate UV2生成", MessageType.None);
                            if (GUILayout.Button("Generate UV2"))
                            {
                                Unwrapping.GenerateSecondaryUVSet(m);
                                EditorApplication.Beep();
                                EditorUtility.DisplayDialog("Done", "Process is done!", "OK");
                            }
                        }
                        GUILayout.EndHorizontal();

                        break;

                    case 2:
                        if (m.uv3.Length > 0)
                        {
                            EditorGUILayout.HelpBox("Mesh UV3 缩略图:", MessageType.None);
                            uvs = m.uv3;
                        }
                        else
                        {
                            EditorGUILayout.HelpBox("Mesh 无 UV3", MessageType.None);
                        }
                        break;

                    case 3:
                        if (m.uv4.Length > 0)
                        {
                            EditorGUILayout.HelpBox("Mesh UV4 缩略图:", MessageType.None);
                            uvs = m.uv4;
                        }
                        else
                        {
                            EditorGUILayout.HelpBox("Mesh 无 UV4", MessageType.None);
                        }
                        break;
                    }
                }

                BaseTexture = (Texture2D)Tex[SubMeshIndex];
            }
            else
            {
                GUI.color = Color.gray;
                EditorGUILayout.HelpBox("Object must have a Mesh Filter or Skinned Mesh Renderer", MessageType.Warning);
                canDrawView = false;
            }
        }

        //BaseTexture = CreateFillTexture(256, 256, new Color(1, 1, 1, 1f));
        //uvPreviewRect = new Rect(new Rect(sideSpace, ySpace + sideSpace, uvPreviewWindow.position.width - (sideSpace * 2), uvPreviewWindow.position.height - ySpace - (sideSpace * 2)));

        //GUI.DrawTexture(new Rect(0, 0, uvPreviewWindow.position.width, ySpace), BaseTexture);

        if (canDrawView)
        {
            tris = m.GetTriangles(SubMeshIndex);
            //tris = m.triangles;

            uvPreviewRect = new Rect(sideSpace, ySpace, (int)(uvPreviewWindow.position.width - 10), (int)(uvPreviewWindow.position.width - 10));
            GUI.DrawTexture(uvPreviewRect, BaseTexture);
            //GUI.DrawTexture(uvPreviewRect, BaseTexture);
            windowDefaultSize = (int)(uvPreviewWindow.position.width - 10);

            //UV
            for (int i = 0; i < tris.Length; i += 3)
            {
                int line1x1 = (int)(uvs[tris[i]].x * (scale * windowDefaultSize) + sideSpace);
                int line1y1 = (int)(-uvs[tris[i]].y * (scale * windowDefaultSize) + ySpace) + windowDefaultSize;
                int line1x2 = (int)(uvs[tris[i + 1]].x * (scale * windowDefaultSize) + sideSpace);
                int line1y2 = (int)(-uvs[tris[i + 1]].y * (scale * windowDefaultSize) + ySpace + windowDefaultSize);

                int line2x1 = (int)(uvs[tris[i + 1]].x * (scale * windowDefaultSize) + sideSpace);
                int line2y1 = (int)(-uvs[tris[i + 1]].y * (scale * windowDefaultSize) + ySpace) + windowDefaultSize;
                int line2x2 = (int)(uvs[tris[i + 2]].x * (scale * windowDefaultSize) + sideSpace);
                int line2y2 = (int)(-uvs[tris[i + 2]].y * (scale * windowDefaultSize) + ySpace) + windowDefaultSize;

                int line3x1 = (int)(uvs[tris[i + 2]].x * (scale * windowDefaultSize) + sideSpace);
                int line3y1 = (int)(-uvs[tris[i + 2]].y * (scale * windowDefaultSize) + ySpace) + windowDefaultSize;
                int line3x2 = (int)(uvs[tris[i]].x * (scale * windowDefaultSize) + sideSpace);
                int line3y2 = (int)(-uvs[tris[i]].y * (scale * windowDefaultSize) + ySpace) + windowDefaultSize;

                Rect cropRect = new Rect(uvPreviewRect.x, uvPreviewRect.y, uvPreviewRect.width + sideSpace, uvPreviewRect.height + ySpace + sideSpace);

                DrawLine(line1x1, line1y1, line1x2, line1y2, new Color(0, 1, 0, 1), true, cropRect);
                DrawLine(line2x1, line2y1, line2x2, line2y2, new Color(0, 1, 0, 1), true, cropRect);
                DrawLine(line3x1, line3y1, line3x2, line3y2, new Color(0, 1, 0, 1), true, cropRect);
            }
        }
    }