Exemplo n.º 1
0
        public void ReadUVSets(int off)
        {
            offUV = off;
            int size  = BitConverter.ToInt32(memory, off);
            int count = BitConverter.ToInt32(memory, off + 4);
            int subc  = size / 4;
            int pos   = off + 8;

            if (count > Vertices.Count)
            {
                currpos = pos;
                return;
            }
            for (int i = 0; i < count; i++)
            {
                UVSet uv = new UVSet();
                uv.U   = new float[subc];
                uv.V   = new float[subc];
                uv.raw = new byte[subc * 4];
                for (int j = 0; j < subc; j++)
                {
                    uv.U[j] = getFloat16(pos);
                    uv.V[j] = getFloat16(pos + 2);
                    for (int k = 0; k < 4; k++)
                    {
                        uv.raw[j * 4 + k] = memory[pos + k];
                    }
                    pos += 4;
                }
                UVSets.Add(uv);
            }
            currpos = pos;
        }
Exemplo n.º 2
0
        public byte[] SerializeUVs()
        {
            MemoryStream rbuff = new MemoryStream();
            int          count = UVSets.Count;

            if (count <= 0)
            {
                return(null);
            }
            int subc = UVSets[0].U.Length;

            byte[] buff = BitConverter.GetBytes((Int32)subc * 4);
            rbuff.Write(buff, 0, 4);
            buff = BitConverter.GetBytes(count);
            rbuff.Write(buff, 0, 4);
            for (int i = 0; i < count; i++)
            {
                UVSet uv = UVSets[i];
                //for (int j = 0; j < subc; j++)
                //{

                //    StreamAppend(rbuff, BitConverter.GetBytes(FloatToHalf(uv.U[j])));
                //    StreamAppend(rbuff, BitConverter.GetBytes(FloatToHalf(uv.V[j])));
                //}
                StreamAppend(rbuff, uv.raw);
            }
            return(rbuff.ToArray());
        }
        void OnEnable()
        {
            #if (UNITY_5_0)
            title = "UV Inspector";
            #else
            titleContent = new GUIContent("UV Inspector");
            #endif

            this.minSize = new Vector2(350, 400);

            previewUVSet             = (UVSet)EditorPrefs.GetInt("nTools.UVInspector.previewUVSet", (int)previewUVSet);
            subMeshToggleField       = EditorPrefs.GetInt("nTools.UVInspector.subMeshToggleField", subMeshToggleField.bitfield);
            showVertexColors         = EditorPrefs.GetBool("nTools.UVInspector.showVertexColors", showVertexColors);
            showGrid                 = EditorPrefs.GetBool("nTools.UVInspector.showGrid", showGrid);
            showSubmeshesByOne       = EditorPrefs.GetBool("nTools.UVInspector.showSubmeshesByOne", showSubmeshesByOne);
            tilePreviewTexture       = EditorPrefs.GetBool("nTools.UVInspector.tilePreviewTexture", tilePreviewTexture);
            previewTextureSource     = (PreviewTextureSource)EditorPrefs.GetInt("nTools.UVInspector.previewTextureSource", (int)previewTextureSource);
            customPreviewTexture     = (Texture2D)AssetDatabase.LoadAssetAtPath(EditorPrefs.GetString("nTools.UVInspector.customPreviewTexture", ""), typeof(Texture2D));
            previewTextureTintColor  = IntToColor(EditorPrefs.GetInt("nTools.UVInspector.previewTextureTintColor", ColorToInt(previewTextureTintColor)));
            preferredTextureProperty = EditorPrefs.GetString("nTools.UVInspector.preferredTextureProperty", preferredTextureProperty);
            previewTextureChannels   = (ColorChannels)EditorPrefs.GetInt("nTools.UVInspector.previewTextureChannels", (int)previewTextureChannels);
            settingsFoldout          = EditorPrefs.GetBool("nTools.UVInspector.settingsFoldout", settingsFoldout);
            previewFoldout           = EditorPrefs.GetBool("nTools.UVInspector.previewFoldout", previewFoldout);


            if (!LoadMaterials())
            {
                Debug.LogWarning("UV Inspector Error: shaders not found. Reimport asset.");
                Close();
                return;
            }

            #if NO_ON_SELECTION_CHANGED
            if (EditorApplication.update != OnEditorUpdate)
            {
                EditorApplication.update += OnEditorUpdate;
            }
            #else
            if (Selection.selectionChanged != OnSelectionChanged)
            {
                Selection.selectionChanged += OnSelectionChanged;
            }
            #endif

            LoadMeshes();
        }
