diff --git a/AssetStudio/AssetStudio.csproj b/AssetStudio/AssetStudio.csproj index 4ba2be2..6c4d56c 100644 --- a/AssetStudio/AssetStudio.csproj +++ b/AssetStudio/AssetStudio.csproj @@ -171,10 +171,16 @@ + + + + + + Code @@ -189,7 +195,7 @@ - + @@ -226,7 +232,6 @@ - diff --git a/AssetStudio/AssetStudioForm.cs b/AssetStudio/AssetStudioForm.cs index b3f99d3..91ffd65 100644 --- a/AssetStudio/AssetStudioForm.cs +++ b/AssetStudio/AssetStudioForm.cs @@ -1783,7 +1783,7 @@ namespace AssetStudio resourceFileReader.Value.Dispose(); } resourceFileReaders.Clear(); - sharedFileIndex.Clear(); + assetsFileIndexCache.Clear(); productName = ""; sceneTreeView.Nodes.Clear(); diff --git a/AssetStudio/StudioClasses/AssetsFile.cs b/AssetStudio/StudioClasses/AssetsFile.cs index 1014dca..6c8d546 100644 --- a/AssetStudio/StudioClasses/AssetsFile.cs +++ b/AssetStudio/StudioClasses/AssetsFile.cs @@ -2,163 +2,37 @@ using System.Collections.Generic; using System.IO; using System.Linq; -using System.Text; using System.Text.RegularExpressions; -using System.Windows.Forms; namespace AssetStudio { - public class SerializedFileHeader - { - public uint m_MetadataSize; - public uint m_FileSize; - public uint m_Version; - public uint m_DataOffset; - public byte m_Endianess; - public byte[] m_Reserved; - } - public class AssetsFile { public EndianBinaryReader reader; - public SerializedFileHeader header; - private EndianType m_FileEndianess; - public string unityVersion = "2.5.0f5"; - public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform; - private bool serializedTypeTrees; - public SortedDictionary> m_Type = new SortedDictionary>(); - private List classIDs = new List();//use for 5.5.0 - public string filePath; public string parentPath; public string fileName; public string upperFileName; public int[] version = { 0, 0, 0, 0 }; public string[] buildType; - public string platformStr = ""; - + public string platformStr; + public bool valid; public Dictionary preloadTable = new Dictionary(); public Dictionary GameObjectList = new Dictionary(); public Dictionary TransformList = new Dictionary(); - public List exportableAssets = new List(); - public List sharedAssetsList = new List { new SharedAssets() }; - public bool valid; - - #region cmmon string - private static Dictionary baseStrings = new Dictionary - { - {0, "AABB"}, - {5, "AnimationClip"}, - {19, "AnimationCurve"}, - {34, "AnimationState"}, - {49, "Array"}, - {55, "Base"}, - {60, "BitField"}, - {69, "bitset"}, - {76, "bool"}, - {81, "char"}, - {86, "ColorRGBA"}, - {96, "Component"}, - {106, "data"}, - {111, "deque"}, - {117, "double"}, - {124, "dynamic_array"}, - {138, "FastPropertyName"}, - {155, "first"}, - {161, "float"}, - {167, "Font"}, - {172, "GameObject"}, - {183, "Generic Mono"}, - {196, "GradientNEW"}, - {208, "GUID"}, - {213, "GUIStyle"}, - {222, "int"}, - {226, "list"}, - {231, "long long"}, - {241, "map"}, - {245, "Matrix4x4f"}, - {256, "MdFour"}, - {263, "MonoBehaviour"}, - {277, "MonoScript"}, - {288, "m_ByteSize"}, - {299, "m_Curve"}, - {307, "m_EditorClassIdentifier"}, - {331, "m_EditorHideFlags"}, - {349, "m_Enabled"}, - {359, "m_ExtensionPtr"}, - {374, "m_GameObject"}, - {387, "m_Index"}, - {395, "m_IsArray"}, - {405, "m_IsStatic"}, - {416, "m_MetaFlag"}, - {427, "m_Name"}, - {434, "m_ObjectHideFlags"}, - {452, "m_PrefabInternal"}, - {469, "m_PrefabParentObject"}, - {490, "m_Script"}, - {499, "m_StaticEditorFlags"}, - {519, "m_Type"}, - {526, "m_Version"}, - {536, "Object"}, - {543, "pair"}, - {548, "PPtr"}, - {564, "PPtr"}, - {581, "PPtr"}, - {596, "PPtr"}, - {616, "PPtr"}, - {633, "PPtr"}, - {646, "PPtr"}, - {659, "PPtr"}, - {672, "PPtr"}, - {688, "PPtr"}, - {702, "PPtr"}, - {718, "PPtr"}, - {734, "Prefab"}, - {741, "Quaternionf"}, - {753, "Rectf"}, - {759, "RectInt"}, - {767, "RectOffset"}, - {778, "second"}, - {785, "set"}, - {789, "short"}, - {795, "size"}, - {800, "SInt16"}, - {807, "SInt32"}, - {814, "SInt64"}, - {821, "SInt8"}, - {827, "staticvector"}, - {840, "string"}, - {847, "TextAsset"}, - {857, "TextMesh"}, - {866, "Texture"}, - {874, "Texture2D"}, - {884, "Transform"}, - {894, "TypelessData"}, - {907, "UInt16"}, - {914, "UInt32"}, - {921, "UInt64"}, - {928, "UInt8"}, - {934, "unsigned int"}, - {947, "unsigned long long"}, - {966, "unsigned short"}, - {981, "vector"}, - {988, "Vector2f"}, - {997, "Vector3f"}, - {1006, "Vector4f"}, - {1015, "m_ScriptingClassIdentifier"}, - {1042, "Gradient"}, - {1051, "Type*"} - }; - #endregion - - public class SharedAssets - { - public int Index = -2; //-2 - Prepare, -1 - Missing - public string aName = ""; - public string fileName = ""; - } + //class SerializedFile + public SerializedFileHeader header; + private EndianType m_FileEndianess; + public string unityVersion = "2.5.0f5"; + public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform; + private bool m_EnableTypeTree; + public SortedDictionary> m_Type = new SortedDictionary>(); + private List classIDs = new List(); + public Dictionary m_Objects; + private List m_ScriptTypes; + public List m_Externals; public AssetsFile(string fullName, EndianBinaryReader reader) { @@ -205,19 +79,19 @@ namespace AssetStudio } } platformStr = m_TargetPlatform.ToString(); - if (header.m_Version >= 14) + if (header.m_Version >= 13) { - serializedTypeTrees = reader.ReadBoolean(); + m_EnableTypeTree = reader.ReadBoolean(); } - // Read types + //Read types int typeCount = reader.ReadInt32(); for (int i = 0; i < typeCount; i++) { - if (header.m_Version < 14) + if (header.m_Version < 13) { int classID = reader.ReadInt32(); - var typeTreeList = new List(); + var typeTreeList = new List(); ReadTypeTree(typeTreeList, 0); m_Type.Add(classID, typeTreeList); } @@ -232,7 +106,7 @@ namespace AssetStudio var bigIDEnabled = reader.ReadInt32(); } - // Read Objects + //Read Objects int objectCount = reader.ReadInt32(); string assetIDfmt = "D" + objectCount.ToString().Length; //format for unique ID @@ -262,12 +136,9 @@ namespace AssetStudio asset.Type2 = reader.ReadUInt16(); reader.Position += 2; } - if (header.m_Version == 15) + if (header.m_Version == 15 || header.m_Version == 16) { - byte unknownByte = reader.ReadByte(); - //this is a single byte, not an int32 - //the next entry is aligned after this - //but not the last! + var stripped = reader.ReadByte(); } if (Enum.IsDefined(typeof(ClassIDReference), asset.Type2)) @@ -301,28 +172,36 @@ namespace AssetStudio #endregion } - if (header.m_Version >= 14) + if (header.m_Version >= 11) { - //this looks like a list of assets that need to be preloaded in memory before anytihng else - int someCount = reader.ReadInt32(); - for (int i = 0; i < someCount; i++) + int scriptCount = reader.ReadInt32(); + m_ScriptTypes = new List(scriptCount); + for (int i = 0; i < scriptCount; i++) { - int num1 = reader.ReadInt32(); - reader.AlignStream(4); - long m_PathID = reader.ReadInt64(); + var m_ScriptType = new LocalSerializedObjectIdentifier(); + m_ScriptType.localSerializedFileIndex = reader.ReadInt32(); + m_ScriptType.localIdentifierInFile = header.m_Version < 14 ? reader.ReadInt32() : reader.ReadInt64(); + m_ScriptTypes.Add(m_ScriptType); } } - sharedAssetsList[0].fileName = fileName; //reference itself because sharedFileIDs start from 1 - int sharedFileCount = reader.ReadInt32(); - for (int i = 0; i < sharedFileCount; i++) + int externalsCount = reader.ReadInt32(); + m_Externals = new List(externalsCount); + for (int i = 0; i < externalsCount; i++) { - var shared = new SharedAssets(); - shared.aName = reader.ReadStringToNull(); - reader.Position += 20; - var sharedFilePath = reader.ReadStringToNull(); //relative path - shared.fileName = Path.GetFileName(sharedFilePath); - sharedAssetsList.Add(shared); + var m_External = new FileIdentifier(); + if (header.m_Version >= 6) + { + var tempEmpty = reader.ReadStringToNull(); + } + if (header.m_Version >= 5) + { + m_External.guid = new Guid(reader.ReadBytes(16)); + m_External.type = reader.ReadInt32(); + } + m_External.pathName = reader.ReadStringToNull(); + m_External.fileName = Path.GetFileName(m_External.pathName); + m_Externals.Add(m_External); } buildType = Regex.Replace(unityVersion, @"\d", "").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries); @@ -343,11 +222,11 @@ namespace AssetStudio } } - private void ReadTypeTree(List typeTreeList, int depth) + private void ReadTypeTree(List typeTreeList, int depth) { - var typeTree = new TypeTree(); + var typeTree = new TypeTreeNode(); typeTreeList.Add(typeTree); - typeTree.m_Depth = depth; + typeTree.m_Level = depth; typeTree.m_Type = reader.ReadStringToNull(); typeTree.m_Name = reader.ReadStringToNull(); typeTree.m_ByteSize = reader.ReadInt32(); @@ -402,7 +281,7 @@ namespace AssetStudio } reader.Position += 16; - if (serializedTypeTrees) + if (m_EnableTypeTree) { int varCount = reader.ReadInt32(); int stringSize = reader.ReadInt32(); @@ -410,14 +289,14 @@ namespace AssetStudio reader.Position += varCount * 24; using (var stringReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringSize)))) { - var typeTreeList = new List(); + var typeTreeList = new List(); reader.Position -= varCount * 24 + stringSize; for (int i = 0; i < varCount; i++) { - var typeTree = new TypeTree(); + var typeTree = new TypeTreeNode(); typeTreeList.Add(typeTree); typeTree.m_Version = reader.ReadUInt16(); - typeTree.m_Depth = reader.ReadByte(); + typeTree.m_Level = reader.ReadByte(); typeTree.m_IsArray = reader.ReadBoolean() ? 1 : 0; ushort varTypeIndex = reader.ReadUInt16(); @@ -429,7 +308,7 @@ namespace AssetStudio } else //varType is an index in an internal strig array { - typeTree.m_Type = baseStrings.ContainsKey(varTypeIndex) ? baseStrings[varTypeIndex] : varTypeIndex.ToString(); + typeTree.m_Type = CommonString.StringBuffer.ContainsKey(varTypeIndex) ? CommonString.StringBuffer[varTypeIndex] : varTypeIndex.ToString(); } ushort varNameIndex = reader.ReadUInt16(); @@ -441,7 +320,7 @@ namespace AssetStudio } else { - typeTree.m_Name = baseStrings.ContainsKey(varNameIndex) ? baseStrings[varNameIndex] : varNameIndex.ToString(); + typeTree.m_Name = CommonString.StringBuffer.ContainsKey(varNameIndex) ? CommonString.StringBuffer[varNameIndex] : varNameIndex.ToString(); } typeTree.m_ByteSize = reader.ReadInt32(); @@ -453,5 +332,16 @@ namespace AssetStudio } } } + + public PPtr ReadPPtr() + { + var result = new PPtr + { + m_FileID = reader.ReadInt32(), + m_PathID = header.m_Version < 14 ? reader.ReadInt32() : reader.ReadInt64(), + assetsFile = this + }; + return result; + } } } diff --git a/AssetStudio/StudioClasses/CommonString.cs b/AssetStudio/StudioClasses/CommonString.cs new file mode 100644 index 0000000..feefe6d --- /dev/null +++ b/AssetStudio/StudioClasses/CommonString.cs @@ -0,0 +1,119 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public static class CommonString + { + public static readonly Dictionary StringBuffer = new Dictionary + { + {0, "AABB"}, + {5, "AnimationClip"}, + {19, "AnimationCurve"}, + {34, "AnimationState"}, + {49, "Array"}, + {55, "Base"}, + {60, "BitField"}, + {69, "bitset"}, + {76, "bool"}, + {81, "char"}, + {86, "ColorRGBA"}, + {96, "Component"}, + {106, "data"}, + {111, "deque"}, + {117, "double"}, + {124, "dynamic_array"}, + {138, "FastPropertyName"}, + {155, "first"}, + {161, "float"}, + {167, "Font"}, + {172, "GameObject"}, + {183, "Generic Mono"}, + {196, "GradientNEW"}, + {208, "GUID"}, + {213, "GUIStyle"}, + {222, "int"}, + {226, "list"}, + {231, "long long"}, + {241, "map"}, + {245, "Matrix4x4f"}, + {256, "MdFour"}, + {263, "MonoBehaviour"}, + {277, "MonoScript"}, + {288, "m_ByteSize"}, + {299, "m_Curve"}, + {307, "m_EditorClassIdentifier"}, + {331, "m_EditorHideFlags"}, + {349, "m_Enabled"}, + {359, "m_ExtensionPtr"}, + {374, "m_GameObject"}, + {387, "m_Index"}, + {395, "m_IsArray"}, + {405, "m_IsStatic"}, + {416, "m_MetaFlag"}, + {427, "m_Name"}, + {434, "m_ObjectHideFlags"}, + {452, "m_PrefabInternal"}, + {469, "m_PrefabParentObject"}, + {490, "m_Script"}, + {499, "m_StaticEditorFlags"}, + {519, "m_Type"}, + {526, "m_Version"}, + {536, "Object"}, + {543, "pair"}, + {548, "PPtr"}, + {564, "PPtr"}, + {581, "PPtr"}, + {596, "PPtr"}, + {616, "PPtr"}, + {633, "PPtr"}, + {646, "PPtr"}, + {659, "PPtr"}, + {672, "PPtr"}, + {688, "PPtr"}, + {702, "PPtr"}, + {718, "PPtr"}, + {734, "Prefab"}, + {741, "Quaternionf"}, + {753, "Rectf"}, + {759, "RectInt"}, + {767, "RectOffset"}, + {778, "second"}, + {785, "set"}, + {789, "short"}, + {795, "size"}, + {800, "SInt16"}, + {807, "SInt32"}, + {814, "SInt64"}, + {821, "SInt8"}, + {827, "staticvector"}, + {840, "string"}, + {847, "TextAsset"}, + {857, "TextMesh"}, + {866, "Texture"}, + {874, "Texture2D"}, + {884, "Transform"}, + {894, "TypelessData"}, + {907, "UInt16"}, + {914, "UInt32"}, + {921, "UInt64"}, + {928, "UInt8"}, + {934, "unsigned int"}, + {947, "unsigned long long"}, + {966, "unsigned short"}, + {981, "vector"}, + {988, "Vector2f"}, + {997, "Vector3f"}, + {1006, "Vector4f"}, + {1015, "m_ScriptingClassIdentifier"}, + {1042, "Gradient"}, + {1051, "Type*"}, + {1057, "int2_storage"}, + {1070, "int3_storage"}, + {1083, "BoundsInt"}, + {1092, "m_CorrespondingSourceObject"} + }; + } +} diff --git a/AssetStudio/StudioClasses/FBXExporter.cs b/AssetStudio/StudioClasses/FBXExporter.cs index 2ce1ffe..62277df 100644 --- a/AssetStudio/StudioClasses/FBXExporter.cs +++ b/AssetStudio/StudioClasses/FBXExporter.cs @@ -61,12 +61,12 @@ namespace AssetStudio { GameObjects.Add(m_GameObject); - if (assetsfileList.TryGetPD(m_GameObject.m_MeshFilter, out var MeshFilterPD)) + if (m_GameObject.m_MeshFilter != null && m_GameObject.m_MeshFilter.TryGetPD(out var MeshFilterPD)) { //MeshFilters are not unique! //MeshFilters.Add(MeshFilterPD); MeshFilter m_MeshFilter = new MeshFilter(MeshFilterPD); - if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out var MeshPD)) + if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD)) { Meshes.Add(MeshPD); @@ -78,13 +78,13 @@ namespace AssetStudio } #region get Renderer - if (assetsfileList.TryGetPD(m_GameObject.m_MeshRenderer, out var RendererPD)) + if (m_GameObject.m_MeshRenderer != null && m_GameObject.m_MeshRenderer.TryGetPD(out var RendererPD)) { MeshRenderer m_Renderer = new MeshRenderer(RendererPD); foreach (var MaterialPPtr in m_Renderer.m_Materials) { - if (assetsfileList.TryGetPD(MaterialPPtr, out var MaterialPD)) + if (MaterialPPtr.TryGetPD(out var MaterialPD)) { Materials.Add(MaterialPD); cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name); @@ -96,7 +96,7 @@ namespace AssetStudio #endregion #region get SkinnedMeshRenderer - if (assetsfileList.TryGetPD(m_GameObject.m_SkinnedMeshRenderer, out var SkinnedMeshPD)) + if (m_GameObject.m_SkinnedMeshRenderer != null && m_GameObject.m_SkinnedMeshRenderer.TryGetPD(out var SkinnedMeshPD)) { Skins.Add(SkinnedMeshPD); @@ -104,7 +104,7 @@ namespace AssetStudio foreach (var MaterialPPtr in m_SkinnedMeshRenderer.m_Materials) { - if (assetsfileList.TryGetPD(MaterialPPtr, out var MaterialPD)) + if (MaterialPPtr.TryGetPD(out var MaterialPD)) { Materials.Add(MaterialPD); cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name); @@ -119,9 +119,9 @@ namespace AssetStudio //collect skeleton dummies to make sure they are exported foreach (var bonePPtr in m_SkinnedMeshRenderer.m_Bones) { - if (assetsfileList.TryGetTransform(bonePPtr, out var b_Transform)) + if (bonePPtr.TryGetTransform(out var b_Transform)) { - if (assetsfileList.TryGetGameObject(b_Transform.m_GameObject, out var m_Bone)) + if (b_Transform.m_GameObject.TryGetGameObject(out var m_Bone)) { LimbNodes.Add(m_Bone); //also collect the root bone @@ -136,9 +136,9 @@ namespace AssetStudio #region collect children because m_SkinnedMeshRenderer.m_Bones doesn't contain terminations foreach (var ChildPPtr in b_Transform.m_Children) { - if (assetsfileList.TryGetTransform(ChildPPtr, out var ChildTR)) + if (ChildPPtr.TryGetTransform(out var ChildTR)) { - if (assetsfileList.TryGetGameObject(ChildTR.m_GameObject, out var m_Child)) + if (ChildTR.m_GameObject.TryGetGameObject(out var m_Child)) { //check that the Model doesn't contain a Mesh, although this won't ensure it's part of the skeleton if (m_Child.m_MeshFilter == null && m_Child.m_SkinnedMeshRenderer == null) @@ -225,7 +225,7 @@ namespace AssetStudio foreach (var m_TexEnv in m_Material.m_TexEnvs) { #region get Porsche material from json - if (!assetsfileList.TryGetPD(m_TexEnv.m_Texture, out var TexturePD) && jsonMats != null) + if (!m_TexEnv.m_Texture.TryGetPD(out var TexturePD) && jsonMats != null) { if (jsonMats.TryGetValue(m_Material.m_Name, out var matProp)) { @@ -430,7 +430,7 @@ namespace AssetStudio ob.Append("\n\t\t\tP: \"ScalingMax\", \"Vector3D\", \"Vector\", \"\",0,0,0"); ob.Append("\n\t\t\tP: \"DefaultAttributeIndex\", \"int\", \"Integer\", \"\",0"); - if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform)) + if (m_GameObject.m_Transform.TryGetTransform(out var m_Transform)) { float[] m_EulerRotation = QuatToEuler(new[] { m_Transform.m_LocalRotation[0], -m_Transform.m_LocalRotation[1], -m_Transform.m_LocalRotation[2], m_Transform.m_LocalRotation[3] }); @@ -485,7 +485,7 @@ namespace AssetStudio foreach (var SkinnedMeshPD in Skins) { SkinnedMeshRenderer m_SkinnedMeshRenderer = new SkinnedMeshRenderer(SkinnedMeshPD); - if (assetsfileList.TryGetGameObject(m_SkinnedMeshRenderer.m_GameObject, out var m_GameObject) && assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out var MeshPD)) + if (m_SkinnedMeshRenderer.m_GameObject.TryGetGameObject(out var m_GameObject) && m_SkinnedMeshRenderer.m_Mesh.TryGetPD(out var MeshPD)) { //generate unique Geometry ID for instanced mesh objects //instanced skinned geometry is possible in FBX, but all instances are linked to the same skeleton nodes @@ -537,9 +537,9 @@ namespace AssetStudio for (int b = 0; b < m_SkinnedMeshRenderer.m_Bones.Length; b++) { - if (assetsfileList.TryGetTransform(m_SkinnedMeshRenderer.m_Bones[b], out var m_Transform)) + if (m_SkinnedMeshRenderer.m_Bones[b].TryGetTransform(out var m_Transform)) { - if (assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out var m_Bone)) + if (m_Transform.m_GameObject.TryGetGameObject(out var m_Bone)) { int influences = 0, ibSplit = 0, wbSplit = 0; StringBuilder ib = new StringBuilder();//indices (vertex) diff --git a/AssetStudio/StudioClasses/FileIdentifier.cs b/AssetStudio/StudioClasses/FileIdentifier.cs new file mode 100644 index 0000000..8a76e77 --- /dev/null +++ b/AssetStudio/StudioClasses/FileIdentifier.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public class FileIdentifier + { + public Guid guid; + public int type; //enum { kNonAssetType = 0, kDeprecatedCachedAssetType = 1, kSerializedAssetType = 2, kMetaAssetType = 3 }; + public string pathName; + + //custom + public string fileName; + } +} diff --git a/AssetStudio/StudioClasses/Importer.cs b/AssetStudio/StudioClasses/Importer.cs index 8aa5f52..2a10e83 100644 --- a/AssetStudio/StudioClasses/Importer.cs +++ b/AssetStudio/StudioClasses/Importer.cs @@ -64,7 +64,7 @@ namespace AssetStudio #endregion int value = 0; - foreach (var sharedFile in assetsFile.sharedAssetsList) + foreach (var sharedFile in assetsFile.m_Externals) { var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName; var sharedFileName = sharedFile.fileName; diff --git a/AssetStudio/StudioClasses/LocalSerializedObjectIdentifier.cs b/AssetStudio/StudioClasses/LocalSerializedObjectIdentifier.cs new file mode 100644 index 0000000..24f4553 --- /dev/null +++ b/AssetStudio/StudioClasses/LocalSerializedObjectIdentifier.cs @@ -0,0 +1,13 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public class LocalSerializedObjectIdentifier + { + public int localSerializedFileIndex; + public long localIdentifierInFile; + } +} diff --git a/AssetStudio/StudioClasses/ModelConverter.cs b/AssetStudio/StudioClasses/ModelConverter.cs index 09d401f..70afac8 100644 --- a/AssetStudio/StudioClasses/ModelConverter.cs +++ b/AssetStudio/StudioClasses/ModelConverter.cs @@ -25,7 +25,7 @@ namespace AssetStudio public ModelConverter(GameObject m_GameObject) { - if (assetsfileList.TryGetPD(m_GameObject.m_Animator, out var m_Animator)) + if (m_GameObject.m_Animator != null && m_GameObject.m_Animator.TryGetPD(out var m_Animator)) { var animator = new Animator(m_Animator); InitWithAnimator(animator); @@ -38,7 +38,7 @@ namespace AssetStudio public ModelConverter(GameObject m_GameObject, List animationList) { - if (assetsfileList.TryGetPD(m_GameObject.m_Animator, out var m_Animator)) + if (m_GameObject.m_Animator != null && m_GameObject.m_Animator.TryGetPD(out var m_Animator)) { var animator = new Animator(m_Animator); InitWithAnimator(animator); @@ -71,16 +71,16 @@ namespace AssetStudio private void InitWithAnimator(Animator m_Animator) { - if (assetsfileList.TryGetPD(m_Animator.m_Avatar, out var m_Avatar)) + if (m_Animator.m_Avatar.TryGetPD(out var m_Avatar)) avatar = new Avatar(m_Avatar); - assetsfileList.TryGetGameObject(m_Animator.m_GameObject, out var m_GameObject); + m_Animator.m_GameObject.TryGetGameObject(out var m_GameObject); InitWithGameObject(m_GameObject, m_Animator.m_HasTransformHierarchy); } private void InitWithGameObject(GameObject m_GameObject, bool hasTransformHierarchy = true) { - assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform); + m_GameObject.m_Transform.TryGetTransform(out var m_Transform); var rootTransform = m_Transform; if (!hasTransformHierarchy) { @@ -91,7 +91,7 @@ namespace AssetStudio else { var frameList = new List(); - while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father)) + while (rootTransform.m_Father.TryGetTransform(out var m_Father)) { frameList.Add(ConvertFrame(m_Father)); rootTransform = m_Father; @@ -120,10 +120,10 @@ namespace AssetStudio private void ConvertMeshRenderer(Transform m_Transform) { - assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out var m_GameObject); + m_Transform.m_GameObject.TryGetGameObject(out var m_GameObject); foreach (var m_Component in m_GameObject.m_Components) { - if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData)) + if (m_Component.TryGetPD(out var assetPreloadData)) { switch (assetPreloadData.Type) { @@ -144,7 +144,7 @@ namespace AssetStudio var m_Animation = new Animation(assetPreloadData); foreach (var animation in m_Animation.m_Animations) { - if (assetsfileList.TryGetPD(animation, out var animationClip)) + if (animation.TryGetPD(out var animationClip)) { animationClipHashSet.Add(animationClip); } @@ -156,24 +156,24 @@ namespace AssetStudio } foreach (var pptr in m_Transform.m_Children) { - if (assetsfileList.TryGetTransform(pptr, out var child)) + if (pptr.TryGetTransform(out var child)) ConvertMeshRenderer(child); } } private void CollectAnimationClip(Animator m_Animator) { - if (assetsfileList.TryGetPD(m_Animator.m_Controller, out var assetPreloadData)) + if (m_Animator.m_Controller.TryGetPD(out var assetPreloadData)) { if (assetPreloadData.Type == ClassIDReference.AnimatorOverrideController) { var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData); - if (assetsfileList.TryGetPD(m_AnimatorOverrideController.m_Controller, out assetPreloadData)) + if (m_AnimatorOverrideController.m_Controller.TryGetPD(out assetPreloadData)) { var m_AnimatorController = new AnimatorController(assetPreloadData); foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips) { - if (assetsfileList.TryGetPD(m_AnimationClip, out assetPreloadData)) + if (m_AnimationClip.TryGetPD(out assetPreloadData)) { animationClipHashSet.Add(assetPreloadData); } @@ -192,7 +192,7 @@ namespace AssetStudio var m_AnimatorController = new AnimatorController(assetPreloadData); foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips) { - if (assetsfileList.TryGetPD(m_AnimationClip, out assetPreloadData)) + if (m_AnimationClip.TryGetPD(out assetPreloadData)) { animationClipHashSet.Add(assetPreloadData); } @@ -204,7 +204,7 @@ namespace AssetStudio private ImportedFrame ConvertFrame(Transform trans) { var frame = new ImportedFrame(); - assetsfileList.TryGetGameObject(trans.m_GameObject, out var m_GameObject); + trans.m_GameObject.TryGetGameObject(out var m_GameObject); frame.Name = m_GameObject.m_Name; frame.InitChildren(trans.m_Children.Count); var m_EulerRotation = QuatToEuler(new[] { trans.m_LocalRotation[0], -trans.m_LocalRotation[1], -trans.m_LocalRotation[2], trans.m_LocalRotation[3] }); @@ -242,7 +242,7 @@ namespace AssetStudio } foreach (var pptr in trans.m_Children) { - if (assetsfileList.TryGetTransform(pptr, out var child)) + if (pptr.TryGetTransform(out var child)) ConvertFrames(child, frame); } } @@ -253,8 +253,8 @@ namespace AssetStudio if (mesh == null) return; var iMesh = new ImportedMesh(); - assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject2); - assetsfileList.TryGetTransform(m_GameObject2.m_Transform, out var meshTransform); + meshR.m_GameObject.TryGetGameObject(out var m_GameObject2); + m_GameObject2.m_Transform.TryGetTransform(out var meshTransform); iMesh.Name = GetTransformPath(meshTransform); iMesh.SubmeshList = new List(); var subHashSet = new HashSet(); @@ -293,7 +293,7 @@ namespace AssetStudio Material mat = null; if (i - firstSubMesh < meshR.m_Materials.Length) { - if (assetsfileList.TryGetPD(meshR.m_Materials[i - firstSubMesh], out var MaterialPD)) + if (meshR.m_Materials[i - firstSubMesh].TryGetPD(out var MaterialPD)) { mat = new Material(MaterialPD); } @@ -388,9 +388,9 @@ namespace AssetStudio for (int i = 0; i < sMesh.m_Bones.Length; i++) { var bone = new ImportedBone(); - if (assetsfileList.TryGetTransform(sMesh.m_Bones[i], out var m_Transform)) + if (sMesh.m_Bones[i].TryGetTransform(out var m_Transform)) { - if (assetsfileList.TryGetGameObject(m_Transform.m_GameObject, out var m_GameObject)) + if (m_Transform.m_GameObject.TryGetGameObject(out var m_GameObject)) { bone.Name = m_GameObject.m_Name; } @@ -536,7 +536,7 @@ namespace AssetStudio //TODO if (combine) { - assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject); + meshR.m_GameObject.TryGetGameObject(out var m_GameObject); foreach (var root in FrameList) { var frame = ImportedHelpers.FindFrame(m_GameObject.m_Name, root); @@ -569,22 +569,22 @@ namespace AssetStudio { if (meshR is SkinnedMeshRenderer sMesh) { - if (assetsfileList.TryGetPD(sMesh.m_Mesh, out var MeshPD)) + if (sMesh.m_Mesh.TryGetPD(out var MeshPD)) { return new Mesh(MeshPD); } } else { - assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject); + meshR.m_GameObject.TryGetGameObject(out var m_GameObject); foreach (var m_Component in m_GameObject.m_Components) { - if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData)) + if (m_Component.TryGetPD(out var assetPreloadData)) { if (assetPreloadData.Type == ClassIDReference.MeshFilter) { var m_MeshFilter = new MeshFilter(assetPreloadData); - if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out var MeshPD)) + if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD)) { return new Mesh(MeshPD); } @@ -599,7 +599,7 @@ namespace AssetStudio private string GetTransformPath(Transform meshTransform) { - assetsfileList.TryGetGameObject(meshTransform.m_GameObject, out var m_GameObject); + meshTransform.m_GameObject.TryGetGameObject(out var m_GameObject); var curFrame = ImportedHelpers.FindFrame(m_GameObject.m_Name, FrameList[0]); var path = curFrame.Name; while (curFrame.Parent != null) @@ -667,7 +667,7 @@ namespace AssetStudio foreach (var texEnv in mat.m_TexEnvs) { Texture2D tex2D = null; - if (assetsfileList.TryGetPD(texEnv.m_Texture, out var TexturePD) && TexturePD.Type == ClassIDReference.Texture2D)//TODO other Texture + if (texEnv.m_Texture.TryGetPD(out var TexturePD) && TexturePD.Type == ClassIDReference.Texture2D)//TODO other Texture { tex2D = new Texture2D(TexturePD, true); } @@ -986,7 +986,7 @@ namespace AssetStudio } foreach (var pptr in m_Transform.m_Children) { - if (assetsfileList.TryGetTransform(pptr, out var child)) + if (pptr.TryGetTransform(out var child)) CreateBonePathHash(child); } } diff --git a/AssetStudio/StudioClasses/ObjectInfo.cs b/AssetStudio/StudioClasses/ObjectInfo.cs new file mode 100644 index 0000000..f5c7986 --- /dev/null +++ b/AssetStudio/StudioClasses/ObjectInfo.cs @@ -0,0 +1,16 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public class ObjectInfo + { + public uint byteStart; + public uint byteSize; + public int typeID; + public int classID; + public ushort isDestroyed; + } +} diff --git a/AssetStudio/StudioClasses/PPtr.cs b/AssetStudio/StudioClasses/PPtr.cs new file mode 100644 index 0000000..e67feb3 --- /dev/null +++ b/AssetStudio/StudioClasses/PPtr.cs @@ -0,0 +1,88 @@ +using static AssetStudio.Studio; + +namespace AssetStudio +{ + public class PPtr + { + public int m_FileID; + public long m_PathID; + + //custom + public AssetsFile assetsFile; + public int index = -2; //-2 - Prepare, -1 - Missing + + private bool TryGet(out AssetsFile result) + { + result = null; + if (m_FileID == 0) + { + result = assetsFile; + return true; + } + + if (m_FileID > 0) + { + if (index == -2) + { + var m_External = assetsFile.m_Externals[m_FileID - 1]; + var name = m_External.fileName.ToUpper(); + if (!assetsFileIndexCache.TryGetValue(name, out index)) + { + index = assetsfileList.FindIndex(x => x.upperFileName == name); + assetsFileIndexCache.Add(name, index); + } + } + + if (index >= 0) + { + result = assetsfileList[index]; + return true; + } + } + + return false; + } + + public bool TryGetPD(out AssetPreloadData result) + { + result = null; + if (TryGet(out var sourceFile)) + { + if (sourceFile.preloadTable.TryGetValue(m_PathID, out result)) + { + return true; + } + } + + return false; + } + + public bool TryGetTransform(out Transform m_Transform) + { + if (TryGet(out var sourceFile)) + { + if (sourceFile.TransformList.TryGetValue(m_PathID, out m_Transform)) + { + return true; + } + } + + m_Transform = null; + return false; + } + + public bool TryGetGameObject(out GameObject m_GameObject) + { + if (TryGet(out var sourceFile)) + { + if (sourceFile.GameObjectList.TryGetValue(m_PathID, out m_GameObject)) + { + return true; + } + } + + m_GameObject = null; + return false; + } + } +} diff --git a/AssetStudio/StudioClasses/PPtrHelpers.cs b/AssetStudio/StudioClasses/PPtrHelpers.cs deleted file mode 100644 index 1af76fa..0000000 --- a/AssetStudio/StudioClasses/PPtrHelpers.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using static AssetStudio.Studio; - -namespace AssetStudio -{ - public class PPtr - { - //m_FileID 0 means current file - public int m_FileID; - //m_PathID acts more like a hash in some games - public long m_PathID; - } - - public static class PPtrHelpers - { - public static PPtr ReadPPtr(this AssetsFile sourceFile) - { - var result = new PPtr(); - var reader = sourceFile.reader; - - int FileID = reader.ReadInt32(); - if (FileID >= 0 && FileID < sourceFile.sharedAssetsList.Count) - { - var sharedFile = sourceFile.sharedAssetsList[FileID]; - var index = sharedFile.Index; - if (index == -2) - { - var name = sharedFile.fileName.ToUpper(); - if (!sharedFileIndex.TryGetValue(name, out index)) - { - index = assetsfileList.FindIndex(aFile => aFile.upperFileName == name); - sharedFileIndex.Add(name, index); - } - sharedFile.Index = index; - } - result.m_FileID = index; - } - - result.m_PathID = sourceFile.header.m_Version < 14 ? reader.ReadInt32() : reader.ReadInt64(); - - return result; - } - - public static bool TryGetPD(this List assetsfileList, PPtr m_elm, out AssetPreloadData result) - { - result = null; - - if (m_elm != null && m_elm.m_FileID >= 0 && m_elm.m_FileID < assetsfileList.Count) - { - AssetsFile sourceFile = assetsfileList[m_elm.m_FileID]; - - //TryGetValue should be safe because m_PathID is 0 when initialized and PathID values range from 1 - if (sourceFile.preloadTable.TryGetValue(m_elm.m_PathID, out result)) { return true; } - } - - return false; - } - - public static bool TryGetTransform(this List assetsfileList, PPtr m_elm, out Transform m_Transform) - { - m_Transform = null; - - if (m_elm != null && m_elm.m_FileID >= 0 && m_elm.m_FileID < assetsfileList.Count) - { - AssetsFile sourceFile = assetsfileList[m_elm.m_FileID]; - - if (sourceFile.TransformList.TryGetValue(m_elm.m_PathID, out m_Transform)) { return true; } - } - - return false; - } - - public static bool TryGetGameObject(this List assetsfileList, PPtr m_elm, out GameObject m_GameObject) - { - m_GameObject = null; - - if (m_elm != null && m_elm.m_FileID >= 0 && m_elm.m_FileID < assetsfileList.Count) - { - AssetsFile sourceFile = assetsfileList[m_elm.m_FileID]; - - if (sourceFile.GameObjectList.TryGetValue(m_elm.m_PathID, out m_GameObject)) { return true; } - } - - return false; - } - } -} diff --git a/AssetStudio/StudioClasses/SerializedFileHeader.cs b/AssetStudio/StudioClasses/SerializedFileHeader.cs new file mode 100644 index 0000000..438dbcb --- /dev/null +++ b/AssetStudio/StudioClasses/SerializedFileHeader.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public class SerializedFileHeader + { + public uint m_MetadataSize; + public uint m_FileSize; + public uint m_Version; + public uint m_DataOffset; + public byte m_Endianess; + public byte[] m_Reserved; + } +} diff --git a/AssetStudio/StudioClasses/SpriteHelper.cs b/AssetStudio/StudioClasses/SpriteHelper.cs index 045e544..f632304 100644 --- a/AssetStudio/StudioClasses/SpriteHelper.cs +++ b/AssetStudio/StudioClasses/SpriteHelper.cs @@ -5,7 +5,6 @@ using System.Drawing.Drawing2D; using System.Drawing.Imaging; using System.Linq; using System.Text; -using static AssetStudio.Studio; namespace AssetStudio { @@ -13,12 +12,12 @@ namespace AssetStudio { public static Bitmap GetImageFromSprite(Sprite m_Sprite) { - if (assetsfileList.TryGetPD(m_Sprite.m_SpriteAtlas, out var assetPreloadData)) + if (m_Sprite.m_SpriteAtlas.TryGetPD(out var assetPreloadData)) { var m_SpriteAtlas = new SpriteAtlas(assetPreloadData); var index = m_SpriteAtlas.guids.FindIndex(x => x == m_Sprite.first); - if (index >= 0 && assetsfileList.TryGetPD(m_SpriteAtlas.textures[index], out assetPreloadData)) + if (index >= 0 && m_SpriteAtlas.textures[index].TryGetPD(out assetPreloadData)) { try { @@ -36,7 +35,7 @@ namespace AssetStudio } else { - if (assetsfileList.TryGetPD(m_Sprite.texture, out assetPreloadData)) + if (m_Sprite.texture.TryGetPD(out assetPreloadData)) { return CutImage(assetPreloadData, m_Sprite.textureRect); } diff --git a/AssetStudio/StudioClasses/Studio.cs b/AssetStudio/StudioClasses/Studio.cs index db6057f..db8cb4f 100644 --- a/AssetStudio/StudioClasses/Studio.cs +++ b/AssetStudio/StudioClasses/Studio.cs @@ -15,7 +15,7 @@ namespace AssetStudio internal static class Studio { public static List assetsfileList = new List(); //loaded files - public static Dictionary sharedFileIndex = new Dictionary(); //to improve the loading speed + public static Dictionary assetsFileIndexCache = new Dictionary(); public static Dictionary resourceFileReaders = new Dictionary(); //use for read res files public static List exportableAssets = new List(); //used to hold all assets while the ListView is filtered private static HashSet assetsNameHash = new HashSet(); //avoid the same name asset @@ -251,7 +251,7 @@ namespace AssetStudio case ClassIDReference.MonoBehaviour: { var m_MonoBehaviour = new MonoBehaviour(asset); - if (m_MonoBehaviour.m_Name == "" && assetsfileList.TryGetPD(m_MonoBehaviour.m_Script, out var script)) + if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGetPD(out var script)) { var m_Script = new MonoScript(script); asset.Text = m_Script.m_ClassName; @@ -337,67 +337,63 @@ namespace AssetStudio { foreach (var m_Component in m_GameObject.m_Components) { - if (m_Component.m_FileID >= 0 && m_Component.m_FileID < assetsfileList.Count) + if (m_Component.TryGetPD(out var asset)) { - var sourceFile = assetsfileList[m_Component.m_FileID]; - if (sourceFile.preloadTable.TryGetValue(m_Component.m_PathID, out var asset)) + switch (asset.Type) { - switch (asset.Type) - { - case ClassIDReference.Transform: + case ClassIDReference.Transform: + { + m_GameObject.m_Transform = m_Component; + break; + } + case ClassIDReference.MeshRenderer: + { + m_GameObject.m_MeshRenderer = m_Component; + break; + } + case ClassIDReference.MeshFilter: + { + m_GameObject.m_MeshFilter = m_Component; + if (m_Component.TryGetPD(out var assetPreloadData)) { - m_GameObject.m_Transform = m_Component; - break; - } - case ClassIDReference.MeshRenderer: - { - m_GameObject.m_MeshRenderer = m_Component; - break; - } - case ClassIDReference.MeshFilter: - { - m_GameObject.m_MeshFilter = m_Component; - if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData)) + var m_MeshFilter = new MeshFilter(assetPreloadData); + if (m_MeshFilter.m_Mesh.TryGetPD(out assetPreloadData)) { - var m_MeshFilter = new MeshFilter(assetPreloadData); - if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out assetPreloadData)) - { - assetPreloadData.gameObject = m_GameObject; - } + assetPreloadData.gameObject = m_GameObject; } - break; } - case ClassIDReference.SkinnedMeshRenderer: + break; + } + case ClassIDReference.SkinnedMeshRenderer: + { + m_GameObject.m_SkinnedMeshRenderer = m_Component; + if (m_Component.TryGetPD(out var assetPreloadData)) { - m_GameObject.m_SkinnedMeshRenderer = m_Component; - if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData)) + var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); + if (m_SkinnedMeshRenderer.m_Mesh.TryGetPD(out assetPreloadData)) { - var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); - if (assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out assetPreloadData)) - { - assetPreloadData.gameObject = m_GameObject; - } + assetPreloadData.gameObject = m_GameObject; } - break; } - case ClassIDReference.Animator: - { - m_GameObject.m_Animator = m_Component; - asset.Text = m_GameObject.preloadData.Text; - break; - } - } + break; + } + case ClassIDReference.Animator: + { + m_GameObject.m_Animator = m_Component; + asset.Text = m_GameObject.preloadData.Text; + break; + } } } } var parentNode = fileNode; - if (assetsfileList.TryGetTransform(m_GameObject.m_Transform, out var m_Transform)) + if (m_GameObject.m_Transform != null && m_GameObject.m_Transform.TryGetTransform(out var m_Transform)) { - if (assetsfileList.TryGetTransform(m_Transform.m_Father, out var m_Father)) + if (m_Transform.m_Father.TryGetTransform(out var m_Father)) { - if (assetsfileList.TryGetGameObject(m_Father.m_GameObject, out var parentGameObject)) + if (m_Father.m_GameObject.TryGetGameObject(out var parentGameObject)) { if (!treeNodeDictionary.TryGetValue(parentGameObject, out parentNode)) { @@ -811,7 +807,7 @@ namespace AssetStudio sb.AppendLine($"\tint m_FileID = {m_MonoBehaviour.m_Script.m_FileID}"); sb.AppendLine($"\tint64 m_PathID = {m_MonoBehaviour.m_Script.m_PathID}"); sb.AppendLine($"string m_Name = \"{m_MonoBehaviour.m_Name}\""); - if (assetsfileList.TryGetPD(m_MonoBehaviour.m_Script, out var script)) + if (m_MonoBehaviour.m_Script.TryGetPD(out var script)) { var m_Script = new MonoScript(script); if (!LoadedModuleDic.TryGetValue(m_Script.m_AssemblyName, out var module)) diff --git a/AssetStudio/StudioClasses/TypeItem.cs b/AssetStudio/StudioClasses/TypeItem.cs index c10a0c6..bd2806a 100644 --- a/AssetStudio/StudioClasses/TypeItem.cs +++ b/AssetStudio/StudioClasses/TypeItem.cs @@ -8,9 +8,9 @@ namespace AssetStudio { public class TypeItem : ListViewItem { - public List typeTreeList; + public List typeTreeList; - public TypeItem(int classID, List typeTreeList) + public TypeItem(int classID, List typeTreeList) { this.typeTreeList = typeTreeList; Text = typeTreeList[0].m_Type + " " + typeTreeList[0].m_Name; @@ -22,7 +22,7 @@ namespace AssetStudio var sb = new StringBuilder(); foreach (var i in typeTreeList) { - sb.AppendFormat("{0}{1} {2} {3} {4}\r\n", new string('\t', i.m_Depth), i.m_Type, i.m_Name, i.m_ByteSize, (i.m_MetaFlag & 0x4000) != 0); + sb.AppendFormat("{0}{1} {2} {3} {4}\r\n", new string('\t', i.m_Level), i.m_Type, i.m_Name, i.m_ByteSize, (i.m_MetaFlag & 0x4000) != 0); } return sb.ToString(); } diff --git a/AssetStudio/StudioClasses/TypeTreeHelper.cs b/AssetStudio/StudioClasses/TypeTreeHelper.cs index 16fa516..3e9f53f 100644 --- a/AssetStudio/StudioClasses/TypeTreeHelper.cs +++ b/AssetStudio/StudioClasses/TypeTreeHelper.cs @@ -9,7 +9,7 @@ namespace AssetStudio { public static class TypeTreeHelper { - public static void ReadTypeString(StringBuilder sb, List members, EndianBinaryReader reader) + public static void ReadTypeString(StringBuilder sb, List members, EndianBinaryReader reader) { for (int i = 0; i < members.Count; i++) { @@ -17,10 +17,10 @@ namespace AssetStudio } } - private static void ReadStringValue(StringBuilder sb, List members, EndianBinaryReader reader, ref int i) + private static void ReadStringValue(StringBuilder sb, List members, EndianBinaryReader reader, ref int i) { var member = members[i]; - var level = member.m_Depth; + var level = member.m_Level; var varTypeStr = member.m_Type; var varNameStr = member.m_Name; object value = null; @@ -106,7 +106,7 @@ namespace AssetStudio var map = GetMembers(members, level, i); i += map.Count - 1; map.RemoveRange(0, 4); - var first = GetMembers(map, map[0].m_Depth, 0); + var first = GetMembers(map, map[0].m_Level, 0); map.RemoveRange(0, first.Count); var second = map; for (int j = 0; j < size; j++) @@ -154,7 +154,7 @@ namespace AssetStudio reader.AlignStream(4); } - public static ExpandoObject ReadDynamicType(List members, EndianBinaryReader reader) + public static ExpandoObject ReadDynamicType(List members, EndianBinaryReader reader) { var obj = new ExpandoObject(); var objdic = (IDictionary)obj; @@ -167,10 +167,10 @@ namespace AssetStudio return obj; } - private static object ReadValue(List members, EndianBinaryReader reader, ref int i) + private static object ReadValue(List members, EndianBinaryReader reader, ref int i) { var member = members[i]; - var level = member.m_Depth; + var level = member.m_Level; var varTypeStr = member.m_Type; object value; var align = (member.m_MetaFlag & 0x4000) != 0; @@ -246,7 +246,7 @@ namespace AssetStudio var map = GetMembers(members, level, i); i += map.Count - 1; map.RemoveRange(0, 4); - var first = GetMembers(map, map[0].m_Depth, 0); + var first = GetMembers(map, map[0].m_Level, 0); map.RemoveRange(0, first.Count); var second = map; for (int j = 0; j < size; j++) @@ -291,14 +291,14 @@ namespace AssetStudio return value; } - private static List GetMembers(List members, int level, int index) + private static List GetMembers(List members, int level, int index) { - var member2 = new List(); + var member2 = new List(); member2.Add(members[0]); for (int i = index + 1; i < members.Count; i++) { var member = members[i]; - var level2 = member.m_Depth; + var level2 = member.m_Level; if (level2 <= level) { return member2; @@ -308,7 +308,7 @@ namespace AssetStudio return member2; } - public static byte[] WriteDynamicType(ExpandoObject obj, List members) + public static byte[] WriteDynamicType(ExpandoObject obj, List members) { var stream = new MemoryStream(); var write = new BinaryWriter(stream); @@ -322,10 +322,10 @@ namespace AssetStudio return stream.ToArray(); } - private static void WriteValue(object value, List members, BinaryWriter write, ref int i) + private static void WriteValue(object value, List members, BinaryWriter write, ref int i) { var member = members[i]; - var level = member.m_Depth; + var level = member.m_Level; var varTypeStr = member.m_Type; var align = (member.m_MetaFlag & 0x4000) != 0; switch (varTypeStr) @@ -401,7 +401,7 @@ namespace AssetStudio var map = GetMembers(members, level, i); i += map.Count - 1; map.RemoveRange(0, 4); - var first = GetMembers(map, map[0].m_Depth, 0); + var first = GetMembers(map, map[0].m_Level, 0); map.RemoveRange(0, first.Count); var second = map; for (int j = 0; j < size; j++) diff --git a/AssetStudio/StudioClasses/TypeTree.cs b/AssetStudio/StudioClasses/TypeTreeNode.cs similarity index 85% rename from AssetStudio/StudioClasses/TypeTree.cs rename to AssetStudio/StudioClasses/TypeTreeNode.cs index 62c853b..644cfe4 100644 --- a/AssetStudio/StudioClasses/TypeTree.cs +++ b/AssetStudio/StudioClasses/TypeTreeNode.cs @@ -5,7 +5,7 @@ using System.Text; namespace AssetStudio { - public class TypeTree + public class TypeTreeNode { public string m_Type; public string m_Name; @@ -14,6 +14,6 @@ namespace AssetStudio public int m_IsArray; public int m_Version; public int m_MetaFlag; - public int m_Depth; + public int m_Level; } }