mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-06-03 00:58:13 -04:00
split code
This commit is contained in:
parent
71c633b506
commit
3e2d0935b8
@ -163,7 +163,9 @@
|
||||
<Compile Include="StudioClasses\BinaryReaderExtensions.cs" />
|
||||
<Compile Include="StudioClasses\BinaryWriterExtensions.cs" />
|
||||
<Compile Include="StudioClasses\BundleFile.cs" />
|
||||
<Compile Include="StudioClasses\ClassMember.cs" />
|
||||
<Compile Include="StudioClasses\ClassStruct.cs" />
|
||||
<Compile Include="StudioClasses\ClassStructHelper.cs" />
|
||||
<Compile Include="StudioClasses\FBXExporter.cs" />
|
||||
<Compile Include="StudioClasses\BuildTarget.cs" />
|
||||
<Compile Include="StudioClasses\ModelConverter.cs" />
|
||||
|
@ -150,6 +150,8 @@
|
||||
<Compile Include="StudioClasses\BinaryWriterExtensions.cs" />
|
||||
<Compile Include="StudioClasses\BuildTarget.cs" />
|
||||
<Compile Include="StudioClasses\ClassIDReference.cs" />
|
||||
<Compile Include="StudioClasses\ClassMember.cs" />
|
||||
<Compile Include="StudioClasses\ClassStructHelper.cs" />
|
||||
<Compile Include="StudioClasses\ShaderResource.Designer.cs">
|
||||
<AutoGen>True</AutoGen>
|
||||
<DesignTime>True</DesignTime>
|
||||
|
@ -1013,7 +1013,7 @@ namespace AssetStudio
|
||||
}
|
||||
default:
|
||||
{
|
||||
var str = asset.ViewStruct();
|
||||
var str = asset.Deserialize();
|
||||
if (str != null)
|
||||
{
|
||||
textPreviewBox.Text = str;
|
||||
|
@ -21,7 +21,7 @@ namespace AssetStudio
|
||||
var m_Name = reader.ReadAlignedString();
|
||||
if (readSwitch)
|
||||
{
|
||||
if ((serializedText = preloadData.ViewStruct()) == null)
|
||||
if ((serializedText = preloadData.Deserialize()) == null)
|
||||
{
|
||||
var str = "PPtr<GameObject> m_GameObject\r\n";
|
||||
str += "\tint m_FileID = " + m_GameObject.m_FileID + "\r\n";
|
||||
|
@ -27,7 +27,7 @@ namespace AssetStudio
|
||||
var str = (string)ShaderResource.ResourceManager.GetObject($"Shader{sourceFile.version[0]}{sourceFile.version[1]}");
|
||||
if (str == null)
|
||||
{
|
||||
str = preloadData.ViewStruct();
|
||||
str = preloadData.Deserialize();
|
||||
if (str == null)
|
||||
m_Script = Encoding.UTF8.GetBytes("Serialized Shader can't be read");
|
||||
else
|
||||
@ -38,9 +38,8 @@ namespace AssetStudio
|
||||
reader.Position = preloadData.Offset;
|
||||
var sb = new StringBuilder();
|
||||
var members = new JavaScriptSerializer().Deserialize<List<ClassMember>>(str);
|
||||
ClassStructHelper.ReadClass(sb, members, reader);
|
||||
ClassStructHelper.ReadClassString(sb, members, reader);
|
||||
m_Script = Encoding.UTF8.GetBytes(sb.ToString());
|
||||
//m_Script = ReadSerializedShader(members, a_Stream);
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@ -30,5 +30,17 @@ namespace AssetStudio
|
||||
reader.Position = Offset;
|
||||
return reader;
|
||||
}
|
||||
|
||||
public string Deserialize()
|
||||
{
|
||||
var reader = InitReader();
|
||||
if (sourceFile.ClassStructures.TryGetValue(Type1, out var classStructure))
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
ClassStructHelper.ReadClassString(sb, classStructure.members, reader);
|
||||
return sb.ToString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
16
AssetStudio/StudioClasses/ClassMember.cs
Normal file
16
AssetStudio/StudioClasses/ClassMember.cs
Normal file
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace AssetStudio
|
||||
{
|
||||
public class ClassMember
|
||||
{
|
||||
public int Level;
|
||||
public string Type;
|
||||
public string Name;
|
||||
public int Size;
|
||||
public int Flag;
|
||||
}
|
||||
}
|
@ -6,15 +6,6 @@ using System.Windows.Forms;
|
||||
|
||||
namespace AssetStudio
|
||||
{
|
||||
public class ClassMember
|
||||
{
|
||||
public int Level;
|
||||
public string Type;
|
||||
public string Name;
|
||||
public int Size;
|
||||
public int Flag;
|
||||
}
|
||||
|
||||
public class ClassStruct : ListViewItem
|
||||
{
|
||||
public int ID;
|
||||
@ -30,177 +21,4 @@ namespace AssetStudio
|
||||
return sb.ToString();
|
||||
}
|
||||
}
|
||||
|
||||
public static class ClassStructHelper
|
||||
{
|
||||
public static string ViewStruct(this AssetPreloadData asset)
|
||||
{
|
||||
var reader = asset.InitReader();
|
||||
if (asset.sourceFile.ClassStructures.TryGetValue(asset.Type1, out var classStructure))
|
||||
{
|
||||
var sb = new StringBuilder();
|
||||
ReadClass(sb, classStructure.members, reader);
|
||||
return sb.ToString();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
public static void ReadClass(StringBuilder sb, List<ClassMember> members, EndianBinaryReader reader)
|
||||
{
|
||||
for (int i = 0; i < members.Count; i++)
|
||||
{
|
||||
ReadValue(sb, members, reader, ref i);
|
||||
}
|
||||
}
|
||||
|
||||
public static void ReadValue(StringBuilder sb, List<ClassMember> members, EndianBinaryReader reader, ref int i)
|
||||
{
|
||||
var member = members[i];
|
||||
var level = member.Level;
|
||||
var varTypeStr = member.Type;
|
||||
var varNameStr = member.Name;
|
||||
object value = null;
|
||||
var append = true;
|
||||
var align = (member.Flag & 0x4000) != 0;
|
||||
switch (varTypeStr)
|
||||
{
|
||||
case "SInt8":
|
||||
value = reader.ReadSByte();
|
||||
break;
|
||||
case "UInt8":
|
||||
value = reader.ReadByte();
|
||||
break;
|
||||
case "short":
|
||||
case "SInt16":
|
||||
value = reader.ReadInt16();
|
||||
break;
|
||||
case "UInt16":
|
||||
case "unsigned short":
|
||||
value = reader.ReadUInt16();
|
||||
break;
|
||||
case "int":
|
||||
case "SInt32":
|
||||
value = reader.ReadInt32();
|
||||
break;
|
||||
case "UInt32":
|
||||
case "unsigned int":
|
||||
case "Type*":
|
||||
value = reader.ReadUInt32();
|
||||
break;
|
||||
case "long long":
|
||||
case "SInt64":
|
||||
value = reader.ReadInt64();
|
||||
break;
|
||||
case "UInt64":
|
||||
case "unsigned long long":
|
||||
value = reader.ReadUInt64();
|
||||
break;
|
||||
case "float":
|
||||
value = reader.ReadSingle();
|
||||
break;
|
||||
case "double":
|
||||
value = reader.ReadDouble();
|
||||
break;
|
||||
case "bool":
|
||||
value = reader.ReadBoolean();
|
||||
break;
|
||||
case "string":
|
||||
append = false;
|
||||
var str = reader.ReadAlignedString();
|
||||
sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str);
|
||||
i += 3;//skip
|
||||
break;
|
||||
case "vector":
|
||||
{
|
||||
if ((members[i + 1].Flag & 0x4000) != 0)
|
||||
align = true;
|
||||
append = false;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
||||
var size = reader.ReadInt32();
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
||||
var vector = GetMembers(members, level, i);
|
||||
i += vector.Count - 1;
|
||||
vector.RemoveRange(0, 3);
|
||||
for (int j = 0; j < size; j++)
|
||||
{
|
||||
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 2)), j);
|
||||
int tmp = 0;
|
||||
ReadValue(sb, vector, reader, ref tmp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "map":
|
||||
{
|
||||
if ((members[i + 1].Flag & 0x4000) != 0)
|
||||
align = true;
|
||||
append = false;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
||||
var size = reader.ReadInt32();
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
||||
var map = GetMembers(members, level, i);
|
||||
i += map.Count - 1;
|
||||
map.RemoveRange(0, 4);
|
||||
var first = GetMembers(map, map[0].Level, 0);
|
||||
map.RemoveRange(0, first.Count);
|
||||
var second = map;
|
||||
for (int j = 0; j < size; j++)
|
||||
{
|
||||
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 2)), j);
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 2)), "pair", "data");
|
||||
int tmp1 = 0;
|
||||
int tmp2 = 0;
|
||||
ReadValue(sb, first, reader, ref tmp1);
|
||||
ReadValue(sb, second, reader, ref tmp2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "TypelessData":
|
||||
{
|
||||
append = false;
|
||||
var size = reader.ReadInt32();
|
||||
reader.ReadBytes(size);
|
||||
i += 2;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
append = false;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
var @class = GetMembers(members, level, i);
|
||||
@class.RemoveAt(0);
|
||||
i += @class.Count;
|
||||
for (int j = 0; j < @class.Count; j++)
|
||||
{
|
||||
ReadValue(sb, @class, reader, ref j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (append)
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
|
||||
if (align)
|
||||
reader.AlignStream(4);
|
||||
}
|
||||
|
||||
public static List<ClassMember> GetMembers(List<ClassMember> members, int level, int index)
|
||||
{
|
||||
var member2 = new List<ClassMember>();
|
||||
member2.Add(members[0]);
|
||||
for (int i = index + 1; i < members.Count; i++)
|
||||
{
|
||||
var member = members[i];
|
||||
var level2 = member.Level;
|
||||
if (level2 <= level)
|
||||
{
|
||||
return member2;
|
||||
}
|
||||
member2.Add(member);
|
||||
}
|
||||
return member2;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
169
AssetStudio/StudioClasses/ClassStructHelper.cs
Normal file
169
AssetStudio/StudioClasses/ClassStructHelper.cs
Normal file
@ -0,0 +1,169 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Dynamic;
|
||||
using System.Linq;
|
||||
using System.Text;
|
||||
|
||||
namespace AssetStudio
|
||||
{
|
||||
public static class ClassStructHelper
|
||||
{
|
||||
public static void ReadClassString(StringBuilder sb, List<ClassMember> members, EndianBinaryReader reader)
|
||||
{
|
||||
for (int i = 0; i < members.Count; i++)
|
||||
{
|
||||
ReadStringValue(sb, members, reader, ref i);
|
||||
}
|
||||
}
|
||||
|
||||
private static void ReadStringValue(StringBuilder sb, List<ClassMember> members, EndianBinaryReader reader, ref int i)
|
||||
{
|
||||
var member = members[i];
|
||||
var level = member.Level;
|
||||
var varTypeStr = member.Type;
|
||||
var varNameStr = member.Name;
|
||||
object value = null;
|
||||
var append = true;
|
||||
var align = (member.Flag & 0x4000) != 0;
|
||||
switch (varTypeStr)
|
||||
{
|
||||
case "SInt8":
|
||||
value = reader.ReadSByte();
|
||||
break;
|
||||
case "UInt8":
|
||||
value = reader.ReadByte();
|
||||
break;
|
||||
case "short":
|
||||
case "SInt16":
|
||||
value = reader.ReadInt16();
|
||||
break;
|
||||
case "UInt16":
|
||||
case "unsigned short":
|
||||
value = reader.ReadUInt16();
|
||||
break;
|
||||
case "int":
|
||||
case "SInt32":
|
||||
value = reader.ReadInt32();
|
||||
break;
|
||||
case "UInt32":
|
||||
case "unsigned int":
|
||||
case "Type*":
|
||||
value = reader.ReadUInt32();
|
||||
break;
|
||||
case "long long":
|
||||
case "SInt64":
|
||||
value = reader.ReadInt64();
|
||||
break;
|
||||
case "UInt64":
|
||||
case "unsigned long long":
|
||||
value = reader.ReadUInt64();
|
||||
break;
|
||||
case "float":
|
||||
value = reader.ReadSingle();
|
||||
break;
|
||||
case "double":
|
||||
value = reader.ReadDouble();
|
||||
break;
|
||||
case "bool":
|
||||
value = reader.ReadBoolean();
|
||||
break;
|
||||
case "string":
|
||||
append = false;
|
||||
var str = reader.ReadAlignedString();
|
||||
sb.AppendFormat("{0}{1} {2} = \"{3}\"\r\n", (new string('\t', level)), varTypeStr, varNameStr, str);
|
||||
i += 3;//skip
|
||||
break;
|
||||
case "vector":
|
||||
{
|
||||
if ((members[i + 1].Flag & 0x4000) != 0)
|
||||
align = true;
|
||||
append = false;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
||||
var size = reader.ReadInt32();
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
||||
var vector = GetMembers(members, level, i);
|
||||
i += vector.Count - 1;
|
||||
vector.RemoveRange(0, 3);
|
||||
for (int j = 0; j < size; j++)
|
||||
{
|
||||
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 2)), j);
|
||||
int tmp = 0;
|
||||
ReadStringValue(sb, vector, reader, ref tmp);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "map":
|
||||
{
|
||||
if ((members[i + 1].Flag & 0x4000) != 0)
|
||||
align = true;
|
||||
append = false;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 1)), "Array", "Array");
|
||||
var size = reader.ReadInt32();
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level + 1)), "int", "size", size);
|
||||
var map = GetMembers(members, level, i);
|
||||
i += map.Count - 1;
|
||||
map.RemoveRange(0, 4);
|
||||
var first = GetMembers(map, map[0].Level, 0);
|
||||
map.RemoveRange(0, first.Count);
|
||||
var second = map;
|
||||
for (int j = 0; j < size; j++)
|
||||
{
|
||||
sb.AppendFormat("{0}[{1}]\r\n", (new string('\t', level + 2)), j);
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level + 2)), "pair", "data");
|
||||
int tmp1 = 0;
|
||||
int tmp2 = 0;
|
||||
ReadStringValue(sb, first, reader, ref tmp1);
|
||||
ReadStringValue(sb, second, reader, ref tmp2);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case "TypelessData":
|
||||
{
|
||||
append = false;
|
||||
var size = reader.ReadInt32();
|
||||
reader.ReadBytes(size);
|
||||
i += 2;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), "int", "size", size);
|
||||
break;
|
||||
}
|
||||
default:
|
||||
{
|
||||
append = false;
|
||||
sb.AppendFormat("{0}{1} {2}\r\n", (new string('\t', level)), varTypeStr, varNameStr);
|
||||
var @class = GetMembers(members, level, i);
|
||||
@class.RemoveAt(0);
|
||||
i += @class.Count;
|
||||
for (int j = 0; j < @class.Count; j++)
|
||||
{
|
||||
ReadStringValue(sb, @class, reader, ref j);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (append)
|
||||
sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value);
|
||||
if (align)
|
||||
reader.AlignStream(4);
|
||||
}
|
||||
|
||||
public static List<ClassMember> GetMembers(List<ClassMember> members, int level, int index)
|
||||
{
|
||||
var member2 = new List<ClassMember>();
|
||||
member2.Add(members[0]);
|
||||
for (int i = index + 1; i < members.Count; i++)
|
||||
{
|
||||
var member = members[i];
|
||||
var level2 = member.Level;
|
||||
if (level2 <= level)
|
||||
{
|
||||
return member2;
|
||||
}
|
||||
member2.Add(member);
|
||||
}
|
||||
return member2;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user