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; }
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(); }
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; }
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; }
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(); }
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; }
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(); }