From 98c9eea58a64bb35a6ab64791e061ed5679f5d0b Mon Sep 17 00:00:00 2001 From: Perfare Date: Mon, 3 Dec 2018 02:42:07 +0800 Subject: [PATCH] Improved file reading --- AssetStudio/AssetsManager.cs | 100 +++++--- AssetStudio/Classes/AnimationClip.cs | 48 ++-- AssetStudio/Classes/Animator.cs | 8 +- AssetStudio/Classes/AnimatorController.cs | 69 ++--- AssetStudio/Classes/AudioClip.cs | 7 +- AssetStudio/Classes/Avatar.cs | 84 ++----- AssetStudio/Classes/Behaviour.cs | 2 +- AssetStudio/Classes/BuildSettings.cs | 6 +- AssetStudio/Classes/Font.cs | 4 +- AssetStudio/Classes/Material.cs | 154 +++++------- AssetStudio/Classes/Mesh.cs | 15 +- AssetStudio/Classes/MeshFilter.cs | 1 - AssetStudio/Classes/MovieTexture.cs | 2 +- AssetStudio/Classes/PlayerSettings.cs | 4 +- AssetStudio/Classes/Renderer.cs | 129 ++++++---- AssetStudio/Classes/Shader.cs | 93 ++----- AssetStudio/Classes/SkinnedMeshRenderer.cs | 23 +- AssetStudio/Classes/Sprite.cs | 21 +- AssetStudio/Classes/SpriteAtlas.cs | 6 +- AssetStudio/Classes/Texture.cs | 2 +- AssetStudio/Classes/Texture2D.cs | 2 +- AssetStudio/Classes/VideoClip.cs | 19 +- .../Extensions/BinaryReaderExtensions.cs | 52 +++- AssetStudio/SerializedFile.cs | 237 +++++++++--------- AssetStudio/TypeTreeHelper.cs | 4 +- AssetStudioUtility/ModelConverter.cs | 37 ++- AssetStudioUtility/ScriptHelper.cs | 2 +- AssetStudioUtility/ShaderConverter.cs | 2 +- 28 files changed, 517 insertions(+), 616 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index 5f04a14..5e5a88f 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -13,7 +13,7 @@ namespace AssetStudio private List importFiles = new List(); private HashSet importFilesHash = new HashSet(); - private HashSet assetsfileListHash = new HashSet(); + private HashSet assetsFileListHash = new HashSet(); public void LoadFiles(string[] files) { @@ -49,7 +49,7 @@ namespace AssetStudio importFiles.Clear(); importFilesHash.Clear(); - assetsfileListHash.Clear(); + assetsFileListHash.Clear(); ReadAssets(); ProcessGameObject(); @@ -74,14 +74,14 @@ namespace AssetStudio private void LoadAssetsFile(string fullName, EndianBinaryReader reader) { var fileName = Path.GetFileName(fullName); - if (!assetsfileListHash.Contains(fileName.ToUpper())) + if (!assetsFileListHash.Contains(fileName.ToUpper())) { Logger.Info($"Loading {fileName}"); - var assetsFile = new SerializedFile(this, fullName, reader); - if (assetsFile.valid) + try { + var assetsFile = new SerializedFile(this, fullName, reader); assetsFileList.Add(assetsFile); - assetsfileListHash.Add(assetsFile.upperFileName); + assetsFileListHash.Add(assetsFile.upperFileName); foreach (var sharedFile in assetsFile.m_Externals) { @@ -107,9 +107,10 @@ namespace AssetStudio } } } - else + catch { reader.Dispose(); + //Logger.Error($"Unable to load assets file {fileName}"); } } else @@ -120,24 +121,28 @@ namespace AssetStudio private void LoadAssetsFromMemory(string fullName, EndianBinaryReader reader, string originalPath, string unityVersion = null) { - var fileName = Path.GetFileName(fullName); - if (!assetsfileListHash.Contains(fileName.ToUpper())) + var upperFileName = Path.GetFileName(fullName).ToUpper(); + if (!assetsFileListHash.Contains(upperFileName)) { - var assetsFile = new SerializedFile(this, fullName, reader); - if (assetsFile.valid) + try { + var assetsFile = new SerializedFile(this, fullName, reader); assetsFile.originalPath = originalPath; if (assetsFile.header.m_Version < 7) { assetsFile.SetVersion(unityVersion); } - assetsFileList.Add(assetsFile); - assetsfileListHash.Add(assetsFile.upperFileName); + assetsFileListHash.Add(assetsFile.upperFileName); + } + catch + { + //Logger.Error($"Unable to load assets file {fileName} from {Path.GetFileName(originalPath)}"); + } + finally + { + resourceFileReaders.Add(upperFileName, reader); } - - resourceFileReaders.Add(assetsFile.upperFileName, assetsFile.reader); - } } @@ -145,12 +150,27 @@ namespace AssetStudio { var fileName = Path.GetFileName(fullName); Logger.Info("Loading " + fileName); - var bundleFile = new BundleFile(reader, fullName); - reader.Dispose(); - foreach (var file in bundleFile.fileList) + try { - var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; - LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine); + var bundleFile = new BundleFile(reader, fullName); + foreach (var file in bundleFile.fileList) + { + var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; + LoadAssetsFromMemory(dummyPath, new EndianBinaryReader(file.stream), parentPath ?? fullName, bundleFile.versionEngine); + } + } + catch + { + /*var str = $"Unable to load bundle file {fileName}"; + if (parentPath != null) + { + str += $" from {Path.GetFileName(parentPath)}"; + } + Logger.Error(str);*/ + } + finally + { + reader.Dispose(); } } @@ -158,24 +178,34 @@ namespace AssetStudio { var fileName = Path.GetFileName(fullName); Logger.Info("Loading " + fileName); - var webFile = new WebFile(reader); - reader.Dispose(); - foreach (var file in webFile.fileList) + try { - var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; - switch (CheckFileType(file.stream, out reader)) + var webFile = new WebFile(reader); + foreach (var file in webFile.fileList) { - case FileType.AssetsFile: - LoadAssetsFromMemory(dummyPath, reader, fullName); - break; - case FileType.BundleFile: - LoadBundleFile(dummyPath, reader, fullName); - break; - case FileType.WebFile: - LoadWebFile(dummyPath, reader); - break; + var dummyPath = Path.GetDirectoryName(fullName) + "\\" + file.fileName; + switch (CheckFileType(file.stream, out reader)) + { + case FileType.AssetsFile: + LoadAssetsFromMemory(dummyPath, reader, fullName); + break; + case FileType.BundleFile: + LoadBundleFile(dummyPath, reader, fullName); + break; + case FileType.WebFile: + LoadWebFile(dummyPath, reader); + break; + } } } + catch + { + //Logger.Error($"Unable to load web file {fileName}"); + } + finally + { + reader.Dispose(); + } } public void Clear() diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 6a4f99a..510e468 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -85,10 +85,10 @@ namespace AssetStudio int numData = reader.ReadInt32(); m_Data = reader.ReadBytes(numData); - reader.AlignStream(4); + reader.AlignStream(); m_BitSize = reader.ReadByte(); - reader.AlignStream(4); + reader.AlignStream(); } public float[] UnpackFloats(int itemCountInChunk, int chunkStride, int start = 0, int numChunks = -1) @@ -142,10 +142,10 @@ namespace AssetStudio int numData = reader.ReadInt32(); m_Data = reader.ReadBytes(numData); - reader.AlignStream(4); + reader.AlignStream(); m_BitSize = reader.ReadByte(); - reader.AlignStream(4); + reader.AlignStream(); } public int[] UnpackInts() @@ -187,7 +187,7 @@ namespace AssetStudio int numData = reader.ReadInt32(); m_Data = reader.ReadBytes(numData); - reader.AlignStream(4); + reader.AlignStream(); } public Quaternion[] UnpackQuats() @@ -383,10 +383,7 @@ namespace AssetStudio public HandPose(ObjectReader reader) { m_GrabX = new xform(reader); - - int numDoFs = reader.ReadInt32(); - m_DoFArray = reader.ReadSingleArray(numDoFs); - + m_DoFArray = reader.ReadSingleArray(); m_Override = reader.ReadSingle(); m_CloseOpen = reader.ReadSingle(); m_InOut = reader.ReadSingle(); @@ -444,8 +441,7 @@ namespace AssetStudio m_LeftHandPose = new HandPose(reader); m_RightHandPose = new HandPose(reader); - int numDoFs = reader.ReadInt32(); - m_DoFArray = reader.ReadSingleArray(numDoFs); + m_DoFArray = reader.ReadSingleArray(); if (version[0] > 5 || (version[0] == 5 && version[1] >= 2))//5.2 and up { @@ -466,8 +462,7 @@ namespace AssetStudio public StreamedClip(ObjectReader reader) { - int numData = reader.ReadInt32(); - data = reader.ReadUInt32Array(numData); + data = reader.ReadUInt32Array(); curveCount = reader.ReadUInt32(); } @@ -572,9 +567,7 @@ namespace AssetStudio m_CurveCount = reader.ReadUInt32(); m_SampleRate = reader.ReadSingle(); m_BeginTime = reader.ReadSingle(); - - int numSamples = reader.ReadInt32(); - m_SampleArray = reader.ReadSingleArray(numSamples); + m_SampleArray = reader.ReadSingleArray(); } } @@ -584,8 +577,7 @@ namespace AssetStudio public ConstantClip(ObjectReader reader) { - int numData = reader.ReadInt32(); - data = reader.ReadSingleArray(numData); + data = reader.ReadSingleArray(); } } @@ -713,16 +705,10 @@ namespace AssetStudio m_CycleOffset = reader.ReadSingle(); m_AverageAngularSpeed = reader.ReadSingle(); - int numIndices = reader.ReadInt32(); - m_IndexArray = reader.ReadInt32Array(numIndices); + m_IndexArray = reader.ReadInt32Array(); if (version[0] < 4 || (version[0] == 4 && version[1] < 3)) //4.3 down { - int numAdditionalCurveIndexs = reader.ReadInt32(); - var m_AdditionalCurveIndexArray = new List(numAdditionalCurveIndexs); - for (int i = 0; i < numAdditionalCurveIndexs; i++) - { - m_AdditionalCurveIndexArray.Add(reader.ReadInt32()); - } + var m_AdditionalCurveIndexArray = reader.ReadInt32Array(); } int numDeltas = reader.ReadInt32(); m_ValueArrayDelta = new List(numDeltas); @@ -732,7 +718,7 @@ namespace AssetStudio } if (version[0] > 5 || (version[0] == 5 && version[1] >= 3))//5.3 and up { - m_ValueArrayReferencePose = reader.ReadSingleArray(reader.ReadInt32()); + m_ValueArrayReferencePose = reader.ReadSingleArray(); } m_Mirror = reader.ReadBoolean(); @@ -749,7 +735,7 @@ namespace AssetStudio m_KeepOriginalPositionY = reader.ReadBoolean(); m_KeepOriginalPositionXZ = reader.ReadBoolean(); m_HeightFromFeet = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -778,7 +764,7 @@ namespace AssetStudio } customType = reader.ReadByte(); isPPtrCurve = reader.ReadByte(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -890,7 +876,7 @@ namespace AssetStudio { m_UseHighQualityCurve = reader.ReadBoolean(); } - reader.AlignStream(4); + reader.AlignStream(); int numRCurves = reader.ReadInt32(); m_RotationCurves = new List(numRCurves); for (int i = 0; i < numRCurves; i++) @@ -965,7 +951,7 @@ namespace AssetStudio m_Events = new List(numEvents); for (int i = 0; i < numEvents; i++) { - m_Events.Add(new AnimationEvent(stream, file.Version[0] - '0')); + m_Events.Add(new AnimationEvent(reader)); }*/ } } diff --git a/AssetStudio/Classes/Animator.cs b/AssetStudio/Classes/Animator.cs index 2e97717..5e9b59e 100644 --- a/AssetStudio/Classes/Animator.cs +++ b/AssetStudio/Classes/Animator.cs @@ -25,13 +25,13 @@ namespace AssetStudio var m_ApplyRootMotion = reader.ReadBoolean(); if (version[0] == 4 && version[1] >= 5) //4.5 and up - 5.0 down { - reader.AlignStream(4); + reader.AlignStream(); } if (version[0] >= 5) //5.0 and up { var m_LinearVelocityBlending = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } if (version[0] < 4 || (version[0] == 4 && version[1] < 5)) //4.5 down @@ -50,13 +50,13 @@ namespace AssetStudio } if (version[0] >= 5 && version[0] < 2018) //5.0 and up - 2018 down { - reader.AlignStream(4); + reader.AlignStream(); } if (version[0] >= 2018) //2018 and up { var m_KeepAnimatorControllerStateOnDisable = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } } diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index 43898fd..100c5fc 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -73,7 +73,7 @@ namespace AssetStudio m_DefaultWeight = reader.ReadSingle(); m_IKPass = reader.ReadBoolean(); m_SyncedLayerAffectsTiming = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -135,7 +135,7 @@ namespace AssetStudio m_ExitTime = reader.ReadSingle(); m_HasExitTime = reader.ReadBoolean(); m_HasFixedDuration = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); m_InterruptionSource = reader.ReadInt32(); m_OrderedInterruption = reader.ReadBoolean(); } @@ -145,7 +145,7 @@ namespace AssetStudio } m_CanTransitionToSelf = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -156,7 +156,7 @@ namespace AssetStudio public LeafInfoConstant(ObjectReader reader) { - m_IDArray = reader.ReadUInt32Array(reader.ReadInt32()); + m_IDArray = reader.ReadUInt32Array(); m_IndexOffset = reader.ReadUInt32(); } } @@ -167,7 +167,7 @@ namespace AssetStudio public MotionNeighborList(ObjectReader reader) { - m_NeighborArray = reader.ReadUInt32Array(reader.ReadInt32()); + m_NeighborArray = reader.ReadUInt32Array(); } } @@ -181,10 +181,10 @@ namespace AssetStudio public Blend2dDataConstant(ObjectReader reader) { - m_ChildPositionArray = reader.ReadVector2Array(reader.ReadInt32()); - m_ChildMagnitudeArray = reader.ReadSingleArray(reader.ReadInt32()); - m_ChildPairVectorArray = reader.ReadVector2Array(reader.ReadInt32()); - m_ChildPairAvgMagInvArray = reader.ReadSingleArray(reader.ReadInt32()); + m_ChildPositionArray = reader.ReadVector2Array(); + m_ChildMagnitudeArray = reader.ReadSingleArray(); + m_ChildPairVectorArray = reader.ReadVector2Array(); + m_ChildPairAvgMagInvArray = reader.ReadSingleArray(); int numNeighbours = reader.ReadInt32(); m_ChildNeighborListArray = new MotionNeighborList[numNeighbours]; @@ -201,7 +201,7 @@ namespace AssetStudio public Blend1dDataConstant(ObjectReader reader) { - m_ChildThresholdArray = reader.ReadSingleArray(reader.ReadInt32()); + m_ChildThresholdArray = reader.ReadSingleArray(); } } @@ -212,9 +212,9 @@ namespace AssetStudio public BlendDirectDataConstant(ObjectReader reader) { - m_ChildBlendEventIDArray = reader.ReadUInt32Array(reader.ReadInt32()); + m_ChildBlendEventIDArray = reader.ReadUInt32Array(); m_NormalizedBlendValues = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -239,7 +239,7 @@ namespace AssetStudio m_BlendType = reader.ReadUInt32(); m_BlendEventID = reader.ReadUInt32(); m_BlendEventYID = reader.ReadUInt32(); - m_ChildIndices = reader.ReadUInt32Array(reader.ReadInt32()); + m_ChildIndices = reader.ReadUInt32Array(); m_Blend1dData = new Blend1dDataConstant(reader); m_Blend2dData = new Blend2dDataConstant(reader); if (version[0] >= 5) //5.0 and up @@ -256,7 +256,7 @@ namespace AssetStudio m_Duration = reader.ReadSingle(); m_CycleOffset = reader.ReadSingle(); m_Mirror = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -306,12 +306,7 @@ namespace AssetStudio m_TransitionConstantArray[i] = new TransitionConstant(reader); } - int numBlendIndices = reader.ReadInt32(); - m_BlendTreeConstantIndexArray = new int[numBlendIndices]; - for (int i = 0; i < numBlendIndices; i++) - { - m_BlendTreeConstantIndexArray[i] = reader.ReadInt32(); - } + m_BlendTreeConstantIndexArray = reader.ReadInt32Array(); if (version[0] < 5) //5.0 down { @@ -360,7 +355,7 @@ namespace AssetStudio m_Loop = reader.ReadBoolean(); m_Mirror = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -399,7 +394,7 @@ namespace AssetStudio m_FullPathID = reader.ReadUInt32(); m_isEntry = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -457,17 +452,12 @@ namespace AssetStudio var version = reader.version; if (version[0] < 5 || (version[0] == 5 && version[1] < 5)) //5.5 down { - int numBools = reader.ReadInt32(); - m_BoolValues = new bool[numBools]; - for (int i = 0; i < numBools; i++) - { - m_BoolValues[i] = reader.ReadBoolean(); - } + m_BoolValues = reader.ReadBooleanArray(); - reader.AlignStream(4); + reader.AlignStream(); - m_IntValues = reader.ReadInt32Array(reader.ReadInt32()); - m_FloatValues = reader.ReadSingleArray(reader.ReadInt32()); + m_IntValues = reader.ReadInt32Array(); + m_FloatValues = reader.ReadSingleArray(); } int numPosValues = reader.ReadInt32(); @@ -477,28 +467,23 @@ namespace AssetStudio m_PositionValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up } - m_QuaternionValues = reader.ReadVector4Array(reader.ReadInt32()); + m_QuaternionValues = reader.ReadVector4Array(); int numScaleValues = reader.ReadInt32(); m_ScaleValues = new Vector3[numScaleValues]; for (int i = 0; i < numScaleValues; i++) { - m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 adn up + m_ScaleValues[i] = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up } if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up { - m_FloatValues = reader.ReadSingleArray(reader.ReadInt32()); - m_IntValues = reader.ReadInt32Array(reader.ReadInt32()); + m_FloatValues = reader.ReadSingleArray(); + m_IntValues = reader.ReadInt32Array(); - int numBools = reader.ReadInt32(); - m_BoolValues = new bool[numBools]; - for (int i = 0; i < numBools; i++) - { - m_BoolValues[i] = reader.ReadBoolean(); - } + m_BoolValues = reader.ReadBooleanArray(); - reader.AlignStream(4); + reader.AlignStream(); } } } diff --git a/AssetStudio/Classes/AudioClip.cs b/AssetStudio/Classes/AudioClip.cs index bbfdf50..7a69db5 100644 --- a/AssetStudio/Classes/AudioClip.cs +++ b/AssetStudio/Classes/AudioClip.cs @@ -39,7 +39,7 @@ namespace AssetStudio m_Type = (AudioType)reader.ReadInt32(); m_3D = reader.ReadBoolean(); m_UseHardware = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); if (version[0] >= 4 || (version[0] == 3 && version[1] >= 2)) //3.2.0 to 5 { @@ -65,13 +65,12 @@ namespace AssetStudio m_BitsPerSample = reader.ReadInt32(); m_Length = reader.ReadSingle(); m_IsTrackerFormat = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); m_SubsoundIndex = reader.ReadInt32(); m_PreloadAudioData = reader.ReadBoolean(); m_LoadInBackground = reader.ReadBoolean(); m_Legacy3D = reader.ReadBoolean(); - reader.AlignStream(4); - m_3D = m_Legacy3D; + reader.AlignStream(); m_Source = reader.ReadAlignedString(); m_Offset = reader.ReadInt64(); diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index 7c516ee..c1a4d7c 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -67,7 +67,7 @@ namespace AssetStudio public class Skeleton { public List m_Node; - public List m_ID; + public uint[] m_ID; public List m_AxesArray; @@ -80,12 +80,7 @@ namespace AssetStudio m_Node.Add(new Node(reader)); } - int numIDs = reader.ReadInt32(); - m_ID = new List(numIDs); - for (int i = 0; i < numIDs; i++) - { - m_ID.Add(reader.ReadUInt32()); - } + m_ID = reader.ReadUInt32Array(); int numAxes = reader.ReadInt32(); m_AxesArray = new List(numAxes); @@ -118,16 +113,11 @@ namespace AssetStudio public class Hand { - public List m_HandBoneIndex; + public int[] m_HandBoneIndex; public Hand(ObjectReader reader) { - int numIndexes = reader.ReadInt32(); - m_HandBoneIndex = new List(numIndexes); - for (int i = 0; i < numIndexes; i++) - { - m_HandBoneIndex.Add(reader.ReadInt32()); - } + m_HandBoneIndex = reader.ReadInt32Array(); } } @@ -180,9 +170,9 @@ namespace AssetStudio public Hand m_RightHand; public List m_Handles; public List m_ColliderArray; - public List m_HumanBoneIndex; - public List m_HumanBoneMass; - public List m_ColliderIndex; + public int[] m_HumanBoneIndex; + public float[] m_HumanBoneMass; + public int[] m_ColliderIndex; public float m_Scale; public float m_ArmTwist; public float m_ForeArmTwist; @@ -221,28 +211,13 @@ namespace AssetStudio } } - int numIndexes = reader.ReadInt32(); - m_HumanBoneIndex = new List(numIndexes); - for (int i = 0; i < numIndexes; i++) - { - m_HumanBoneIndex.Add(reader.ReadInt32()); - } + m_HumanBoneIndex = reader.ReadInt32Array(); - int numMasses = reader.ReadInt32(); - m_HumanBoneMass = new List(numMasses); - for (int i = 0; i < numMasses; i++) - { - m_HumanBoneMass.Add(reader.ReadSingle()); - } + m_HumanBoneMass = reader.ReadSingleArray(); if (version[0] < 2018 || (version[0] == 2018 && version[1] < 2)) //2018.2 down { - int numColliderIndexes = reader.ReadInt32(); - m_ColliderIndex = new List(numColliderIndexes); - for (int i = 0; i < numColliderIndexes; i++) - { - m_ColliderIndex.Add(reader.ReadInt32()); - } + m_ColliderIndex = reader.ReadInt32Array(); } m_Scale = reader.ReadSingle(); @@ -256,7 +231,7 @@ namespace AssetStudio m_HasLeftHand = reader.ReadBoolean(); m_HasRightHand = reader.ReadBoolean(); m_HasTDoF = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -265,15 +240,15 @@ namespace AssetStudio public Skeleton m_AvatarSkeleton; public SkeletonPose m_AvatarSkeletonPose; public SkeletonPose m_DefaultPose; - public List m_SkeletonNameIDArray; + public uint[] m_SkeletonNameIDArray; public Human m_Human; - public List m_HumanSkeletonIndexArray; - public List m_HumanSkeletonReverseIndexArray; + public int[] m_HumanSkeletonIndexArray; + public int[] m_HumanSkeletonReverseIndexArray; public int m_RootMotionBoneIndex; public xform m_RootMotionBoneX; public Skeleton m_RootMotionSkeleton; public SkeletonPose m_RootMotionSkeletonPose; - public List m_RootMotionSkeletonIndexArray; + public int[] m_RootMotionSkeletonIndexArray; public AvatarConstant(ObjectReader reader) { @@ -284,31 +259,17 @@ namespace AssetStudio if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { m_DefaultPose = new SkeletonPose(reader); - int numIDs = reader.ReadInt32(); - m_SkeletonNameIDArray = new List(numIDs); - for (int i = 0; i < numIDs; i++) - { - m_SkeletonNameIDArray.Add(reader.ReadUInt32()); - } + + m_SkeletonNameIDArray = reader.ReadUInt32Array(); } m_Human = new Human(reader); - int numIndexes = reader.ReadInt32(); - m_HumanSkeletonIndexArray = new List(numIndexes); - for (int i = 0; i < numIndexes; i++) - { - m_HumanSkeletonIndexArray.Add(reader.ReadInt32()); - } + m_HumanSkeletonIndexArray = reader.ReadInt32Array(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - int numReverseIndexes = reader.ReadInt32(); - m_HumanSkeletonReverseIndexArray = new List(numReverseIndexes); - for (int i = 0; i < numReverseIndexes; i++) - { - m_HumanSkeletonReverseIndexArray.Add(reader.ReadInt32()); - } + m_HumanSkeletonReverseIndexArray = reader.ReadInt32Array(); } m_RootMotionBoneIndex = reader.ReadInt32(); @@ -319,12 +280,7 @@ namespace AssetStudio m_RootMotionSkeleton = new Skeleton(reader); m_RootMotionSkeletonPose = new SkeletonPose(reader); - int numMotionIndexes = reader.ReadInt32(); - m_RootMotionSkeletonIndexArray = new List(numMotionIndexes); - for (int i = 0; i < numMotionIndexes; i++) - { - m_RootMotionSkeletonIndexArray.Add(reader.ReadInt32()); - } + m_RootMotionSkeletonIndexArray = reader.ReadInt32Array(); } } } diff --git a/AssetStudio/Classes/Behaviour.cs b/AssetStudio/Classes/Behaviour.cs index 51c049f..2076202 100644 --- a/AssetStudio/Classes/Behaviour.cs +++ b/AssetStudio/Classes/Behaviour.cs @@ -12,7 +12,7 @@ namespace AssetStudio protected Behaviour(ObjectReader reader) : base(reader) { m_Enabled = reader.ReadByte(); - reader.AlignStream(4); + reader.AlignStream(); } } } diff --git a/AssetStudio/Classes/BuildSettings.cs b/AssetStudio/Classes/BuildSettings.cs index d96be1a..3c180fb 100644 --- a/AssetStudio/Classes/BuildSettings.cs +++ b/AssetStudio/Classes/BuildSettings.cs @@ -11,11 +11,7 @@ namespace AssetStudio public BuildSettings(ObjectReader reader) : base(reader) { - int levelsNum = reader.ReadInt32(); - for (int i = 0; i < levelsNum; i++) - { - var level = reader.ReadAlignedString(); - } + var levels = reader.ReadStringArray(); var hasRenderTexture = reader.ReadBoolean(); var hasPROVersion = reader.ReadBoolean(); diff --git a/AssetStudio/Classes/Font.cs b/AssetStudio/Classes/Font.cs index bc1091e..52b8371 100644 --- a/AssetStudio/Classes/Font.cs +++ b/AssetStudio/Classes/Font.cs @@ -89,7 +89,7 @@ namespace AssetStudio if (version[0] >= 4) { var flipped = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -106,7 +106,7 @@ namespace AssetStudio if (version[0] <= 3) { var m_GridFont = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } else { float m_PixelScale = reader.ReadSingle(); } diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index 1706524..217acd5 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -1,117 +1,101 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; +using SharpDX; namespace AssetStudio { - public class TexEnv + public class UnityTexEnv { - public string name; public PPtr m_Texture; - public float[] m_Scale; - public float[] m_Offset; + public Vector2 m_Scale; + public Vector2 m_Offset; + + public UnityTexEnv(ObjectReader reader) + { + m_Texture = new PPtr(reader); + m_Scale = reader.ReadVector2(); + m_Offset = reader.ReadVector2(); + } } - public class strFloatPair + public class UnityPropertySheet { - public string first; - public float second; - } + public List> m_TexEnvs; + public List> m_Floats; + public List> m_Colors; - public class strColorPair - { - public string first; - public float[] second; + public UnityPropertySheet(ObjectReader reader) + { + int m_TexEnvsSize = reader.ReadInt32(); + m_TexEnvs = new List>(m_TexEnvsSize); + for (int i = 0; i < m_TexEnvsSize; i++) + { + m_TexEnvs.Add(new KeyValuePair(reader.ReadAlignedString(), new UnityTexEnv(reader))); + } + + int m_FloatsSize = reader.ReadInt32(); + m_Floats = new List>(m_FloatsSize); + for (int i = 0; i < m_FloatsSize; i++) + { + m_Floats.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadSingle())); + } + + int m_ColorsSize = reader.ReadInt32(); + m_Colors = new List>(m_ColorsSize); + for (int i = 0; i < m_ColorsSize; i++) + { + m_Colors.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadColor4())); + } + } } public sealed class Material : NamedObject { public PPtr m_Shader; - public string[] m_ShaderKeywords; - public int m_CustomRenderQueue; - public TexEnv[] m_TexEnvs; - public strFloatPair[] m_Floats; - public strColorPair[] m_Colors; + public UnityPropertySheet m_SavedProperties; public Material(ObjectReader reader) : base(reader) { m_Shader = new PPtr(reader); - if (version[0] == 4 && (version[1] >= 2 || (version[1] == 1 && !buildType.IsAlpha))) + if (version[0] == 4 && version[1] >= 1) //4.x { - m_ShaderKeywords = new string[reader.ReadInt32()]; - for (int i = 0; i < m_ShaderKeywords.Length; i++) - { - m_ShaderKeywords[i] = reader.ReadAlignedString(); - } + var m_ShaderKeywords = reader.ReadStringArray(); } - else if (version[0] >= 5)//5.0 and up + + if (version[0] >= 5) //5.0 and up { - m_ShaderKeywords = new[] { reader.ReadAlignedString() }; - uint m_LightmapFlags = reader.ReadUInt32(); - if (version[0] == 5 && version[1] >= 6 || version[0] > 5)//5.6.0 and up + var m_ShaderKeywords = reader.ReadAlignedString(); + var m_LightmapFlags = reader.ReadUInt32(); + } + + if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up + { + var m_EnableInstancingVariants = reader.ReadBoolean(); + //var m_DoubleSidedGI = a_Stream.ReadBoolean(); //2017 and up + reader.AlignStream(); + } + + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + { + var m_CustomRenderQueue = reader.ReadInt32(); + } + + if (version[0] > 5 || (version[0] == 5 && version[1] >= 1)) //5.1 and up + { + var stringTagMapSize = reader.ReadInt32(); + for (int i = 0; i < stringTagMapSize; i++) { - var m_EnableInstancingVariants = reader.ReadBoolean(); - //var m_DoubleSidedGI = a_Stream.ReadBoolean();//2017.x - reader.AlignStream(4); + var first = reader.ReadAlignedString(); + var second = reader.ReadAlignedString(); } } - if (version[0] > 4 || version[0] == 4 && version[1] >= 3) { m_CustomRenderQueue = reader.ReadInt32(); } - - if (version[0] == 5 && version[1] >= 1 || version[0] > 5)//5.1 and up + if (version[0] > 5 || (version[0] == 5 && version[1] >= 6)) //5.6 and up { - string[][] stringTagMap = new string[reader.ReadInt32()][]; - for (int i = 0; i < stringTagMap.Length; i++) - { - stringTagMap[i] = new[] { reader.ReadAlignedString(), reader.ReadAlignedString() }; - } - } - //disabledShaderPasses - 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++) - { - reader.ReadAlignedString(); - } - } - //m_SavedProperties - m_TexEnvs = new TexEnv[reader.ReadInt32()]; - for (int i = 0; i < m_TexEnvs.Length; i++) - { - TexEnv m_TexEnv = new TexEnv() - { - name = reader.ReadAlignedString(), - m_Texture = new PPtr(reader), - m_Scale = new[] { reader.ReadSingle(), reader.ReadSingle() }, - m_Offset = new[] { reader.ReadSingle(), reader.ReadSingle() } - }; - m_TexEnvs[i] = m_TexEnv; + var disabledShaderPasses = reader.ReadStringArray(); } - m_Floats = new strFloatPair[reader.ReadInt32()]; - for (int i = 0; i < m_Floats.Length; i++) - { - strFloatPair m_Float = new strFloatPair() - { - first = reader.ReadAlignedString(), - second = reader.ReadSingle() - }; - m_Floats[i] = m_Float; - } - - m_Colors = new strColorPair[reader.ReadInt32()]; - for (int i = 0; i < m_Colors.Length; i++) - { - strColorPair m_Color = new strColorPair() - { - first = reader.ReadAlignedString(), - second = new[] { reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle() } - }; - m_Colors[i] = m_Color; - } + m_SavedProperties = new UnityPropertySheet(reader); } } } diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 43f33c4..0a47b1d 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -10,7 +10,6 @@ namespace AssetStudio { public List m_SubMeshes = new List(); public List m_Indices = new List(); //use a list because I don't always know the facecount for triangle strips - public List m_materialIDs = new List(); private uint[] m_IndexBuffer; private ChannelInfo[] m_Channels; private StreamInfo[] m_Streams; @@ -93,7 +92,7 @@ namespace AssetStudio vertexCount = reader.ReadUInt32(); hasNormals = reader.ReadBoolean(); hasTangents = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -259,7 +258,7 @@ namespace AssetStudio { m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = reader.ReadUInt16(); } - reader.AlignStream(4); + reader.AlignStream(); } else { @@ -356,7 +355,7 @@ namespace AssetStudio var m_UsedForStaticMeshColliderOnly = reader.ReadBoolean(); } } - reader.AlignStream(4); + reader.AlignStream(); //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) && buildType.IsPatch) || //fixed after 2017.3.1px @@ -370,13 +369,13 @@ namespace AssetStudio { m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; for (int i = 0; i < m_IndexBuffer_size / 2; i++) { m_IndexBuffer[i] = reader.ReadUInt16(); } - reader.AlignStream(4); + reader.AlignStream(); } else { m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; for (int i = 0; i < m_IndexBuffer_size / 4; i++) { m_IndexBuffer[i] = reader.ReadUInt32(); } - reader.AlignStream(4);//untested + reader.AlignStream();//untested } } #endregion @@ -568,7 +567,7 @@ namespace AssetStudio //actual Vertex Buffer var m_DataSize = reader.ReadBytes(reader.ReadInt32()); - reader.AlignStream(4); + reader.AlignStream(); #endregion #region compute FvF @@ -1099,7 +1098,6 @@ namespace AssetStudio m_Indices.Add(m_IndexBuffer[firstIndex + i * 3]); m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 1]); m_Indices.Add(m_IndexBuffer[firstIndex + i * 3 + 2]); - m_materialIDs.Add(s); } } else @@ -1124,7 +1122,6 @@ namespace AssetStudio m_Indices.Add(fc); m_Indices.Add(fb); } - m_materialIDs.Add(s); j++; } } diff --git a/AssetStudio/Classes/MeshFilter.cs b/AssetStudio/Classes/MeshFilter.cs index 5db6140..d3c24bf 100644 --- a/AssetStudio/Classes/MeshFilter.cs +++ b/AssetStudio/Classes/MeshFilter.cs @@ -7,7 +7,6 @@ namespace AssetStudio { public sealed class MeshFilter : Component { - public long preloadIndex; public PPtr m_Mesh; public MeshFilter(ObjectReader reader) : base(reader) diff --git a/AssetStudio/Classes/MovieTexture.cs b/AssetStudio/Classes/MovieTexture.cs index 9cdc42f..0293457 100644 --- a/AssetStudio/Classes/MovieTexture.cs +++ b/AssetStudio/Classes/MovieTexture.cs @@ -13,7 +13,7 @@ namespace AssetStudio public MovieTexture(ObjectReader reader) : base(reader) { var m_Loop = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); m_AudioClip = new PPtr(reader); m_MovieData = reader.ReadBytes(reader.ReadInt32()); } diff --git a/AssetStudio/Classes/PlayerSettings.cs b/AssetStudio/Classes/PlayerSettings.cs index 1a9a1ab..245385b 100644 --- a/AssetStudio/Classes/PlayerSettings.cs +++ b/AssetStudio/Classes/PlayerSettings.cs @@ -20,7 +20,7 @@ namespace AssetStudio var AndroidProfiler = reader.ReadBoolean(); //bool AndroidFilterTouchesWhenObscured 2017.2 and up //bool AndroidEnableSustainedPerformanceMode 2018 and up - reader.AlignStream(4); + reader.AlignStream(); int defaultScreenOrientation = reader.ReadInt32(); int targetDevice = reader.ReadInt32(); if (version[0] < 5 || (version[0] == 5 && version[1] < 3)) //5.3 down @@ -38,7 +38,7 @@ namespace AssetStudio else { var useOnDemandResources = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 and up { diff --git a/AssetStudio/Classes/Renderer.cs b/AssetStudio/Classes/Renderer.cs index 2321031..a7a070f 100644 --- a/AssetStudio/Classes/Renderer.cs +++ b/AssetStudio/Classes/Renderer.cs @@ -9,6 +9,12 @@ namespace AssetStudio { public ushort firstSubMesh; public ushort subMeshCount; + + public StaticBatchInfo(ObjectReader reader) + { + firstSubMesh = reader.ReadUInt16(); + subMeshCount = reader.ReadUInt16(); + } } public abstract class Renderer : Component @@ -19,97 +25,114 @@ namespace AssetStudio protected Renderer(ObjectReader reader) : base(reader) { - if (version[0] < 5) + if (version[0] < 5) //5.0 down { var m_Enabled = reader.ReadBoolean(); - var m_CastShadows = reader.ReadByte(); + var m_CastShadows = reader.ReadBoolean(); var m_ReceiveShadows = reader.ReadBoolean(); var m_LightmapIndex = reader.ReadByte(); } - else + else //5.0 and up { - var m_Enabled = reader.ReadBoolean(); - reader.AlignStream(4); - var m_CastShadows = reader.ReadByte(); - var m_ReceiveShadows = reader.ReadBoolean(); - reader.AlignStream(4); - if (version[0] >= 2018)//2018 and up + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + { + var m_Enabled = reader.ReadBoolean(); + var m_CastShadows = reader.ReadByte(); + var m_ReceiveShadows = reader.ReadByte(); + if (version[0] > 2017 || (version[0] == 2017 && version[0] >= 2)) //2017.2 and up + { + var m_DynamicOccludee = reader.ReadByte(); + } + var m_MotionVectors = reader.ReadByte(); + var m_LightProbeUsage = reader.ReadByte(); + var m_ReflectionProbeUsage = reader.ReadByte(); + reader.AlignStream(); + } + else + { + var m_Enabled = reader.ReadBoolean(); + reader.AlignStream(); + var m_CastShadows = reader.ReadByte(); + var m_ReceiveShadows = reader.ReadBoolean(); + reader.AlignStream(); + } + + if (version[0] >= 2018) //2018 and up { var m_RenderingLayerMask = reader.ReadUInt32(); } + var m_LightmapIndex = reader.ReadUInt16(); var m_LightmapIndexDynamic = reader.ReadUInt16(); } - if (version[0] >= 3) + if (version[0] >= 3) //3.0 and up { - reader.Position += 16;//Vector4f m_LightmapTilingOffset + var m_LightmapTilingOffset = reader.ReadVector4(); } - if (version[0] >= 5) + if (version[0] >= 5) //5.0 and up { - reader.Position += 16;//Vector4f m_LightmapTilingOffsetDynamic + var m_LightmapTilingOffsetDynamic = reader.ReadVector4(); } - m_Materials = new PPtr[reader.ReadInt32()]; - for (int m = 0; m < m_Materials.Length; m++) + var m_MaterialsSize = reader.ReadInt32(); + m_Materials = new PPtr[m_MaterialsSize]; + for (int i = 0; i < m_MaterialsSize; i++) { - m_Materials[m] = new PPtr(reader); + m_Materials[i] = new PPtr(reader); } - if (version[0] < 3) + if (version[0] < 3) //3.0 down { - reader.Position += 16;//m_LightmapTilingOffset vector4d + var m_LightmapTilingOffset = reader.ReadVector4(); } - else + else //3.0 and up { - if ((version[0] == 5 && version[1] >= 5) || version[0] > 5)//5.5.0 and up + if (version[0] > 5 || (version[0] == 5 && version[1] >= 5)) //5.5 and up { - m_StaticBatchInfo = new StaticBatchInfo - { - firstSubMesh = reader.ReadUInt16(), - subMeshCount = reader.ReadUInt16() - }; + m_StaticBatchInfo = new StaticBatchInfo(reader); } else { - int numSubsetIndices = reader.ReadInt32(); - m_SubsetIndices = reader.ReadUInt32Array(numSubsetIndices); + m_SubsetIndices = reader.ReadUInt32Array(); } var m_StaticBatchRoot = new PPtr(reader); + } - if ((version[0] == 5 && version[1] >= 4) || version[0] > 5)//5.4.0 and up + if (version[0] > 5 || (version[0] == 5 && version[1] >= 4)) //5.4 and up + { + var m_ProbeAnchor = new PPtr(reader); + var m_LightProbeVolumeOverride = new PPtr(reader); + } + else if (version[0] > 3 || (version[0] == 3 && version[1] >= 5)) //3.5 - 5.3 + { + var m_UseLightProbes = reader.ReadBoolean(); + reader.AlignStream(); + + if (version[0] >= 5)//5.0 and up { - var m_ProbeAnchor = new PPtr(reader); - var m_LightProbeVolumeOverride = new PPtr(reader); - } - else if (version[0] >= 4 || (version[0] == 3 && version[1] >= 5))//3.5 - 5.3 - { - var m_UseLightProbes = reader.ReadBoolean(); - reader.AlignStream(4); - if (version[0] == 5)//5.0 and up - { - int m_ReflectionProbeUsage = reader.ReadInt32(); - } - var m_LightProbeAnchor = new PPtr(reader); + var m_ReflectionProbeUsage = reader.ReadInt32(); } - if (version[0] >= 5 || (version[0] == 4 && version[1] >= 3))//4.3 and up - { - if (version[0] == 4 && version[1] == 3)//4.3 - { - int m_SortingLayer = reader.ReadInt16(); - } - else - { - int m_SortingLayerID = reader.ReadInt32(); - //SInt16 m_SortingOrder 5.6 and up - } + var m_LightProbeAnchor = new PPtr(reader); //5.0 and up m_ProbeAnchor + } - int m_SortingOrder = reader.ReadInt16(); - reader.AlignStream(4); + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + { + if (version[0] == 4 && version[1] == 3) //4.3 + { + var m_SortingLayer = reader.ReadInt16(); } + else + { + var m_SortingLayerID = reader.ReadUInt32(); + } + + //SInt16 m_SortingLayer 5.6 and up + var m_SortingOrder = reader.ReadInt16(); + reader.AlignStream(); } } } diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index b19c92a..5cd3c6f 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -81,34 +81,20 @@ namespace AssetStudio { public string m_Name; public string m_Description; - public List m_Attributes; + public string[] m_Attributes; public SerializedPropertyType m_Type; public uint m_Flags; - public List m_DefValue; + public float[] m_DefValue; public SerializedTextureProperty m_DefTexture; public SerializedProperty(BinaryReader reader) { m_Name = reader.ReadAlignedString(); m_Description = reader.ReadAlignedString(); - - int numAttributes = reader.ReadInt32(); - m_Attributes = new List(numAttributes); - for (int i = 0; i < numAttributes; i++) - { - m_Attributes.Add(reader.ReadAlignedString()); - } - + m_Attributes = reader.ReadStringArray(); m_Type = (SerializedPropertyType)reader.ReadInt32(); m_Flags = reader.ReadUInt32(); - - int numValues = 4; - m_DefValue = new List(numValues); - for (int i = 0; i < numValues; i++) - { - m_DefValue.Add(reader.ReadSingle()); - } - + m_DefValue = reader.ReadSingleArray(4); m_DefTexture = new SerializedTextureProperty(reader); } } @@ -255,7 +241,7 @@ namespace AssetStudio rtBlend6 = new SerializedShaderRTBlendState(reader); rtBlend7 = new SerializedShaderRTBlendState(reader); rtSeparateBlend = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); if (version[0] > 2017 || (version[0] == 2017 && version[1] >= 2)) //2017.2 and up { zClip = new SerializedShaderFloatValue(reader); @@ -281,7 +267,7 @@ namespace AssetStudio m_Tags = new SerializedTagMap(reader); m_LOD = reader.ReadInt32(); lighting = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -310,7 +296,7 @@ namespace AssetStudio { m_Channels.Add(new ShaderBindChannel(reader)); } - reader.AlignStream(4); + reader.AlignStream(); m_SourceMap = reader.ReadUInt32(); } @@ -331,7 +317,7 @@ namespace AssetStudio m_ArraySize = reader.ReadInt32(); m_Type = reader.ReadSByte(); m_Dim = reader.ReadSByte(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -350,7 +336,7 @@ namespace AssetStudio m_ArraySize = reader.ReadInt32(); m_Type = reader.ReadSByte(); m_RowCount = reader.ReadSByte(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -373,7 +359,7 @@ namespace AssetStudio var m_MultiSampled = reader.ReadBoolean(); } m_Dim = reader.ReadSByte(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -478,7 +464,7 @@ namespace AssetStudio { public uint m_BlobIndex; public ParserBindChannels m_Channels; - public List m_KeywordIndices; + public ushort[] m_KeywordIndices; public sbyte m_ShaderHardwareTier; public ShaderGpuProgramType m_GpuProgramType; public List m_VectorParams; @@ -497,19 +483,14 @@ namespace AssetStudio m_BlobIndex = reader.ReadUInt32(); m_Channels = new ParserBindChannels(reader); - int numIndices = reader.ReadInt32(); - m_KeywordIndices = new List(numIndices); - for (int i = 0; i < numIndices; i++) - { - m_KeywordIndices.Add(reader.ReadUInt16()); - } + m_KeywordIndices = reader.ReadUInt16Array(); if (version[0] >= 2017) //2017 and up { - reader.AlignStream(4); + reader.AlignStream(); } m_ShaderHardwareTier = reader.ReadSByte(); m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte(); - reader.AlignStream(4); + reader.AlignStream(); int numVectorParams = reader.ReadInt32(); m_VectorParams = new List(numVectorParams); @@ -639,7 +620,7 @@ namespace AssetStudio { var m_HasProceduralInstancingVariant = reader.ReadBoolean(); } - reader.AlignStream(4); + reader.AlignStream(); m_UseName = reader.ReadAlignedString(); m_Name = reader.ReadAlignedString(); m_TextureName = reader.ReadAlignedString(); @@ -727,7 +708,7 @@ namespace AssetStudio } m_DisableNoSubshadersMessage = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -739,10 +720,10 @@ namespace AssetStudio public byte[] m_SubProgramBlob; //5.5 and up public SerializedShader m_ParsedForm; - public List platforms; - public List offsets; - public List compressedLengths; - public List decompressedLengths; + public uint[] platforms; + public uint[] offsets; + public uint[] compressedLengths; + public uint[] decompressedLengths; public byte[] compressedBlob; public Shader(ObjectReader reader) : base(reader) @@ -750,40 +731,16 @@ namespace AssetStudio if (version[0] == 5 && version[1] >= 5 || version[0] > 5) //5.5 and up { m_ParsedForm = new SerializedShader(reader); - int numPlatforms = reader.ReadInt32(); - platforms = new List(numPlatforms); - for (int i = 0; i < numPlatforms; i++) - { - platforms.Add(reader.ReadUInt32()); - } - - int numOffsets = reader.ReadInt32(); - offsets = new List(numOffsets); - for (int i = 0; i < numOffsets; i++) - { - offsets.Add(reader.ReadUInt32()); - } - - int numCompressedLengths = reader.ReadInt32(); - compressedLengths = new List(numCompressedLengths); - for (int i = 0; i < numCompressedLengths; i++) - { - compressedLengths.Add(reader.ReadUInt32()); - } - - int numDecompressedLengths = reader.ReadInt32(); - decompressedLengths = new List(numDecompressedLengths); - for (int i = 0; i < numDecompressedLengths; i++) - { - decompressedLengths.Add(reader.ReadUInt32()); - } - + platforms = reader.ReadUInt32Array(); + offsets = reader.ReadUInt32Array(); + compressedLengths = reader.ReadUInt32Array(); + decompressedLengths = reader.ReadUInt32Array(); compressedBlob = reader.ReadBytes(reader.ReadInt32()); } else { m_Script = reader.ReadBytes(reader.ReadInt32()); - reader.AlignStream(4); + reader.AlignStream(); var m_PathName = reader.ReadAlignedString(); if (version[0] == 5 && version[1] >= 3) //5.3 - 5.4 { diff --git a/AssetStudio/Classes/SkinnedMeshRenderer.cs b/AssetStudio/Classes/SkinnedMeshRenderer.cs index 6e8c5c3..d45f29e 100644 --- a/AssetStudio/Classes/SkinnedMeshRenderer.cs +++ b/AssetStudio/Classes/SkinnedMeshRenderer.cs @@ -9,16 +9,16 @@ namespace AssetStudio { public PPtr m_Mesh; public PPtr[] m_Bones; - public List m_BlendShapeWeights; + public float[] m_BlendShapeWeights; public SkinnedMeshRenderer(ObjectReader reader) : base(reader) { int m_Quality = reader.ReadInt32(); var m_UpdateWhenOffscreen = reader.ReadBoolean(); var m_SkinNormals = reader.ReadBoolean(); //3.1.0 and below - reader.AlignStream(4); + reader.AlignStream(); - if (version[0] == 2 && version[1] < 6)//2.6 down + if (version[0] == 2 && version[1] < 6) //2.6 down { var m_DisableAnimationWhenOffscreen = new PPtr(reader); } @@ -31,22 +31,9 @@ namespace AssetStudio m_Bones[b] = new PPtr(reader); } - if (version[0] < 3) + if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { - int m_BindPose = reader.ReadInt32(); - reader.Position += m_BindPose * 16 * 4;//Matrix4x4f - } - else - { - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up - { - int numBSWeights = reader.ReadInt32(); - m_BlendShapeWeights = new List(numBSWeights); - for (int i = 0; i < numBSWeights; i++) - { - m_BlendShapeWeights.Add(reader.ReadSingle()); - } - } + m_BlendShapeWeights = reader.ReadSingleArray(); } } } diff --git a/AssetStudio/Classes/Sprite.cs b/AssetStudio/Classes/Sprite.cs index 7306273..37767de 100644 --- a/AssetStudio/Classes/Sprite.cs +++ b/AssetStudio/Classes/Sprite.cs @@ -164,7 +164,7 @@ namespace AssetStudio } m_DataSize = reader.ReadBytes(reader.ReadInt32()); - reader.AlignStream(4); + reader.AlignStream(); } } @@ -244,7 +244,7 @@ namespace AssetStudio } m_IndexBuffer = reader.ReadBytes(reader.ReadInt32()); - reader.AlignStream(4); + reader.AlignStream(); m_VertexData = new VertexData(reader); } @@ -257,13 +257,13 @@ namespace AssetStudio vertices[i] = new SpriteVertex(reader); } - indices = reader.ReadUInt16Array(reader.ReadInt32()); - reader.AlignStream(4); + indices = reader.ReadUInt16Array(); + reader.AlignStream(); } if (version[0] >= 2018) //2018 and up { - m_Bindpose = reader.ReadMatrixArray(reader.ReadInt32()); + m_Bindpose = reader.ReadMatrixArray(); if (version[0] == 2018 && version[1] < 2) //2018.2 down { @@ -331,7 +331,7 @@ namespace AssetStudio if (version[0] > 5 || (version[0] == 5 && version[1] >= 3)) //5.3 and up { m_IsPolygon = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } if (version[0] >= 2017) //2017 and up @@ -340,12 +340,7 @@ namespace AssetStudio var second = reader.ReadInt64(); m_RenderDataKey = new KeyValuePair(first, second); - var m_AtlasTagsSize = reader.ReadInt32(); - m_AtlasTags = new string[m_AtlasTagsSize]; - for (int i = 0; i < m_AtlasTagsSize; i++) - { - m_AtlasTags[i] = reader.ReadAlignedString(); - } + m_AtlasTags = reader.ReadStringArray(); m_SpriteAtlas = new PPtr(reader); } @@ -358,7 +353,7 @@ namespace AssetStudio m_PhysicsShape = new Vector2[m_PhysicsShapeSize][]; for (int i = 0; i < m_PhysicsShapeSize; i++) { - m_PhysicsShape[i] = reader.ReadVector2Array(reader.ReadInt32()); + m_PhysicsShape[i] = reader.ReadVector2Array(); } } diff --git a/AssetStudio/Classes/SpriteAtlas.cs b/AssetStudio/Classes/SpriteAtlas.cs index a3d1a08..27df0d6 100644 --- a/AssetStudio/Classes/SpriteAtlas.cs +++ b/AssetStudio/Classes/SpriteAtlas.cs @@ -44,11 +44,7 @@ namespace AssetStudio new PPtr(reader); } - var m_PackedSpriteNamesToIndexSize = reader.ReadInt32(); - for (int i = 0; i < m_PackedSpriteNamesToIndexSize; i++) - { - reader.ReadAlignedString(); - } + var m_PackedSpriteNamesToIndex = reader.ReadStringArray(); var m_RenderDataMapSize = reader.ReadInt32(); m_RenderDataMap = new Dictionary, SpriteAtlasData>(m_RenderDataMapSize); diff --git a/AssetStudio/Classes/Texture.cs b/AssetStudio/Classes/Texture.cs index 84cfe9f..bcd2196 100644 --- a/AssetStudio/Classes/Texture.cs +++ b/AssetStudio/Classes/Texture.cs @@ -13,7 +13,7 @@ namespace AssetStudio { var m_ForcedFallbackFormat = reader.ReadInt32(); var m_DownscaleFallback = reader.ReadBoolean(); - reader.AlignStream(4); + reader.AlignStream(); } } } diff --git a/AssetStudio/Classes/Texture2D.cs b/AssetStudio/Classes/Texture2D.cs index 89c6574..f9f40bf 100644 --- a/AssetStudio/Classes/Texture2D.cs +++ b/AssetStudio/Classes/Texture2D.cs @@ -53,7 +53,7 @@ namespace AssetStudio m_IsReadable = reader.ReadBoolean(); //2.6.0 and up m_ReadAllowed = reader.ReadBoolean(); //3.0.0 - 5.4 //m_StreamingMipmaps 2018.2 and up - reader.AlignStream(4); + reader.AlignStream(); if (version[0] > 2018 || (version[0] == 2018 && version[1] >= 2)) //2018.2 and up { var m_StreamingMipmapsPriority = reader.ReadInt32(); diff --git a/AssetStudio/Classes/VideoClip.cs b/AssetStudio/Classes/VideoClip.cs index df69452..504ff47 100644 --- a/AssetStudio/Classes/VideoClip.cs +++ b/AssetStudio/Classes/VideoClip.cs @@ -20,7 +20,7 @@ namespace AssetStudio var m_ProxyHeight = reader.ReadUInt32(); var Width = reader.ReadUInt32(); var Height = reader.ReadUInt32(); - if (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(); @@ -28,19 +28,10 @@ namespace AssetStudio var m_FrameRate = reader.ReadDouble(); var m_FrameCount = reader.ReadUInt64(); var m_Format = reader.ReadInt32(); - //m_AudioChannelCount - var size = reader.ReadInt32(); - reader.Position += size * 2; - reader.AlignStream(4); - //m_AudioSampleRate - size = reader.ReadInt32(); - reader.Position += size * 4; - //m_AudioLanguage - size = reader.ReadInt32(); - for (int i = 0; i < size; i++) - { - reader.ReadAlignedString(); - } + var m_AudioChannelCount = reader.ReadUInt16Array(); + reader.AlignStream(); + var m_AudioSampleRate = reader.ReadUInt32Array(); + var m_AudioLanguage = reader.ReadStringArray(); //StreamedResource m_ExternalResources m_Source = reader.ReadAlignedString(); var m_Offset = reader.ReadUInt64(); diff --git a/AssetStudio/Extensions/BinaryReaderExtensions.cs b/AssetStudio/Extensions/BinaryReaderExtensions.cs index 8bec001..84d1d35 100644 --- a/AssetStudio/Extensions/BinaryReaderExtensions.cs +++ b/AssetStudio/Extensions/BinaryReaderExtensions.cs @@ -8,6 +8,11 @@ namespace AssetStudio { public static class BinaryReaderExtensions { + public static void AlignStream(this BinaryReader reader) + { + reader.AlignStream(4); + } + public static void AlignStream(this BinaryReader reader, int alignment) { var pos = reader.BaseStream.Position; @@ -65,6 +70,11 @@ namespace AssetStudio return new System.Drawing.RectangleF(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); } + public static Color4 ReadColor4(this BinaryReader reader) + { + return new Color4(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); + } + public static Matrix ReadMatrix(this BinaryReader reader) { var m = new Matrix(); @@ -81,21 +91,41 @@ namespace AssetStudio private static T[] ReadArray(Func del, int length) { var array = new T[length]; - for (int i = 0; i < array.Length; i++) + for (int i = 0; i < length; i++) { array[i] = del(); } return array; } + public static bool[] ReadBooleanArray(this BinaryReader reader) + { + return ReadArray(reader.ReadBoolean, reader.ReadInt32()); + } + + public static ushort[] ReadUInt16Array(this BinaryReader reader) + { + return ReadArray(reader.ReadUInt16, reader.ReadInt32()); + } + + public static int[] ReadInt32Array(this BinaryReader reader) + { + return ReadArray(reader.ReadInt32, reader.ReadInt32()); + } + public static int[] ReadInt32Array(this BinaryReader reader, int length) { return ReadArray(reader.ReadInt32, length); } - public static uint[] ReadUInt32Array(this BinaryReader reader, int length) + public static uint[] ReadUInt32Array(this BinaryReader reader) { - return ReadArray(reader.ReadUInt32, length); + return ReadArray(reader.ReadUInt32, reader.ReadInt32()); + } + + public static float[] ReadSingleArray(this BinaryReader reader) + { + return ReadArray(reader.ReadSingle, reader.ReadInt32()); } public static float[] ReadSingleArray(this BinaryReader reader, int length) @@ -103,24 +133,24 @@ namespace AssetStudio return ReadArray(reader.ReadSingle, length); } - public static Vector2[] ReadVector2Array(this BinaryReader reader, int length) + public static string[] ReadStringArray(this BinaryReader reader) { - return ReadArray(reader.ReadVector2, length); + return ReadArray(reader.ReadAlignedString, reader.ReadInt32()); } - public static Vector4[] ReadVector4Array(this BinaryReader reader, int length) + public static Vector2[] ReadVector2Array(this BinaryReader reader) { - return ReadArray(reader.ReadVector4, length); + return ReadArray(reader.ReadVector2, reader.ReadInt32()); } - public static ushort[] ReadUInt16Array(this BinaryReader reader, int length) + public static Vector4[] ReadVector4Array(this BinaryReader reader) { - return ReadArray(reader.ReadUInt16, length); + return ReadArray(reader.ReadVector4, reader.ReadInt32()); } - public static Matrix[] ReadMatrixArray(this BinaryReader reader, int length) + public static Matrix[] ReadMatrixArray(this BinaryReader reader) { - return ReadArray(reader.ReadMatrix, length); + return ReadArray(reader.ReadMatrix, reader.ReadInt32()); } } } diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index c0e4472..53c8302 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -16,7 +16,6 @@ namespace AssetStudio public string upperFileName; public int[] version = { 0, 0, 0, 0 }; public BuildType buildType; - public bool valid; public Dictionary Objects; public SerializedFileHeader header; @@ -36,151 +35,143 @@ namespace AssetStudio this.fullName = fullName; fileName = Path.GetFileName(fullName); upperFileName = fileName.ToUpper(); - try - { - //ReadHeader - header = new SerializedFileHeader(); - header.m_MetadataSize = reader.ReadUInt32(); - header.m_FileSize = reader.ReadUInt32(); - header.m_Version = reader.ReadUInt32(); - header.m_DataOffset = reader.ReadUInt32(); - if (header.m_Version >= 9) + //ReadHeader + header = new SerializedFileHeader(); + header.m_MetadataSize = reader.ReadUInt32(); + header.m_FileSize = reader.ReadUInt32(); + header.m_Version = reader.ReadUInt32(); + header.m_DataOffset = reader.ReadUInt32(); + + if (header.m_Version >= 9) + { + header.m_Endianess = reader.ReadByte(); + header.m_Reserved = reader.ReadBytes(3); + m_FileEndianess = (EndianType)header.m_Endianess; + } + else + { + reader.Position = header.m_FileSize - header.m_MetadataSize; + m_FileEndianess = (EndianType)reader.ReadByte(); + } + + //ReadMetadata + if (m_FileEndianess == EndianType.LittleEndian) + { + reader.endian = EndianType.LittleEndian; + } + if (header.m_Version >= 7) + { + unityVersion = reader.ReadStringToNull(); + SetVersion(unityVersion); + } + if (header.m_Version >= 8) + { + m_TargetPlatform = (BuildTarget)reader.ReadInt32(); + if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform)) { - header.m_Endianess = reader.ReadByte(); - header.m_Reserved = reader.ReadBytes(3); - m_FileEndianess = (EndianType)header.m_Endianess; + m_TargetPlatform = BuildTarget.UnknownPlatform; + } + } + if (header.m_Version >= 13) + { + m_EnableTypeTree = reader.ReadBoolean(); + } + + //ReadTypes + int typeCount = reader.ReadInt32(); + m_Types = new List(typeCount); + for (int i = 0; i < typeCount; i++) + { + m_Types.Add(ReadSerializedType()); + } + + if (header.m_Version >= 7 && header.m_Version < 14) + { + var bigIDEnabled = reader.ReadInt32(); + } + + //ReadObjects + int objectCount = reader.ReadInt32(); + m_Objects = new List(objectCount); + for (int i = 0; i < objectCount; i++) + { + var objectInfo = new ObjectInfo(); + if (header.m_Version < 14) + { + objectInfo.m_PathID = reader.ReadInt32(); } else { - reader.Position = header.m_FileSize - header.m_MetadataSize; - m_FileEndianess = (EndianType)reader.ReadByte(); + reader.AlignStream(); + objectInfo.m_PathID = reader.ReadInt64(); } + objectInfo.byteStart = reader.ReadUInt32(); + objectInfo.byteStart += header.m_DataOffset; + objectInfo.byteSize = reader.ReadUInt32(); + objectInfo.typeID = reader.ReadInt32(); + if (header.m_Version < 16) + { + objectInfo.classID = reader.ReadUInt16(); + objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID); + var isDestroyed = reader.ReadUInt16(); + } + else + { + var type = m_Types[objectInfo.typeID]; + objectInfo.serializedType = type; + objectInfo.classID = type.classID; + } + if (header.m_Version == 15 || header.m_Version == 16) + { + var stripped = reader.ReadByte(); + } + m_Objects.Add(objectInfo); + } - //ReadMetadata - if (m_FileEndianess == EndianType.LittleEndian) + if (header.m_Version >= 11) + { + int scriptCount = reader.ReadInt32(); + m_ScriptTypes = new List(scriptCount); + for (int i = 0; i < scriptCount; i++) { - reader.endian = EndianType.LittleEndian; - } - if (header.m_Version >= 7) - { - unityVersion = reader.ReadStringToNull(); - SetVersion(unityVersion); - } - if (header.m_Version >= 8) - { - m_TargetPlatform = (BuildTarget)reader.ReadInt32(); - if (!Enum.IsDefined(typeof(BuildTarget), m_TargetPlatform)) - { - m_TargetPlatform = BuildTarget.UnknownPlatform; - } - } - if (header.m_Version >= 13) - { - m_EnableTypeTree = reader.ReadBoolean(); - } - - //ReadTypes - int typeCount = reader.ReadInt32(); - m_Types = new List(typeCount); - for (int i = 0; i < typeCount; i++) - { - m_Types.Add(ReadSerializedType()); - } - - if (header.m_Version >= 7 && header.m_Version < 14) - { - var bigIDEnabled = reader.ReadInt32(); - } - - //ReadObjects - int objectCount = reader.ReadInt32(); - m_Objects = new List(objectCount); - for (int i = 0; i < objectCount; i++) - { - var objectInfo = new ObjectInfo(); + var m_ScriptType = new LocalSerializedObjectIdentifier(); + m_ScriptType.localSerializedFileIndex = reader.ReadInt32(); if (header.m_Version < 14) { - objectInfo.m_PathID = reader.ReadInt32(); + m_ScriptType.localIdentifierInFile = reader.ReadInt32(); } else { - reader.AlignStream(4); - objectInfo.m_PathID = reader.ReadInt64(); + reader.AlignStream(); + m_ScriptType.localIdentifierInFile = reader.ReadInt64(); } - objectInfo.byteStart = reader.ReadUInt32(); - objectInfo.byteStart += header.m_DataOffset; - objectInfo.byteSize = reader.ReadUInt32(); - objectInfo.typeID = reader.ReadInt32(); - if (header.m_Version < 16) - { - objectInfo.classID = reader.ReadUInt16(); - objectInfo.serializedType = m_Types.Find(x => x.classID == objectInfo.typeID); - var isDestroyed = reader.ReadUInt16(); - } - else - { - var type = m_Types[objectInfo.typeID]; - objectInfo.serializedType = type; - objectInfo.classID = type.classID; - } - if (header.m_Version == 15 || header.m_Version == 16) - { - var stripped = reader.ReadByte(); - } - m_Objects.Add(objectInfo); + m_ScriptTypes.Add(m_ScriptType); } + } - if (header.m_Version >= 11) + int externalsCount = reader.ReadInt32(); + m_Externals = new List(externalsCount); + for (int i = 0; i < externalsCount; i++) + { + var m_External = new FileIdentifier(); + if (header.m_Version >= 6) { - int scriptCount = reader.ReadInt32(); - m_ScriptTypes = new List(scriptCount); - for (int i = 0; i < scriptCount; i++) - { - var m_ScriptType = new LocalSerializedObjectIdentifier(); - m_ScriptType.localSerializedFileIndex = reader.ReadInt32(); - if (header.m_Version < 14) - { - m_ScriptType.localIdentifierInFile = reader.ReadInt32(); - } - else - { - reader.AlignStream(4); - m_ScriptType.localIdentifierInFile = reader.ReadInt64(); - } - m_ScriptTypes.Add(m_ScriptType); - } + var tempEmpty = reader.ReadStringToNull(); } - - int externalsCount = reader.ReadInt32(); - m_Externals = new List(externalsCount); - for (int i = 0; i < externalsCount; i++) - { - var m_External = new FileIdentifier(); - if (header.m_Version >= 6) - { - var tempEmpty = reader.ReadStringToNull(); - } - if (header.m_Version >= 5) - { - m_External.guid = new Guid(reader.ReadBytes(16)); - m_External.type = reader.ReadInt32(); - } - m_External.pathName = reader.ReadStringToNull(); - m_External.fileName = Path.GetFileName(m_External.pathName); - m_Externals.Add(m_External); - } - if (header.m_Version >= 5) { - //var userInformation = reader.ReadStringToNull(); + m_External.guid = new Guid(reader.ReadBytes(16)); + m_External.type = reader.ReadInt32(); } - - valid = true; + m_External.pathName = reader.ReadStringToNull(); + m_External.fileName = Path.GetFileName(m_External.pathName); + m_Externals.Add(m_External); } - catch + + if (header.m_Version >= 5) { - // ignored + //var userInformation = reader.ReadStringToNull(); } } diff --git a/AssetStudio/TypeTreeHelper.cs b/AssetStudio/TypeTreeHelper.cs index 3391844..bbfedec 100644 --- a/AssetStudio/TypeTreeHelper.cs +++ b/AssetStudio/TypeTreeHelper.cs @@ -150,7 +150,7 @@ namespace AssetStudio if (append) sb.AppendFormat("{0}{1} {2} = {3}\r\n", (new string('\t', level)), varTypeStr, varNameStr, value); if (align) - reader.AlignStream(4); + reader.AlignStream(); } public static Dictionary ReadBoxingType(List members, BinaryReader reader) @@ -284,7 +284,7 @@ namespace AssetStudio } } if (align) - reader.AlignStream(4); + reader.AlignStream(); return value; } diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index bae87d9..7ec6e9e 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -482,7 +482,7 @@ namespace AssetStudio lastGroup = group; } - morph.Channels.Add(new Tuple(i < sMesh.m_BlendShapeWeights.Count ? sMesh.m_BlendShapeWeights[i] : 0f, morph.KeyframeList.Count, mesh.m_Shapes.channels[i].frameCount)); + morph.Channels.Add(new Tuple(i < sMesh.m_BlendShapeWeights.Length ? sMesh.m_BlendShapeWeights[i] : 0f, morph.KeyframeList.Count, mesh.m_Shapes.channels[i].frameCount)); for (int frameIdx = 0; frameIdx < mesh.m_Shapes.channels[i].frameCount; frameIdx++) { ImportedMorphKeyframe keyframe = new ImportedMorphKeyframe(); @@ -596,22 +596,21 @@ namespace AssetStudio } iMat = new ImportedMaterial(); iMat.Name = mat.m_Name; - foreach (var col in mat.m_Colors) + foreach (var col in mat.m_SavedProperties.m_Colors) { - var color = new Color4(col.second[0], col.second[1], col.second[2], col.second[3]); - switch (col.first) + switch (col.Key) { case "_Color": - iMat.Diffuse = color; + iMat.Diffuse = col.Value; break; case "_SColor": - iMat.Ambient = color; + iMat.Ambient = col.Value; break; case "_EmissionColor": - iMat.Emissive = color; + iMat.Emissive = col.Value; break; case "_SpecColor": - iMat.Specular = color; + iMat.Specular = col.Value; break; case "_RimColor": case "_OutlineColor": @@ -620,12 +619,12 @@ namespace AssetStudio } } - foreach (var flt in mat.m_Floats) + foreach (var flt in mat.m_SavedProperties.m_Floats) { - switch (flt.first) + switch (flt.Key) { case "_Shininess": - iMat.Power = flt.second; + iMat.Power = flt.Value; break; case "_RimPower": case "_Outline": @@ -637,10 +636,10 @@ namespace AssetStudio iMat.Textures = new string[5]; iMat.TexOffsets = new Vector2[5]; iMat.TexScales = new Vector2[5]; - foreach (var texEnv in mat.m_TexEnvs) + foreach (var texEnv in mat.m_SavedProperties.m_TexEnvs) { Texture2D m_Texture2D = null; - if (texEnv.m_Texture.TryGet(out var m_Texture)) //TODO other Texture + if (texEnv.Value.m_Texture.TryGet(out var m_Texture)) //TODO other Texture { m_Texture2D = m_Texture; } @@ -650,13 +649,13 @@ namespace AssetStudio continue; } int dest = -1; - if (texEnv.name == "_MainTex") + if (texEnv.Key == "_MainTex") dest = 0; - else if (texEnv.name == "_BumpMap") + else if (texEnv.Key == "_BumpMap") dest = 4; - else if (texEnv.name.Contains("Spec")) + else if (texEnv.Key.Contains("Spec")) dest = 2; - else if (texEnv.name.Contains("Norm")) + else if (texEnv.Key.Contains("Norm")) dest = 3; if (dest < 0 || iMat.Textures[dest] != null) { @@ -685,8 +684,8 @@ namespace AssetStudio iMat.Textures[dest] = m_Texture2D.m_Name + ".png"; textureNameDictionary.Add(m_Texture, iMat.Textures[dest]); } - 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]); + iMat.TexOffsets[dest] = texEnv.Value.m_Offset; + iMat.TexScales[dest] = texEnv.Value.m_Scale; ConvertTexture2D(m_Texture2D, iMat.Textures[dest]); } diff --git a/AssetStudioUtility/ScriptHelper.cs b/AssetStudioUtility/ScriptHelper.cs index 50674d5..ec4d565 100644 --- a/AssetStudioUtility/ScriptHelper.cs +++ b/AssetStudioUtility/ScriptHelper.cs @@ -94,7 +94,7 @@ namespace AssetStudio value = reader.ReadChar(); break; } - reader.AlignStream(4); + reader.AlignStream(); sb.AppendLine($"{new string('\t', indent)}{typeDef.Name} {name} = {value}"); return; } diff --git a/AssetStudioUtility/ShaderConverter.cs b/AssetStudioUtility/ShaderConverter.cs index 79d61f5..56bb19f 100644 --- a/AssetStudioUtility/ShaderConverter.cs +++ b/AssetStudioUtility/ShaderConverter.cs @@ -107,7 +107,7 @@ namespace AssetStudio m_Keywords[i] = reader.ReadAlignedString(); } m_ProgramCode = reader.ReadBytes(reader.ReadInt32()); - reader.AlignStream(4); + reader.AlignStream(); //TODO }