mirror of
https://github.com/aelurum/AssetStudio.git
synced 2025-05-27 22:00:23 -04:00
rewrite some code to make it closer to the source code
This commit is contained in:
parent
f15ee038b4
commit
3442b39784
@ -171,10 +171,16 @@
|
|||||||
<Compile Include="Classes\MonoScript.cs" />
|
<Compile Include="Classes\MonoScript.cs" />
|
||||||
<Compile Include="Classes\NamedObject.cs" />
|
<Compile Include="Classes\NamedObject.cs" />
|
||||||
<Compile Include="Classes\Object.cs" />
|
<Compile Include="Classes\Object.cs" />
|
||||||
|
<Compile Include="StudioClasses\PPtr.cs" />
|
||||||
<Compile Include="Classes\Renderer.cs" />
|
<Compile Include="Classes\Renderer.cs" />
|
||||||
<Compile Include="Classes\Texture.cs" />
|
<Compile Include="Classes\Texture.cs" />
|
||||||
<Compile Include="StudioClasses\AudioClipConverter.cs" />
|
<Compile Include="StudioClasses\AudioClipConverter.cs" />
|
||||||
|
<Compile Include="StudioClasses\CommonString.cs" />
|
||||||
|
<Compile Include="StudioClasses\FileIdentifier.cs" />
|
||||||
<Compile Include="StudioClasses\GameObjectTreeNode.cs" />
|
<Compile Include="StudioClasses\GameObjectTreeNode.cs" />
|
||||||
|
<Compile Include="StudioClasses\LocalSerializedObjectIdentifier.cs" />
|
||||||
|
<Compile Include="StudioClasses\ObjectInfo.cs" />
|
||||||
|
<Compile Include="StudioClasses\SerializedFileHeader.cs" />
|
||||||
<Compile Include="StudioClasses\SevenZipHelper.cs">
|
<Compile Include="StudioClasses\SevenZipHelper.cs">
|
||||||
<SubType>Code</SubType>
|
<SubType>Code</SubType>
|
||||||
</Compile>
|
</Compile>
|
||||||
@ -189,7 +195,7 @@
|
|||||||
<Compile Include="StudioClasses\BinaryWriterExtensions.cs" />
|
<Compile Include="StudioClasses\BinaryWriterExtensions.cs" />
|
||||||
<Compile Include="StudioClasses\BuildTarget.cs" />
|
<Compile Include="StudioClasses\BuildTarget.cs" />
|
||||||
<Compile Include="StudioClasses\ClassIDReference.cs" />
|
<Compile Include="StudioClasses\ClassIDReference.cs" />
|
||||||
<Compile Include="StudioClasses\TypeTree.cs" />
|
<Compile Include="StudioClasses\TypeTreeNode.cs" />
|
||||||
<Compile Include="StudioClasses\TypeTreeHelper.cs" />
|
<Compile Include="StudioClasses\TypeTreeHelper.cs" />
|
||||||
<Compile Include="StudioClasses\ResourcesHelper.cs" />
|
<Compile Include="StudioClasses\ResourcesHelper.cs" />
|
||||||
<Compile Include="Classes\AssetBundle.cs" />
|
<Compile Include="Classes\AssetBundle.cs" />
|
||||||
@ -226,7 +232,6 @@
|
|||||||
<Compile Include="Classes\Material.cs" />
|
<Compile Include="Classes\Material.cs" />
|
||||||
<Compile Include="Classes\Mesh.cs" />
|
<Compile Include="Classes\Mesh.cs" />
|
||||||
<Compile Include="Classes\GameObject.cs" />
|
<Compile Include="Classes\GameObject.cs" />
|
||||||
<Compile Include="StudioClasses\PPtrHelpers.cs" />
|
|
||||||
<Compile Include="Classes\MonoBehaviour.cs" />
|
<Compile Include="Classes\MonoBehaviour.cs" />
|
||||||
<Compile Include="Classes\PlayerSettings.cs" />
|
<Compile Include="Classes\PlayerSettings.cs" />
|
||||||
<Compile Include="Classes\RectTransform.cs" />
|
<Compile Include="Classes\RectTransform.cs" />
|
||||||
|
@ -1783,7 +1783,7 @@ namespace AssetStudio
|
|||||||
resourceFileReader.Value.Dispose();
|
resourceFileReader.Value.Dispose();
|
||||||
}
|
}
|
||||||
resourceFileReaders.Clear();
|
resourceFileReaders.Clear();
|
||||||
sharedFileIndex.Clear();
|
assetsFileIndexCache.Clear();
|
||||||
productName = "";
|
productName = "";
|
||||||
|
|
||||||
sceneTreeView.Nodes.Clear();
|
sceneTreeView.Nodes.Clear();
|
||||||
|
@ -2,163 +2,37 @@
|
|||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
using System.Windows.Forms;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
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 class AssetsFile
|
||||||
{
|
{
|
||||||
public EndianBinaryReader reader;
|
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<int, List<TypeTree>> m_Type = new SortedDictionary<int, List<TypeTree>>();
|
|
||||||
private List<int[]> classIDs = new List<int[]>();//use for 5.5.0
|
|
||||||
|
|
||||||
public string filePath;
|
public string filePath;
|
||||||
public string parentPath;
|
public string parentPath;
|
||||||
public string fileName;
|
public string fileName;
|
||||||
public string upperFileName;
|
public string upperFileName;
|
||||||
public int[] version = { 0, 0, 0, 0 };
|
public int[] version = { 0, 0, 0, 0 };
|
||||||
public string[] buildType;
|
public string[] buildType;
|
||||||
public string platformStr = "";
|
public string platformStr;
|
||||||
|
public bool valid;
|
||||||
public Dictionary<long, AssetPreloadData> preloadTable = new Dictionary<long, AssetPreloadData>();
|
public Dictionary<long, AssetPreloadData> preloadTable = new Dictionary<long, AssetPreloadData>();
|
||||||
public Dictionary<long, GameObject> GameObjectList = new Dictionary<long, GameObject>();
|
public Dictionary<long, GameObject> GameObjectList = new Dictionary<long, GameObject>();
|
||||||
public Dictionary<long, Transform> TransformList = new Dictionary<long, Transform>();
|
public Dictionary<long, Transform> TransformList = new Dictionary<long, Transform>();
|
||||||
|
|
||||||
public List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>();
|
public List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>();
|
||||||
public List<SharedAssets> sharedAssetsList = new List<SharedAssets> { new SharedAssets() };
|
|
||||||
|
|
||||||
public bool valid;
|
//class SerializedFile
|
||||||
|
public SerializedFileHeader header;
|
||||||
#region cmmon string
|
private EndianType m_FileEndianess;
|
||||||
private static Dictionary<int, string> baseStrings = new Dictionary<int, string>
|
public string unityVersion = "2.5.0f5";
|
||||||
{
|
public BuildTarget m_TargetPlatform = BuildTarget.UnknownPlatform;
|
||||||
{0, "AABB"},
|
private bool m_EnableTypeTree;
|
||||||
{5, "AnimationClip"},
|
public SortedDictionary<int, List<TypeTreeNode>> m_Type = new SortedDictionary<int, List<TypeTreeNode>>();
|
||||||
{19, "AnimationCurve"},
|
private List<int[]> classIDs = new List<int[]>();
|
||||||
{34, "AnimationState"},
|
public Dictionary<long, ObjectInfo> m_Objects;
|
||||||
{49, "Array"},
|
private List<LocalSerializedObjectIdentifier> m_ScriptTypes;
|
||||||
{55, "Base"},
|
public List<FileIdentifier> m_Externals;
|
||||||
{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<Component>"},
|
|
||||||
{564, "PPtr<GameObject>"},
|
|
||||||
{581, "PPtr<Material>"},
|
|
||||||
{596, "PPtr<MonoBehaviour>"},
|
|
||||||
{616, "PPtr<MonoScript>"},
|
|
||||||
{633, "PPtr<Object>"},
|
|
||||||
{646, "PPtr<Prefab>"},
|
|
||||||
{659, "PPtr<Sprite>"},
|
|
||||||
{672, "PPtr<TextAsset>"},
|
|
||||||
{688, "PPtr<Texture>"},
|
|
||||||
{702, "PPtr<Texture2D>"},
|
|
||||||
{718, "PPtr<Transform>"},
|
|
||||||
{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 = "";
|
|
||||||
}
|
|
||||||
|
|
||||||
public AssetsFile(string fullName, EndianBinaryReader reader)
|
public AssetsFile(string fullName, EndianBinaryReader reader)
|
||||||
{
|
{
|
||||||
@ -205,19 +79,19 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
platformStr = m_TargetPlatform.ToString();
|
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();
|
int typeCount = reader.ReadInt32();
|
||||||
for (int i = 0; i < typeCount; i++)
|
for (int i = 0; i < typeCount; i++)
|
||||||
{
|
{
|
||||||
if (header.m_Version < 14)
|
if (header.m_Version < 13)
|
||||||
{
|
{
|
||||||
int classID = reader.ReadInt32();
|
int classID = reader.ReadInt32();
|
||||||
var typeTreeList = new List<TypeTree>();
|
var typeTreeList = new List<TypeTreeNode>();
|
||||||
ReadTypeTree(typeTreeList, 0);
|
ReadTypeTree(typeTreeList, 0);
|
||||||
m_Type.Add(classID, typeTreeList);
|
m_Type.Add(classID, typeTreeList);
|
||||||
}
|
}
|
||||||
@ -232,7 +106,7 @@ namespace AssetStudio
|
|||||||
var bigIDEnabled = reader.ReadInt32();
|
var bigIDEnabled = reader.ReadInt32();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Read Objects
|
//Read Objects
|
||||||
int objectCount = reader.ReadInt32();
|
int objectCount = reader.ReadInt32();
|
||||||
|
|
||||||
string assetIDfmt = "D" + objectCount.ToString().Length; //format for unique ID
|
string assetIDfmt = "D" + objectCount.ToString().Length; //format for unique ID
|
||||||
@ -262,12 +136,9 @@ namespace AssetStudio
|
|||||||
asset.Type2 = reader.ReadUInt16();
|
asset.Type2 = reader.ReadUInt16();
|
||||||
reader.Position += 2;
|
reader.Position += 2;
|
||||||
}
|
}
|
||||||
if (header.m_Version == 15)
|
if (header.m_Version == 15 || header.m_Version == 16)
|
||||||
{
|
{
|
||||||
byte unknownByte = reader.ReadByte();
|
var stripped = reader.ReadByte();
|
||||||
//this is a single byte, not an int32
|
|
||||||
//the next entry is aligned after this
|
|
||||||
//but not the last!
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Enum.IsDefined(typeof(ClassIDReference), asset.Type2))
|
if (Enum.IsDefined(typeof(ClassIDReference), asset.Type2))
|
||||||
@ -301,28 +172,36 @@ namespace AssetStudio
|
|||||||
#endregion
|
#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 scriptCount = reader.ReadInt32();
|
||||||
int someCount = reader.ReadInt32();
|
m_ScriptTypes = new List<LocalSerializedObjectIdentifier>(scriptCount);
|
||||||
for (int i = 0; i < someCount; i++)
|
for (int i = 0; i < scriptCount; i++)
|
||||||
{
|
{
|
||||||
int num1 = reader.ReadInt32();
|
var m_ScriptType = new LocalSerializedObjectIdentifier();
|
||||||
reader.AlignStream(4);
|
m_ScriptType.localSerializedFileIndex = reader.ReadInt32();
|
||||||
long m_PathID = reader.ReadInt64();
|
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 externalsCount = reader.ReadInt32();
|
||||||
int sharedFileCount = reader.ReadInt32();
|
m_Externals = new List<FileIdentifier>(externalsCount);
|
||||||
for (int i = 0; i < sharedFileCount; i++)
|
for (int i = 0; i < externalsCount; i++)
|
||||||
{
|
{
|
||||||
var shared = new SharedAssets();
|
var m_External = new FileIdentifier();
|
||||||
shared.aName = reader.ReadStringToNull();
|
if (header.m_Version >= 6)
|
||||||
reader.Position += 20;
|
{
|
||||||
var sharedFilePath = reader.ReadStringToNull(); //relative path
|
var tempEmpty = reader.ReadStringToNull();
|
||||||
shared.fileName = Path.GetFileName(sharedFilePath);
|
}
|
||||||
sharedAssetsList.Add(shared);
|
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);
|
buildType = Regex.Replace(unityVersion, @"\d", "").Split(new[] { "." }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
@ -343,11 +222,11 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void ReadTypeTree(List<TypeTree> typeTreeList, int depth)
|
private void ReadTypeTree(List<TypeTreeNode> typeTreeList, int depth)
|
||||||
{
|
{
|
||||||
var typeTree = new TypeTree();
|
var typeTree = new TypeTreeNode();
|
||||||
typeTreeList.Add(typeTree);
|
typeTreeList.Add(typeTree);
|
||||||
typeTree.m_Depth = depth;
|
typeTree.m_Level = depth;
|
||||||
typeTree.m_Type = reader.ReadStringToNull();
|
typeTree.m_Type = reader.ReadStringToNull();
|
||||||
typeTree.m_Name = reader.ReadStringToNull();
|
typeTree.m_Name = reader.ReadStringToNull();
|
||||||
typeTree.m_ByteSize = reader.ReadInt32();
|
typeTree.m_ByteSize = reader.ReadInt32();
|
||||||
@ -402,7 +281,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
reader.Position += 16;
|
reader.Position += 16;
|
||||||
|
|
||||||
if (serializedTypeTrees)
|
if (m_EnableTypeTree)
|
||||||
{
|
{
|
||||||
int varCount = reader.ReadInt32();
|
int varCount = reader.ReadInt32();
|
||||||
int stringSize = reader.ReadInt32();
|
int stringSize = reader.ReadInt32();
|
||||||
@ -410,14 +289,14 @@ namespace AssetStudio
|
|||||||
reader.Position += varCount * 24;
|
reader.Position += varCount * 24;
|
||||||
using (var stringReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringSize))))
|
using (var stringReader = new BinaryReader(new MemoryStream(reader.ReadBytes(stringSize))))
|
||||||
{
|
{
|
||||||
var typeTreeList = new List<TypeTree>();
|
var typeTreeList = new List<TypeTreeNode>();
|
||||||
reader.Position -= varCount * 24 + stringSize;
|
reader.Position -= varCount * 24 + stringSize;
|
||||||
for (int i = 0; i < varCount; i++)
|
for (int i = 0; i < varCount; i++)
|
||||||
{
|
{
|
||||||
var typeTree = new TypeTree();
|
var typeTree = new TypeTreeNode();
|
||||||
typeTreeList.Add(typeTree);
|
typeTreeList.Add(typeTree);
|
||||||
typeTree.m_Version = reader.ReadUInt16();
|
typeTree.m_Version = reader.ReadUInt16();
|
||||||
typeTree.m_Depth = reader.ReadByte();
|
typeTree.m_Level = reader.ReadByte();
|
||||||
typeTree.m_IsArray = reader.ReadBoolean() ? 1 : 0;
|
typeTree.m_IsArray = reader.ReadBoolean() ? 1 : 0;
|
||||||
|
|
||||||
ushort varTypeIndex = reader.ReadUInt16();
|
ushort varTypeIndex = reader.ReadUInt16();
|
||||||
@ -429,7 +308,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
else //varType is an index in an internal strig array
|
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();
|
ushort varNameIndex = reader.ReadUInt16();
|
||||||
@ -441,7 +320,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
else
|
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();
|
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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
119
AssetStudio/StudioClasses/CommonString.cs
Normal file
119
AssetStudio/StudioClasses/CommonString.cs
Normal file
@ -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<int, string> StringBuffer = new Dictionary<int, string>
|
||||||
|
{
|
||||||
|
{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<Component>"},
|
||||||
|
{564, "PPtr<GameObject>"},
|
||||||
|
{581, "PPtr<Material>"},
|
||||||
|
{596, "PPtr<MonoBehaviour>"},
|
||||||
|
{616, "PPtr<MonoScript>"},
|
||||||
|
{633, "PPtr<Object>"},
|
||||||
|
{646, "PPtr<Prefab>"},
|
||||||
|
{659, "PPtr<Sprite>"},
|
||||||
|
{672, "PPtr<TextAsset>"},
|
||||||
|
{688, "PPtr<Texture>"},
|
||||||
|
{702, "PPtr<Texture2D>"},
|
||||||
|
{718, "PPtr<Transform>"},
|
||||||
|
{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"}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
@ -61,12 +61,12 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
GameObjects.Add(m_GameObject);
|
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 are not unique!
|
||||||
//MeshFilters.Add(MeshFilterPD);
|
//MeshFilters.Add(MeshFilterPD);
|
||||||
MeshFilter m_MeshFilter = new MeshFilter(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);
|
Meshes.Add(MeshPD);
|
||||||
|
|
||||||
@ -78,13 +78,13 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
|
|
||||||
#region get Renderer
|
#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);
|
MeshRenderer m_Renderer = new MeshRenderer(RendererPD);
|
||||||
|
|
||||||
foreach (var MaterialPPtr in m_Renderer.m_Materials)
|
foreach (var MaterialPPtr in m_Renderer.m_Materials)
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(MaterialPPtr, out var MaterialPD))
|
if (MaterialPPtr.TryGetPD(out var MaterialPD))
|
||||||
{
|
{
|
||||||
Materials.Add(MaterialPD);
|
Materials.Add(MaterialPD);
|
||||||
cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name);
|
cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name);
|
||||||
@ -96,7 +96,7 @@ namespace AssetStudio
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
#region get SkinnedMeshRenderer
|
#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);
|
Skins.Add(SkinnedMeshPD);
|
||||||
|
|
||||||
@ -104,7 +104,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
foreach (var MaterialPPtr in m_SkinnedMeshRenderer.m_Materials)
|
foreach (var MaterialPPtr in m_SkinnedMeshRenderer.m_Materials)
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(MaterialPPtr, out var MaterialPD))
|
if (MaterialPPtr.TryGetPD(out var MaterialPD))
|
||||||
{
|
{
|
||||||
Materials.Add(MaterialPD);
|
Materials.Add(MaterialPD);
|
||||||
cb2.AppendFormat("\n\n\t;Material::, Model::{0}", m_GameObject.m_Name);
|
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
|
//collect skeleton dummies to make sure they are exported
|
||||||
foreach (var bonePPtr in m_SkinnedMeshRenderer.m_Bones)
|
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);
|
LimbNodes.Add(m_Bone);
|
||||||
//also collect the root bone
|
//also collect the root bone
|
||||||
@ -136,9 +136,9 @@ namespace AssetStudio
|
|||||||
#region collect children because m_SkinnedMeshRenderer.m_Bones doesn't contain terminations
|
#region collect children because m_SkinnedMeshRenderer.m_Bones doesn't contain terminations
|
||||||
foreach (var ChildPPtr in b_Transform.m_Children)
|
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
|
//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)
|
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)
|
foreach (var m_TexEnv in m_Material.m_TexEnvs)
|
||||||
{
|
{
|
||||||
#region get Porsche material from json
|
#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))
|
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: \"ScalingMax\", \"Vector3D\", \"Vector\", \"\",0,0,0");
|
||||||
ob.Append("\n\t\t\tP: \"DefaultAttributeIndex\", \"int\", \"Integer\", \"\",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] });
|
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)
|
foreach (var SkinnedMeshPD in Skins)
|
||||||
{
|
{
|
||||||
SkinnedMeshRenderer m_SkinnedMeshRenderer = new SkinnedMeshRenderer(SkinnedMeshPD);
|
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
|
//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
|
//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++)
|
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;
|
int influences = 0, ibSplit = 0, wbSplit = 0;
|
||||||
StringBuilder ib = new StringBuilder();//indices (vertex)
|
StringBuilder ib = new StringBuilder();//indices (vertex)
|
||||||
|
17
AssetStudio/StudioClasses/FileIdentifier.cs
Normal file
17
AssetStudio/StudioClasses/FileIdentifier.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -64,7 +64,7 @@ namespace AssetStudio
|
|||||||
#endregion
|
#endregion
|
||||||
|
|
||||||
int value = 0;
|
int value = 0;
|
||||||
foreach (var sharedFile in assetsFile.sharedAssetsList)
|
foreach (var sharedFile in assetsFile.m_Externals)
|
||||||
{
|
{
|
||||||
var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
|
var sharedFilePath = Path.GetDirectoryName(fullName) + "\\" + sharedFile.fileName;
|
||||||
var sharedFileName = sharedFile.fileName;
|
var sharedFileName = sharedFile.fileName;
|
||||||
|
13
AssetStudio/StudioClasses/LocalSerializedObjectIdentifier.cs
Normal file
13
AssetStudio/StudioClasses/LocalSerializedObjectIdentifier.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -25,7 +25,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public ModelConverter(GameObject m_GameObject)
|
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);
|
var animator = new Animator(m_Animator);
|
||||||
InitWithAnimator(animator);
|
InitWithAnimator(animator);
|
||||||
@ -38,7 +38,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
public ModelConverter(GameObject m_GameObject, List<AssetPreloadData> animationList)
|
public ModelConverter(GameObject m_GameObject, List<AssetPreloadData> 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);
|
var animator = new Animator(m_Animator);
|
||||||
InitWithAnimator(animator);
|
InitWithAnimator(animator);
|
||||||
@ -71,16 +71,16 @@ namespace AssetStudio
|
|||||||
|
|
||||||
private void InitWithAnimator(Animator m_Animator)
|
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);
|
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);
|
InitWithGameObject(m_GameObject, m_Animator.m_HasTransformHierarchy);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void InitWithGameObject(GameObject m_GameObject, bool hasTransformHierarchy = true)
|
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;
|
var rootTransform = m_Transform;
|
||||||
if (!hasTransformHierarchy)
|
if (!hasTransformHierarchy)
|
||||||
{
|
{
|
||||||
@ -91,7 +91,7 @@ namespace AssetStudio
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
var frameList = new List<ImportedFrame>();
|
var frameList = new List<ImportedFrame>();
|
||||||
while (assetsfileList.TryGetTransform(rootTransform.m_Father, out var m_Father))
|
while (rootTransform.m_Father.TryGetTransform(out var m_Father))
|
||||||
{
|
{
|
||||||
frameList.Add(ConvertFrame(m_Father));
|
frameList.Add(ConvertFrame(m_Father));
|
||||||
rootTransform = m_Father;
|
rootTransform = m_Father;
|
||||||
@ -120,10 +120,10 @@ namespace AssetStudio
|
|||||||
|
|
||||||
private void ConvertMeshRenderer(Transform m_Transform)
|
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)
|
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)
|
switch (assetPreloadData.Type)
|
||||||
{
|
{
|
||||||
@ -144,7 +144,7 @@ namespace AssetStudio
|
|||||||
var m_Animation = new Animation(assetPreloadData);
|
var m_Animation = new Animation(assetPreloadData);
|
||||||
foreach (var animation in m_Animation.m_Animations)
|
foreach (var animation in m_Animation.m_Animations)
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(animation, out var animationClip))
|
if (animation.TryGetPD(out var animationClip))
|
||||||
{
|
{
|
||||||
animationClipHashSet.Add(animationClip);
|
animationClipHashSet.Add(animationClip);
|
||||||
}
|
}
|
||||||
@ -156,24 +156,24 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
foreach (var pptr in m_Transform.m_Children)
|
foreach (var pptr in m_Transform.m_Children)
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetTransform(pptr, out var child))
|
if (pptr.TryGetTransform(out var child))
|
||||||
ConvertMeshRenderer(child);
|
ConvertMeshRenderer(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void CollectAnimationClip(Animator m_Animator)
|
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)
|
if (assetPreloadData.Type == ClassIDReference.AnimatorOverrideController)
|
||||||
{
|
{
|
||||||
var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData);
|
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);
|
var m_AnimatorController = new AnimatorController(assetPreloadData);
|
||||||
foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips)
|
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);
|
animationClipHashSet.Add(assetPreloadData);
|
||||||
}
|
}
|
||||||
@ -192,7 +192,7 @@ namespace AssetStudio
|
|||||||
var m_AnimatorController = new AnimatorController(assetPreloadData);
|
var m_AnimatorController = new AnimatorController(assetPreloadData);
|
||||||
foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips)
|
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);
|
animationClipHashSet.Add(assetPreloadData);
|
||||||
}
|
}
|
||||||
@ -204,7 +204,7 @@ namespace AssetStudio
|
|||||||
private ImportedFrame ConvertFrame(Transform trans)
|
private ImportedFrame ConvertFrame(Transform trans)
|
||||||
{
|
{
|
||||||
var frame = new ImportedFrame();
|
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.Name = m_GameObject.m_Name;
|
||||||
frame.InitChildren(trans.m_Children.Count);
|
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] });
|
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)
|
foreach (var pptr in trans.m_Children)
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetTransform(pptr, out var child))
|
if (pptr.TryGetTransform(out var child))
|
||||||
ConvertFrames(child, frame);
|
ConvertFrames(child, frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -253,8 +253,8 @@ namespace AssetStudio
|
|||||||
if (mesh == null)
|
if (mesh == null)
|
||||||
return;
|
return;
|
||||||
var iMesh = new ImportedMesh();
|
var iMesh = new ImportedMesh();
|
||||||
assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject2);
|
meshR.m_GameObject.TryGetGameObject(out var m_GameObject2);
|
||||||
assetsfileList.TryGetTransform(m_GameObject2.m_Transform, out var meshTransform);
|
m_GameObject2.m_Transform.TryGetTransform(out var meshTransform);
|
||||||
iMesh.Name = GetTransformPath(meshTransform);
|
iMesh.Name = GetTransformPath(meshTransform);
|
||||||
iMesh.SubmeshList = new List<ImportedSubmesh>();
|
iMesh.SubmeshList = new List<ImportedSubmesh>();
|
||||||
var subHashSet = new HashSet<int>();
|
var subHashSet = new HashSet<int>();
|
||||||
@ -293,7 +293,7 @@ namespace AssetStudio
|
|||||||
Material mat = null;
|
Material mat = null;
|
||||||
if (i - firstSubMesh < meshR.m_Materials.Length)
|
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);
|
mat = new Material(MaterialPD);
|
||||||
}
|
}
|
||||||
@ -388,9 +388,9 @@ namespace AssetStudio
|
|||||||
for (int i = 0; i < sMesh.m_Bones.Length; i++)
|
for (int i = 0; i < sMesh.m_Bones.Length; i++)
|
||||||
{
|
{
|
||||||
var bone = new ImportedBone();
|
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;
|
bone.Name = m_GameObject.m_Name;
|
||||||
}
|
}
|
||||||
@ -536,7 +536,7 @@ namespace AssetStudio
|
|||||||
//TODO
|
//TODO
|
||||||
if (combine)
|
if (combine)
|
||||||
{
|
{
|
||||||
assetsfileList.TryGetGameObject(meshR.m_GameObject, out var m_GameObject);
|
meshR.m_GameObject.TryGetGameObject(out var m_GameObject);
|
||||||
foreach (var root in FrameList)
|
foreach (var root in FrameList)
|
||||||
{
|
{
|
||||||
var frame = ImportedHelpers.FindFrame(m_GameObject.m_Name, root);
|
var frame = ImportedHelpers.FindFrame(m_GameObject.m_Name, root);
|
||||||
@ -569,22 +569,22 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
if (meshR is SkinnedMeshRenderer sMesh)
|
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);
|
return new Mesh(MeshPD);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
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)
|
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)
|
if (assetPreloadData.Type == ClassIDReference.MeshFilter)
|
||||||
{
|
{
|
||||||
var m_MeshFilter = new MeshFilter(assetPreloadData);
|
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);
|
return new Mesh(MeshPD);
|
||||||
}
|
}
|
||||||
@ -599,7 +599,7 @@ namespace AssetStudio
|
|||||||
|
|
||||||
private string GetTransformPath(Transform meshTransform)
|
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 curFrame = ImportedHelpers.FindFrame(m_GameObject.m_Name, FrameList[0]);
|
||||||
var path = curFrame.Name;
|
var path = curFrame.Name;
|
||||||
while (curFrame.Parent != null)
|
while (curFrame.Parent != null)
|
||||||
@ -667,7 +667,7 @@ namespace AssetStudio
|
|||||||
foreach (var texEnv in mat.m_TexEnvs)
|
foreach (var texEnv in mat.m_TexEnvs)
|
||||||
{
|
{
|
||||||
Texture2D tex2D = null;
|
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);
|
tex2D = new Texture2D(TexturePD, true);
|
||||||
}
|
}
|
||||||
@ -986,7 +986,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
foreach (var pptr in m_Transform.m_Children)
|
foreach (var pptr in m_Transform.m_Children)
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetTransform(pptr, out var child))
|
if (pptr.TryGetTransform(out var child))
|
||||||
CreateBonePathHash(child);
|
CreateBonePathHash(child);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
16
AssetStudio/StudioClasses/ObjectInfo.cs
Normal file
16
AssetStudio/StudioClasses/ObjectInfo.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
88
AssetStudio/StudioClasses/PPtr.cs
Normal file
88
AssetStudio/StudioClasses/PPtr.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -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<AssetsFile> 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<AssetsFile> 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<AssetsFile> 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;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
17
AssetStudio/StudioClasses/SerializedFileHeader.cs
Normal file
17
AssetStudio/StudioClasses/SerializedFileHeader.cs
Normal file
@ -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;
|
||||||
|
}
|
||||||
|
}
|
@ -5,7 +5,6 @@ using System.Drawing.Drawing2D;
|
|||||||
using System.Drawing.Imaging;
|
using System.Drawing.Imaging;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using static AssetStudio.Studio;
|
|
||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
@ -13,12 +12,12 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public static Bitmap GetImageFromSprite(Sprite m_Sprite)
|
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 m_SpriteAtlas = new SpriteAtlas(assetPreloadData);
|
||||||
var index = m_SpriteAtlas.guids.FindIndex(x => x == m_Sprite.first);
|
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
|
try
|
||||||
{
|
{
|
||||||
@ -36,7 +35,7 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (assetsfileList.TryGetPD(m_Sprite.texture, out assetPreloadData))
|
if (m_Sprite.texture.TryGetPD(out assetPreloadData))
|
||||||
{
|
{
|
||||||
return CutImage(assetPreloadData, m_Sprite.textureRect);
|
return CutImage(assetPreloadData, m_Sprite.textureRect);
|
||||||
}
|
}
|
||||||
|
@ -15,7 +15,7 @@ namespace AssetStudio
|
|||||||
internal static class Studio
|
internal static class Studio
|
||||||
{
|
{
|
||||||
public static List<AssetsFile> assetsfileList = new List<AssetsFile>(); //loaded files
|
public static List<AssetsFile> assetsfileList = new List<AssetsFile>(); //loaded files
|
||||||
public static Dictionary<string, int> sharedFileIndex = new Dictionary<string, int>(); //to improve the loading speed
|
public static Dictionary<string, int> assetsFileIndexCache = new Dictionary<string, int>();
|
||||||
public static Dictionary<string, EndianBinaryReader> resourceFileReaders = new Dictionary<string, EndianBinaryReader>(); //use for read res files
|
public static Dictionary<string, EndianBinaryReader> resourceFileReaders = new Dictionary<string, EndianBinaryReader>(); //use for read res files
|
||||||
public static List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>(); //used to hold all assets while the ListView is filtered
|
public static List<AssetPreloadData> exportableAssets = new List<AssetPreloadData>(); //used to hold all assets while the ListView is filtered
|
||||||
private static HashSet<string> assetsNameHash = new HashSet<string>(); //avoid the same name asset
|
private static HashSet<string> assetsNameHash = new HashSet<string>(); //avoid the same name asset
|
||||||
@ -251,7 +251,7 @@ namespace AssetStudio
|
|||||||
case ClassIDReference.MonoBehaviour:
|
case ClassIDReference.MonoBehaviour:
|
||||||
{
|
{
|
||||||
var m_MonoBehaviour = new MonoBehaviour(asset);
|
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);
|
var m_Script = new MonoScript(script);
|
||||||
asset.Text = m_Script.m_ClassName;
|
asset.Text = m_Script.m_ClassName;
|
||||||
@ -337,67 +337,63 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
foreach (var m_Component in m_GameObject.m_Components)
|
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];
|
switch (asset.Type)
|
||||||
if (sourceFile.preloadTable.TryGetValue(m_Component.m_PathID, out var asset))
|
|
||||||
{
|
{
|
||||||
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;
|
var m_MeshFilter = new MeshFilter(assetPreloadData);
|
||||||
break;
|
if (m_MeshFilter.m_Mesh.TryGetPD(out assetPreloadData))
|
||||||
}
|
|
||||||
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);
|
assetPreloadData.gameObject = m_GameObject;
|
||||||
if (assetsfileList.TryGetPD(m_MeshFilter.m_Mesh, out assetPreloadData))
|
|
||||||
{
|
|
||||||
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;
|
var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData);
|
||||||
if (assetsfileList.TryGetPD(m_Component, out var assetPreloadData))
|
if (m_SkinnedMeshRenderer.m_Mesh.TryGetPD(out assetPreloadData))
|
||||||
{
|
{
|
||||||
var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData);
|
assetPreloadData.gameObject = m_GameObject;
|
||||||
if (assetsfileList.TryGetPD(m_SkinnedMeshRenderer.m_Mesh, out assetPreloadData))
|
|
||||||
{
|
|
||||||
assetPreloadData.gameObject = m_GameObject;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
case ClassIDReference.Animator:
|
break;
|
||||||
{
|
}
|
||||||
m_GameObject.m_Animator = m_Component;
|
case ClassIDReference.Animator:
|
||||||
asset.Text = m_GameObject.preloadData.Text;
|
{
|
||||||
break;
|
m_GameObject.m_Animator = m_Component;
|
||||||
}
|
asset.Text = m_GameObject.preloadData.Text;
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var parentNode = fileNode;
|
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))
|
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($"\tint m_FileID = {m_MonoBehaviour.m_Script.m_FileID}");
|
||||||
sb.AppendLine($"\tint64 m_PathID = {m_MonoBehaviour.m_Script.m_PathID}");
|
sb.AppendLine($"\tint64 m_PathID = {m_MonoBehaviour.m_Script.m_PathID}");
|
||||||
sb.AppendLine($"string m_Name = \"{m_MonoBehaviour.m_Name}\"");
|
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);
|
var m_Script = new MonoScript(script);
|
||||||
if (!LoadedModuleDic.TryGetValue(m_Script.m_AssemblyName, out var module))
|
if (!LoadedModuleDic.TryGetValue(m_Script.m_AssemblyName, out var module))
|
||||||
|
@ -8,9 +8,9 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public class TypeItem : ListViewItem
|
public class TypeItem : ListViewItem
|
||||||
{
|
{
|
||||||
public List<TypeTree> typeTreeList;
|
public List<TypeTreeNode> typeTreeList;
|
||||||
|
|
||||||
public TypeItem(int classID, List<TypeTree> typeTreeList)
|
public TypeItem(int classID, List<TypeTreeNode> typeTreeList)
|
||||||
{
|
{
|
||||||
this.typeTreeList = typeTreeList;
|
this.typeTreeList = typeTreeList;
|
||||||
Text = typeTreeList[0].m_Type + " " + typeTreeList[0].m_Name;
|
Text = typeTreeList[0].m_Type + " " + typeTreeList[0].m_Name;
|
||||||
@ -22,7 +22,7 @@ namespace AssetStudio
|
|||||||
var sb = new StringBuilder();
|
var sb = new StringBuilder();
|
||||||
foreach (var i in typeTreeList)
|
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();
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,7 @@ namespace AssetStudio
|
|||||||
{
|
{
|
||||||
public static class TypeTreeHelper
|
public static class TypeTreeHelper
|
||||||
{
|
{
|
||||||
public static void ReadTypeString(StringBuilder sb, List<TypeTree> members, EndianBinaryReader reader)
|
public static void ReadTypeString(StringBuilder sb, List<TypeTreeNode> members, EndianBinaryReader reader)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < members.Count; i++)
|
for (int i = 0; i < members.Count; i++)
|
||||||
{
|
{
|
||||||
@ -17,10 +17,10 @@ namespace AssetStudio
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void ReadStringValue(StringBuilder sb, List<TypeTree> members, EndianBinaryReader reader, ref int i)
|
private static void ReadStringValue(StringBuilder sb, List<TypeTreeNode> members, EndianBinaryReader reader, ref int i)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var member = members[i];
|
||||||
var level = member.m_Depth;
|
var level = member.m_Level;
|
||||||
var varTypeStr = member.m_Type;
|
var varTypeStr = member.m_Type;
|
||||||
var varNameStr = member.m_Name;
|
var varNameStr = member.m_Name;
|
||||||
object value = null;
|
object value = null;
|
||||||
@ -106,7 +106,7 @@ namespace AssetStudio
|
|||||||
var map = GetMembers(members, level, i);
|
var map = GetMembers(members, level, i);
|
||||||
i += map.Count - 1;
|
i += map.Count - 1;
|
||||||
map.RemoveRange(0, 4);
|
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);
|
map.RemoveRange(0, first.Count);
|
||||||
var second = map;
|
var second = map;
|
||||||
for (int j = 0; j < size; j++)
|
for (int j = 0; j < size; j++)
|
||||||
@ -154,7 +154,7 @@ namespace AssetStudio
|
|||||||
reader.AlignStream(4);
|
reader.AlignStream(4);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static ExpandoObject ReadDynamicType(List<TypeTree> members, EndianBinaryReader reader)
|
public static ExpandoObject ReadDynamicType(List<TypeTreeNode> members, EndianBinaryReader reader)
|
||||||
{
|
{
|
||||||
var obj = new ExpandoObject();
|
var obj = new ExpandoObject();
|
||||||
var objdic = (IDictionary<string, object>)obj;
|
var objdic = (IDictionary<string, object>)obj;
|
||||||
@ -167,10 +167,10 @@ namespace AssetStudio
|
|||||||
return obj;
|
return obj;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static object ReadValue(List<TypeTree> members, EndianBinaryReader reader, ref int i)
|
private static object ReadValue(List<TypeTreeNode> members, EndianBinaryReader reader, ref int i)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var member = members[i];
|
||||||
var level = member.m_Depth;
|
var level = member.m_Level;
|
||||||
var varTypeStr = member.m_Type;
|
var varTypeStr = member.m_Type;
|
||||||
object value;
|
object value;
|
||||||
var align = (member.m_MetaFlag & 0x4000) != 0;
|
var align = (member.m_MetaFlag & 0x4000) != 0;
|
||||||
@ -246,7 +246,7 @@ namespace AssetStudio
|
|||||||
var map = GetMembers(members, level, i);
|
var map = GetMembers(members, level, i);
|
||||||
i += map.Count - 1;
|
i += map.Count - 1;
|
||||||
map.RemoveRange(0, 4);
|
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);
|
map.RemoveRange(0, first.Count);
|
||||||
var second = map;
|
var second = map;
|
||||||
for (int j = 0; j < size; j++)
|
for (int j = 0; j < size; j++)
|
||||||
@ -291,14 +291,14 @@ namespace AssetStudio
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<TypeTree> GetMembers(List<TypeTree> members, int level, int index)
|
private static List<TypeTreeNode> GetMembers(List<TypeTreeNode> members, int level, int index)
|
||||||
{
|
{
|
||||||
var member2 = new List<TypeTree>();
|
var member2 = new List<TypeTreeNode>();
|
||||||
member2.Add(members[0]);
|
member2.Add(members[0]);
|
||||||
for (int i = index + 1; i < members.Count; i++)
|
for (int i = index + 1; i < members.Count; i++)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var member = members[i];
|
||||||
var level2 = member.m_Depth;
|
var level2 = member.m_Level;
|
||||||
if (level2 <= level)
|
if (level2 <= level)
|
||||||
{
|
{
|
||||||
return member2;
|
return member2;
|
||||||
@ -308,7 +308,7 @@ namespace AssetStudio
|
|||||||
return member2;
|
return member2;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static byte[] WriteDynamicType(ExpandoObject obj, List<TypeTree> members)
|
public static byte[] WriteDynamicType(ExpandoObject obj, List<TypeTreeNode> members)
|
||||||
{
|
{
|
||||||
var stream = new MemoryStream();
|
var stream = new MemoryStream();
|
||||||
var write = new BinaryWriter(stream);
|
var write = new BinaryWriter(stream);
|
||||||
@ -322,10 +322,10 @@ namespace AssetStudio
|
|||||||
return stream.ToArray();
|
return stream.ToArray();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void WriteValue(object value, List<TypeTree> members, BinaryWriter write, ref int i)
|
private static void WriteValue(object value, List<TypeTreeNode> members, BinaryWriter write, ref int i)
|
||||||
{
|
{
|
||||||
var member = members[i];
|
var member = members[i];
|
||||||
var level = member.m_Depth;
|
var level = member.m_Level;
|
||||||
var varTypeStr = member.m_Type;
|
var varTypeStr = member.m_Type;
|
||||||
var align = (member.m_MetaFlag & 0x4000) != 0;
|
var align = (member.m_MetaFlag & 0x4000) != 0;
|
||||||
switch (varTypeStr)
|
switch (varTypeStr)
|
||||||
@ -401,7 +401,7 @@ namespace AssetStudio
|
|||||||
var map = GetMembers(members, level, i);
|
var map = GetMembers(members, level, i);
|
||||||
i += map.Count - 1;
|
i += map.Count - 1;
|
||||||
map.RemoveRange(0, 4);
|
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);
|
map.RemoveRange(0, first.Count);
|
||||||
var second = map;
|
var second = map;
|
||||||
for (int j = 0; j < size; j++)
|
for (int j = 0; j < size; j++)
|
||||||
|
@ -5,7 +5,7 @@ using System.Text;
|
|||||||
|
|
||||||
namespace AssetStudio
|
namespace AssetStudio
|
||||||
{
|
{
|
||||||
public class TypeTree
|
public class TypeTreeNode
|
||||||
{
|
{
|
||||||
public string m_Type;
|
public string m_Type;
|
||||||
public string m_Name;
|
public string m_Name;
|
||||||
@ -14,6 +14,6 @@ namespace AssetStudio
|
|||||||
public int m_IsArray;
|
public int m_IsArray;
|
||||||
public int m_Version;
|
public int m_Version;
|
||||||
public int m_MetaFlag;
|
public int m_MetaFlag;
|
||||||
public int m_Depth;
|
public int m_Level;
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user