Exemplo n.º 4
0
        public void ReadEdges(byte[] memory)
        {
            UnknownList edges = new UnknownList();
            Edges       e     = new Edges();

            edges.size  = BitConverter.ToInt32(memory, readerpos);
            edges.count = BitConverter.ToInt32(memory, readerpos + 4);
            e.size      = edges.size;
            e.count     = edges.count;
            readerpos  += 8;
            int len = edges.size * edges.count;

            edges.data = new byte[len];
            int datacounter = 0;

            e.UVSet = new List <UVSet>();
            for (int i = 0; i < edges.count; i++)
            {
                UVSet uv = new UVSet();
                uv.UVs     = new List <Vector2>();
                uv.x1      = memory[readerpos];
                uv.y1      = memory[readerpos + 1];
                uv.z1      = memory[readerpos + 2];
                uv.w1      = memory[readerpos + 3];
                uv.x2      = memory[readerpos + 4];
                uv.y2      = memory[readerpos + 5];
                uv.z2      = memory[readerpos + 6];
                uv.w2      = memory[readerpos + 7];
                readerpos += 8;

                for (int row = 0; row < (edges.size - 8) / 4; row++)
                {
                    float u = DXHelper.HalfToFloat(BitConverter.ToUInt16(memory, readerpos));
                    float v = DXHelper.HalfToFloat(BitConverter.ToUInt16(memory, readerpos + 2));
                    uv.UVs.Add(new Vector2(u, v));
                    edges.data[datacounter] = memory[readerpos];
                    readerpos   += 4;
                    datacounter += 1;
                }
                e.UVSet.Add(uv);
            }
            Mesh.Edges = e;
        }
Exemplo n.º 5
0
        public void ReadEdges(byte[] memory)
        {
            TreeNode res = new TreeNode("Edges list, start: 0x" + readerpos.ToString("X4"));
            UnknownList edges = new UnknownList(); //here using struct unknown list, later we're just filling up data array byte by byte
            Edges e = new Edges();
            edges.size = BitConverter.ToInt32(memory, readerpos);
            edges.count = BitConverter.ToInt32(memory, readerpos + 4);
            e.size = edges.size;
            e.count = edges.count;
            //quick'n'dirty fix above, need work! <--------------
            readerpos += 8;
            int len = edges.size * edges.count;
            edges.data = new byte[len];
            res.Nodes.Add(new TreeNode("Size : " + edges.size.ToString()));
            res.Nodes.Add(new TreeNode("Count : " + edges.count.ToString()));
            TreeNode data = new TreeNode("Data");
            int datacounter = 0;

            e.UVSet = new List<UVSet>();
            for (int i = 0; i < edges.count; i++)
            {
                UVSet uv = new UVSet();
                uv.UVs = new List<Vector2>();

                //here adding packed normals
                uv.x1 = memory[readerpos];
                uv.y1 = memory[readerpos + 1];
                uv.z1 = memory[readerpos + 2];
                uv.w1 = memory[readerpos + 3];
                uv.x2 = memory[readerpos + 4];
                uv.y2 = memory[readerpos + 5];
                uv.z2 = memory[readerpos + 6];
                uv.w2 = memory[readerpos + 7];

                //string rawdata = "";
                //string n1 = packedNorm(readerpos);
                //string n2 = packedNorm(readerpos + 4);
                //rawdata = n1 + " " + n2 + " UV Sets: "; //
                //          memory[readerpos].ToString("X2") + " " +
                //          memory[readerpos + 1].ToString("X2") + " " +
                //          memory[readerpos + 2].ToString("X2") + " " +
                //          memory[readerpos + 3].ToString("X2") + " " +
                //          memory[readerpos + 4].ToString("X2") + " " +
                //          memory[readerpos + 5].ToString("X2") + " " +
                //          memory[readerpos + 6].ToString("X2") + " " +
                //          memory[readerpos + 7].ToString("X2") + " " + 
                readerpos += 8;


                for (int row = 0; row < (edges.size - 8) / 4; row++)
                {
                    float u = HalfToFloat(BitConverter.ToUInt16(memory, readerpos));
                    float v = HalfToFloat(BitConverter.ToUInt16(memory, readerpos + 2));
                    uv.UVs.Add(new Vector2(u, v));
                    //rawdata += "uv(" + u + " ; " + v + ") ";
                    edges.data[datacounter] = memory[readerpos];
                    readerpos += 4;
                    datacounter += 1;
                }
                e.UVSet.Add(uv);
                data.Nodes.Add(new TreeNode(i.ToString("d4") + ": " ));
            }

            res.Nodes.Add(data);
            e.t = res;
            Mesh.Edges = e;
        }
