From 6f3b438d926f6806c7ce40fa197423019f963f16 Mon Sep 17 00:00:00 2001 From: Perfare Date: Tue, 4 Apr 2017 05:49:26 +0800 Subject: [PATCH] Fixed read struct --- Unity Studio/Unity Classes/Shader.cs | 2 +- .../Unity Studio Classes/AssetPreloadData.cs | 62 ++++++++----------- .../Unity Studio Classes/AssetsFile.cs | 11 ++-- .../Unity Studio Classes/ClassIDReference.cs | 1 + Unity Studio/UnityStudioForm.cs | 7 +-- 5 files changed, 37 insertions(+), 46 deletions(-) diff --git a/Unity Studio/Unity Classes/Shader.cs b/Unity Studio/Unity Classes/Shader.cs index 0be1b5a..21c40e5 100644 --- a/Unity Studio/Unity Classes/Shader.cs +++ b/Unity Studio/Unity Classes/Shader.cs @@ -27,7 +27,7 @@ namespace Unity_Studio { if (readSwitch) { - m_Script = Encoding.UTF8.GetBytes("Serialized Shader can't be read"); + m_Script = Encoding.UTF8.GetBytes(preloadData.ViewStruct()); } else { diff --git a/Unity Studio/Unity Studio Classes/AssetPreloadData.cs b/Unity Studio/Unity Studio Classes/AssetPreloadData.cs index 8d5cf06..8fb172e 100644 --- a/Unity Studio/Unity Studio Classes/AssetPreloadData.cs +++ b/Unity Studio/Unity Studio Classes/AssetPreloadData.cs @@ -36,7 +36,6 @@ namespace Unity_Studio return null; } - //TODO 1,2长度类型对齐问题 private static void Read(StringBuilder sb, List members, EndianStream a_Stream) { for (int i = 0; i < members.Count; i++) @@ -45,80 +44,65 @@ namespace Unity_Studio var level = member.Level; var varTypeStr = member.Type; var varNameStr = member.Name; + object value = null; + var align = (member.Flag & 0x4000) != 0; + var append = true; if (varTypeStr == "SInt8")//sbyte { - var value = a_Stream.ReadSByte(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadSByte(); } else if (varTypeStr == "UInt8")//byte { - var value = a_Stream.ReadByte(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadByte(); } else if (varTypeStr == "short" || varTypeStr == "SInt16")//Int16 { - var value = a_Stream.ReadInt16(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadInt16(); } else if (varTypeStr == "UInt16" || varTypeStr == "unsigned short")//UInt16 { - var value = a_Stream.ReadUInt16(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadUInt16(); } else if (varTypeStr == "int" || varTypeStr == "SInt32")//Int32 { - var value = a_Stream.ReadInt32(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadInt32(); } else if (varTypeStr == "UInt32" || varTypeStr == "unsigned int")//UInt32 { - var value = a_Stream.ReadUInt32(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadUInt32(); } else if (varTypeStr == "long long" || varTypeStr == "SInt64")//Int64 { - var value = a_Stream.ReadInt64(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadInt64(); } else if (varTypeStr == "UInt64" || varTypeStr == "unsigned long long")//UInt64 { - var value = a_Stream.ReadUInt64(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadUInt64(); } else if (varTypeStr == "float")//float { - var value = a_Stream.ReadSingle(); - sb.AppendFormat("{0}{1} {2} = {3:f}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadSingle(); } else if (varTypeStr == "double")//double { - var value = a_Stream.ReadDouble(); - sb.AppendFormat("{0}{1} {2} = {3:f4}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadDouble(); } else if (varTypeStr == "bool")//bool { - var value = a_Stream.ReadBoolean(); - sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); - a_Stream.AlignStream(4); + value = a_Stream.ReadBoolean(); } else if (varTypeStr == "string")//string { - var value = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); - sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); + append = false; + var str = a_Stream.ReadAlignedString(a_Stream.ReadInt32()); + sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str); i += 3;//skip } else if (varTypeStr == "Array")//Array { + append = false; + if ((members[i - 1].Flag & 0x4000) != 0) + align = true; sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); var size = a_Stream.ReadInt32(); sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size); @@ -132,8 +116,14 @@ namespace Unity_Studio } else { + append = false; + align = false; sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr); } + if (append) + sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); + if (align) + a_Stream.AlignStream(4); } } diff --git a/Unity Studio/Unity Studio Classes/AssetsFile.cs b/Unity Studio/Unity Studio Classes/AssetsFile.cs index 10400d0..e3c238a 100644 --- a/Unity Studio/Unity Studio Classes/AssetsFile.cs +++ b/Unity Studio/Unity Studio Classes/AssetsFile.cs @@ -365,8 +365,7 @@ namespace Unity_Studio int index = a_Stream.ReadInt32(); int isArray = a_Stream.ReadInt32(); int num0 = a_Stream.ReadInt32(); - int num1 = a_Stream.ReadInt16(); - int num2 = a_Stream.ReadInt16(); + int flag = a_Stream.ReadInt32(); int childrenCount = a_Stream.ReadInt32(); //Debug.WriteLine(baseFormat + " " + baseName + " " + childrenCount); @@ -375,7 +374,8 @@ namespace Unity_Studio Level = level - 1, Type = varType, Name = varName, - Size = size + Size = size, + Flag = flag }); for (int i = 0; i < childrenCount; i++) { readBase(cb, level + 1); } } @@ -452,7 +452,7 @@ namespace Unity_Studio int size = a_Stream.ReadInt32(); int index = a_Stream.ReadInt32(); - int num1 = a_Stream.ReadInt32(); + int flag = a_Stream.ReadInt32(); if (index == 0) { className = varTypeStr + " " + varNameStr; } else @@ -462,7 +462,8 @@ namespace Unity_Studio Level = level - 1, Type = varTypeStr, Name = varNameStr, - Size = size + Size = size, + Flag = flag }); } diff --git a/Unity Studio/Unity Studio Classes/ClassIDReference.cs b/Unity Studio/Unity Studio Classes/ClassIDReference.cs index 019a1a0..82f82bc 100644 --- a/Unity Studio/Unity Studio Classes/ClassIDReference.cs +++ b/Unity Studio/Unity Studio Classes/ClassIDReference.cs @@ -31,6 +31,7 @@ namespace Unity_Studio public string Type; public string Name; public int Size; + public int Flag; } public static class ClassIDReference diff --git a/Unity Studio/UnityStudioForm.cs b/Unity Studio/UnityStudioForm.cs index 1872b11..2ffe3fd 100644 --- a/Unity Studio/UnityStudioForm.cs +++ b/Unity Studio/UnityStudioForm.cs @@ -13,7 +13,6 @@ using System.Diagnostics; using System.Drawing.Text; using OpenTK; using OpenTK.Graphics.OpenGL; -using ManagedFbx; using static Unity_Studio.UnityStudio; namespace Unity_Studio @@ -1062,14 +1061,14 @@ namespace Unity_Studio default: { - /*string str; + string str; if ((str = asset.ViewStruct()) != null) { textPreviewBox.Text = str; textPreviewBox.Visible = true; } - else*/ - StatusStripUpdate("Only supported export the raw file."); + else + StatusStripUpdate("Only supported export the raw file."); break; } }