diff --git a/AssetStudio/AssetStudio.csproj b/AssetStudio/AssetStudio.csproj index 3073569..1c5caba 100644 --- a/AssetStudio/AssetStudio.csproj +++ b/AssetStudio/AssetStudio.csproj @@ -171,6 +171,7 @@ + @@ -204,7 +205,7 @@ - + diff --git a/AssetStudio/AssetStudioForm.cs b/AssetStudio/AssetStudioForm.cs index 04111d4..3e4cc37 100644 --- a/AssetStudio/AssetStudioForm.cs +++ b/AssetStudio/AssetStudioForm.cs @@ -20,8 +20,8 @@ namespace AssetStudio { partial class AssetStudioForm : Form { - private AssetPreloadData lastSelectedItem; - private AssetPreloadData lastLoadedAsset; + private AssetItem lastSelectedItem; + private AssetItem lastLoadedAsset; private FMOD.System system; private FMOD.Sound sound; @@ -194,6 +194,7 @@ namespace AssetStudio { sceneTreeView.BeginUpdate(); sceneTreeView.Nodes.AddRange(treeNodeCollection.ToArray()); + treeNodeCollection.Clear(); foreach (TreeNode node in sceneTreeView.Nodes) { node.HideCheckBox(); @@ -580,7 +581,7 @@ namespace AssetStudio switch (e.Column) { case 0: - visibleAssets.Sort(delegate (AssetPreloadData a, AssetPreloadData b) + visibleAssets.Sort(delegate (AssetItem a, AssetItem b) { int xdiff = reverseSort ? b.Text.CompareTo(a.Text) : a.Text.CompareTo(b.Text); if (xdiff != 0) return xdiff; @@ -588,7 +589,7 @@ namespace AssetStudio }); break; case 1: - visibleAssets.Sort(delegate (AssetPreloadData a, AssetPreloadData b) + visibleAssets.Sort(delegate (AssetItem a, AssetItem b) { int xdiff = reverseSort ? b.TypeString.CompareTo(a.TypeString) : a.TypeString.CompareTo(b.TypeString); if (xdiff != 0) return xdiff; @@ -596,7 +597,7 @@ namespace AssetStudio }); break; case 2: - visibleAssets.Sort(delegate (AssetPreloadData a, AssetPreloadData b) + visibleAssets.Sort(delegate (AssetItem a, AssetItem b) { int xdiff = reverseSort ? b.FullSize.CompareTo(a.FullSize) : a.FullSize.CompareTo(b.FullSize); if (xdiff != 0) return xdiff; @@ -625,7 +626,7 @@ namespace AssetStudio FMODreset(); - lastSelectedItem = (AssetPreloadData)e.Item; + lastSelectedItem = (AssetItem)e.Item; if (e.IsSelected) { @@ -650,14 +651,15 @@ namespace AssetStudio } } - private void PreviewAsset(AssetPreloadData asset) + private void PreviewAsset(AssetItem asset) { + var reader = asset.reader; switch (asset.Type) { case ClassIDType.Texture2D: { imageTexture?.Dispose(); - var m_Texture2D = new Texture2D(asset, true); + var m_Texture2D = new Texture2D(reader, true); //Info asset.InfoText = $"Width: {m_Texture2D.m_Width}\nHeight: {m_Texture2D.m_Height}\nFormat: {m_Texture2D.m_TextureFormat}"; @@ -692,7 +694,7 @@ namespace AssetStudio } case ClassIDType.AudioClip: { - var m_AudioClip = new AudioClip(asset, true); + var m_AudioClip = new AudioClip(reader, true); //Info asset.InfoText = "Compression format: "; @@ -814,7 +816,7 @@ namespace AssetStudio } case ClassIDType.Shader: { - Shader m_TextAsset = new Shader(asset); + Shader m_TextAsset = new Shader(reader); string m_Script_Text = Encoding.UTF8.GetString(m_TextAsset.m_Script); m_Script_Text = Regex.Replace(m_Script_Text, "(? 0) { viewMatrixData = Matrix4.CreateRotationY(-(float)Math.PI / 4) * Matrix4.CreateRotationX(-(float)Math.PI / 6); @@ -1055,7 +1056,7 @@ namespace AssetStudio case ClassIDType.Sprite: { imageTexture?.Dispose(); - imageTexture = SpriteHelper.GetImageFromSprite(new Sprite(asset)); + imageTexture = SpriteHelper.GetImageFromSprite(new Sprite(reader)); if (imageTexture != null) { asset.InfoText = $"Width: {imageTexture.Width}\nHeight: {imageTexture.Height}\n"; @@ -1083,7 +1084,7 @@ namespace AssetStudio } default: { - var str = asset.Dump(); + var str = reader.Dump(); if (str != null) { textPreviewBox.Text = str; @@ -1373,7 +1374,7 @@ namespace AssetStudio { timer.Stop(); - List toExportAssets = null; + List toExportAssets = null; switch (((ToolStripItem)sender).Name) { case "exportAllAssetsMenuItem": @@ -1383,10 +1384,10 @@ namespace AssetStudio toExportAssets = visibleAssets; break; case "exportSelectedAssetsMenuItem": - toExportAssets = new List(assetListView.SelectedIndices.Count); + toExportAssets = new List(assetListView.SelectedIndices.Count); foreach (int i in assetListView.SelectedIndices) { - toExportAssets.Add((AssetPreloadData)assetListView.Items[i]); + toExportAssets.Add((AssetItem)assetListView.Items[i]); } break; } @@ -1804,7 +1805,7 @@ namespace AssetStudio private void showOriginalFileToolStripMenuItem_Click(object sender, EventArgs e) { - var selectasset = (AssetPreloadData)assetListView.Items[assetListView.SelectedIndices[0]]; + var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; var args = $"/select, \"{selectasset.sourceFile.parentPath ?? selectasset.sourceFile.filePath}\""; var pfi = new ProcessStartInfo("explorer.exe", args); Process.Start(pfi); @@ -1812,8 +1813,8 @@ namespace AssetStudio private void exportAnimatorwithAnimationClipMenuItem_Click(object sender, EventArgs e) { - AssetPreloadData animator = null; - List animationList = new List(); + AssetItem animator = null; + List animationList = new List(); var selectedAssets = GetSelectedAssets(); foreach (var assetPreloadData in selectedAssets) { @@ -1877,7 +1878,7 @@ namespace AssetStudio private void jumpToSceneHierarchyToolStripMenuItem_Click(object sender, EventArgs e) { - var selectasset = (AssetPreloadData)assetListView.Items[assetListView.SelectedIndices[0]]; + var selectasset = (AssetItem)assetListView.Items[assetListView.SelectedIndices[0]]; if (selectasset.gameObject != null) { sceneTreeView.SelectedNode = treeNodeDictionary[selectasset.gameObject]; @@ -1904,12 +1905,12 @@ namespace AssetStudio } } - private List GetSelectedAssets() + private List GetSelectedAssets() { - var selectedAssets = new List(); + var selectedAssets = new List(); foreach (int index in assetListView.SelectedIndices) { - selectedAssets.Add((AssetPreloadData)assetListView.Items[index]); + selectedAssets.Add((AssetItem)assetListView.Items[index]); } return selectedAssets; diff --git a/AssetStudio/Classes/Animation.cs b/AssetStudio/Classes/Animation.cs index c7f59d5..f206a6e 100644 --- a/AssetStudio/Classes/Animation.cs +++ b/AssetStudio/Classes/Animation.cs @@ -9,14 +9,14 @@ namespace AssetStudio { public List m_Animations; - public Animation(AssetPreloadData preloadData) : base(preloadData) + public Animation(ObjectReader reader) : base(reader) { - var m_Animation = sourceFile.ReadPPtr(); + var m_Animation = reader.ReadPPtr(); int numAnimations = reader.ReadInt32(); m_Animations = new List(numAnimations); for (int i = 0; i < numAnimations; i++) { - m_Animations.Add(sourceFile.ReadPPtr()); + m_Animations.Add(reader.ReadPPtr()); } } } diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index f52960c..4d85a5b 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -19,13 +19,13 @@ namespace AssetStudio public T outWeight { get; set; } - public Keyframe(EndianBinaryReader reader, Func readerFunc, int[] version) + public Keyframe(ObjectReader reader, Func readerFunc) { time = reader.ReadSingle(); value = readerFunc(); inSlope = readerFunc(); outSlope = readerFunc(); - if (version[0] >= 2018) + if (reader.version[0] >= 2018) { weightedMode = reader.ReadInt32(); inWeight = readerFunc(); @@ -41,13 +41,14 @@ namespace AssetStudio public int m_PostInfinity { get; set; } public int m_RotationOrder { get; set; } - public AnimationCurve(EndianBinaryReader reader, Func readerFunc, int[] version) + public AnimationCurve(ObjectReader reader, Func readerFunc) { + var version = reader.version; int numCurves = reader.ReadInt32(); m_Curve = new List>(numCurves); for (int i = 0; i < numCurves; i++) { - m_Curve.Add(new Keyframe(reader, readerFunc, version)); + m_Curve.Add(new Keyframe(reader, readerFunc)); } m_PreInfinity = reader.ReadInt32(); @@ -64,9 +65,9 @@ namespace AssetStudio public AnimationCurve curve { get; set; } public string path { get; set; } - public QuaternionCurve(EndianBinaryReader reader, int[] version) + public QuaternionCurve(ObjectReader reader) { - curve = new AnimationCurve(reader, reader.ReadQuaternion, version); + curve = new AnimationCurve(reader, reader.ReadQuaternion); path = reader.ReadAlignedString(); } } @@ -79,7 +80,7 @@ namespace AssetStudio public byte[] m_Data { get; set; } public byte m_BitSize { get; set; } - public PackedFloatVector(EndianBinaryReader reader) + public PackedFloatVector(ObjectReader reader) { m_NumItems = reader.ReadUInt32(); m_Range = reader.ReadSingle(); @@ -138,7 +139,7 @@ namespace AssetStudio public byte[] m_Data { get; set; } public byte m_BitSize { get; set; } - public PackedIntVector(EndianBinaryReader reader) + public PackedIntVector(ObjectReader reader) { m_NumItems = reader.ReadUInt32(); @@ -182,7 +183,7 @@ namespace AssetStudio public uint m_NumItems { get; set; } public byte[] m_Data { get; set; } - public PackedQuatVector(EndianBinaryReader reader) + public PackedQuatVector(ObjectReader reader) { m_NumItems = reader.ReadUInt32(); @@ -266,7 +267,7 @@ namespace AssetStudio public int m_PreInfinity { get; set; } public int m_PostInfinity { get; set; } - public CompressedAnimationCurve(EndianBinaryReader reader) + public CompressedAnimationCurve(ObjectReader reader) { m_Path = reader.ReadAlignedString(); m_Times = new PackedIntVector(reader); @@ -282,9 +283,9 @@ namespace AssetStudio public AnimationCurve curve { get; set; } public string path { get; set; } - public Vector3Curve(EndianBinaryReader reader, int[] version) + public Vector3Curve(ObjectReader reader) { - curve = new AnimationCurve(reader, reader.ReadVector3, version); + curve = new AnimationCurve(reader, reader.ReadVector3); path = reader.ReadAlignedString(); } } @@ -298,14 +299,13 @@ namespace AssetStudio public PPtr script { get; set; } - public FloatCurve(AssetPreloadData preloadData) + public FloatCurve(ObjectReader reader) { - var reader = preloadData.sourceFile.reader; - curve = new AnimationCurve(reader, reader.ReadSingle, preloadData.sourceFile.version); + curve = new AnimationCurve(reader, reader.ReadSingle); attribute = reader.ReadAlignedString(); path = reader.ReadAlignedString(); classID = reader.ReadInt32(); - script = preloadData.sourceFile.ReadPPtr(); + script = reader.ReadPPtr(); } } @@ -315,11 +315,10 @@ namespace AssetStudio public PPtr value { get; set; } - public PPtrKeyframe(AssetPreloadData preloadData) + public PPtrKeyframe(ObjectReader reader) { - var reader = preloadData.sourceFile.reader; time = reader.ReadSingle(); - value = preloadData.sourceFile.ReadPPtr(); + value = reader.ReadPPtr(); } } @@ -332,21 +331,19 @@ namespace AssetStudio public PPtr script { get; set; } - public PPtrCurve(AssetPreloadData preloadData) + public PPtrCurve(ObjectReader reader) { - var reader = preloadData.sourceFile.reader; - int numCurves = reader.ReadInt32(); curve = new List(numCurves); for (int i = 0; i < numCurves; i++) { - curve.Add(new PPtrKeyframe(preloadData)); + curve.Add(new PPtrKeyframe(reader)); } attribute = reader.ReadAlignedString(); path = reader.ReadAlignedString(); classID = reader.ReadInt32(); - script = preloadData.sourceFile.ReadPPtr(); + script = reader.ReadPPtr(); } } @@ -355,7 +352,7 @@ namespace AssetStudio public Vector3 m_Center { get; set; } public Vector3 m_Extend { get; set; } - public AABB(EndianBinaryReader reader) + public AABB(ObjectReader reader) { m_Center = reader.ReadVector3(); m_Extend = reader.ReadVector3(); @@ -368,8 +365,9 @@ namespace AssetStudio public Quaternion q { get; set; } public object s { get; set; } - public xform(EndianBinaryReader reader, int[] version) + public xform(ObjectReader reader) { + var version = reader.version; t = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up q = reader.ReadQuaternion(); s = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up @@ -385,9 +383,9 @@ namespace AssetStudio public float m_InOut { get; set; } public float m_Grab { get; set; } - public HandPose(EndianBinaryReader reader, int[] version) + public HandPose(ObjectReader reader) { - m_GrabX = new xform(reader, version); + m_GrabX = new xform(reader); int numDoFs = reader.ReadInt32(); m_DoFArray = reader.ReadSingleArray(numDoFs); @@ -407,9 +405,10 @@ namespace AssetStudio public object m_HintT { get; set; } public float m_HintWeightT { get; set; } - public HumanGoal(EndianBinaryReader reader, int[] version) + public HumanGoal(ObjectReader reader) { - m_X = new xform(reader, version); + var version = reader.version; + m_X = new xform(reader); m_WeightT = reader.ReadSingle(); m_WeightR = reader.ReadSingle(); if (version[0] >= 5)//5.0 and up @@ -431,9 +430,10 @@ namespace AssetStudio public float[] m_DoFArray { get; set; } public object[] m_TDoFArray { get; set; } - public HumanPose(EndianBinaryReader reader, int[] version) + public HumanPose(ObjectReader reader) { - m_RootX = new xform(reader, version); + var version = reader.version; + m_RootX = new xform(reader); m_LookAtPosition = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up m_LookAtWeight = reader.ReadVector4(); @@ -441,11 +441,11 @@ namespace AssetStudio m_GoalArray = new List(numGoals); for (int i = 0; i < numGoals; i++) { - m_GoalArray.Add(new HumanGoal(reader, version)); + m_GoalArray.Add(new HumanGoal(reader)); } - m_LeftHandPose = new HandPose(reader, version); - m_RightHandPose = new HandPose(reader, version); + m_LeftHandPose = new HandPose(reader); + m_RightHandPose = new HandPose(reader); int numDoFs = reader.ReadInt32(); m_DoFArray = reader.ReadSingleArray(numDoFs); @@ -467,7 +467,7 @@ namespace AssetStudio public uint[] data { get; set; } public uint curveCount { get; set; } - public StreamedClip(EndianBinaryReader reader) + public StreamedClip(ObjectReader reader) { int numData = reader.ReadInt32(); data = reader.ReadUInt32Array(numData); @@ -570,7 +570,7 @@ namespace AssetStudio public float m_BeginTime { get; set; } public float[] m_SampleArray { get; set; } - public DenseClip(EndianBinaryReader reader) + public DenseClip(ObjectReader reader) { m_FrameCount = reader.ReadInt32(); m_CurveCount = reader.ReadUInt32(); @@ -586,7 +586,7 @@ namespace AssetStudio { public float[] data { get; set; } - public ConstantClip(EndianBinaryReader reader) + public ConstantClip(ObjectReader reader) { int numData = reader.ReadInt32(); data = reader.ReadSingleArray(numData); @@ -600,8 +600,9 @@ namespace AssetStudio public uint m_Type { get; set; } public uint m_Index { get; set; } - public ValueConstant(EndianBinaryReader reader, int[] version) + public ValueConstant(ObjectReader reader) { + var version = reader.version; m_ID = reader.ReadUInt32(); if (version[0] < 5 || (version[0] == 5 && version[1] < 5))//5.5 down { @@ -616,13 +617,13 @@ namespace AssetStudio { public List m_ValueArray { get; set; } - public ValueArrayConstant(EndianBinaryReader reader, int[] version) + public ValueArrayConstant(ObjectReader reader) { int numVals = reader.ReadInt32(); m_ValueArray = new List(numVals); for (int i = 0; i < numVals; i++) { - m_ValueArray.Add(new ValueConstant(reader, version)); + m_ValueArray.Add(new ValueConstant(reader)); } } } @@ -634,15 +635,16 @@ namespace AssetStudio public ConstantClip m_ConstantClip { get; set; } public ValueArrayConstant m_Binding { get; set; } - public Clip(EndianBinaryReader reader, int[] version) + public Clip(ObjectReader reader) { + var version = reader.version; m_StreamedClip = new StreamedClip(reader); m_DenseClip = new DenseClip(reader); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { m_ConstantClip = new ConstantClip(reader); } - m_Binding = new ValueArrayConstant(reader, version); + m_Binding = new ValueArrayConstant(reader); } } @@ -651,7 +653,7 @@ namespace AssetStudio public float m_Start { get; set; } public float m_Stop { get; set; } - public ValueDelta(EndianBinaryReader reader) + public ValueDelta(ObjectReader reader) { m_Start = reader.ReadSingle(); m_Stop = reader.ReadSingle(); @@ -690,23 +692,24 @@ namespace AssetStudio public bool m_KeepOriginalPositionXZ { get; set; } public bool m_HeightFromFeet { get; set; } - public ClipMuscleConstant(EndianBinaryReader reader, int[] version) + public ClipMuscleConstant(ObjectReader reader) { - m_DeltaPose = new HumanPose(reader, version); - m_StartX = new xform(reader, version); + var version = reader.version; + m_DeltaPose = new HumanPose(reader); + m_StartX = new xform(reader); if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up { - m_StopX = new xform(reader, version); + m_StopX = new xform(reader); } - m_LeftFootStartX = new xform(reader, version); - m_RightFootStartX = new xform(reader, version); + m_LeftFootStartX = new xform(reader); + m_RightFootStartX = new xform(reader); if (version[0] < 5)//5.0 down { - m_MotionStartX = new xform(reader, version); - m_MotionStopX = new xform(reader, version); + m_MotionStartX = new xform(reader); + m_MotionStopX = new xform(reader); } m_AverageSpeed = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? (object)reader.ReadVector3() : (object)reader.ReadVector4();//5.4 and up - m_Clip = new Clip(reader, version); + m_Clip = new Clip(reader); m_StartTime = reader.ReadSingle(); m_StopTime = reader.ReadSingle(); m_OrientationOffsetY = reader.ReadSingle(); @@ -763,13 +766,12 @@ namespace AssetStudio public byte customType { get; set; } public byte isPPtrCurve { get; set; } - public GenericBinding(AssetPreloadData preloadData) + public GenericBinding(ObjectReader reader) { - var reader = preloadData.sourceFile.reader; - var version = preloadData.sourceFile.version; + var version = reader.version; path = reader.ReadUInt32(); attribute = reader.ReadUInt32(); - script = preloadData.sourceFile.ReadPPtr(); + script = reader.ReadPPtr(); if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up { typeID = reader.ReadInt32(); @@ -789,21 +791,20 @@ namespace AssetStudio public List genericBindings { get; set; } public List pptrCurveMapping { get; set; } - public AnimationClipBindingConstant(AssetPreloadData preloadData) + public AnimationClipBindingConstant(ObjectReader reader) { - var reader = preloadData.sourceFile.reader; int numBindings = reader.ReadInt32(); genericBindings = new List(numBindings); for (int i = 0; i < numBindings; i++) { - genericBindings.Add(new GenericBinding(preloadData)); + genericBindings.Add(new GenericBinding(reader)); } int numMappings = reader.ReadInt32(); pptrCurveMapping = new List(numMappings); for (int i = 0; i < numMappings; i++) { - pptrCurveMapping.Add(preloadData.sourceFile.ReadPPtr()); + pptrCurveMapping.Add(reader.ReadPPtr()); } } @@ -852,7 +853,7 @@ namespace AssetStudio //public List m_Events { get; set; } - public AnimationClip(AssetPreloadData preloadData) : base(preloadData) + public AnimationClip(ObjectReader reader) : base(reader) { if (version[0] >= 5)//5.0 and up { @@ -878,7 +879,7 @@ namespace AssetStudio m_RotationCurves = new List(numRCurves); for (int i = 0; i < numRCurves; i++) { - m_RotationCurves.Add(new QuaternionCurve(reader, version)); + m_RotationCurves.Add(new QuaternionCurve(reader)); } int numCRCurves = reader.ReadInt32(); @@ -894,7 +895,7 @@ namespace AssetStudio m_EulerCurves = new List(numEulerCurves); for (int i = 0; i < numEulerCurves; i++) { - m_EulerCurves.Add(new Vector3Curve(reader, version)); + m_EulerCurves.Add(new Vector3Curve(reader)); } } @@ -902,21 +903,21 @@ namespace AssetStudio m_PositionCurves = new List(numPCurves); for (int i = 0; i < numPCurves; i++) { - m_PositionCurves.Add(new Vector3Curve(reader, version)); + m_PositionCurves.Add(new Vector3Curve(reader)); } int numSCurves = reader.ReadInt32(); m_ScaleCurves = new List(numSCurves); for (int i = 0; i < numSCurves; i++) { - m_ScaleCurves.Add(new Vector3Curve(reader, version)); + m_ScaleCurves.Add(new Vector3Curve(reader)); } int numFCurves = reader.ReadInt32(); m_FloatCurves = new List(numFCurves); for (int i = 0; i < numFCurves; i++) { - m_FloatCurves.Add(new FloatCurve(preloadData)); + m_FloatCurves.Add(new FloatCurve(reader)); } if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up @@ -925,7 +926,7 @@ namespace AssetStudio m_PPtrCurves = new List(numPtrCurves); for (int i = 0; i < numPtrCurves; i++) { - m_PPtrCurves.Add(new PPtrCurve(preloadData)); + m_PPtrCurves.Add(new PPtrCurve(reader)); } } @@ -938,11 +939,11 @@ namespace AssetStudio if (version[0] >= 4)//4.0 and up { m_MuscleClipSize = reader.ReadUInt32(); - m_MuscleClip = new ClipMuscleConstant(reader, version); + m_MuscleClip = new ClipMuscleConstant(reader); } if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - m_ClipBindingConstant = new AnimationClipBindingConstant(preloadData); + m_ClipBindingConstant = new AnimationClipBindingConstant(reader); } /*int numEvents = reader.ReadInt32(); m_Events = new List(numEvents); diff --git a/AssetStudio/Classes/Animator.cs b/AssetStudio/Classes/Animator.cs index 6a41ca7..1acc45e 100644 --- a/AssetStudio/Classes/Animator.cs +++ b/AssetStudio/Classes/Animator.cs @@ -11,10 +11,10 @@ namespace AssetStudio public PPtr m_Controller; public bool m_HasTransformHierarchy; - public Animator(AssetPreloadData preloadData) : base(preloadData) + public Animator(ObjectReader reader) : base(reader) { - m_Avatar = sourceFile.ReadPPtr(); - m_Controller = sourceFile.ReadPPtr(); + m_Avatar = reader.ReadPPtr(); + m_Controller = reader.ReadPPtr(); var m_CullingMode = reader.ReadInt32(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 5)) //4.5 and up diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index f9e533f..e83b825 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -12,11 +12,11 @@ namespace AssetStudio public uint word1 { get; set; } public uint word2 { get; set; } - public HumanPoseMask(EndianBinaryReader reader, int[] version) + public HumanPoseMask(ObjectReader reader) { word0 = reader.ReadUInt32(); word1 = reader.ReadUInt32(); - if (version[0] >= 5) //5.0 and up + if (reader.version[0] >= 5) //5.0 and up { word2 = reader.ReadUInt32(); } @@ -28,7 +28,7 @@ namespace AssetStudio public uint m_PathHash { get; set; } public float m_Weight { get; set; } - public SkeletonMaskElement(EndianBinaryReader reader) + public SkeletonMaskElement(ObjectReader reader) { m_PathHash = reader.ReadUInt32(); m_Weight = reader.ReadSingle(); @@ -39,7 +39,7 @@ namespace AssetStudio { public SkeletonMaskElement[] m_Data { get; set; } - public SkeletonMask(EndianBinaryReader reader) + public SkeletonMask(ObjectReader reader) { int numElements = reader.ReadInt32(); m_Data = new SkeletonMaskElement[numElements]; @@ -62,11 +62,11 @@ namespace AssetStudio public bool m_IKPass { get; set; } public bool m_SyncedLayerAffectsTiming { get; set; } - public LayerConstant(EndianBinaryReader reader, int[] version) + public LayerConstant(ObjectReader reader) { m_StateMachineIndex = reader.ReadUInt32(); m_StateMachineMotionSetIndex = reader.ReadUInt32(); - m_BodyMask = new HumanPoseMask(reader, version); + m_BodyMask = new HumanPoseMask(reader); m_SkeletonMask = new SkeletonMask(reader); m_Binding = reader.ReadUInt32(); m_LayerBlendingMode = reader.ReadInt32(); @@ -84,7 +84,7 @@ namespace AssetStudio public float m_EventThreshold { get; set; } public float m_ExitTime { get; set; } - public ConditionConstant(EndianBinaryReader reader) + public ConditionConstant(ObjectReader reader) { m_ConditionMode = reader.ReadUInt32(); m_EventID = reader.ReadUInt32(); @@ -110,8 +110,9 @@ namespace AssetStudio public bool m_Atomic { get; set; } public bool m_CanTransitionToSelf { get; set; } - public TransitionConstant(EndianBinaryReader reader, int[] version) + public TransitionConstant(ObjectReader reader) { + var version = reader.version; int numConditions = reader.ReadInt32(); m_ConditionConstantArray = new ConditionConstant[numConditions]; for (int i = 0; i < numConditions; i++) @@ -153,7 +154,7 @@ namespace AssetStudio public uint[] m_IDArray { get; set; } public uint m_IndexOffset { get; set; } - public LeafInfoConstant(EndianBinaryReader reader) + public LeafInfoConstant(ObjectReader reader) { m_IDArray = reader.ReadUInt32Array(reader.ReadInt32()); m_IndexOffset = reader.ReadUInt32(); @@ -164,7 +165,7 @@ namespace AssetStudio { public uint[] m_NeighborArray { get; set; } - public MotionNeighborList(EndianBinaryReader reader) + public MotionNeighborList(ObjectReader reader) { m_NeighborArray = reader.ReadUInt32Array(reader.ReadInt32()); } @@ -178,7 +179,7 @@ namespace AssetStudio public float[] m_ChildPairAvgMagInvArray { get; set; } public MotionNeighborList[] m_ChildNeighborListArray { get; set; } - public Blend2dDataConstant(EndianBinaryReader reader) + public Blend2dDataConstant(ObjectReader reader) { m_ChildPositionArray = reader.ReadVector2Array(reader.ReadInt32()); m_ChildMagnitudeArray = reader.ReadSingleArray(reader.ReadInt32()); @@ -198,7 +199,7 @@ namespace AssetStudio { public float[] m_ChildThresholdArray { get; set; } - public Blend1dDataConstant(EndianBinaryReader reader) + public Blend1dDataConstant(ObjectReader reader) { m_ChildThresholdArray = reader.ReadSingleArray(reader.ReadInt32()); } @@ -209,7 +210,7 @@ namespace AssetStudio public uint[] m_ChildBlendEventIDArray { get; set; } public bool m_NormalizedBlendValues { get; set; } - public BlendDirectDataConstant(EndianBinaryReader reader) + public BlendDirectDataConstant(ObjectReader reader) { m_ChildBlendEventIDArray = reader.ReadUInt32Array(reader.ReadInt32()); m_NormalizedBlendValues = reader.ReadBoolean(); @@ -232,8 +233,9 @@ namespace AssetStudio public float m_CycleOffset { get; set; } public bool m_Mirror { get; set; } - public BlendTreeNodeConstant(EndianBinaryReader reader, int[] version) + public BlendTreeNodeConstant(ObjectReader reader) { + var version = reader.version; m_BlendType = reader.ReadUInt32(); m_BlendEventID = reader.ReadUInt32(); m_BlendEventYID = reader.ReadUInt32(); @@ -262,13 +264,13 @@ namespace AssetStudio { public BlendTreeNodeConstant[] m_NodeArray { get; set; } - public BlendTreeConstant(EndianBinaryReader reader, int[] version) + public BlendTreeConstant(ObjectReader reader) { int numNodes = reader.ReadInt32(); m_NodeArray = new BlendTreeNodeConstant[numNodes]; for (int i = 0; i < numNodes; i++) { - m_NodeArray[i] = new BlendTreeNodeConstant(reader, version); + m_NodeArray[i] = new BlendTreeNodeConstant(reader); } } } @@ -294,13 +296,14 @@ namespace AssetStudio public bool m_Loop { get; set; } public bool m_Mirror { get; set; } - public StateConstant(EndianBinaryReader reader, int[] version) + public StateConstant(ObjectReader reader) { + var version = reader.version; int numTransistions = reader.ReadInt32(); m_TransitionConstantArray = new TransitionConstant[numTransistions]; for (int i = 0; i < numTransistions; i++) { - m_TransitionConstantArray[i] = new TransitionConstant(reader, version); + m_TransitionConstantArray[i] = new TransitionConstant(reader); } int numBlendIndices = reader.ReadInt32(); @@ -324,7 +327,7 @@ namespace AssetStudio m_BlendTreeConstantArray = new BlendTreeConstant[numBlends]; for (int i = 0; i < numBlends; i++) { - m_BlendTreeConstantArray[i] = new BlendTreeConstant(reader, version); + m_BlendTreeConstantArray[i] = new BlendTreeConstant(reader); } m_NameID = reader.ReadUInt32(); @@ -366,7 +369,7 @@ namespace AssetStudio public uint m_Destination { get; set; } public ConditionConstant[] m_ConditionConstantArray { get; set; } - public SelectorTransitionConstant(EndianBinaryReader reader) + public SelectorTransitionConstant(ObjectReader reader) { m_Destination = reader.ReadUInt32(); @@ -385,7 +388,7 @@ namespace AssetStudio public uint m_FullPathID { get; set; } public bool m_isEntry { get; set; } - public SelectorStateConstant(EndianBinaryReader reader) + public SelectorStateConstant(ObjectReader reader) { int numTransitions = reader.ReadInt32(); m_TransitionConstantArray = new SelectorTransitionConstant[numTransitions]; @@ -408,20 +411,21 @@ namespace AssetStudio public uint m_DefaultState { get; set; } public uint m_MotionSetCount { get; set; } - public StateMachineConstant(EndianBinaryReader reader, int[] version) + public StateMachineConstant(ObjectReader reader) { + var version = reader.version; int numStates = reader.ReadInt32(); m_StateConstantArray = new StateConstant[numStates]; for (int i = 0; i < numStates; i++) { - m_StateConstantArray[i] = new StateConstant(reader, version); + m_StateConstantArray[i] = new StateConstant(reader); } int numAnyStates = reader.ReadInt32(); m_AnyStateTransitionConstantArray = new TransitionConstant[numAnyStates]; for (int i = 0; i < numAnyStates; i++) { - m_AnyStateTransitionConstantArray[i] = new TransitionConstant(reader, version); + m_AnyStateTransitionConstantArray[i] = new TransitionConstant(reader); } if (version[0] >= 5) //5.0 and up @@ -448,8 +452,9 @@ namespace AssetStudio public Vector4[] m_QuaternionValues { get; set; } public object[] m_ScaleValues { get; set; } - public ValueArray(EndianBinaryReader reader, int[] version) + public ValueArray(ObjectReader reader) { + var version = reader.version; if (version[0] < 5 || (version[0] == 5 && version[1] < 5)) //5.5 down { int numBools = reader.ReadInt32(); @@ -505,24 +510,24 @@ namespace AssetStudio public ValueArrayConstant m_Values { get; set; } public ValueArray m_DefaultValues { get; set; } - public ControllerConstant(EndianBinaryReader reader, int[] version) + public ControllerConstant(ObjectReader reader) { int numLayers = reader.ReadInt32(); m_LayerArray = new LayerConstant[numLayers]; for (int i = 0; i < numLayers; i++) { - m_LayerArray[i] = new LayerConstant(reader, version); + m_LayerArray[i] = new LayerConstant(reader); } int numStates = reader.ReadInt32(); m_StateMachineArray = new StateMachineConstant[numStates]; for (int i = 0; i < numStates; i++) { - m_StateMachineArray[i] = new StateMachineConstant(reader, version); + m_StateMachineArray[i] = new StateMachineConstant(reader); } - m_Values = new ValueArrayConstant(reader, version); - m_DefaultValues = new ValueArray(reader, version); + m_Values = new ValueArrayConstant(reader); + m_DefaultValues = new ValueArray(reader); } } @@ -530,10 +535,10 @@ namespace AssetStudio { public PPtr[] m_AnimationClips; - public AnimatorController(AssetPreloadData preloadData) : base(preloadData) + public AnimatorController(ObjectReader reader) : base(reader) { var m_ControllerSize = reader.ReadUInt32(); - var m_Controller = new ControllerConstant(reader, version); + var m_Controller = new ControllerConstant(reader); int tosSize = reader.ReadInt32(); var m_TOS = new List>(tosSize); @@ -546,7 +551,7 @@ namespace AssetStudio m_AnimationClips = new PPtr[numClips]; for (int i = 0; i < numClips; i++) { - m_AnimationClips[i] = sourceFile.ReadPPtr(); + m_AnimationClips[i] = reader.ReadPPtr(); } } } diff --git a/AssetStudio/Classes/AnimatorOverrideController.cs b/AssetStudio/Classes/AnimatorOverrideController.cs index 4e53d0c..78406db 100644 --- a/AssetStudio/Classes/AnimatorOverrideController.cs +++ b/AssetStudio/Classes/AnimatorOverrideController.cs @@ -10,17 +10,17 @@ namespace AssetStudio public PPtr m_Controller; public PPtr[][] m_Clips; - public AnimatorOverrideController(AssetPreloadData preloadData) : base(preloadData) + public AnimatorOverrideController(ObjectReader reader) : base(reader) { - m_Controller = sourceFile.ReadPPtr(); + m_Controller = reader.ReadPPtr(); int numOverrides = reader.ReadInt32(); m_Clips = new PPtr[numOverrides][]; for (int i = 0; i < numOverrides; i++) { m_Clips[i] = new PPtr[2]; - m_Clips[i][0] = sourceFile.ReadPPtr(); - m_Clips[i][1] = sourceFile.ReadPPtr(); + m_Clips[i][0] = reader.ReadPPtr(); + m_Clips[i][1] = reader.ReadPPtr(); } } } diff --git a/AssetStudio/Classes/AssetBundle.cs b/AssetStudio/Classes/AssetBundle.cs index 9ad31d7..27dac69 100644 --- a/AssetStudio/Classes/AssetBundle.cs +++ b/AssetStudio/Classes/AssetBundle.cs @@ -23,12 +23,12 @@ namespace AssetStudio public List m_Container = new List(); - public AssetBundle(AssetPreloadData preloadData) : base(preloadData) + public AssetBundle(ObjectReader reader) : base(reader) { var size = reader.ReadInt32(); for (int i = 0; i < size; i++) { - sourceFile.ReadPPtr(); + reader.ReadPPtr(); } size = reader.ReadInt32(); for (int i = 0; i < size; i++) @@ -38,7 +38,7 @@ namespace AssetStudio temp.second = new AssetInfo(); temp.second.preloadIndex = reader.ReadInt32(); temp.second.preloadSize = reader.ReadInt32(); - temp.second.asset = sourceFile.ReadPPtr(); + temp.second.asset = reader.ReadPPtr(); m_Container.Add(temp); } } diff --git a/AssetStudio/Classes/AudioClip.cs b/AssetStudio/Classes/AudioClip.cs index 27f2f7b..3bd37e4 100644 --- a/AssetStudio/Classes/AudioClip.cs +++ b/AssetStudio/Classes/AudioClip.cs @@ -31,7 +31,7 @@ namespace AssetStudio public long m_Size; public byte[] m_AudioData; - public AudioClip(AssetPreloadData preloadData, bool readData) : base(preloadData) + public AudioClip(ObjectReader reader, bool readData) : base(reader) { if (version[0] < 5) { @@ -46,7 +46,7 @@ namespace AssetStudio int m_Stream = reader.ReadInt32(); m_Size = reader.ReadInt32(); var tsize = m_Size % 4 != 0 ? m_Size + 4 - m_Size % 4 : m_Size; - if (preloadData.Size + preloadData.Offset - reader.Position != tsize) + if (reader.byteSize + reader.byteStart - reader.Position != tsize) { m_Offset = reader.ReadInt32(); m_Source = sourceFile.filePath + ".resS"; diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index 1e4a7d6..67199e7 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -8,7 +8,7 @@ namespace AssetStudio public int m_ParentId { get; set; } public int m_AxesId { get; set; } - public Node(EndianBinaryReader reader) + public Node(ObjectReader reader) { m_ParentId = reader.ReadInt32(); m_AxesId = reader.ReadInt32(); @@ -20,8 +20,9 @@ namespace AssetStudio public object m_Min { get; set; } public object m_Max { get; set; } - public Limit(EndianBinaryReader reader, int[] version) + public Limit(ObjectReader reader) { + var version = reader.version; if (version[0] > 5 || (version[0] == 5 && version[1] >= 4))//5.4 and up { m_Min = reader.ReadVector3(); @@ -44,8 +45,9 @@ namespace AssetStudio public float m_Length { get; set; } public uint m_Type { get; set; } - public Axes(EndianBinaryReader reader, int[] version) + public Axes(ObjectReader reader) { + var version = reader.version; m_PreQ = reader.ReadVector4(); m_PostQ = reader.ReadVector4(); if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up @@ -56,7 +58,7 @@ namespace AssetStudio { m_Sgn = reader.ReadVector4(); } - m_Limit = new Limit(reader, version); + m_Limit = new Limit(reader); m_Length = reader.ReadSingle(); m_Type = reader.ReadUInt32(); } @@ -69,7 +71,7 @@ namespace AssetStudio public List m_AxesArray { get; set; } - public Skeleton(EndianBinaryReader reader, int[] version) + public Skeleton(ObjectReader reader) { int numNodes = reader.ReadInt32(); m_Node = new List(numNodes); @@ -89,7 +91,7 @@ namespace AssetStudio m_AxesArray = new List(numAxes); for (int i = 0; i < numAxes; i++) { - m_AxesArray.Add(new Axes(reader, version)); + m_AxesArray.Add(new Axes(reader)); } } } @@ -103,13 +105,13 @@ namespace AssetStudio m_X = new List(); } - public SkeletonPose(EndianBinaryReader reader, int[] version) + public SkeletonPose(ObjectReader reader) { int numXforms = reader.ReadInt32(); m_X = new List(numXforms); for (int i = 0; i < numXforms; i++) { - m_X.Add(new xform(reader, version)); + m_X.Add(new xform(reader)); } } } @@ -118,7 +120,7 @@ namespace AssetStudio { public List m_HandBoneIndex { get; set; } - public Hand(EndianBinaryReader reader) + public Hand(ObjectReader reader) { int numIndexes = reader.ReadInt32(); m_HandBoneIndex = new List(numIndexes); @@ -135,9 +137,9 @@ namespace AssetStudio public uint m_ParentHumanIndex { get; set; } public uint m_ID { get; set; } - public Handle(EndianBinaryReader reader, int[] version) + public Handle(ObjectReader reader) { - m_X = new xform(reader, version); + m_X = new xform(reader); m_ParentHumanIndex = reader.ReadUInt32(); m_ID = reader.ReadUInt32(); } @@ -155,9 +157,9 @@ namespace AssetStudio public float m_MaxLimitY { get; set; } public float m_MaxLimitZ { get; set; } - public Collider(EndianBinaryReader reader, int[] version) + public Collider(ObjectReader reader) { - m_X = new xform(reader, version); + m_X = new xform(reader); m_Type = reader.ReadUInt32(); m_XMotionType = reader.ReadUInt32(); m_YMotionType = reader.ReadUInt32(); @@ -193,11 +195,12 @@ namespace AssetStudio public bool m_HasRightHand { get; set; } public bool m_HasTDoF { get; set; } - public Human(EndianBinaryReader reader, int[] version) + public Human(ObjectReader reader) { - m_RootX = new xform(reader, version); - m_Skeleton = new Skeleton(reader, version); - m_SkeletonPose = new SkeletonPose(reader, version); + var version = reader.version; + m_RootX = new xform(reader); + m_Skeleton = new Skeleton(reader); + m_SkeletonPose = new SkeletonPose(reader); m_LeftHand = new Hand(reader); m_RightHand = new Hand(reader); @@ -207,14 +210,14 @@ namespace AssetStudio m_Handles = new List(numHandles); for (int i = 0; i < numHandles; i++) { - m_Handles.Add(new Handle(reader, version)); + m_Handles.Add(new Handle(reader)); } int numColliders = reader.ReadInt32(); m_ColliderArray = new List(numColliders); for (int i = 0; i < numColliders; i++) { - m_ColliderArray.Add(new Collider(reader, version)); + m_ColliderArray.Add(new Collider(reader)); } } @@ -272,14 +275,15 @@ namespace AssetStudio public SkeletonPose m_RootMotionSkeletonPose { get; set; } public List m_RootMotionSkeletonIndexArray { get; set; } - public AvatarConstant(EndianBinaryReader reader, int[] version) + public AvatarConstant(ObjectReader reader) { - m_AvatarSkeleton = new Skeleton(reader, version); - m_AvatarSkeletonPose = new SkeletonPose(reader, version); + var version = reader.version; + m_AvatarSkeleton = new Skeleton(reader); + m_AvatarSkeletonPose = new SkeletonPose(reader); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - m_DefaultPose = new SkeletonPose(reader, version); + m_DefaultPose = new SkeletonPose(reader); int numIDs = reader.ReadInt32(); m_SkeletonNameIDArray = new List(numIDs); for (int i = 0; i < numIDs; i++) @@ -288,7 +292,7 @@ namespace AssetStudio } } - m_Human = new Human(reader, version); + m_Human = new Human(reader); int numIndexes = reader.ReadInt32(); m_HumanSkeletonIndexArray = new List(numIndexes); @@ -308,12 +312,12 @@ namespace AssetStudio } m_RootMotionBoneIndex = reader.ReadInt32(); - m_RootMotionBoneX = new xform(reader, version); + m_RootMotionBoneX = new xform(reader); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - m_RootMotionSkeleton = new Skeleton(reader, version); - m_RootMotionSkeletonPose = new SkeletonPose(reader, version); + m_RootMotionSkeleton = new Skeleton(reader); + m_RootMotionSkeletonPose = new SkeletonPose(reader); int numMotionIndexes = reader.ReadInt32(); m_RootMotionSkeletonIndexArray = new List(numMotionIndexes); @@ -331,10 +335,10 @@ namespace AssetStudio public AvatarConstant m_Avatar { get; set; } public List> m_TOS { get; set; } - public Avatar(AssetPreloadData preloadData) : base(preloadData) + public Avatar(ObjectReader reader) : base(reader) { m_AvatarSize = reader.ReadUInt32(); - m_Avatar = new AvatarConstant(reader, version); + m_Avatar = new AvatarConstant(reader); int numTOS = reader.ReadInt32(); m_TOS = new List>(numTOS); diff --git a/AssetStudio/Classes/Behaviour.cs b/AssetStudio/Classes/Behaviour.cs index 2cb5355..51c049f 100644 --- a/AssetStudio/Classes/Behaviour.cs +++ b/AssetStudio/Classes/Behaviour.cs @@ -9,7 +9,7 @@ namespace AssetStudio { public byte m_Enabled; - protected Behaviour(AssetPreloadData preloadData) : base(preloadData) + protected Behaviour(ObjectReader reader) : base(reader) { m_Enabled = reader.ReadByte(); reader.AlignStream(4); diff --git a/AssetStudio/Classes/BuildSettings.cs b/AssetStudio/Classes/BuildSettings.cs index a4157a9..d96be1a 100644 --- a/AssetStudio/Classes/BuildSettings.cs +++ b/AssetStudio/Classes/BuildSettings.cs @@ -9,7 +9,7 @@ namespace AssetStudio { public string m_Version; - public BuildSettings(AssetPreloadData preloadData) : base(preloadData) + public BuildSettings(ObjectReader reader) : base(reader) { int levelsNum = reader.ReadInt32(); for (int i = 0; i < levelsNum; i++) diff --git a/AssetStudio/Classes/Component.cs b/AssetStudio/Classes/Component.cs index 08712ca..7a03952 100644 --- a/AssetStudio/Classes/Component.cs +++ b/AssetStudio/Classes/Component.cs @@ -9,9 +9,9 @@ namespace AssetStudio { public PPtr m_GameObject; - protected Component(AssetPreloadData preloadData) : base(preloadData) + protected Component(ObjectReader reader) : base(reader) { - m_GameObject = sourceFile.ReadPPtr(); + m_GameObject = reader.ReadPPtr(); } } } diff --git a/AssetStudio/Classes/EditorExtension.cs b/AssetStudio/Classes/EditorExtension.cs index ddc798b..7554588 100644 --- a/AssetStudio/Classes/EditorExtension.cs +++ b/AssetStudio/Classes/EditorExtension.cs @@ -7,12 +7,12 @@ namespace AssetStudio { public abstract class EditorExtension : Object { - protected EditorExtension(AssetPreloadData preloadData) : base(preloadData) + protected EditorExtension(ObjectReader reader) : base(reader) { if (platform == BuildTarget.NoTarget) { - var m_PrefabParentObject = sourceFile.ReadPPtr(); - var m_PrefabInternal = sourceFile.ReadPPtr(); + var m_PrefabParentObject = reader.ReadPPtr(); + var m_PrefabInternal = reader.ReadPPtr(); } } } diff --git a/AssetStudio/Classes/Font.cs b/AssetStudio/Classes/Font.cs index 57ccd83..ed0e06e 100644 --- a/AssetStudio/Classes/Font.cs +++ b/AssetStudio/Classes/Font.cs @@ -9,14 +9,14 @@ namespace AssetStudio { public byte[] m_FontData; - public Font(AssetPreloadData preloadData) : base(preloadData) + public Font(ObjectReader reader) : base(reader) { if ((version[0] == 5 && version[1] >= 5) || version[0] > 5)//5.5 and up { var m_LineSpacing = reader.ReadSingle(); - var m_DefaultMaterial = sourceFile.ReadPPtr(); + var m_DefaultMaterial = reader.ReadPPtr(); var m_FontSize = reader.ReadSingle(); - var m_Texture = sourceFile.ReadPPtr(); + var m_Texture = reader.ReadPPtr(); int m_AsciiStartOffset = reader.ReadInt32(); var m_Tracking = reader.ReadSingle(); var m_CharacterSpacing = reader.ReadInt32(); @@ -68,7 +68,7 @@ namespace AssetStudio } int m_ConvertCase = reader.ReadInt32(); - PPtr m_DefaultMaterial = sourceFile.ReadPPtr(); + PPtr m_DefaultMaterial = reader.ReadPPtr(); int m_CharacterRects_size = reader.ReadInt32(); for (int i = 0; i < m_CharacterRects_size; i++) @@ -93,7 +93,7 @@ namespace AssetStudio } } - PPtr m_Texture = sourceFile.ReadPPtr(); + PPtr m_Texture = reader.ReadPPtr(); int m_KerningValues_size = reader.ReadInt32(); for (int i = 0; i < m_KerningValues_size; i++) diff --git a/AssetStudio/Classes/GameObject.cs b/AssetStudio/Classes/GameObject.cs index 46efe46..c59113d 100644 --- a/AssetStudio/Classes/GameObject.cs +++ b/AssetStudio/Classes/GameObject.cs @@ -16,30 +16,25 @@ namespace AssetStudio public PPtr m_SkinnedMeshRenderer; public PPtr m_Animator; - public GameObject(AssetPreloadData preloadData) : base(preloadData) + public GameObject(ObjectReader reader) : base(reader) { int m_Component_size = reader.ReadInt32(); m_Components = new List(m_Component_size); for (int j = 0; j < m_Component_size; j++) { - if ((sourceFile.version[0] == 5 && sourceFile.version[1] >= 5) || sourceFile.version[0] > 5)//5.5.0 and up + if ((version[0] == 5 && version[1] >= 5) || version[0] > 5)//5.5.0 and up { - m_Components.Add(sourceFile.ReadPPtr()); + m_Components.Add(reader.ReadPPtr()); } else { int first = reader.ReadInt32(); - m_Components.Add(sourceFile.ReadPPtr()); + m_Components.Add(reader.ReadPPtr()); } } var m_Layer = reader.ReadInt32(); m_Name = reader.ReadAlignedString(); - - if (m_Name == "") - { - m_Name = "GameObject #" + preloadData.uniqueID; - } } } } diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index a44f033..aa9a391 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -34,11 +34,11 @@ namespace AssetStudio public strFloatPair[] m_Floats; public strColorPair[] m_Colors; - public Material(AssetPreloadData preloadData) : base(preloadData) + public Material(ObjectReader reader) : base(reader) { - m_Shader = sourceFile.ReadPPtr(); + m_Shader = reader.ReadPPtr(); - if (sourceFile.version[0] == 4 && (sourceFile.version[1] >= 2 || (sourceFile.version[1] == 1 && sourceFile.buildType[0] != "a"))) + if (version[0] == 4 && (version[1] >= 2 || (version[1] == 1 && buildType[0] != "a"))) { m_ShaderKeywords = new string[reader.ReadInt32()]; for (int i = 0; i < m_ShaderKeywords.Length; i++) @@ -46,11 +46,11 @@ namespace AssetStudio m_ShaderKeywords[i] = reader.ReadAlignedString(); } } - else if (sourceFile.version[0] >= 5)//5.0 and up + else if (version[0] >= 5)//5.0 and up { m_ShaderKeywords = new[] { reader.ReadAlignedString() }; uint m_LightmapFlags = reader.ReadUInt32(); - if (sourceFile.version[0] == 5 && sourceFile.version[1] >= 6 || sourceFile.version[0] > 5)//5.6.0 and up + if (version[0] == 5 && version[1] >= 6 || version[0] > 5)//5.6.0 and up { var m_EnableInstancingVariants = reader.ReadBoolean(); //var m_DoubleSidedGI = a_Stream.ReadBoolean();//2017.x @@ -58,9 +58,9 @@ namespace AssetStudio } } - if (sourceFile.version[0] > 4 || sourceFile.version[0] == 4 && sourceFile.version[1] >= 3) { m_CustomRenderQueue = reader.ReadInt32(); } + if (version[0] > 4 || version[0] == 4 && version[1] >= 3) { m_CustomRenderQueue = reader.ReadInt32(); } - if (sourceFile.version[0] == 5 && sourceFile.version[1] >= 1 || sourceFile.version[0] > 5)//5.1 and up + if (version[0] == 5 && version[1] >= 1 || version[0] > 5)//5.1 and up { string[][] stringTagMap = new string[reader.ReadInt32()][]; for (int i = 0; i < stringTagMap.Length; i++) @@ -69,7 +69,7 @@ namespace AssetStudio } } //disabledShaderPasses - if ((sourceFile.version[0] == 5 && sourceFile.version[1] >= 6) || sourceFile.version[0] > 5)//5.6.0 and up + if ((version[0] == 5 && version[1] >= 6) || version[0] > 5)//5.6.0 and up { var size = reader.ReadInt32(); for (int i = 0; i < size; i++) @@ -84,7 +84,7 @@ namespace AssetStudio TexEnv m_TexEnv = new TexEnv() { name = reader.ReadAlignedString(), - m_Texture = sourceFile.ReadPPtr(), + m_Texture = reader.ReadPPtr(), m_Scale = new[] { reader.ReadSingle(), reader.ReadSingle() }, m_Offset = new[] { reader.ReadSingle(), reader.ReadSingle() } }; diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 27f0899..ac818f9 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -71,7 +71,7 @@ namespace AssetStudio public Vector3 tangent { get; set; } public uint index { get; set; } - public BlendShapeVertex(EndianBinaryReader reader) + public BlendShapeVertex(ObjectReader reader) { vertex = reader.ReadVector3(); normal = reader.ReadVector3(); @@ -87,7 +87,7 @@ namespace AssetStudio public bool hasNormals { get; set; } public bool hasTangents { get; set; } - public MeshBlendShape(EndianBinaryReader reader) + public MeshBlendShape(ObjectReader reader) { firstVertex = reader.ReadUInt32(); vertexCount = reader.ReadUInt32(); @@ -104,7 +104,7 @@ namespace AssetStudio public int frameIndex { get; set; } public int frameCount { get; set; } - public MeshBlendShapeChannel(EndianBinaryReader reader) + public MeshBlendShapeChannel(ObjectReader reader) { name = reader.ReadAlignedString(); nameHash = reader.ReadUInt32(); @@ -118,7 +118,7 @@ namespace AssetStudio public List channels { get; set; } public List fullWeights { get; set; } - public BlendShapeData(EndianBinaryReader reader) + public BlendShapeData(ObjectReader reader) { int numVerts = reader.ReadInt32(); vertices = new List(numVerts); @@ -150,10 +150,13 @@ namespace AssetStudio } } - private float BytesToFloat(byte[] inputBytes) + private float BytesToFloat(byte[] inputBytes, EndianType endian) { float result = 0; - if (reader.endian == EndianType.BigEndian) { Array.Reverse(inputBytes); } + if (endian == EndianType.BigEndian) + { + Array.Reverse(inputBytes); + } switch (inputBytes.Length) { @@ -236,7 +239,7 @@ namespace AssetStudio } } - public Mesh(AssetPreloadData preloadData) : base(preloadData) + public Mesh(ObjectReader reader) : base(reader) { bool m_Use16BitIndices = true; //3.5.0 and newer always uses 16bit indices uint m_MeshCompression = 0; @@ -292,7 +295,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 && preloadData.sourceFile.buildType[0] != "a") || (version[1] > 1 && version[1] <= 2))) + if (version[0] == 4 && ((version[1] == 1 && buildType[0] != "a") || (version[1] > 1 && version[1] <= 2))) { int m_Shapes_size = reader.ReadInt32(); if (m_Shapes_size > 0) @@ -348,7 +351,7 @@ namespace AssetStudio bool m_IsReadable = reader.ReadBoolean(); bool m_KeepVertices = reader.ReadBoolean(); bool m_KeepIndices = reader.ReadBoolean(); - if (preloadData.HasStructMember("m_UsedForStaticMeshColliderOnly")) + if (reader.HasStructMember("m_UsedForStaticMeshColliderOnly")) { var m_UsedForStaticMeshColliderOnly = reader.ReadBoolean(); } @@ -356,7 +359,7 @@ namespace AssetStudio 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) && preloadData.sourceFile.buildType[0] == "p") || //fixed after 2017.3.1px + ((version[0] == 2017 && version[1] == 3 && version[2] == 1) && 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(); @@ -594,7 +597,7 @@ namespace AssetStudio } } - if (preloadData.sourceFile.m_TargetPlatform == BuildTarget.XBOX360 && componentByteSize > 1) //swap bytes for Xbox + if (platform == BuildTarget.XBOX360 && componentByteSize > 1) //swap bytes for Xbox { for (var i = 0; i < componentBytes.Length / componentByteSize; i++) { @@ -715,7 +718,7 @@ namespace AssetStudio } } - if (preloadData.sourceFile.m_TargetPlatform == BuildTarget.XBOX360 && componentByteSize > 1) //swap bytes for Xbox + if (platform == BuildTarget.XBOX360 && componentByteSize > 1) //swap bytes for Xbox { for (var i = 0; i < componentBytes.Length / componentByteSize; i++) { @@ -818,7 +821,7 @@ namespace AssetStudio { int m_DataSizeOffset = vertexOffset + componentByteSize * d; Buffer.BlockCopy(m_DataSize, m_DataSizeOffset, componentBytes, 0, componentByteSize); - componentsArray[v * m_Channel.dimension + d] = BytesToFloat(componentBytes); + componentsArray[v * m_Channel.dimension + d] = BytesToFloat(componentBytes, reader.endian); } } diff --git a/AssetStudio/Classes/MeshFilter.cs b/AssetStudio/Classes/MeshFilter.cs index 6ff6250..95ea684 100644 --- a/AssetStudio/Classes/MeshFilter.cs +++ b/AssetStudio/Classes/MeshFilter.cs @@ -10,9 +10,9 @@ namespace AssetStudio public long preloadIndex; public PPtr m_Mesh; - public MeshFilter(AssetPreloadData preloadData) : base(preloadData) + public MeshFilter(ObjectReader reader) : base(reader) { - m_Mesh = sourceFile.ReadPPtr(); + m_Mesh = reader.ReadPPtr(); } } } diff --git a/AssetStudio/Classes/MeshRenderer.cs b/AssetStudio/Classes/MeshRenderer.cs index 6ea6da9..4b00e6f 100644 --- a/AssetStudio/Classes/MeshRenderer.cs +++ b/AssetStudio/Classes/MeshRenderer.cs @@ -7,7 +7,7 @@ namespace AssetStudio { public sealed class MeshRenderer : Renderer { - public MeshRenderer(AssetPreloadData preloadData) : base(preloadData) + public MeshRenderer(ObjectReader reader) : base(reader) { } diff --git a/AssetStudio/Classes/MonoBehaviour.cs b/AssetStudio/Classes/MonoBehaviour.cs index 5e9abb9..5e3d931 100644 --- a/AssetStudio/Classes/MonoBehaviour.cs +++ b/AssetStudio/Classes/MonoBehaviour.cs @@ -10,9 +10,9 @@ namespace AssetStudio public PPtr m_Script; public string m_Name; - public MonoBehaviour(AssetPreloadData preloadData) : base(preloadData) + public MonoBehaviour(ObjectReader reader) : base(reader) { - m_Script = sourceFile.ReadPPtr(); + m_Script = reader.ReadPPtr(); m_Name = reader.ReadAlignedString(); } } diff --git a/AssetStudio/Classes/MonoScript.cs b/AssetStudio/Classes/MonoScript.cs index 709c1aa..9c696f8 100644 --- a/AssetStudio/Classes/MonoScript.cs +++ b/AssetStudio/Classes/MonoScript.cs @@ -11,7 +11,7 @@ namespace AssetStudio public string m_Namespace = string.Empty; public string m_AssemblyName; - public MonoScript(AssetPreloadData preloadData) : base(preloadData) + public MonoScript(ObjectReader reader) : base(reader) { if (version[0] > 3 || (version[0] == 3 && version[1] >= 4)) //3.4 and up { diff --git a/AssetStudio/Classes/MovieTexture.cs b/AssetStudio/Classes/MovieTexture.cs index 34a27ae..7c7bcd3 100644 --- a/AssetStudio/Classes/MovieTexture.cs +++ b/AssetStudio/Classes/MovieTexture.cs @@ -9,12 +9,12 @@ namespace AssetStudio { public byte[] m_MovieData; - public MovieTexture(AssetPreloadData preloadData) : base(preloadData) + public MovieTexture(ObjectReader reader) : base(reader) { var m_Loop = reader.ReadBoolean(); reader.AlignStream(4); //PPtr - sourceFile.ReadPPtr(); + reader.ReadPPtr(); m_MovieData = reader.ReadBytes(reader.ReadInt32()); } } diff --git a/AssetStudio/Classes/NamedObject.cs b/AssetStudio/Classes/NamedObject.cs index 9f01e8c..c91b2ce 100644 --- a/AssetStudio/Classes/NamedObject.cs +++ b/AssetStudio/Classes/NamedObject.cs @@ -9,7 +9,7 @@ namespace AssetStudio { public string m_Name; - public NamedObject(AssetPreloadData preloadData) : base(preloadData) + public NamedObject(ObjectReader reader) : base(reader) { m_Name = reader.ReadAlignedString(); } diff --git a/AssetStudio/Classes/Object.cs b/AssetStudio/Classes/Object.cs index b87226e..b0dbce7 100644 --- a/AssetStudio/Classes/Object.cs +++ b/AssetStudio/Classes/Object.cs @@ -7,21 +7,20 @@ namespace AssetStudio { public abstract class Object { - public AssetPreloadData preloadData; - public AssetsFile sourceFile; - protected EndianBinaryReader reader; + protected AssetsFile sourceFile; + public ObjectReader reader; public int[] version; protected string[] buildType; - protected BuildTarget platform; + public BuildTarget platform; - protected Object(AssetPreloadData preloadData) + protected Object(ObjectReader reader) { - this.preloadData = preloadData; - sourceFile = preloadData.sourceFile; - reader = preloadData.InitReader(); - version = sourceFile.version; - buildType = sourceFile.buildType; - platform = sourceFile.m_TargetPlatform; + this.reader = reader; + reader.Reset(); + sourceFile = reader.assetsFile; + version = reader.version; + buildType = reader.buildType; + platform = reader.platform; if (platform == BuildTarget.NoTarget) { diff --git a/AssetStudio/Classes/PlayerSettings.cs b/AssetStudio/Classes/PlayerSettings.cs index d09a891..1a9a1ab 100644 --- a/AssetStudio/Classes/PlayerSettings.cs +++ b/AssetStudio/Classes/PlayerSettings.cs @@ -10,7 +10,7 @@ namespace AssetStudio public string companyName; public string productName; - public PlayerSettings(AssetPreloadData preloadData) : base(preloadData) + public PlayerSettings(ObjectReader reader) : base(reader) { if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4.0 nad up { diff --git a/AssetStudio/Classes/RectTransform.cs b/AssetStudio/Classes/RectTransform.cs index 7dfcc30..f47f09a 100644 --- a/AssetStudio/Classes/RectTransform.cs +++ b/AssetStudio/Classes/RectTransform.cs @@ -7,7 +7,7 @@ namespace AssetStudio { public sealed class RectTransform : Transform { - public RectTransform(AssetPreloadData preloadData) : base(preloadData) + public RectTransform(ObjectReader reader) : base(reader) { } } diff --git a/AssetStudio/Classes/Renderer.cs b/AssetStudio/Classes/Renderer.cs index 7ab1f0f..662c20e 100644 --- a/AssetStudio/Classes/Renderer.cs +++ b/AssetStudio/Classes/Renderer.cs @@ -17,7 +17,7 @@ namespace AssetStudio public StaticBatchInfo m_StaticBatchInfo; public uint[] m_SubsetIndices; - protected Renderer(AssetPreloadData preloadData) : base(preloadData) + protected Renderer(ObjectReader reader) : base(reader) { if (version[0] < 5) { @@ -54,7 +54,7 @@ namespace AssetStudio m_Materials = new PPtr[reader.ReadInt32()]; for (int m = 0; m < m_Materials.Length; m++) { - m_Materials[m] = sourceFile.ReadPPtr(); + m_Materials[m] = reader.ReadPPtr(); } if (version[0] < 3) @@ -63,7 +63,7 @@ namespace AssetStudio } else { - if ((sourceFile.version[0] == 5 && sourceFile.version[1] >= 5) || sourceFile.version[0] > 5)//5.5.0 and up + if ((version[0] == 5 && version[1] >= 5) || version[0] > 5)//5.5.0 and up { m_StaticBatchInfo = new StaticBatchInfo { @@ -77,12 +77,12 @@ namespace AssetStudio m_SubsetIndices = reader.ReadUInt32Array(numSubsetIndices); } - var m_StaticBatchRoot = sourceFile.ReadPPtr(); + var m_StaticBatchRoot = reader.ReadPPtr(); - if ((sourceFile.version[0] == 5 && sourceFile.version[1] >= 4) || sourceFile.version[0] > 5)//5.4.0 and up + if ((version[0] == 5 && version[1] >= 4) || version[0] > 5)//5.4.0 and up { - var m_ProbeAnchor = sourceFile.ReadPPtr(); - var m_LightProbeVolumeOverride = sourceFile.ReadPPtr(); + var m_ProbeAnchor = reader.ReadPPtr(); + var m_LightProbeVolumeOverride = reader.ReadPPtr(); } else if (version[0] >= 4 || (version[0] == 3 && version[1] >= 5))//3.5 - 5.3 { @@ -92,7 +92,7 @@ namespace AssetStudio { int m_ReflectionProbeUsage = reader.ReadInt32(); } - var m_LightProbeAnchor = sourceFile.ReadPPtr(); + var m_LightProbeAnchor = reader.ReadPPtr(); } if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3))//4.3 and up diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 1f78a12..fa74f1a 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -12,17 +12,17 @@ namespace AssetStudio { public byte[] m_Script; - public Shader(AssetPreloadData preloadData) : base(preloadData) + public Shader(ObjectReader reader) : base(reader) { - if (sourceFile.version[0] == 5 && sourceFile.version[1] >= 5 || sourceFile.version[0] > 5) //5.5.0 and up + if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5.0 and up { - var str = preloadData.Dump(); + var str = reader.Dump(); m_Script = Encoding.UTF8.GetBytes(str ?? "Serialized Shader can't be read"); } else { m_Script = reader.ReadBytes(reader.ReadInt32()); - if (sourceFile.version[0] == 5 && sourceFile.version[1] >= 3) //5.3 - 5.4 + if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4 { reader.AlignStream(4); var m_PathName = reader.ReadAlignedString(); diff --git a/AssetStudio/Classes/SkinnedMeshRenderer.cs b/AssetStudio/Classes/SkinnedMeshRenderer.cs index d7e665a..8bf6dda 100644 --- a/AssetStudio/Classes/SkinnedMeshRenderer.cs +++ b/AssetStudio/Classes/SkinnedMeshRenderer.cs @@ -11,7 +11,7 @@ namespace AssetStudio public PPtr[] m_Bones; public List m_BlendShapeWeights; - public SkinnedMeshRenderer(AssetPreloadData preloadData) : base(preloadData) + public SkinnedMeshRenderer(ObjectReader reader) : base(reader) { int m_Quality = reader.ReadInt32(); var m_UpdateWhenOffscreen = reader.ReadBoolean(); @@ -20,15 +20,15 @@ namespace AssetStudio if (version[0] == 2 && version[1] < 6)//2.6 down { - var m_DisableAnimationWhenOffscreen = sourceFile.ReadPPtr(); + var m_DisableAnimationWhenOffscreen = reader.ReadPPtr(); } - m_Mesh = sourceFile.ReadPPtr(); + m_Mesh = reader.ReadPPtr(); m_Bones = new PPtr[reader.ReadInt32()]; for (int b = 0; b < m_Bones.Length; b++) { - m_Bones[b] = sourceFile.ReadPPtr(); + m_Bones[b] = reader.ReadPPtr(); } if (version[0] < 3) diff --git a/AssetStudio/Classes/Sprite.cs b/AssetStudio/Classes/Sprite.cs index 65396ce..488ab1c 100644 --- a/AssetStudio/Classes/Sprite.cs +++ b/AssetStudio/Classes/Sprite.cs @@ -17,7 +17,7 @@ namespace AssetStudio public RectangleF textureRect; public PointF[][] m_PhysicsShape; - public Sprite(AssetPreloadData preloadData) : base(preloadData) + public Sprite(ObjectReader reader) : base(reader) { //Rectf m_Rect m_Rect = new RectangleF(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); @@ -58,16 +58,16 @@ namespace AssetStudio } //PPtr m_SpriteAtlas - m_SpriteAtlas = sourceFile.ReadPPtr(); + m_SpriteAtlas = reader.ReadPPtr(); } //SpriteRenderData m_RD // PPtr texture - texture = sourceFile.ReadPPtr(); + texture = reader.ReadPPtr(); // PPtr alphaTexture if (version[0] >= 5) //5.0 and up { - var alphaTexture = sourceFile.ReadPPtr(); + var alphaTexture = reader.ReadPPtr(); } if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up diff --git a/AssetStudio/Classes/SpriteAtlas.cs b/AssetStudio/Classes/SpriteAtlas.cs index 103cd60..75a8ab3 100644 --- a/AssetStudio/Classes/SpriteAtlas.cs +++ b/AssetStudio/Classes/SpriteAtlas.cs @@ -13,14 +13,14 @@ namespace AssetStudio public List guids = new List(); - public SpriteAtlas(AssetPreloadData preloadData) : base(preloadData) + public SpriteAtlas(ObjectReader reader) : base(reader) { //vector m_PackedSprites var size = reader.ReadInt32(); for (int i = 0; i < size; i++) { //PPtr data - sourceFile.ReadPPtr(); + reader.ReadPPtr(); } //vector m_PackedSpriteNamesToIndex size = reader.ReadInt32(); @@ -37,14 +37,14 @@ namespace AssetStudio var second = reader.ReadInt64(); //SpriteAtlasData second // PPtr texture - textures.Add(sourceFile.ReadPPtr()); + textures.Add(reader.ReadPPtr()); // PPtr alphaTexture - var alphaTexture = sourceFile.ReadPPtr(); + var alphaTexture = reader.ReadPPtr(); // Rectf textureRect textureRects.Add(new RectangleF(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle())); // Vector2f textureRectOffset reader.Position += 8; - if (sourceFile.version[0] > 2017 || (sourceFile.version[0] == 2017 && sourceFile.version[1] >= 2))//2017.2 and up + if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2))//2017.2 and up { // Vector2f atlasRectOffset reader.Position += 8; diff --git a/AssetStudio/Classes/TextAsset.cs b/AssetStudio/Classes/TextAsset.cs index ebe6767..32ecd3c 100644 --- a/AssetStudio/Classes/TextAsset.cs +++ b/AssetStudio/Classes/TextAsset.cs @@ -10,7 +10,7 @@ namespace AssetStudio { public byte[] m_Script; - public TextAsset(AssetPreloadData preloadData) : base(preloadData) + public TextAsset(ObjectReader reader) : base(reader) { m_Script = reader.ReadBytes(reader.ReadInt32()); } diff --git a/AssetStudio/Classes/Texture.cs b/AssetStudio/Classes/Texture.cs index beb74ca..84cfe9f 100644 --- a/AssetStudio/Classes/Texture.cs +++ b/AssetStudio/Classes/Texture.cs @@ -7,7 +7,7 @@ namespace AssetStudio { public abstract class Texture : NamedObject { - protected Texture(AssetPreloadData preloadData) : base(preloadData) + protected Texture(ObjectReader reader) : base(reader) { if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 3)) //2017.3 and up { diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index 1fe8d7f..22bb1c5 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -34,7 +34,7 @@ namespace AssetStudio public uint size; public string path; - public Texture2D(AssetPreloadData preloadData, bool readData) : base(preloadData) + public Texture2D(ObjectReader reader, bool readData) : base(reader) { m_Width = reader.ReadInt32(); m_Height = reader.ReadInt32(); @@ -58,11 +58,11 @@ namespace AssetStudio { var m_StreamingMipmapsPriority = reader.ReadInt32(); } - else if (preloadData.HasStructMember("m_StreamingMipmapsPriority")) //will fix in some patch version bundle + else if (reader.HasStructMember("m_StreamingMipmapsPriority")) //will fix in some patch version bundle { var m_StreamingMipmapsPriority = reader.ReadInt32(); } - if (preloadData.HasStructMember("m_StreamingGroupID")) //What the hell is this? + if (reader.HasStructMember("m_StreamingGroupID")) //What the hell is this? { var m_StreamingGroupID = reader.ReadUInt32(); } diff --git a/AssetStudio/Classes/Transform.cs b/AssetStudio/Classes/Transform.cs index 465dc14..a6eeb1d 100644 --- a/AssetStudio/Classes/Transform.cs +++ b/AssetStudio/Classes/Transform.cs @@ -14,7 +14,7 @@ namespace AssetStudio public List m_Children; public PPtr m_Father; - public Transform(AssetPreloadData preloadData) : base(preloadData) + public Transform(ObjectReader reader) : base(reader) { m_LocalRotation = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }; m_LocalPosition = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() }; @@ -23,9 +23,9 @@ namespace AssetStudio m_Children = new List(m_ChildrenCount); for (int j = 0; j < m_ChildrenCount; j++) { - m_Children.Add(sourceFile.ReadPPtr()); + m_Children.Add(reader.ReadPPtr()); } - m_Father = sourceFile.ReadPPtr(); + m_Father = reader.ReadPPtr(); } } } diff --git a/AssetStudio/Classes/VideoClip.cs b/AssetStudio/Classes/VideoClip.cs index 72cc6a5..2c24b09 100644 --- a/AssetStudio/Classes/VideoClip.cs +++ b/AssetStudio/Classes/VideoClip.cs @@ -13,14 +13,14 @@ namespace AssetStudio public string m_Source; public ulong m_Size; - public VideoClip(AssetPreloadData preloadData, bool readData) : base(preloadData) + public VideoClip(ObjectReader reader, bool readData) : base(reader) { m_OriginalPath = reader.ReadAlignedString(); var m_ProxyWidth = reader.ReadUInt32(); var m_ProxyHeight = reader.ReadUInt32(); var Width = reader.ReadUInt32(); var Height = reader.ReadUInt32(); - if (sourceFile.version[0] >= 2017)//2017.x and up + if (version[0] >= 2017)//2017.x and up { var m_PixelAspecRatioNum = reader.ReadUInt32(); var m_PixelAspecRatioDen = reader.ReadUInt32(); diff --git a/AssetStudio/StudioClasses/AssetItem.cs b/AssetStudio/StudioClasses/AssetItem.cs new file mode 100644 index 0000000..5eef4b1 --- /dev/null +++ b/AssetStudio/StudioClasses/AssetItem.cs @@ -0,0 +1,28 @@ +using System; +using System.Linq; +using System.Text; +using System.Windows.Forms; + +namespace AssetStudio +{ + public class AssetItem : ListViewItem + { + public AssetsFile sourceFile; + public ObjectReader reader; + public long FullSize; + public ClassIDType Type; + public string TypeString; + public string InfoText; + public string UniqueID; + public GameObject gameObject; + + public AssetItem(ObjectReader reader) + { + sourceFile = reader.assetsFile; + this.reader = reader; + FullSize = reader.byteSize; + Type = reader.type; + TypeString = Type.ToString(); + } + } +} diff --git a/AssetStudio/StudioClasses/AssetPreloadData.cs b/AssetStudio/StudioClasses/AssetPreloadData.cs deleted file mode 100644 index b9b4578..0000000 --- a/AssetStudio/StudioClasses/AssetPreloadData.cs +++ /dev/null @@ -1,67 +0,0 @@ -using System; -using System.Linq; -using System.Text; -using System.Windows.Forms; - -namespace AssetStudio -{ - public class AssetPreloadData : ListViewItem - { - public AssetsFile sourceFile; - public long m_PathID; - public uint Offset; - public uint Size; - public long FullSize; - public SerializedType serializedType; - public ClassIDType Type; - public string TypeString; - public string InfoText; - public string uniqueID; - public GameObject gameObject; - - public AssetPreloadData(AssetsFile assetsFile, ObjectInfo objectInfo, string uniqueID) - { - sourceFile = assetsFile; - m_PathID = objectInfo.m_PathID; - Offset = objectInfo.byteStart; - Size = objectInfo.byteSize; - FullSize = objectInfo.byteSize; - serializedType = objectInfo.serializedType; - if (Enum.IsDefined(typeof(ClassIDType), objectInfo.classID)) - { - Type = (ClassIDType)objectInfo.classID; - TypeString = Type.ToString(); - } - else - { - Type = ClassIDType.UnknownType; - TypeString = $"UnknownType {objectInfo.classID}"; - } - this.uniqueID = uniqueID; - } - - public EndianBinaryReader InitReader() - { - var reader = sourceFile.reader; - reader.Position = Offset; - return reader; - } - - public string Dump() - { - var reader = InitReader(); - if (serializedType?.m_Nodes != null) - { - var sb = new StringBuilder(); - TypeTreeHelper.ReadTypeString(sb, serializedType.m_Nodes, reader); - return sb.ToString(); - } - return null; - } - - public bool HasStructMember(string name) - { - return serializedType?.m_Nodes != null && serializedType.m_Nodes.Any(x => x.m_Name == name); - } - } -} diff --git a/AssetStudio/StudioClasses/AssetsFile.cs b/AssetStudio/StudioClasses/AssetsFile.cs index a056fe4..af9d264 100644 --- a/AssetStudio/StudioClasses/AssetsFile.cs +++ b/AssetStudio/StudioClasses/AssetsFile.cs @@ -17,10 +17,9 @@ namespace AssetStudio public string[] buildType; 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 Dictionary ObjectReaders = new Dictionary(); + public Dictionary GameObjects = new Dictionary(); + public Dictionary Transforms = new Dictionary(); //class SerializedFile public SerializedFileHeader header; @@ -98,9 +97,6 @@ namespace AssetStudio //Read Objects int objectCount = reader.ReadInt32(); - - var assetIDfmt = "D" + objectCount.ToString().Length; //format for unique ID - m_Objects = new Dictionary(objectCount); for (int i = 0; i < objectCount; i++) { @@ -136,17 +132,17 @@ namespace AssetStudio } m_Objects.Add(objectInfo.m_PathID, objectInfo); - //Create AssetPreloadData - var asset = new AssetPreloadData(this, objectInfo, i.ToString(assetIDfmt)); - preloadTable.Add(asset.m_PathID, asset); + //Create Reader + var objectReader = new ObjectReader(reader, this, objectInfo); + ObjectReaders.Add(objectInfo.m_PathID, objectReader); #region read BuildSettings to get version for version 2.x files - if (asset.Type == ClassIDType.BuildSettings && header.m_Version == 6) + if (objectReader.type == ClassIDType.BuildSettings && header.m_Version == 6) { var nextAsset = reader.Position; - var BSettings = new BuildSettings(asset); - unityVersion = BSettings.m_Version; + var buildSettings = new BuildSettings(objectReader); + unityVersion = buildSettings.m_Version; reader.Position = nextAsset; } @@ -331,16 +327,5 @@ namespace AssetStudio reader.Position += stringBufferSize; } } - - 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/AudioClipConverter.cs b/AssetStudio/StudioClasses/AudioClipConverter.cs index d297a8b..f50a20b 100644 --- a/AssetStudio/StudioClasses/AudioClipConverter.cs +++ b/AssetStudio/StudioClasses/AudioClipConverter.cs @@ -71,7 +71,7 @@ namespace AssetStudio public string GetExtensionName() { - if (m_AudioClip.sourceFile.version[0] < 5) + if (m_AudioClip.version[0] < 5) { switch (m_AudioClip.m_Type) { @@ -136,7 +136,7 @@ namespace AssetStudio { get { - if (m_AudioClip.sourceFile.version[0] < 5) + if (m_AudioClip.version[0] < 5) { switch (m_AudioClip.m_Type) { diff --git a/AssetStudio/StudioClasses/Exporter.cs b/AssetStudio/StudioClasses/Exporter.cs index e8ee41f..b7b5aac 100644 --- a/AssetStudio/StudioClasses/Exporter.cs +++ b/AssetStudio/StudioClasses/Exporter.cs @@ -10,9 +10,9 @@ namespace AssetStudio { static class Exporter { - public static bool ExportTexture2D(AssetPreloadData asset, string exportPathName, bool flip) + public static bool ExportTexture2D(ObjectReader reader, string exportPathName, bool flip) { - var m_Texture2D = new Texture2D(asset, true); + var m_Texture2D = new Texture2D(reader, true); if (m_Texture2D.image_data == null || m_Texture2D.image_data.Length == 0) return false; var converter = new Texture2DConverter(m_Texture2D); @@ -36,7 +36,7 @@ namespace AssetStudio format = ImageFormat.Jpeg; break; } - var exportFullName = exportPathName + asset.Text + "." + ext.ToLower(); + var exportFullName = exportPathName + reader.exportName + "." + ext.ToLower(); if (ExportFileExists(exportFullName)) return false; bitmap.Save(exportFullName, format); @@ -45,7 +45,7 @@ namespace AssetStudio } else { - var exportFullName = exportPathName + asset.Text + converter.GetExtensionName(); + var exportFullName = exportPathName + reader.exportName + converter.GetExtensionName(); if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, converter.ConvertToContainer()); @@ -53,16 +53,16 @@ namespace AssetStudio } } - public static bool ExportAudioClip(AssetPreloadData asset, string exportPath) + public static bool ExportAudioClip(ObjectReader reader, string exportPath) { - var m_AudioClip = new AudioClip(asset, true); + var m_AudioClip = new AudioClip(reader, true); if (m_AudioClip.m_AudioData == null) return false; var convertAudio = (bool)Properties.Settings.Default["convertAudio"]; var converter = new AudioClipConverter(m_AudioClip); if (convertAudio && converter.IsFMODSupport) { - var exportFullName = exportPath + asset.Text + ".wav"; + var exportFullName = exportPath + reader.exportName + ".wav"; if (ExportFileExists(exportFullName)) return false; var buffer = converter.ConvertToWav(); @@ -72,7 +72,7 @@ namespace AssetStudio } else { - var exportFullName = exportPath + asset.Text + converter.GetExtensionName(); + var exportFullName = exportPath + reader.exportName + converter.GetExtensionName(); if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, m_AudioClip.m_AudioData); @@ -80,56 +80,56 @@ namespace AssetStudio return true; } - public static bool ExportShader(AssetPreloadData asset, string exportPath) + public static bool ExportShader(ObjectReader reader, string exportPath) { - var m_Shader = new Shader(asset); - var exportFullName = exportPath + asset.Text + ".shader"; + var m_Shader = new Shader(reader); + var exportFullName = exportPath + reader.exportName + ".shader"; if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, m_Shader.m_Script); return true; } - public static bool ExportTextAsset(AssetPreloadData asset, string exportPath) + public static bool ExportTextAsset(ObjectReader reader, string exportPath) { - var m_TextAsset = new TextAsset(asset); - var exportFullName = exportPath + asset.Text + ".txt"; + var m_TextAsset = new TextAsset(reader); + var exportFullName = exportPath + reader.exportName + ".txt"; if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, m_TextAsset.m_Script); return true; } - public static bool ExportMonoBehaviour(AssetPreloadData asset, string exportPath) + public static bool ExportMonoBehaviour(ObjectReader reader, string exportPath) { - var exportFullName = exportPath + asset.Text + ".txt"; + var exportFullName = exportPath + reader.exportName + ".txt"; if (ExportFileExists(exportFullName)) return false; - var m_MonoBehaviour = new MonoBehaviour(asset); + var m_MonoBehaviour = new MonoBehaviour(reader); string str; - if (asset.serializedType?.m_Nodes != null) + if (reader.serializedType?.m_Nodes != null) { - str = asset.Dump(); + str = reader.Dump(); } else { - str = Studio.GetScriptString(asset); + str = Studio.GetScriptString(reader); } File.WriteAllText(exportFullName, str); return true; } - public static bool ExportFont(AssetPreloadData asset, string exportPath) + public static bool ExportFont(ObjectReader reader, string exportPath) { - var m_Font = new Font(asset); + var m_Font = new Font(reader); if (m_Font.m_FontData != null) { - string extension = ".ttf"; + var extension = ".ttf"; if (m_Font.m_FontData[0] == 79 && m_Font.m_FontData[1] == 84 && m_Font.m_FontData[2] == 84 && m_Font.m_FontData[3] == 79) { extension = ".otf"; } - var exportFullName = exportPath + asset.Text + extension; + var exportFullName = exportPath + reader.exportName + extension; if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, m_Font.m_FontData); @@ -138,12 +138,12 @@ namespace AssetStudio return false; } - public static bool ExportMesh(AssetPreloadData asset, string exportPath) + public static bool ExportMesh(ObjectReader reader, string exportPath) { - var m_Mesh = new Mesh(asset); + var m_Mesh = new Mesh(reader); if (m_Mesh.m_VertexCount <= 0) return false; - var exportFullName = exportPath + asset.Text + ".obj"; + var exportFullName = exportPath + reader.exportName + ".obj"; if (ExportFileExists(exportFullName)) return false; var sb = new StringBuilder(); @@ -219,12 +219,12 @@ namespace AssetStudio return true; } - public static bool ExportVideoClip(AssetPreloadData asset, string exportPath) + public static bool ExportVideoClip(ObjectReader reader, string exportPath) { - var m_VideoClip = new VideoClip(asset, true); + var m_VideoClip = new VideoClip(reader, true); if (m_VideoClip.m_VideoData != null) { - var exportFullName = exportPath + asset.Text + Path.GetExtension(m_VideoClip.m_OriginalPath); + var exportFullName = exportPath + reader.exportName + Path.GetExtension(m_VideoClip.m_OriginalPath); if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, m_VideoClip.m_VideoData); @@ -233,17 +233,17 @@ namespace AssetStudio return false; } - public static bool ExportMovieTexture(AssetPreloadData asset, string exportPath) + public static bool ExportMovieTexture(ObjectReader reader, string exportPath) { - var m_MovieTexture = new MovieTexture(asset); - var exportFullName = exportPath + asset.Text + ".ogv"; + var m_MovieTexture = new MovieTexture(reader); + var exportFullName = exportPath + reader.exportName + ".ogv"; if (ExportFileExists(exportFullName)) return false; File.WriteAllBytes(exportFullName, m_MovieTexture.m_MovieData); return true; } - public static bool ExportSprite(AssetPreloadData asset, string exportPath) + public static bool ExportSprite(ObjectReader reader, string exportPath) { ImageFormat format = null; var type = (string)Properties.Settings.Default["convertType"]; @@ -259,10 +259,10 @@ namespace AssetStudio format = ImageFormat.Jpeg; break; } - var exportFullName = exportPath + asset.Text + "." + type.ToLower(); + var exportFullName = exportPath + reader.exportName + "." + type.ToLower(); if (ExportFileExists(exportFullName)) return false; - var bitmap = SpriteHelper.GetImageFromSprite(new Sprite(asset)); + var bitmap = SpriteHelper.GetImageFromSprite(new Sprite(reader)); if (bitmap != null) { bitmap.Save(exportFullName, format); @@ -271,13 +271,12 @@ namespace AssetStudio return false; } - public static bool ExportRawFile(AssetPreloadData asset, string exportPath) + public static bool ExportRawFile(ObjectReader reader, string exportPath) { - var exportFullName = exportPath + asset.Text + ".dat"; + var exportFullName = exportPath + reader.exportName + ".dat"; if (ExportFileExists(exportFullName)) return false; - var bytes = asset.InitReader().ReadBytes((int)asset.Size); - File.WriteAllBytes(exportFullName, bytes); + File.WriteAllBytes(exportFullName, reader.GetRawData()); return true; } @@ -291,15 +290,15 @@ namespace AssetStudio return false; } - public static bool ExportAnimator(AssetPreloadData animator, string exportPath, List animationList = null) + public static bool ExportAnimator(ObjectReader animator, string exportPath, List animationList = null) { var m_Animator = new Animator(animator); var convert = animationList != null ? new ModelConverter(m_Animator, animationList) : new ModelConverter(m_Animator); - exportPath = exportPath + Studio.FixFileName(animator.Text) + ".fbx"; + exportPath = exportPath + Studio.FixFileName(animator.exportName) + ".fbx"; return ModelConverter(convert, exportPath); } - public static bool ExportGameObject(GameObject gameObject, string exportPath, List animationList = null) + public static bool ExportGameObject(GameObject gameObject, string exportPath, List animationList = null) { var convert = animationList != null ? new ModelConverter(gameObject, animationList) : new ModelConverter(gameObject); exportPath = exportPath + Studio.FixFileName(gameObject.m_Name) + ".fbx"; diff --git a/AssetStudio/StudioClasses/ModelConverter.cs b/AssetStudio/StudioClasses/ModelConverter.cs index e94a3ef..adf7272 100644 --- a/AssetStudio/StudioClasses/ModelConverter.cs +++ b/AssetStudio/StudioClasses/ModelConverter.cs @@ -20,12 +20,12 @@ namespace AssetStudio private Avatar avatar; private Dictionary morphChannelInfo = new Dictionary(); - private HashSet animationClipHashSet = new HashSet(); + private HashSet animationClipHashSet = new HashSet(); private Dictionary bonePathHash = new Dictionary(); public ModelConverter(GameObject m_GameObject) { - if (m_GameObject.m_Animator != null && m_GameObject.m_Animator.TryGetPD(out var m_Animator)) + if (m_GameObject.m_Animator != null && m_GameObject.m_Animator.TryGet(out var m_Animator)) { var animator = new Animator(m_Animator); InitWithAnimator(animator); @@ -36,9 +36,9 @@ namespace AssetStudio ConvertAnimations(); } - public ModelConverter(GameObject m_GameObject, List animationList) + public ModelConverter(GameObject m_GameObject, List animationList) { - if (m_GameObject.m_Animator != null && m_GameObject.m_Animator.TryGetPD(out var m_Animator)) + if (m_GameObject.m_Animator != null && m_GameObject.m_Animator.TryGet(out var m_Animator)) { var animator = new Animator(m_Animator); InitWithAnimator(animator); @@ -47,7 +47,7 @@ namespace AssetStudio InitWithGameObject(m_GameObject); foreach (var assetPreloadData in animationList) { - animationClipHashSet.Add(assetPreloadData); + animationClipHashSet.Add(assetPreloadData.reader); } ConvertAnimations(); } @@ -59,19 +59,19 @@ namespace AssetStudio ConvertAnimations(); } - public ModelConverter(Animator m_Animator, List animationList) + public ModelConverter(Animator m_Animator, List animationList) { InitWithAnimator(m_Animator); foreach (var assetPreloadData in animationList) { - animationClipHashSet.Add(assetPreloadData); + animationClipHashSet.Add(assetPreloadData.reader); } ConvertAnimations(); } private void InitWithAnimator(Animator m_Animator) { - if (m_Animator.m_Avatar.TryGetPD(out var m_Avatar)) + if (m_Animator.m_Avatar.TryGet(out var m_Avatar)) avatar = new Avatar(m_Avatar); m_Animator.m_GameObject.TryGetGameObject(out var m_GameObject); @@ -124,28 +124,28 @@ namespace AssetStudio m_Transform.m_GameObject.TryGetGameObject(out var m_GameObject); foreach (var m_Component in m_GameObject.m_Components) { - if (m_Component.TryGetPD(out var assetPreloadData)) + if (m_Component.TryGet(out var objectReader)) { - switch (assetPreloadData.Type) + switch (objectReader.type) { case ClassIDType.MeshRenderer: { - var m_Renderer = new MeshRenderer(assetPreloadData); + var m_Renderer = new MeshRenderer(objectReader); ConvertMeshRenderer(m_Renderer); break; } case ClassIDType.SkinnedMeshRenderer: { - var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); + var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(objectReader); ConvertMeshRenderer(m_SkinnedMeshRenderer); break; } case ClassIDType.Animation: { - var m_Animation = new Animation(assetPreloadData); + var m_Animation = new Animation(objectReader); foreach (var animation in m_Animation.m_Animations) { - if (animation.TryGetPD(out var animationClip)) + if (animation.TryGet(out var animationClip)) { animationClipHashSet.Add(animationClip); } @@ -164,19 +164,19 @@ namespace AssetStudio private void CollectAnimationClip(Animator m_Animator) { - if (m_Animator.m_Controller.TryGetPD(out var assetPreloadData)) + if (m_Animator.m_Controller.TryGet(out var objectReader)) { - if (assetPreloadData.Type == ClassIDType.AnimatorOverrideController) + if (objectReader.type == ClassIDType.AnimatorOverrideController) { - var m_AnimatorOverrideController = new AnimatorOverrideController(assetPreloadData); - if (m_AnimatorOverrideController.m_Controller.TryGetPD(out assetPreloadData)) + var m_AnimatorOverrideController = new AnimatorOverrideController(objectReader); + if (m_AnimatorOverrideController.m_Controller.TryGet(out objectReader)) { - var m_AnimatorController = new AnimatorController(assetPreloadData); + var m_AnimatorController = new AnimatorController(objectReader); foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips) { - if (m_AnimationClip.TryGetPD(out assetPreloadData)) + if (m_AnimationClip.TryGet(out objectReader)) { - animationClipHashSet.Add(assetPreloadData); + animationClipHashSet.Add(objectReader); } } } @@ -188,14 +188,14 @@ namespace AssetStudio } }*/ } - else if (assetPreloadData.Type == ClassIDType.AnimatorController) + else if (objectReader.type == ClassIDType.AnimatorController) { - var m_AnimatorController = new AnimatorController(assetPreloadData); + var m_AnimatorController = new AnimatorController(objectReader); foreach (var m_AnimationClip in m_AnimatorController.m_AnimationClips) { - if (m_AnimationClip.TryGetPD(out assetPreloadData)) + if (m_AnimationClip.TryGet(out objectReader)) { - animationClipHashSet.Add(assetPreloadData); + animationClipHashSet.Add(objectReader); } } } @@ -294,7 +294,7 @@ namespace AssetStudio Material mat = null; if (i - firstSubMesh < meshR.m_Materials.Length) { - if (meshR.m_Materials[i - firstSubMesh].TryGetPD(out var MaterialPD)) + if (meshR.m_Materials[i - firstSubMesh].TryGet(out var MaterialPD)) { mat = new Material(MaterialPD); } @@ -567,7 +567,7 @@ namespace AssetStudio { if (meshR is SkinnedMeshRenderer sMesh) { - if (sMesh.m_Mesh.TryGetPD(out var MeshPD)) + if (sMesh.m_Mesh.TryGet(out var MeshPD)) { return new Mesh(MeshPD); } @@ -577,12 +577,12 @@ namespace AssetStudio meshR.m_GameObject.TryGetGameObject(out var m_GameObject); foreach (var m_Component in m_GameObject.m_Components) { - if (m_Component.TryGetPD(out var assetPreloadData)) + if (m_Component.TryGet(out var objectReader)) { - if (assetPreloadData.Type == ClassIDType.MeshFilter) + if (objectReader.type == ClassIDType.MeshFilter) { - var m_MeshFilter = new MeshFilter(assetPreloadData); - if (m_MeshFilter.m_Mesh.TryGetPD(out var MeshPD)) + var m_MeshFilter = new MeshFilter(objectReader); + if (m_MeshFilter.m_Mesh.TryGet(out var MeshPD)) { return new Mesh(MeshPD); } @@ -675,7 +675,7 @@ namespace AssetStudio foreach (var texEnv in mat.m_TexEnvs) { Texture2D tex2D = null; - if (texEnv.m_Texture.TryGetPD(out var TexturePD) && TexturePD.Type == ClassIDType.Texture2D)//TODO other Texture + if (texEnv.m_Texture.TryGet(out var TexturePD) && TexturePD.type == ClassIDType.Texture2D)//TODO other Texture { tex2D = new Texture2D(TexturePD, true); } @@ -689,7 +689,7 @@ namespace AssetStudio { continue; } - iMat.Textures[dest] = TexturePD.Text + ".png"; + iMat.Textures[dest] = TexturePD.exportName + ".png"; iMat.TexOffsets[dest] = new Vector2(texEnv.m_Offset[0], texEnv.m_Offset[1]); iMat.TexScales[dest] = new Vector2(texEnv.m_Scale[0], texEnv.m_Scale[1]); ConvertTexture2D(tex2D, iMat.Textures[dest]); diff --git a/AssetStudio/StudioClasses/ObjectReader.cs b/AssetStudio/StudioClasses/ObjectReader.cs new file mode 100644 index 0000000..e376d64 --- /dev/null +++ b/AssetStudio/StudioClasses/ObjectReader.cs @@ -0,0 +1,82 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace AssetStudio +{ + public class ObjectReader : EndianBinaryReader + { + public AssetsFile assetsFile; + public long m_PathID; + public uint byteStart; + public uint byteSize; + public ClassIDType type; + public SerializedType serializedType; + public BuildTarget platform; + private uint m_Version; + + public int[] version => assetsFile.version; + public string[] buildType => assetsFile.buildType; + + public string exportName; //TODO Remove it + + public ObjectReader(EndianBinaryReader reader, AssetsFile assetsFile, ObjectInfo objectInfo) : base(reader.BaseStream, reader.endian) + { + this.assetsFile = assetsFile; + m_PathID = objectInfo.m_PathID; + byteStart = objectInfo.byteStart; + byteSize = objectInfo.byteSize; + if (Enum.IsDefined(typeof(ClassIDType), objectInfo.classID)) + { + type = (ClassIDType)objectInfo.classID; + } + else + { + type = ClassIDType.UnknownType; + } + serializedType = objectInfo.serializedType; + platform = assetsFile.m_TargetPlatform; + m_Version = assetsFile.header.m_Version; + } + + public void Reset() + { + Position = byteStart; + } + + public string Dump() + { + Reset(); + if (serializedType?.m_Nodes != null) + { + var sb = new StringBuilder(); + TypeTreeHelper.ReadTypeString(sb, serializedType.m_Nodes, this); + return sb.ToString(); + } + return null; + } + + public bool HasStructMember(string name) + { + return serializedType?.m_Nodes != null && serializedType.m_Nodes.Any(x => x.m_Name == name); + } + + public PPtr ReadPPtr() + { + return new PPtr + { + m_FileID = ReadInt32(), + m_PathID = m_Version < 14 ? ReadInt32() : ReadInt64(), + assetsFile = assetsFile + }; + } + + public byte[] GetRawData() + { + Reset(); + return ReadBytes((int)byteSize); + } + } +} diff --git a/AssetStudio/StudioClasses/PPtr.cs b/AssetStudio/StudioClasses/PPtr.cs index 3d0a244..984c5a8 100644 --- a/AssetStudio/StudioClasses/PPtr.cs +++ b/AssetStudio/StudioClasses/PPtr.cs @@ -11,7 +11,7 @@ namespace AssetStudio public AssetsFile assetsFile; public int index = -2; //-2 - Prepare, -1 - Missing - private bool TryGet(out AssetsFile result) + private bool TryGetAssetsFile(out AssetsFile result) { result = null; if (m_FileID == 0) @@ -43,12 +43,12 @@ namespace AssetStudio return false; } - public bool TryGetPD(out AssetPreloadData result) + public bool TryGet(out ObjectReader result) { result = null; - if (TryGet(out var sourceFile)) + if (TryGetAssetsFile(out var sourceFile)) { - if (sourceFile.preloadTable.TryGetValue(m_PathID, out result)) + if (sourceFile.ObjectReaders.TryGetValue(m_PathID, out result)) { return true; } @@ -59,9 +59,9 @@ namespace AssetStudio public bool TryGetTransform(out Transform m_Transform) { - if (TryGet(out var sourceFile)) + if (TryGetAssetsFile(out var sourceFile)) { - if (sourceFile.TransformList.TryGetValue(m_PathID, out m_Transform)) + if (sourceFile.Transforms.TryGetValue(m_PathID, out m_Transform)) { return true; } @@ -73,9 +73,9 @@ namespace AssetStudio public bool TryGetGameObject(out GameObject m_GameObject) { - if (TryGet(out var sourceFile)) + if (TryGetAssetsFile(out var sourceFile)) { - if (sourceFile.GameObjectList.TryGetValue(m_PathID, out m_GameObject)) + if (sourceFile.GameObjects.TryGetValue(m_PathID, out m_GameObject)) { return true; } diff --git a/AssetStudio/StudioClasses/SpriteHelper.cs b/AssetStudio/StudioClasses/SpriteHelper.cs index 6bee011..14e98b6 100644 --- a/AssetStudio/StudioClasses/SpriteHelper.cs +++ b/AssetStudio/StudioClasses/SpriteHelper.cs @@ -12,39 +12,39 @@ namespace AssetStudio { public static Bitmap GetImageFromSprite(Sprite m_Sprite) { - if (m_Sprite.m_SpriteAtlas != null && m_Sprite.m_SpriteAtlas.TryGetPD(out var assetPreloadData)) + if (m_Sprite.m_SpriteAtlas != null && m_Sprite.m_SpriteAtlas.TryGet(out var objectReader)) { - var m_SpriteAtlas = new SpriteAtlas(assetPreloadData); + var m_SpriteAtlas = new SpriteAtlas(objectReader); var index = m_SpriteAtlas.guids.FindIndex(x => x == m_Sprite.first); - if (index >= 0 && m_SpriteAtlas.textures[index].TryGetPD(out assetPreloadData)) + if (index >= 0 && m_SpriteAtlas.textures[index].TryGet(out objectReader)) { try { if (m_Sprite.m_PhysicsShape.Length > 0) { - return CutImage(assetPreloadData, m_SpriteAtlas.textureRects[index], m_Sprite); + return CutImage(objectReader, m_SpriteAtlas.textureRects[index], m_Sprite); } - return CutImage(assetPreloadData, m_SpriteAtlas.textureRects[index]); + return CutImage(objectReader, m_SpriteAtlas.textureRects[index]); } catch { - return CutImage(assetPreloadData, m_SpriteAtlas.textureRects[index]); + return CutImage(objectReader, m_SpriteAtlas.textureRects[index]); } } } else { - if (m_Sprite.texture.TryGetPD(out assetPreloadData)) + if (m_Sprite.texture.TryGet(out objectReader)) { - return CutImage(assetPreloadData, m_Sprite.textureRect); + return CutImage(objectReader, m_Sprite.textureRect); } } return null; } - private static Bitmap CutImage(AssetPreloadData texture2DAsset, RectangleF textureRect) + private static Bitmap CutImage(ObjectReader texture2DAsset, RectangleF textureRect) { var texture2D = new Texture2DConverter(new Texture2D(texture2DAsset, true)); using (var originalImage = texture2D.ConvertToBitmap(false)) @@ -60,7 +60,7 @@ namespace AssetStudio return null; } - private static Bitmap CutImage(AssetPreloadData texture2DAsset, RectangleF textureRect, Sprite sprite) + private static Bitmap CutImage(ObjectReader texture2DAsset, RectangleF textureRect, Sprite sprite) { var texture2D = new Texture2DConverter(new Texture2D(texture2DAsset, true)); using (var originalImage = texture2D.ConvertToBitmap(false)) diff --git a/AssetStudio/StudioClasses/Studio.cs b/AssetStudio/StudioClasses/Studio.cs index 38b6bcf..be58fb8 100644 --- a/AssetStudio/StudioClasses/Studio.cs +++ b/AssetStudio/StudioClasses/Studio.cs @@ -17,9 +17,9 @@ namespace AssetStudio public static List assetsfileList = new List(); //loaded files 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 + 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 - public static List visibleAssets = new List(); //used to build the ListView from all or filtered assets + public static List visibleAssets = new List(); //used to build the ListView from all or filtered assets public static Dictionary> AllTypeMap = new Dictionary>(); public static string mainPath; public static string productName = ""; @@ -157,65 +157,70 @@ namespace AssetStudio public static void BuildAssetStructures(bool loadAssets, bool displayAll, bool buildHierarchy, bool buildClassStructures, bool displayOriginalName) { - #region first loop - read asset data & create list + var tempDic = new Dictionary(); + // first loop - read asset data & create list if (loadAssets) { SetProgressBarValue(0); - SetProgressBarMaximum(assetsfileList.Sum(x => x.preloadTable.Values.Count)); + SetProgressBarMaximum(assetsfileList.Sum(x => x.ObjectReaders.Count)); StatusStripUpdate("Building asset list..."); - string fileIDfmt = "D" + assetsfileList.Count.ToString().Length; + var fileIDfmt = "D" + assetsfileList.Count.ToString().Length; for (var i = 0; i < assetsfileList.Count; i++) { var assetsFile = assetsfileList[i]; - - string fileID = i.ToString(fileIDfmt); + var tempExportableAssets = new List(); + var fileID = i.ToString(fileIDfmt); AssetBundle ab = null; - foreach (var asset in assetsFile.preloadTable.Values) + var j = 0; + var assetIDfmt = "D" + assetsFile.m_Objects.Count.ToString().Length; + foreach (var objectReader in assetsFile.ObjectReaders.Values) { - asset.uniqueID = fileID + asset.uniqueID; + var assetItem = new AssetItem(objectReader); + tempDic.Add(objectReader, assetItem); + assetItem.UniqueID = fileID + j.ToString(assetIDfmt); var exportable = false; - switch (asset.Type) + switch (assetItem.Type) { case ClassIDType.GameObject: { - var m_GameObject = new GameObject(asset); - asset.Text = m_GameObject.m_Name; - assetsFile.GameObjectList.Add(asset.m_PathID, m_GameObject); + var m_GameObject = new GameObject(objectReader); + assetItem.Text = m_GameObject.m_Name; + assetsFile.GameObjects.Add(objectReader.m_PathID, m_GameObject); break; } case ClassIDType.Transform: { - var m_Transform = new Transform(asset); - assetsFile.TransformList.Add(asset.m_PathID, m_Transform); + var m_Transform = new Transform(objectReader); + assetsFile.Transforms.Add(objectReader.m_PathID, m_Transform); break; } case ClassIDType.RectTransform: { - var m_Rect = new RectTransform(asset); - assetsFile.TransformList.Add(asset.m_PathID, m_Rect); + var m_Rect = new RectTransform(objectReader); + assetsFile.Transforms.Add(objectReader.m_PathID, m_Rect); break; } case ClassIDType.Texture2D: { - var m_Texture2D = new Texture2D(asset, false); + var m_Texture2D = new Texture2D(objectReader, false); if (!string.IsNullOrEmpty(m_Texture2D.path)) - asset.FullSize = asset.Size + m_Texture2D.size; + assetItem.FullSize = objectReader.byteSize + m_Texture2D.size; goto case ClassIDType.NamedObject; } case ClassIDType.AudioClip: { - var m_AudioClip = new AudioClip(asset, false); + var m_AudioClip = new AudioClip(objectReader, false); if (!string.IsNullOrEmpty(m_AudioClip.m_Source)) - asset.FullSize = asset.Size + m_AudioClip.m_Size; + assetItem.FullSize = objectReader.byteSize + m_AudioClip.m_Size; goto case ClassIDType.NamedObject; } case ClassIDType.VideoClip: { - var m_VideoClip = new VideoClip(asset, false); + var m_VideoClip = new VideoClip(objectReader, false); if (!string.IsNullOrEmpty(m_VideoClip.m_OriginalPath)) - asset.FullSize = asset.Size + (long)m_VideoClip.m_Size; + assetItem.FullSize = objectReader.byteSize + (long)m_VideoClip.m_Size; goto case ClassIDType.NamedObject; } case ClassIDType.NamedObject: @@ -227,8 +232,8 @@ namespace AssetStudio case ClassIDType.MovieTexture: case ClassIDType.Sprite: { - var obj = new NamedObject(asset); - asset.Text = obj.m_Name; + var obj = new NamedObject(objectReader); + assetItem.Text = obj.m_Name; exportable = true; break; } @@ -239,8 +244,8 @@ namespace AssetStudio case ClassIDType.MonoScript: case ClassIDType.SpriteAtlas: { - var obj = new NamedObject(asset); - asset.Text = obj.m_Name; + var obj = new NamedObject(objectReader); + assetItem.Text = obj.m_Name; break; } case ClassIDType.Animator: @@ -250,78 +255,82 @@ namespace AssetStudio } case ClassIDType.MonoBehaviour: { - var m_MonoBehaviour = new MonoBehaviour(asset); - if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGetPD(out var script)) + var m_MonoBehaviour = new MonoBehaviour(objectReader); + if (m_MonoBehaviour.m_Name == "" && m_MonoBehaviour.m_Script.TryGet(out var script)) { var m_Script = new MonoScript(script); - asset.Text = m_Script.m_ClassName; + assetItem.Text = m_Script.m_ClassName; } else { - asset.Text = m_MonoBehaviour.m_Name; + assetItem.Text = m_MonoBehaviour.m_Name; } exportable = true; break; } case ClassIDType.PlayerSettings: { - var plSet = new PlayerSettings(asset); + var plSet = new PlayerSettings(objectReader); productName = plSet.productName; break; } case ClassIDType.AssetBundle: { - ab = new AssetBundle(asset); - asset.Text = ab.m_Name; + ab = new AssetBundle(objectReader); + assetItem.Text = ab.m_Name; break; } } - if (asset.Text == "") + if (assetItem.Text == "") { - asset.Text = asset.TypeString + " #" + asset.uniqueID; + assetItem.Text = assetItem.TypeString + " #" + assetItem.UniqueID; } - asset.SubItems.AddRange(new[] { asset.TypeString, asset.FullSize.ToString() }); + assetItem.SubItems.AddRange(new[] { assetItem.TypeString, assetItem.FullSize.ToString() }); //处理同名文件 - if (!assetsNameHash.Add((asset.TypeString + asset.Text).ToUpper())) + if (!assetsNameHash.Add((assetItem.TypeString + assetItem.Text).ToUpper())) { - asset.Text += " #" + asset.uniqueID; + assetItem.Text += " #" + assetItem.UniqueID; } //处理非法文件名 - asset.Text = FixFileName(asset.Text); + assetItem.Text = FixFileName(assetItem.Text); if (displayAll) { exportable = true; } if (exportable) { - assetsFile.exportableAssets.Add(asset); + tempExportableAssets.Add(assetItem); } + objectReader.exportName = assetItem.Text; + ProgressBarPerformStep(); + j++; } if (displayOriginalName) { - assetsFile.exportableAssets.ForEach(x => + foreach (var x in tempExportableAssets) { - var replacename = ab?.m_Container.Find(y => y.second.asset.m_PathID == x.m_PathID)?.first; + var replacename = ab?.m_Container.Find(y => y.second.asset.m_PathID == x.reader.m_PathID)?.first; if (!string.IsNullOrEmpty(replacename)) { var ex = Path.GetExtension(replacename); x.Text = !string.IsNullOrEmpty(ex) ? replacename.Replace(ex, "") : replacename; + x.reader.exportName = x.Text; } - }); + } } - exportableAssets.AddRange(assetsFile.exportableAssets); + exportableAssets.AddRange(tempExportableAssets); + tempExportableAssets.Clear(); } visibleAssets = exportableAssets; assetsNameHash.Clear(); } - #endregion - #region second loop - build tree structure + // second loop - build tree structure if (buildHierarchy) { - var gameObjectCount = assetsfileList.Sum(x => x.GameObjectList.Values.Count); + var gameObjectCount = assetsfileList.Sum(x => x.GameObjects.Count); if (gameObjectCount > 0) { SetProgressBarValue(0); @@ -333,13 +342,13 @@ namespace AssetStudio var fileNode = new GameObjectTreeNode(null); //RootNode fileNode.Text = assetsFile.fileName; - foreach (var m_GameObject in assetsFile.GameObjectList.Values) + foreach (var m_GameObject in assetsFile.GameObjects.Values) { foreach (var m_Component in m_GameObject.m_Components) { - if (m_Component.TryGetPD(out var asset)) + if (m_Component.TryGet(out var asset)) { - switch (asset.Type) + switch (asset.type) { case ClassIDType.Transform: { @@ -354,12 +363,13 @@ namespace AssetStudio case ClassIDType.MeshFilter: { m_GameObject.m_MeshFilter = m_Component; - if (m_Component.TryGetPD(out var assetPreloadData)) + if (m_Component.TryGet(out var objectReader)) { - var m_MeshFilter = new MeshFilter(assetPreloadData); - if (m_MeshFilter.m_Mesh.TryGetPD(out assetPreloadData)) + var m_MeshFilter = new MeshFilter(objectReader); + if (m_MeshFilter.m_Mesh.TryGet(out objectReader)) { - assetPreloadData.gameObject = m_GameObject; + var item = tempDic[objectReader]; + item.gameObject = m_GameObject; } } break; @@ -367,12 +377,13 @@ namespace AssetStudio case ClassIDType.SkinnedMeshRenderer: { m_GameObject.m_SkinnedMeshRenderer = m_Component; - if (m_Component.TryGetPD(out var assetPreloadData)) + if (m_Component.TryGet(out var objectReader)) { - var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(assetPreloadData); - if (m_SkinnedMeshRenderer.m_Mesh.TryGetPD(out assetPreloadData)) + var m_SkinnedMeshRenderer = new SkinnedMeshRenderer(objectReader); + if (m_SkinnedMeshRenderer.m_Mesh.TryGet(out objectReader)) { - assetPreloadData.gameObject = m_GameObject; + var item = tempDic[objectReader]; + item.gameObject = m_GameObject; } } break; @@ -380,7 +391,9 @@ namespace AssetStudio case ClassIDType.Animator: { m_GameObject.m_Animator = m_Component; - asset.Text = m_GameObject.preloadData.Text; + var item = tempDic[asset]; + item.Text = m_GameObject.reader.exportName; + asset.exportName = m_GameObject.reader.exportName; break; } } @@ -410,6 +423,7 @@ namespace AssetStudio treeNodeDictionary.Add(m_GameObject, currentNode); } parentNode.Nodes.Add(currentNode); + ProgressBarPerformStep(); } @@ -420,9 +434,9 @@ namespace AssetStudio } } } - #endregion + tempDic.Clear(); - #region build list of class strucutres + // build list of class strucutres if (buildClassStructures) { foreach (var assetsFile in assetsfileList) @@ -455,7 +469,6 @@ namespace AssetStudio } } } - #endregion } public static string FixFileName(string str) @@ -481,7 +494,7 @@ namespace AssetStudio return selectFile.Distinct().ToArray(); } - public static void ExportAssets(string savePath, List toExportAssets, int assetGroupSelectedIndex, bool openAfterExport) + public static void ExportAssets(string savePath, List toExportAssets, int assetGroupSelectedIndex, bool openAfterExport) { ThreadPool.QueueUserWorkItem(state => { @@ -504,72 +517,73 @@ namespace AssetStudio exportpath = savePath + "\\" + asset.TypeString + "\\"; } StatusStripUpdate($"Exporting {asset.TypeString}: {asset.Text}"); + var reader = asset.reader; try { switch (asset.Type) { case ClassIDType.Texture2D: - if (ExportTexture2D(asset, exportpath, true)) + if (ExportTexture2D(reader, exportpath, true)) { exportedCount++; } break; case ClassIDType.AudioClip: - if (ExportAudioClip(asset, exportpath)) + if (ExportAudioClip(reader, exportpath)) { exportedCount++; } break; case ClassIDType.Shader: - if (ExportShader(asset, exportpath)) + if (ExportShader(reader, exportpath)) { exportedCount++; } break; case ClassIDType.TextAsset: - if (ExportTextAsset(asset, exportpath)) + if (ExportTextAsset(reader, exportpath)) { exportedCount++; } break; case ClassIDType.MonoBehaviour: - if (ExportMonoBehaviour(asset, exportpath)) + if (ExportMonoBehaviour(reader, exportpath)) { exportedCount++; } break; case ClassIDType.Font: - if (ExportFont(asset, exportpath)) + if (ExportFont(reader, exportpath)) { exportedCount++; } break; case ClassIDType.Mesh: - if (ExportMesh(asset, exportpath)) + if (ExportMesh(reader, exportpath)) { exportedCount++; } break; case ClassIDType.VideoClip: - if (ExportVideoClip(asset, exportpath)) + if (ExportVideoClip(reader, exportpath)) { exportedCount++; } break; case ClassIDType.MovieTexture: - if (ExportMovieTexture(asset, exportpath)) + if (ExportMovieTexture(reader, exportpath)) { exportedCount++; } break; case ClassIDType.Sprite: - if (ExportSprite(asset, exportpath)) + if (ExportSprite(reader, exportpath)) { exportedCount++; } break; case ClassIDType.Animator: - if (ExportAnimator(asset, exportpath)) + if (ExportAnimator(reader, exportpath)) { exportedCount++; } @@ -577,7 +591,7 @@ namespace AssetStudio case ClassIDType.AnimationClip: break; default: - if (ExportRawFile(asset, exportpath)) + if (ExportRawFile(reader, exportpath)) { exportedCount++; } @@ -667,14 +681,14 @@ namespace AssetStudio } } - public static void ExportAnimatorWithAnimationClip(AssetPreloadData animator, List animationList, string exportPath) + public static void ExportAnimatorWithAnimationClip(AssetItem animator, List animationList, string exportPath) { ThreadPool.QueueUserWorkItem(state => { StatusStripUpdate($"Exporting {animator.Text}"); try { - ExportAnimator(animator, exportPath, animationList); + ExportAnimator(animator.reader, exportPath, animationList); StatusStripUpdate($"Finished exporting {animator.Text}"); } catch (Exception ex) @@ -686,7 +700,7 @@ namespace AssetStudio }); } - public static void ExportObjectsWithAnimationClip(string exportPath, TreeNodeCollection nodes, List animationList = null) + public static void ExportObjectsWithAnimationClip(string exportPath, TreeNodeCollection nodes, List animationList = null) { ThreadPool.QueueUserWorkItem(state => { @@ -777,7 +791,7 @@ namespace AssetStudio return new[] { (float)(eax * 180 / Math.PI), (float)(eay * 180 / Math.PI), (float)(eaz * 180 / Math.PI) }; } - public static string GetScriptString(AssetPreloadData assetPreloadData) + public static string GetScriptString(ObjectReader reader) { if (!moduleLoaded) { @@ -807,7 +821,7 @@ namespace AssetStudio moduleLoaded = true; } - var m_MonoBehaviour = new MonoBehaviour(assetPreloadData); + var m_MonoBehaviour = new MonoBehaviour(reader); var sb = new StringBuilder(); sb.AppendLine("PPtr m_GameObject"); sb.AppendLine($"\tint m_FileID = {m_MonoBehaviour.m_GameObject.m_FileID}"); @@ -817,7 +831,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 (m_MonoBehaviour.m_Script.TryGetPD(out var script)) + if (m_MonoBehaviour.m_Script.TryGet(out var script)) { var m_Script = new MonoScript(script); if (!LoadedModuleDic.TryGetValue(m_Script.m_AssemblyName, out var module)) @@ -849,7 +863,7 @@ namespace AssetStudio { try { - DumpType(typeDef.ToTypeSig(), sb, assetPreloadData.sourceFile, null, -1, true); + DumpType(typeDef.ToTypeSig(), sb, reader, null, -1, true); } catch { @@ -868,10 +882,9 @@ namespace AssetStudio return sb.ToString(); } - private static void DumpType(TypeSig typeSig, StringBuilder sb, AssetsFile assetsFile, string name, int indent, bool isRoot = false) + private static void DumpType(TypeSig typeSig, StringBuilder sb, ObjectReader reader, string name, int indent, bool isRoot = false) { var typeDef = typeSig.ToTypeDefOrRef().ResolveTypeDefThrow(); - var reader = assetsFile.reader; if (typeSig.IsPrimitive) { object value = null; @@ -944,7 +957,7 @@ namespace AssetStudio for (int i = 0; i < size; i++) { sb.AppendLine($"{new string('\t', indent + 2)}[{i}]"); - DumpType(typeDef.ToTypeSig(), sb, assetsFile, "data", indent + 2); + DumpType(typeDef.ToTypeSig(), sb, reader, "data", indent + 2); } return; } @@ -964,14 +977,14 @@ namespace AssetStudio for (int i = 0; i < size; i++) { sb.AppendLine($"{new string('\t', indent + 2)}[{i}]"); - DumpType(genericInstSig.GenericArguments[0], sb, assetsFile, "data", indent + 2); + DumpType(genericInstSig.GenericArguments[0], sb, reader, "data", indent + 2); } } return; } if (indent != -1 && IsAssignFromUnityObject(typeDef)) { - var pptr = assetsFile.ReadPPtr(); + var pptr = reader.ReadPPtr(); sb.AppendLine($"{new string('\t', indent)}PPtr<{typeDef.Name}> {name} = {{fileID: {pptr.m_FileID}, pathID: {pptr.m_PathID}}}"); return; } @@ -999,15 +1012,15 @@ namespace AssetStudio if (typeDef.FullName == "UnityEngine.AnimationCurve") { sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}"); - var animationCurve = new AnimationCurve(reader, reader.ReadSingle, assetsFile.version); + var animationCurve = new AnimationCurve(reader, reader.ReadSingle); return; } if (typeDef.FullName == "UnityEngine.Gradient") { sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name}"); - if (assetsFile.version[0] == 5 && assetsFile.version[1] < 5) + if (reader.version[0] == 5 && reader.version[1] < 5) reader.Position += 68; - else if (assetsFile.version[0] == 5 && assetsFile.version[1] < 6) + else if (reader.version[0] == 5 && reader.version[1] < 6) reader.Position += 72; else reader.Position += 168; @@ -1034,11 +1047,11 @@ namespace AssetStudio } if (indent == -1 && typeDef.BaseType.FullName != "UnityEngine.Object") { - DumpType(typeDef.BaseType.ToTypeSig(), sb, assetsFile, null, indent, true); + DumpType(typeDef.BaseType.ToTypeSig(), sb, reader, null, indent, true); } if (indent != -1 && typeDef.BaseType.FullName != "System.Object") { - DumpType(typeDef.BaseType.ToTypeSig(), sb, assetsFile, null, indent, true); + DumpType(typeDef.BaseType.ToTypeSig(), sb, reader, null, indent, true); } foreach (var fieldDef in typeDef.Fields) { @@ -1047,12 +1060,12 @@ namespace AssetStudio { if (fieldDef.CustomAttributes.Any(x => x.TypeFullName.Contains("SerializeField"))) { - DumpType(fieldDef.FieldType, sb, assetsFile, fieldDef.Name, indent + 1); + DumpType(fieldDef.FieldType, sb, reader, fieldDef.Name, indent + 1); } } else if ((fieldDef.Attributes & FieldAttributes.Static) == 0 && (fieldDef.Attributes & FieldAttributes.InitOnly) == 0 && (fieldDef.Attributes & FieldAttributes.NotSerialized) == 0) { - DumpType(fieldDef.FieldType, sb, assetsFile, fieldDef.Name, indent + 1); + DumpType(fieldDef.FieldType, sb, reader, fieldDef.Name, indent + 1); } } } diff --git a/AssetStudio/StudioClasses/Texture2DConverter.cs b/AssetStudio/StudioClasses/Texture2DConverter.cs index 6ed9f02..cd6d527 100644 --- a/AssetStudio/StudioClasses/Texture2DConverter.cs +++ b/AssetStudio/StudioClasses/Texture2DConverter.cs @@ -94,8 +94,8 @@ namespace AssetStudio m_Height = m_Texture2D.m_Height; m_TextureFormat = m_Texture2D.m_TextureFormat; var mMipMap = m_Texture2D.m_MipMap; - version = m_Texture2D.sourceFile.version; - var platform = m_Texture2D.sourceFile.m_TargetPlatform; + version = m_Texture2D.version; + var platform = m_Texture2D.platform; if (version[0] < 5 || (version[0] == 5 && version[1] < 2))//5.2 down {