Exemplo n.º 6
0
        public void ImportFromPsk(string path)
        {
            psk = new PSKFile();
            psk.ImportPSK(path);
#region Vertices
            Mesh.Vertices = new Verts();
            Mesh.Vertices.Points = new List<Vector3>();
            for (int i = 0; i < psk.psk.edges.Count; i++)
            {
                int idx = psk.psk.edges[i].index;
                float valueX = psk.psk.points[idx].x;
                float valueY = psk.psk.points[idx].y;
                float valueZ = psk.psk.points[idx].z;
                Mesh.Vertices.Points.Add(new Vector3(valueX, valueY, valueZ));

            }
            Mesh.Buffers.IndexBuffer = Mesh.Vertices.Points.Count();
            byte[] buff = BitConverter.GetBytes((int)Mesh.Vertices.Points.Count());
            for (int i = 0; i < 4; i++)
                Mesh.UnknownPart.data[24 + i] = buff[i];
            #endregion
#region materials
            Lod l = Mesh.Mat.Lods[0];
            l.Sections = new List<Section>();
            for (int i = 0; i < psk.psk.faces.Count; i++)
            {
                PSKFile.PSKFace e = psk.psk.faces[i];
                int mat = e.material;
                
                if (mat >= l.Sections.Count())
                {
                    int min = i * 3;
                    int minv = e.v0;
                    if (e.v1 < minv)
                        minv = e.v1;
                    if (e.v2 < minv)
                        minv = e.v2;
                    int maxv = e.v0;
                    if (e.v1 > maxv)
                        maxv = e.v1;
                    if (e.v2 > maxv)
                        maxv = e.v2;
                    Section s = new Section();
                    s.FirstIdx1 = min;
                    s.FirstIdx2 = min;
                    s.NumFaces1 = 1;
                    s.NumFaces2 = 1;
                    s.MatEff1 = minv;
                    s.MatEff2 = maxv;
                    s.Unk1 = 1;
                    s.Unk2 = 1;
                    s.Unk3 = 1;
                    s.Unk4 = 0;
                    s.Unk5 = 1;
                    s.Unk6 = 0;
                    l.Sections.Add(s);
                }
                else
                {
                    Section s = l.Sections[mat];
                    int min = s.FirstIdx1 / 3;
                    int max = s.NumFaces1;
                    int minv = s.MatEff1;
                    if (e.v1 < minv)
                        minv = e.v1;
                    if (e.v2 < minv)
                        minv = e.v2;
                    int maxv = s.MatEff2;
                    if (e.v1 > maxv)
                        maxv = e.v1;
                    if (e.v2 > maxv)
                        maxv = e.v2;
                    if (i - s.FirstIdx1 / 3  + 1> max)
                        max = i - s.FirstIdx1 / 3 + 1;
                    if (i < min)
                        min = i;
                    s.FirstIdx1 = min * 3;
                    s.FirstIdx2 = min * 3;
                    s.NumFaces1 = max;
                    s.NumFaces2 = max;
                    s.MatEff1 = minv;
                    s.MatEff2 = maxv;
                    l.Sections[mat] = s;
                }
            }
            l.SectionCount = l.Sections.Count();
            for (int i = 0; i < l.SectionCount; i++)
            {
                Select_Material selm = new Select_Material();
                selm.hasSelected = false;
                selm.listBox1.Items.Clear();
                selm.Objects = new List<int>();
                for(int j =0;j<pcc.Exports.Count;j++)
                {
                    PCCObject.ExportEntry e =pcc.Exports[j];
                    if (e.ClassName == "Material" || e.ClassName == "MaterialInstanceConstant")
                    {
                        selm.listBox1.Items.Add(j + "\t" + e.ClassName + " : " + e.ObjectName);
                        selm.Objects.Add(j);
                    }
                }
                selm.Show();
                while (selm != null && !selm.hasSelected)
                {
                    Application.DoEvents();
                }
                Section s = l.Sections[i];
                s.Name = selm.SelIndex + 1;
                l.Sections[i] = s;
                selm.Close();
            }
            l.NumVert = psk.psk.points.Count();
            Mesh.Mat.Lods[0] = l;
#endregion
#region Edges
            int oldcount = Mesh.Edges.UVSet[0].UVs.Count();
            Mesh.Buffers.UV1 = oldcount;
            Mesh.Buffers.UV2 = oldcount * 4 + 8;
            Mesh.Edges = new Edges();
            Mesh.Edges.UVSet = new List<UVSet>();
            for (int i = 0; i < psk.psk.edges.Count; i++)
            {
                UVSet newSet = new UVSet();
                newSet.UVs = new List<Vector2>();
                for (int j = 0; j < oldcount; j++)
                    newSet.UVs.Add(new Vector2(psk.psk.edges[i].U, psk.psk.edges[i].V));
                newSet.x1 = 0;
                newSet.x2 = 0;
                newSet.y1 = 0;
                newSet.y2 = 0;
                newSet.z1 = 0;
                newSet.z2 = 0;
                newSet.w1 = 0;
                newSet.w2 = 0;
                Mesh.Edges.UVSet.Add(newSet);
            }            
            Mesh.Edges.count = psk.psk.edges.Count;
            Mesh.Edges.size = 8 + 4 * oldcount;
#endregion
#region Faces
            Mesh.RawTris.RawTriangles = new List<RawTriangle>();
            bool WithIndex = (Mesh.IdxBuf.Indexes.Count != 0);
            if (WithIndex)
                Mesh.IdxBuf.Indexes = new List<ushort>();
            for (int i = 0; i < psk.psk.faces.Count; i++)
            {
                RawTriangle r = new RawTriangle();
                PSKFile.PSKFace f = psk.psk.faces[i];
                r.v0 = (Int16)f.v0;
                r.v1 = (Int16)f.v1;
                r.v2 = (Int16)f.v2;
                r.mat = f.material;
                Mesh.RawTris.RawTriangles.Add(r);
                if (WithIndex)
                {
                    Mesh.IdxBuf.Indexes.Add((UInt16)f.v0);
                    Mesh.IdxBuf.Indexes.Add((UInt16)f.v1);
                    Mesh.IdxBuf.Indexes.Add((UInt16)f.v2);
                    Mesh.IdxBuf.count = Mesh.IdxBuf.Indexes.Count();
                }               
            }
            CalcTangentSpace();
#endregion
            RecalculateBoundings();
            GenerateMesh();

        }
