diff --git a/AssetStudio/AssetStudioForm.cs b/AssetStudio/AssetStudioForm.cs index 36bb0b6..0cf3370 100644 --- a/AssetStudio/AssetStudioForm.cs +++ b/AssetStudio/AssetStudioForm.cs @@ -1013,7 +1013,7 @@ namespace AssetStudio } default: { - var str = asset.Deserialize(); + var str = asset.GetClassString(); if (str != null) { textPreviewBox.Text = str; diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index e017137..2557182 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -417,21 +417,19 @@ namespace AssetStudio return unpackedVectors; } - public Mesh(AssetPreloadData MeshPD, bool readSwitch) + public Mesh(AssetPreloadData preloadData, bool readSwitch) { - //Stream = new EndianStream(File.OpenRead(sourceFile.filePath), sourceFile.endianType); - //Stream.endian = sourceFile.endianType; - var version = MeshPD.sourceFile.version; - reader = MeshPD.InitReader(); + var version = preloadData.sourceFile.version; + reader = preloadData.InitReader(); bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices uint m_MeshCompression = 0; - if (MeshPD.sourceFile.platform == -2) + if (preloadData.sourceFile.platform == -2) { uint m_ObjectHideFlags = reader.ReadUInt32(); - PPtr m_PrefabParentObject = MeshPD.sourceFile.ReadPPtr(); - PPtr m_PrefabInternal = MeshPD.sourceFile.ReadPPtr(); + PPtr m_PrefabParentObject = preloadData.sourceFile.ReadPPtr(); + PPtr m_PrefabInternal = preloadData.sourceFile.ReadPPtr(); } m_Name = reader.ReadAlignedString(); @@ -490,8 +488,7 @@ namespace AssetStudio #endregion #region BlendShapeData for 4.1.0 to 4.2.x, excluding 4.1.0 alpha - if (version[0] == 4 && ((version[1] == 1 && MeshPD.sourceFile.buildType[0] != "a") || - (version[1] > 1 && version[1] <= 2))) + if (version[0] == 4 && ((version[1] == 1 && preloadData.sourceFile.buildType[0] != "a") || (version[1] > 1 && version[1] <= 2))) { int m_Shapes_size = reader.ReadInt32(); if (m_Shapes_size > 0) @@ -547,17 +544,15 @@ namespace AssetStudio bool m_IsReadable = reader.ReadBoolean(); bool m_KeepVertices = reader.ReadBoolean(); bool m_KeepIndices = reader.ReadBoolean(); - //TODO Need other ways to solve this problem - /*if (version[0] == 5 && version[1] == 6 && version[2] == 4 && - MeshPD.sourceFile.buildType[0] == "p") + if (preloadData.HasStructMember("m_UsedForStaticMeshColliderOnly")) { var m_UsedForStaticMeshColliderOnly = reader.ReadBoolean(); - }*/ + } } reader.AlignStream(4); //This is a bug fixed in 2017.3.1p1 and later versions if ((version[0] > 2017 || (version[0] == 2017 && version[1] >= 4)) || //2017.4 - ((version[0] == 2017 && version[1] == 3 && version[2] == 1) && MeshPD.sourceFile.buildType[0] == "p") || //fixed after 2017.3.1px + ((version[0] == 2017 && version[1] == 3 && version[2] == 1) && preloadData.sourceFile.buildType[0] == "p") || //fixed after 2017.3.1px ((version[0] == 2017 && version[1] == 3) && m_MeshCompression == 0))//2017.3.xfx with no compression { var m_IndexFormat = reader.ReadInt32(); @@ -1394,8 +1389,8 @@ namespace AssetStudio } else { - MeshPD.extension = ".obj"; - MeshPD.Text = m_Name; + preloadData.extension = ".obj"; + preloadData.Text = m_Name; } } } diff --git a/AssetStudio/Classes/MonoBehaviour.cs b/AssetStudio/Classes/MonoBehaviour.cs index 2a05431..7b89ec7 100644 --- a/AssetStudio/Classes/MonoBehaviour.cs +++ b/AssetStudio/Classes/MonoBehaviour.cs @@ -21,7 +21,7 @@ namespace AssetStudio var m_Name = reader.ReadAlignedString(); if (readSwitch) { - if ((serializedText = preloadData.Deserialize()) == null) + if ((serializedText = preloadData.GetClassString()) == null) { var str = "PPtr m_GameObject\r\n"; str += "\tint m_FileID = " + m_GameObject.m_FileID + "\r\n"; diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 055eadc..14fbc4d 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -27,7 +27,7 @@ namespace AssetStudio var str = (string)ShaderResource.ResourceManager.GetObject($"Shader{sourceFile.version[0]}{sourceFile.version[1]}"); if (str == null) { - str = preloadData.Deserialize(); + str = preloadData.GetClassString(); if (str == null) m_Script = Encoding.UTF8.GetBytes("Serialized Shader can't be read"); else diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index 950b234..ddb88da 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -69,7 +69,10 @@ namespace AssetStudio m_IsReadable = reader.ReadBoolean(); //2.6.0 and up m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4 reader.AlignStream(4); - + if (preloadData.HasStructMember("m_StreamingMipmapsPriority")) + { + var m_StreamingMipmapsPriority = reader.ReadInt32(); + } m_ImageCount = reader.ReadInt32(); m_TextureDimension = reader.ReadInt32(); //m_TextureSettings diff --git a/AssetStudio/StudioClasses/AssetPreloadData.cs b/AssetStudio/StudioClasses/AssetPreloadData.cs index 8fc885f..1d659de 100644 --- a/AssetStudio/StudioClasses/AssetPreloadData.cs +++ b/AssetStudio/StudioClasses/AssetPreloadData.cs @@ -31,7 +31,7 @@ namespace AssetStudio return reader; } - public string Deserialize() + public string GetClassString() { var reader = InitReader(); if (sourceFile.ClassStructures.TryGetValue(Type1, out var classStructure)) @@ -42,5 +42,10 @@ namespace AssetStudio } return null; } + + public bool HasStructMember(string name) + { + return sourceFile.ClassStructures.TryGetValue(Type1, out var classStructure) && classStructure.members.Any(x => x.Name == name); + } } }