Exemplo n.º 7
0
 public void ReadUVSets(int off)
 {
     offUV = off;
     int size = BitConverter.ToInt32(memory, off);
     int count = BitConverter.ToInt32(memory, off + 4);
     int subc = size / 4;
     int pos = off + 8;
     if (count > Vertices.Count)
     {
         currpos = pos;
         return;
     }
     for (int i = 0; i < count; i++)
     {
         UVSet uv = new UVSet();
         uv.U = new float[subc];
         uv.V = new float[subc];
         uv.raw = new byte[subc * 4];
         for (int j = 0; j < subc; j++)
         {
             uv.U[j] = getFloat16(pos);
             uv.V[j] = getFloat16(pos + 2);
             for (int k = 0; k < 4; k++)
                 uv.raw[j * 4 + k] = memory[pos + k];
             pos += 4;
         }
         UVSets.Add(uv);
     }
     currpos = pos;
 }
Exemplo n.º 8
0
        public void ReadEdges(byte[] memory)
        {
            UnknownList edges = new UnknownList(); 
            Edges e = new Edges();
            edges.size = BitConverter.ToInt32(memory, readerpos);
            edges.count = BitConverter.ToInt32(memory, readerpos + 4);
            e.size = edges.size;
            e.count = edges.count;
            readerpos += 8;
            int len = edges.size * edges.count;
            edges.data = new byte[len];
            int datacounter = 0;
            e.UVSet = new List<UVSet>();
            for (int i = 0; i < edges.count; i++)
            {
                UVSet uv = new UVSet();
                uv.UVs = new List<Vector2>();
                uv.x1 = memory[readerpos];
                uv.y1 = memory[readerpos + 1];
                uv.z1 = memory[readerpos + 2];
                uv.w1 = memory[readerpos + 3];
                uv.x2 = memory[readerpos + 4];
                uv.y2 = memory[readerpos + 5];
                uv.z2 = memory[readerpos + 6];
                uv.w2 = memory[readerpos + 7];
                readerpos += 8;

                for (int row = 0; row < (edges.size - 8) / 4; row++)
                {
                    float u = DXHelper.HalfToFloat(BitConverter.ToUInt16(memory, readerpos));
                    float v = DXHelper.HalfToFloat(BitConverter.ToUInt16(memory, readerpos + 2));
                    uv.UVs.Add(new Vector2(u, v));
                    edges.data[datacounter] = memory[readerpos];
                    readerpos += 4;
                    datacounter += 1;
                }
                e.UVSet.Add(uv);
            }
            Mesh.Edges = e;
        }
        void OnGUI()
        {
            if (uvPreviewMaterial == null || simpleMaterial == null)
            {
                if (!LoadMaterials())
                {
                    return;
                }
            }

            for (int i = 0; i < inspectedObjects.Count; i++)
            {
                if (inspectedObjects[i].obj == null)
                {
                    inspectedObjects.RemoveAt(i);
                    i = 0;
                }
            }

            scroolPosition = EditorGUILayout.BeginScrollView(scroolPosition);

            EditorGUILayout.BeginVertical();

            Rect logoRect = EditorGUILayout.GetControlRect(GUILayout.Height(56));

            if (Event.current.type == EventType.Repaint)
            {
                Styles.logoFont.Draw(logoRect, "nTools|UVInspector", false, false, false, false);
            }



            // info box
            if (inspectedObjects.Count == 0)
            {
                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                EditorGUILayout.LabelField("Select object with mesh.");
                EditorGUILayout.EndVertical();
            }
            else if (inspectedObjects.Count == 1)
            {
                StringBuilder   sb  = new StringBuilder();
                InspectedObject obj = inspectedObjects[0];

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                EditorGUILayout.LabelField("Object: " + obj.obj.name + ", Mesh: " + obj.mesh.name);

                sb.AppendFormat("Submeshes: {0}", obj.subMeshCount);
                sb.AppendFormat(", Triangles: {0}", obj.triangleCount);
                sb.AppendFormat(", Vertices: {0}", obj.vertexCount);
                if (obj.hasColors)
                {
                    sb.Append(", Colors");
                }
                if (obj.hasUV[0])
                {
                    sb.Append(", UV1");
                }
                if (obj.hasUV[1])
                {
                    sb.Append(", UV2");
                }
                if (obj.hasUV[2])
                {
                    sb.Append(", UV3");
                }
                if (obj.hasUV[3])
                {
                    sb.Append(", UV4");
                }

                EditorGUILayout.LabelField(sb.ToString());
                EditorGUILayout.EndVertical();
            }
            else
            {
                StringBuilder sb = new StringBuilder();

                for (int i = 0; i < inspectedObjects.Count; i++)
                {
                    sb.Append(inspectedObjects[i].obj.name + "(" + inspectedObjects[i].mesh.name + "), ");
                }

                EditorGUILayout.BeginVertical(EditorStyles.helpBox);
                EditorGUILayout.LabelField("Multiple objects:");
                EditorGUILayout.LabelField(sb.ToString(), EditorStyles.wordWrappedMiniLabel);
                EditorGUILayout.EndVertical();
            }



            // UI Window
            float previewWindowHeight = Mathf.Min(EditorGUIUtility.currentViewWidth, this.position.height * 0.75f);
            Rect  previewWindowRect   = EditorGUILayout.GetControlRect(GUILayout.Height(previewWindowHeight));

            UVPreviewWindow(previewWindowRect);



            if (inspectedObjects.Count == 1 && !inspectedObjects[0].hasUV[(int)previewUVSet])
            {
                EditorGUI.LabelField(previewWindowRect, "Unassigned UV Channel", Styles.hudFont);
            }



            // Toolbar buttons
            EditorGUILayout.BeginHorizontal();

            showGrid           = GUILayout.Toggle(showGrid, "Grid", EditorStyles.toolbarButton);
            showVertexColors   = GUILayout.Toggle(showVertexColors, "Vertex Colors", EditorStyles.toolbarButton);
            tilePreviewTexture = GUILayout.Toggle(tilePreviewTexture, "Texture Tiles", EditorStyles.toolbarButton);
            GUI.enabled        = IsCanFrameSelected();

            if (GUILayout.Toggle(false, "Frame View", EditorStyles.toolbarButton, GUILayout.MaxWidth(80)))
            {
                FrameSelected();
            }
            GUI.enabled = true;


            if (GUILayout.Toggle(false, "Reset View", EditorStyles.toolbarButton, GUILayout.MaxWidth(80)))
            {
                previewWindowPosition = new Vector2(-0.5f, -0.5f);

                float aspect = Mathf.Min(viewportSize.x, viewportSize.y) / Mathf.Max(viewportSize.x, viewportSize.y, 1);
                previewWindowScale = 1.8f * aspect;
            }

            EditorGUILayout.EndHorizontal();



            if (previewFoldout = nGUI.Foldout(previewFoldout, "Preview"))
            {
                ++EditorGUI.indentLevel;

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PrefixLabel("UV Channel");
                previewUVSet = (UVSet)GUILayout.Toolbar((int)previewUVSet, Styles.uvSetNames, GUILayout.MaxWidth(160), GUILayout.Height(20));
                EditorGUILayout.EndHorizontal();

                EditorGUILayout.BeginHorizontal();
                EditorGUILayout.PrefixLabel("Sub Mesh");
                if (inspectedObjects.Count == 1)
                {
                    SubMeshToolbar(inspectedObjects[0].mesh.subMeshCount);
                }
                else
                {
                    GUI.enabled = false;
                    GUI.Button(EditorGUILayout.GetControlRect(GUILayout.MaxWidth(160), GUILayout.Height(20)), inspectedObjects.Count > 1 ? "<Multyply Objects>" : "---");
                    GUI.enabled = true;
                }
                EditorGUILayout.EndHorizontal();



                previewTextureSource = (PreviewTextureSource)EditorGUILayout.EnumPopup("Preview Texture", previewTextureSource);

                ++EditorGUI.indentLevel;
                if (previewTextureSource == PreviewTextureSource.Custom)
                {
                    previewTextureTintColor = EditorGUILayout.ColorField("Image Tint", previewTextureTintColor);

                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.PrefixLabel("Color Channel");
                    previewTextureChannels = (ColorChannels)GUILayout.Toolbar((int)previewTextureChannels, Styles.colorChannelsNames, GUILayout.MaxWidth(160), GUILayout.Height(20));
                    EditorGUILayout.EndHorizontal();

                    customPreviewTexture = (Texture2D)EditorGUILayout.ObjectField("Image", customPreviewTexture, typeof(Texture2D), false);
                }
                else if (previewTextureSource == PreviewTextureSource.FromMaterial)
                {
                    PreviewTextureGUI();
                    previewTextureTintColor = EditorGUILayout.ColorField("Image Tint", previewTextureTintColor);
                    EditorGUILayout.BeginHorizontal();
                    EditorGUILayout.PrefixLabel("Color Channel");
                    previewTextureChannels = (ColorChannels)GUILayout.Toolbar((int)previewTextureChannels, Styles.colorChannelsNames, GUILayout.MaxWidth(160), GUILayout.Height(20));
                    EditorGUILayout.EndHorizontal();
                }
                --EditorGUI.indentLevel;

                --EditorGUI.indentLevel;
            }



            EditorGUILayout.EndVertical();

            EditorGUILayout.EndScrollView();
        }