From 35b24990c6a5d99c15b661578cf9da26aefe8d1b Mon Sep 17 00:00:00 2001 From: VaDiM Date: Thu, 24 Jul 2025 04:06:14 +0300 Subject: [PATCH] Allocation-safe asset reading Try to not pre-allocate memory during asset reading --- AssetStudio/BundleFile.cs | 5 + AssetStudio/Classes/Animation.cs | 13 +- AssetStudio/Classes/AnimationClip.cs | 176 +++++------ AssetStudio/Classes/AnimatorController.cs | 141 +++++---- .../Classes/AnimatorOverrideController.cs | 13 +- AssetStudio/Classes/AssetBundle.cs | 20 +- AssetStudio/Classes/Avatar.cs | 46 +-- AssetStudio/Classes/EditorExtension.cs | 7 +- AssetStudio/Classes/Font.cs | 17 +- AssetStudio/Classes/GameObject.cs | 13 +- AssetStudio/Classes/Material.cs | 34 +-- AssetStudio/Classes/Mesh.cs | 187 ++++++------ AssetStudio/Classes/MeshFilter.cs | 7 +- AssetStudio/Classes/MeshRenderer.cs | 7 +- AssetStudio/Classes/MonoScript.cs | 7 +- AssetStudio/Classes/MovieTexture.cs | 7 +- AssetStudio/Classes/NamedObject.cs | 7 +- AssetStudio/Classes/PreloadData.cs | 10 +- AssetStudio/Classes/RectTransform.cs | 7 +- AssetStudio/Classes/Renderer.cs | 12 +- AssetStudio/Classes/ResourceManager.cs | 8 +- .../Classes/RuntimeAnimatorController.cs | 7 +- AssetStudio/Classes/Shader.cs | 276 +++++++----------- AssetStudio/Classes/SkinnedMeshRenderer.cs | 14 +- AssetStudio/Classes/Sprite.cs | 41 +-- AssetStudio/Classes/SpriteAtlas.cs | 20 +- AssetStudio/Classes/TextAsset.cs | 8 +- AssetStudio/Classes/Transform.cs | 13 +- AssetStudio/Classes/VideoClip.cs | 5 +- .../Extensions/BinaryReaderExtensions.cs | 91 +++--- AssetStudio/ObjectReader.cs | 9 + AssetStudio/SerializedFile.cs | 30 +- AssetStudioCLI/Exporter.cs | 2 +- AssetStudioCLI/Studio.cs | 4 +- AssetStudioGUI/Exporter.cs | 2 +- AssetStudioGUI/Studio.cs | 4 +- .../CubismMotion3Converter.cs | 6 +- .../CubismMotion3Json.cs | 6 +- AssetStudioUtility/ModelConverter.cs | 24 +- AssetStudioUtility/ShaderConverter.cs | 17 +- 40 files changed, 617 insertions(+), 706 deletions(-) diff --git a/AssetStudio/BundleFile.cs b/AssetStudio/BundleFile.cs index f7b9e8f..5db5355 100644 --- a/AssetStudio/BundleFile.cs +++ b/AssetStudio/BundleFile.cs @@ -287,6 +287,11 @@ namespace AssetStudio var compressedSize = (int)m_Header.compressedBlocksInfoSize; var uncompressedSize = (int)m_Header.uncompressedBlocksInfoSize; + if (uncompressedSize < 0 || compressedSize < 0 || compressedSize > reader.BaseStream.Length) + { + throw new IOException("Incorrect blockInfo length.\nBlockInfo sizes might be encrypted.\n"); + } + if ((m_Header.flags & ArchiveFlags.BlocksInfoAtTheEnd) != 0) { var position = reader.Position; diff --git a/AssetStudio/Classes/Animation.cs b/AssetStudio/Classes/Animation.cs index b03035b..17b0b42 100644 --- a/AssetStudio/Classes/Animation.cs +++ b/AssetStudio/Classes/Animation.cs @@ -1,22 +1,19 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; namespace AssetStudio { public sealed class Animation : Behaviour { - public PPtr[] m_Animations; + public List> m_Animations; public Animation(ObjectReader reader) : base(reader) { var m_Animation = new PPtr(reader); int numAnimations = reader.ReadInt32(); - m_Animations = new PPtr[numAnimations]; - for (int i = 0; i < numAnimations; i++) + m_Animations = new List>(); + for (var i = 0; i < numAnimations; i++) { - m_Animations[i] = new PPtr(reader); + m_Animations.Add(new PPtr(reader)); } } } diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 1f84e44..b11fb03 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -35,7 +35,7 @@ namespace AssetStudio public class AnimationCurve { - public Keyframe[] m_Curve; + public List> m_Curve; public int m_PreInfinity; public int m_PostInfinity; public int m_RotationOrder; @@ -45,10 +45,10 @@ namespace AssetStudio public AnimationCurve(ObjectReader reader, Func readerFunc) { int numCurves = reader.ReadInt32(); - m_Curve = new Keyframe[numCurves]; - for (int i = 0; i < numCurves; i++) + m_Curve = new List>(); + for (var i = 0; i < numCurves; i++) { - m_Curve[i] = new Keyframe(reader, readerFunc); + m_Curve.Add(new Keyframe(reader, readerFunc)); } m_PreInfinity = reader.ReadInt32(); @@ -111,7 +111,7 @@ namespace AssetStudio var data = new List(); for (var index = 0; index != end; index += chunkStride / 4) { - for (int i = 0; i < itemCountInChunk; ++i) + for (var i = 0; i < itemCountInChunk; ++i) { uint x = 0; @@ -132,7 +132,6 @@ namespace AssetStudio data.Add(x / (scale * ((1 << m_BitSize) - 1)) + m_Start); } } - return data.ToArray(); } } @@ -159,16 +158,16 @@ namespace AssetStudio public int[] UnpackInts() { - var data = new int[m_NumItems]; + var data = new List(); int indexPos = 0; int bitPos = 0; - for (int i = 0; i < m_NumItems; i++) + for (var i = 0; i < m_NumItems; i++) { int bits = 0; - data[i] = 0; + int elem = 0; while (bits < m_BitSize) { - data[i] |= (m_Data[indexPos] >> bitPos) << bits; + elem |= (m_Data[indexPos] >> bitPos) << bits; int num = Math.Min(m_BitSize - bits, 8 - bitPos); bitPos += num; bits += num; @@ -178,9 +177,10 @@ namespace AssetStudio bitPos = 0; } } - data[i] &= (1 << m_BitSize) - 1; + elem &= (1 << m_BitSize) - 1; + data.Add(elem); } - return data; + return data.ToArray(); } } @@ -203,11 +203,11 @@ namespace AssetStudio public Quaternion[] UnpackQuats() { - var data = new Quaternion[m_NumItems]; + var data = new List(); int indexPos = 0; int bitPos = 0; - for (int i = 0; i < m_NumItems; i++) + for (var i = 0; i < m_NumItems; i++) { uint flags = 0; @@ -226,10 +226,9 @@ namespace AssetStudio } flags &= 7; - var q = new Quaternion(); float sum = 0; - for (int j = 0; j < 4; j++) + for (var j = 0; j < 4; j++) { if ((flags & 3) != j) { @@ -254,15 +253,13 @@ namespace AssetStudio sum += q[j] * q[j]; } } - int lastComponent = (int)(flags & 3); q[lastComponent] = MathF.Sqrt(1 - sum); if ((flags & 4) != 0u) q[lastComponent] = -q[lastComponent]; - data[i] = q; + data.Add(q); } - - return data; + return data.ToArray(); } } @@ -343,7 +340,7 @@ namespace AssetStudio public class PPtrCurve { - public PPtrKeyframe[] curve; + public List curve; public string attribute; public string path; public int classID; @@ -355,10 +352,10 @@ namespace AssetStudio public PPtrCurve(ObjectReader reader) { int numCurves = reader.ReadInt32(); - curve = new PPtrKeyframe[numCurves]; - for (int i = 0; i < numCurves; i++) + curve = new List(); + for (var i = 0; i < numCurves; i++) { - curve[i] = new PPtrKeyframe(reader); + curve.Add(new PPtrKeyframe(reader)); } attribute = reader.ReadAlignedString(); @@ -470,11 +467,12 @@ namespace AssetStudio m_LookAtWeight = reader.ReadVector4(); int numGoals = reader.ReadInt32(); - m_GoalArray = new HumanGoal[numGoals]; - for (int i = 0; i < numGoals; i++) + var goalList = new List(); + for (var i = 0; i < numGoals; i++) { - m_GoalArray[i] = new HumanGoal(reader); + goalList.Add(new HumanGoal(reader)); } + m_GoalArray = goalList.ToArray(); m_LeftHandPose = new HandPose(reader); m_RightHandPose = new HandPose(reader); @@ -484,11 +482,14 @@ namespace AssetStudio if (version >= (5, 2))//5.2 and up { int numTDof = reader.ReadInt32(); - m_TDoFArray = new Vector3[numTDof]; - for (int i = 0; i < numTDof; i++) + var tDoFList = new List(); + for (var i = 0; i < numTDof; i++) { - m_TDoFArray[i] = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up + tDoFList.Add(version >= (5, 4) //5.4 and up + ? reader.ReadVector3() + : (Vector3) reader.ReadVector4()); } + m_TDoFArray = tDoFList.ToArray(); } } } @@ -556,7 +557,7 @@ namespace AssetStudio public class StreamedFrame { public float time; - public StreamedCurveKey[] keyList; + public List keyList; public StreamedFrame() { } @@ -565,10 +566,10 @@ namespace AssetStudio time = reader.ReadSingle(); int numKeys = reader.ReadInt32(); - keyList = new StreamedCurveKey[numKeys]; - for (int i = 0; i < numKeys; i++) + keyList = new List(); + for (var i = 0; i < numKeys; i++) { - keyList[i] = new StreamedCurveKey(reader); + keyList.Add(new StreamedCurveKey(reader)); } } } @@ -586,12 +587,12 @@ namespace AssetStudio } } - for (int frameIndex = 2; frameIndex < frameList.Count - 1; frameIndex++) + for (var frameIndex = 2; frameIndex < frameList.Count - 1; frameIndex++) { var frame = frameList[frameIndex]; foreach (var curveKey in frame.keyList) { - for (int i = frameIndex - 1; i >= 0; i--) + for (var i = frameIndex - 1; i >= 0; i--) { var preFrame = frameList[i]; var preCurveKey = preFrame.keyList.FirstOrDefault(x => x.index == curveKey.index); @@ -669,11 +670,12 @@ namespace AssetStudio public ValueArrayConstant(ObjectReader reader) { int numVals = reader.ReadInt32(); - m_ValueArray = new ValueConstant[numVals]; - for (int i = 0; i < numVals; i++) + var valueList = new List(); + for (var i = 0; i < numVals; i++) { - m_ValueArray[i] = new ValueConstant(reader); + valueList.Add(new ValueConstant(reader)); } + m_ValueArray = valueList.ToArray(); } } @@ -718,7 +720,7 @@ namespace AssetStudio var bindings = new AnimationClipBindingConstant(); var genericBindings = new List(); var values = m_Binding; - for (int i = 0; i < values.m_ValueArray.Length;) + for (var i = 0; i < values.m_ValueArray.Length;) { var curveID = values.m_ValueArray[i].m_ID; var curveTypeID = values.m_ValueArray[i].m_TypeID; @@ -753,7 +755,7 @@ namespace AssetStudio i++; } } - bindings.genericBindings = genericBindings.ToArray(); + bindings.genericBindings = genericBindings; return bindings; } } @@ -834,11 +836,13 @@ namespace AssetStudio m_IndexArray = reader.ReadInt32Array(); if (version < (4, 3)) //4.3 down { - var m_AdditionalCurveIndexArray = reader.ReadInt32Array(); + var m_AdditionalCurveIndexArrayNum = reader.ReadInt32(); + reader.Position += m_AdditionalCurveIndexArrayNum * 4; //skip int[] m_AdditionalCurveIndexArray } int numDeltas = reader.ReadInt32(); + reader.ThrowIfTooLarge(numDeltas * 8f); m_ValueArrayDelta = new ValueDelta[numDeltas]; - for (int i = 0; i < numDeltas; i++) + for (var i = 0; i < numDeltas; i++) { m_ValueArrayDelta[i] = new ValueDelta(reader); } @@ -911,25 +915,25 @@ namespace AssetStudio public class AnimationClipBindingConstant { - public GenericBinding[] genericBindings; - public PPtr[] pptrCurveMapping; + public List genericBindings; + public List> pptrCurveMapping; public AnimationClipBindingConstant() { } public AnimationClipBindingConstant(ObjectReader reader) { int numBindings = reader.ReadInt32(); - genericBindings = new GenericBinding[numBindings]; - for (int i = 0; i < numBindings; i++) + genericBindings = new List(); + for (var i = 0; i < numBindings; i++) { - genericBindings[i] = new GenericBinding(reader); + genericBindings.Add(new GenericBinding(reader)); } int numMappings = reader.ReadInt32(); - pptrCurveMapping = new PPtr[numMappings]; - for (int i = 0; i < numMappings; i++) + pptrCurveMapping = new List>(); + for (var i = 0; i < numMappings; i++) { - pptrCurveMapping[i] = new PPtr(reader); + pptrCurveMapping.Add(new PPtr(reader)); } } @@ -1013,20 +1017,20 @@ namespace AssetStudio public bool m_Legacy; public bool m_Compressed; public bool m_UseHighQualityCurve; - public QuaternionCurve[] m_RotationCurves; - public CompressedAnimationCurve[] m_CompressedRotationCurves; - public Vector3Curve[] m_EulerCurves; - public Vector3Curve[] m_PositionCurves; - public Vector3Curve[] m_ScaleCurves; - public FloatCurve[] m_FloatCurves; - public PPtrCurve[] m_PPtrCurves; + public List m_RotationCurves; + public List m_CompressedRotationCurves; + public List m_EulerCurves; + public List m_PositionCurves; + public List m_ScaleCurves; + public List m_FloatCurves; + public List m_PPtrCurves; public float m_SampleRate; public int m_WrapMode; public AABB m_Bounds; public uint m_MuscleClipSize; public ClipMuscleConstant m_MuscleClip; public AnimationClipBindingConstant m_ClipBindingConstant; - public AnimationEvent[] m_Events; + public List m_Events; public byte[] m_AnimData; public StreamingInfo m_StreamingInfo; @@ -1083,9 +1087,9 @@ namespace AssetStudio } else { - m_EulerCurves = Vector3CurveArray(objReader); - m_PositionCurves = Vector3CurveArray(objReader); - m_ScaleCurves = Vector3CurveArray(objReader); + m_EulerCurves = Vector3CurveList(objReader); + m_PositionCurves = Vector3CurveList(objReader); + m_ScaleCurves = Vector3CurveList(objReader); } } } @@ -1116,19 +1120,19 @@ namespace AssetStudio } reader.AlignStream(); int numRCurves = reader.ReadInt32(); - m_RotationCurves = new QuaternionCurve[numRCurves]; - for (int i = 0; i < numRCurves; i++) + m_RotationCurves = new List(); + for (var i = 0; i < numRCurves; i++) { - m_RotationCurves[i] = new QuaternionCurve(reader); + m_RotationCurves.Add(new QuaternionCurve(reader)); } if (version >= (2, 6)) //2.6 and up { int numCRCurves = reader.ReadInt32(); - m_CompressedRotationCurves = new CompressedAnimationCurve[numCRCurves]; - for (int i = 0; i < numCRCurves; i++) + m_CompressedRotationCurves = new List(); + for (var i = 0; i < numCRCurves; i++) { - m_CompressedRotationCurves[i] = new CompressedAnimationCurve(reader); + m_CompressedRotationCurves.Add(new CompressedAnimationCurve(reader)); } } @@ -1136,26 +1140,26 @@ namespace AssetStudio { if (version >= (5, 3)) //5.3 and up { - m_EulerCurves = Vector3CurveArray(reader); + m_EulerCurves = Vector3CurveList(reader); } - m_PositionCurves = Vector3CurveArray(reader); - m_ScaleCurves = Vector3CurveArray(reader); + m_PositionCurves = Vector3CurveList(reader); + m_ScaleCurves = Vector3CurveList(reader); } int numFCurves = reader.ReadInt32(); - m_FloatCurves = new FloatCurve[numFCurves]; - for (int i = 0; i < numFCurves; i++) + m_FloatCurves = new List(); + for (var i = 0; i < numFCurves; i++) { - m_FloatCurves[i] = new FloatCurve(reader); + m_FloatCurves.Add(new FloatCurve(reader)); } if (version >= (4, 3)) //4.3 and up { int numPtrCurves = reader.ReadInt32(); - m_PPtrCurves = new PPtrCurve[numPtrCurves]; - for (int i = 0; i < numPtrCurves; i++) + m_PPtrCurves = new List(); + for (var i = 0; i < numPtrCurves; i++) { - m_PPtrCurves[i] = new PPtrCurve(reader); + m_PPtrCurves.Add(new PPtrCurve(reader)); } } @@ -1185,9 +1189,9 @@ namespace AssetStudio } else { - m_EulerCurves = Vector3CurveArray(reader); - m_PositionCurves = Vector3CurveArray(reader); - m_ScaleCurves = Vector3CurveArray(reader); + m_EulerCurves = Vector3CurveList(reader); + m_PositionCurves = Vector3CurveList(reader); + m_ScaleCurves = Vector3CurveList(reader); } } } @@ -1202,10 +1206,10 @@ namespace AssetStudio reader.AlignStream(); } int numEvents = reader.ReadInt32(); - m_Events = new AnimationEvent[numEvents]; - for (int i = 0; i < numEvents; i++) + m_Events = new List(); + for (var i = 0; i < numEvents; i++) { - m_Events[i] = new AnimationEvent(reader); + m_Events.Add(new AnimationEvent(reader)); } if (version >= 2017) //2017 and up { @@ -1213,13 +1217,13 @@ namespace AssetStudio } } - private static Vector3Curve[] Vector3CurveArray(ObjectReader reader) + private static List Vector3CurveList(ObjectReader reader) { var curveNum = reader.ReadInt32(); - var vector3Curve = new Vector3Curve[curveNum]; + var vector3Curve = new List(); for (var i = 0; i < curveNum; i++) { - vector3Curve[i] = new Vector3Curve(reader); + vector3Curve.Add(new Vector3Curve(reader)); } return vector3Curve; } diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index 5baecb0..904ccf2 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; namespace AssetStudio { @@ -38,15 +35,15 @@ namespace AssetStudio public class SkeletonMask { - public SkeletonMaskElement[] m_Data; + public List m_Data; public SkeletonMask(ObjectReader reader) { int numElements = reader.ReadInt32(); - m_Data = new SkeletonMaskElement[numElements]; - for (int i = 0; i < numElements; i++) + m_Data = new List(); + for (var i = 0; i < numElements; i++) { - m_Data[i] = new SkeletonMaskElement(reader); + m_Data.Add(new SkeletonMaskElement(reader)); } } } @@ -124,11 +121,12 @@ namespace AssetStudio var version = reader.version; int numConditions = reader.ReadInt32(); - m_ConditionConstantArray = new ConditionConstant[numConditions]; - for (int i = 0; i < numConditions; i++) + var conditionConstantList = new List(); + for (var i = 0; i < numConditions; i++) { - m_ConditionConstantArray[i] = new ConditionConstant(reader); + conditionConstantList.Add(new ConditionConstant(reader)); } + m_ConditionConstantArray = conditionConstantList.ToArray(); m_DestinationState = reader.ReadUInt32(); if (version >= 5) //5.0 and up @@ -201,11 +199,12 @@ namespace AssetStudio m_ChildPairAvgMagInvArray = reader.ReadSingleArray(); int numNeighbours = reader.ReadInt32(); - m_ChildNeighborListArray = new MotionNeighborList[numNeighbours]; - for (int i = 0; i < numNeighbours; i++) + var childNeighborLists = new List(); + for (var i = 0; i < numNeighbours; i++) { - m_ChildNeighborListArray[i] = new MotionNeighborList(reader); + childNeighborLists.Add(new MotionNeighborList(reader)); } + m_ChildNeighborListArray = childNeighborLists.ToArray(); } } @@ -305,11 +304,12 @@ namespace AssetStudio var version = reader.version; int numNodes = reader.ReadInt32(); - m_NodeArray = new BlendTreeNodeConstant[numNodes]; - for (int i = 0; i < numNodes; i++) + var nodeList = new List(); + for (var i = 0; i < numNodes; i++) { - m_NodeArray[i] = new BlendTreeNodeConstant(reader); + nodeList.Add(new BlendTreeNodeConstant(reader)); } + m_NodeArray = nodeList.ToArray(); if (version < (4, 5)) //4.5 down { @@ -343,31 +343,34 @@ namespace AssetStudio { var version = reader.version; - int numTransistions = reader.ReadInt32(); - m_TransitionConstantArray = new TransitionConstant[numTransistions]; - for (int i = 0; i < numTransistions; i++) + int numTransitions = reader.ReadInt32(); + var transitionConstantList = new List(); + for (var i = 0; i < numTransitions; i++) { - m_TransitionConstantArray[i] = new TransitionConstant(reader); + transitionConstantList.Add(new TransitionConstant(reader)); } + m_TransitionConstantArray = transitionConstantList.ToArray(); m_BlendTreeConstantIndexArray = reader.ReadInt32Array(); if (version < (5, 2)) //5.2 down { int numInfos = reader.ReadInt32(); - m_LeafInfoArray = new LeafInfoConstant[numInfos]; - for (int i = 0; i < numInfos; i++) + var leafInfoList = new List(); + for (var i = 0; i < numInfos; i++) { - m_LeafInfoArray[i] = new LeafInfoConstant(reader); + leafInfoList.Add(new LeafInfoConstant(reader)); } + m_LeafInfoArray = leafInfoList.ToArray(); } int numBlends = reader.ReadInt32(); - m_BlendTreeConstantArray = new BlendTreeConstant[numBlends]; - for (int i = 0; i < numBlends; i++) + var blendTreeConstantList = new List(); + for (var i = 0; i < numBlends; i++) { - m_BlendTreeConstantArray[i] = new BlendTreeConstant(reader); + blendTreeConstantList.Add(new BlendTreeConstant(reader)); } + m_BlendTreeConstantArray = blendTreeConstantList.ToArray(); m_NameID = reader.ReadUInt32(); if (version >= (4, 3)) //4.3 and up @@ -423,11 +426,12 @@ namespace AssetStudio m_Destination = reader.ReadUInt32(); int numConditions = reader.ReadInt32(); - m_ConditionConstantArray = new ConditionConstant[numConditions]; - for (int i = 0; i < numConditions; i++) + var conditionConstantList = new List(); + for (var i = 0; i < numConditions; i++) { - m_ConditionConstantArray[i] = new ConditionConstant(reader); + conditionConstantList.Add(new ConditionConstant(reader)); } + m_ConditionConstantArray = conditionConstantList.ToArray(); } } @@ -440,11 +444,12 @@ namespace AssetStudio public SelectorStateConstant(ObjectReader reader) { int numTransitions = reader.ReadInt32(); - m_TransitionConstantArray = new SelectorTransitionConstant[numTransitions]; - for (int i = 0; i < numTransitions; i++) + var transitionConstantList = new List(); + for (var i = 0; i < numTransitions; i++) { - m_TransitionConstantArray[i] = new SelectorTransitionConstant(reader); + transitionConstantList.Add(new SelectorTransitionConstant(reader)); } + m_TransitionConstantArray = transitionConstantList.ToArray(); m_FullPathID = reader.ReadUInt32(); m_isEntry = reader.ReadBoolean(); @@ -465,27 +470,30 @@ namespace AssetStudio var version = reader.version; int numStates = reader.ReadInt32(); - m_StateConstantArray = new StateConstant[numStates]; - for (int i = 0; i < numStates; i++) + var stateConstantList = new List(); + for (var i = 0; i < numStates; i++) { - m_StateConstantArray[i] = new StateConstant(reader); + stateConstantList.Add(new StateConstant(reader)); } + m_StateConstantArray = stateConstantList.ToArray(); int numAnyStates = reader.ReadInt32(); - m_AnyStateTransitionConstantArray = new TransitionConstant[numAnyStates]; - for (int i = 0; i < numAnyStates; i++) + var anyStateTransitionConstantList = new List(); + for (var i = 0; i < numAnyStates; i++) { - m_AnyStateTransitionConstantArray[i] = new TransitionConstant(reader); + anyStateTransitionConstantList.Add(new TransitionConstant(reader)); } - + m_AnyStateTransitionConstantArray = anyStateTransitionConstantList.ToArray(); + if (version >= 5) //5.0 and up { int numSelectors = reader.ReadInt32(); - m_SelectorStateConstantArray = new SelectorStateConstant[numSelectors]; - for (int i = 0; i < numSelectors; i++) + var selectorStateConstantList = new List(); + for (var i = 0; i < numSelectors; i++) { - m_SelectorStateConstantArray[i] = new SelectorStateConstant(reader); + selectorStateConstantList.Add(new SelectorStateConstant(reader)); } + m_SelectorStateConstantArray = selectorStateConstantList.ToArray(); } m_DefaultState = reader.ReadUInt32(); @@ -522,20 +530,26 @@ namespace AssetStudio else { int numPosValues = reader.ReadInt32(); - m_PositionValues = new Vector3[numPosValues]; - for (int i = 0; i < numPosValues; i++) + var positionValuesList = new List(); + for (var i = 0; i < numPosValues; i++) { - m_PositionValues[i] = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + positionValuesList.Add(version >= (5, 4) //5.4 and up + ? reader.ReadVector3() + : (Vector3)reader.ReadVector4()); } + m_PositionValues = positionValuesList.ToArray(); m_QuaternionValues = reader.ReadVector4Array(); int numScaleValues = reader.ReadInt32(); - m_ScaleValues = new Vector3[numScaleValues]; - for (int i = 0; i < numScaleValues; i++) + var scaleValuesList = new List(); + for (var i = 0; i < numScaleValues; i++) { - m_ScaleValues[i] = version >= (5, 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4(); //5.4 and up + scaleValuesList.Add(version >= (5, 4) //5.4 and up + ? reader.ReadVector3() + : (Vector3)reader.ReadVector4()); } + m_ScaleValues = scaleValuesList.ToArray(); if (version >= (5, 5)) //5.5 and up { @@ -558,18 +572,20 @@ namespace AssetStudio public ControllerConstant(ObjectReader reader) { int numLayers = reader.ReadInt32(); - m_LayerArray = new LayerConstant[numLayers]; - for (int i = 0; i < numLayers; i++) + var layerList = new List(); + for (var i = 0; i < numLayers; i++) { - m_LayerArray[i] = new LayerConstant(reader); + layerList.Add(new LayerConstant(reader)); } + m_LayerArray = layerList.ToArray(); int numStates = reader.ReadInt32(); - m_StateMachineArray = new StateMachineConstant[numStates]; - for (int i = 0; i < numStates; i++) + var stateMachineList = new List(); + for (var i = 0; i < numStates; i++) { - m_StateMachineArray[i] = new StateMachineConstant(reader); + stateMachineList.Add(new StateMachineConstant(reader)); } + m_StateMachineArray = stateMachineList.ToArray(); m_Values = new ValueArrayConstant(reader); m_DefaultValues = new ValueArray(reader); @@ -578,7 +594,8 @@ namespace AssetStudio public sealed class AnimatorController : RuntimeAnimatorController { - public PPtr[] m_AnimationClips; + public List> m_AnimationClips; + public List> m_TOS; public AnimatorController(ObjectReader reader) : base(reader) { @@ -586,17 +603,17 @@ namespace AssetStudio var m_Controller = new ControllerConstant(reader); int tosSize = reader.ReadInt32(); - var m_TOS = new KeyValuePair[tosSize]; - for (int i = 0; i < tosSize; i++) + m_TOS = new List>(); + for (var i = 0; i < tosSize; i++) { - m_TOS[i] = new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString()); + m_TOS.Add(new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString())); } int numClips = reader.ReadInt32(); - m_AnimationClips = new PPtr[numClips]; - for (int i = 0; i < numClips; i++) + m_AnimationClips = new List>(); + for (var i = 0; i < numClips; i++) { - m_AnimationClips[i] = new PPtr(reader); + m_AnimationClips.Add(new PPtr(reader)); } } } diff --git a/AssetStudio/Classes/AnimatorOverrideController.cs b/AssetStudio/Classes/AnimatorOverrideController.cs index c89e7a2..55068d3 100644 --- a/AssetStudio/Classes/AnimatorOverrideController.cs +++ b/AssetStudio/Classes/AnimatorOverrideController.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; namespace AssetStudio { @@ -20,17 +17,17 @@ namespace AssetStudio public sealed class AnimatorOverrideController : RuntimeAnimatorController { public PPtr m_Controller; - public AnimationClipOverride[] m_Clips; + public List m_Clips; public AnimatorOverrideController(ObjectReader reader) : base(reader) { m_Controller = new PPtr(reader); int numOverrides = reader.ReadInt32(); - m_Clips = new AnimationClipOverride[numOverrides]; - for (int i = 0; i < numOverrides; i++) + m_Clips = new List(); + for (var i = 0; i < numOverrides; i++) { - m_Clips[i] = new AnimationClipOverride(reader); + m_Clips.Add(new AnimationClipOverride(reader)); } } } diff --git a/AssetStudio/Classes/AssetBundle.cs b/AssetStudio/Classes/AssetBundle.cs index b6199f7..4a4f368 100644 --- a/AssetStudio/Classes/AssetBundle.cs +++ b/AssetStudio/Classes/AssetBundle.cs @@ -18,8 +18,8 @@ namespace AssetStudio public sealed class AssetBundle : NamedObject { - public PPtr[] m_PreloadTable; - public KeyValuePair[] m_Container; + public List> m_PreloadTable; + public List> m_Container; public string m_AssetBundleName; public string[] m_Dependencies; public bool m_IsStreamedSceneAssetBundle; @@ -27,17 +27,17 @@ namespace AssetStudio public AssetBundle(ObjectReader reader) : base(reader) { var m_PreloadTableSize = reader.ReadInt32(); - m_PreloadTable = new PPtr[m_PreloadTableSize]; + m_PreloadTable = new List>(); for (var i = 0; i < m_PreloadTableSize; i++) { - m_PreloadTable[i] = new PPtr(reader); + m_PreloadTable.Add(new PPtr(reader)); } var m_ContainerSize = reader.ReadInt32(); - m_Container = new KeyValuePair[m_ContainerSize]; + m_Container = new List>(); for (var i = 0; i < m_ContainerSize; i++) { - m_Container[i] = new KeyValuePair(reader.ReadAlignedString(), new AssetInfo(reader)); + m_Container.Add(new KeyValuePair(reader.ReadAlignedString(), new AssetInfo(reader))); } var m_MainAsset = new AssetInfo(reader); @@ -61,13 +61,7 @@ namespace AssetStudio { m_AssetBundleName = reader.ReadAlignedString(); - var m_DependenciesSize = reader.ReadInt32(); - m_Dependencies = new string[m_DependenciesSize]; - - for (var i = 0; i < m_DependenciesSize; i++) - { - m_Dependencies[i] = reader.ReadAlignedString(); - } + m_Dependencies = reader.ReadStringArray(); m_IsStreamedSceneAssetBundle = reader.ReadBoolean(); } diff --git a/AssetStudio/Classes/Avatar.cs b/AssetStudio/Classes/Avatar.cs index e8593a90..93f7b9a 100644 --- a/AssetStudio/Classes/Avatar.cs +++ b/AssetStudio/Classes/Avatar.cs @@ -66,7 +66,7 @@ namespace AssetStudio public class Skeleton { - public Node[] m_Node; + public List m_Node; public uint[] m_ID; public Axes[] m_AxesArray; @@ -74,34 +74,35 @@ namespace AssetStudio public Skeleton(ObjectReader reader) { int numNodes = reader.ReadInt32(); - m_Node = new Node[numNodes]; - for (int i = 0; i < numNodes; i++) + m_Node = new List(); + for (var i = 0; i < numNodes; i++) { - m_Node[i] = new Node(reader); + m_Node.Add(new Node(reader)); } m_ID = reader.ReadUInt32Array(); int numAxes = reader.ReadInt32(); - m_AxesArray = new Axes[numAxes]; - for (int i = 0; i < numAxes; i++) + var axesList = new List(); + for (var i = 0; i < numAxes; i++) { - m_AxesArray[i] = new Axes(reader); + axesList.Add(new Axes(reader)); } + m_AxesArray = axesList.ToArray(); } } public class SkeletonPose { - public xform[] m_X; + public List m_X; public SkeletonPose(ObjectReader reader) { int numXforms = reader.ReadInt32(); - m_X = new xform[numXforms]; - for (int i = 0; i < numXforms; i++) + m_X = new List(); + for (var i = 0; i < numXforms; i++) { - m_X[i] = new xform(reader); + m_X.Add(new xform(reader)); } } } @@ -163,7 +164,7 @@ namespace AssetStudio public SkeletonPose m_SkeletonPose; public Hand m_LeftHand; public Hand m_RightHand; - public Handle[] m_Handles; + public List m_Handles; public Collider[] m_ColliderArray; public int[] m_HumanBoneIndex; public float[] m_HumanBoneMass; @@ -192,18 +193,19 @@ namespace AssetStudio if (version < (2018, 2)) //2018.2 down { int numHandles = reader.ReadInt32(); - m_Handles = new Handle[numHandles]; - for (int i = 0; i < numHandles; i++) + m_Handles = new List(); + for (var i = 0; i < numHandles; i++) { - m_Handles[i] = new Handle(reader); + m_Handles.Add(new Handle(reader)); } int numColliders = reader.ReadInt32(); - m_ColliderArray = new Collider[numColliders]; - for (int i = 0; i < numColliders; i++) + var colliderList = new List(); + for (var i = 0; i < numColliders; i++) { - m_ColliderArray[i] = new Collider(reader); + colliderList.Add(new Collider(reader)); } + m_ColliderArray = colliderList.ToArray(); } m_HumanBoneIndex = reader.ReadInt32Array(); @@ -287,7 +289,7 @@ namespace AssetStudio { public uint m_AvatarSize; public AvatarConstant m_Avatar; - public KeyValuePair[] m_TOS; + public List> m_TOS; public Avatar(ObjectReader reader) : base(reader) { @@ -295,10 +297,10 @@ namespace AssetStudio m_Avatar = new AvatarConstant(reader); int numTOS = reader.ReadInt32(); - m_TOS = new KeyValuePair[numTOS]; - for (int i = 0; i < numTOS; i++) + m_TOS = new List>(); + for (var i = 0; i < numTOS; i++) { - m_TOS[i] = new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString()); + m_TOS.Add(new KeyValuePair(reader.ReadUInt32(), reader.ReadAlignedString())); } //HumanDescription m_HumanDescription 2019 and up diff --git a/AssetStudio/Classes/EditorExtension.cs b/AssetStudio/Classes/EditorExtension.cs index aacfccc..3b5ea1c 100644 --- a/AssetStudio/Classes/EditorExtension.cs +++ b/AssetStudio/Classes/EditorExtension.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public abstract class EditorExtension : Object { diff --git a/AssetStudio/Classes/Font.cs b/AssetStudio/Classes/Font.cs index 0f76fa2..01d98a3 100644 --- a/AssetStudio/Classes/Font.cs +++ b/AssetStudio/Classes/Font.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class Font : NamedObject { @@ -23,12 +18,12 @@ namespace AssetStudio var m_CharacterPadding = reader.ReadInt32(); var m_ConvertCase = reader.ReadInt32(); int m_CharacterRects_size = reader.ReadInt32(); - for (int i = 0; i < m_CharacterRects_size; i++) + for (var i = 0; i < m_CharacterRects_size; i++) { reader.Position += 44;//CharacterInfo data 41 } int m_KerningValues_size = reader.ReadInt32(); - for (int i = 0; i < m_KerningValues_size; i++) + for (var i = 0; i < m_KerningValues_size; i++) { reader.Position += 8; } @@ -55,7 +50,7 @@ namespace AssetStudio if (version <= 3) { int m_PerCharacterKerning_size = reader.ReadInt32(); - for (int i = 0; i < m_PerCharacterKerning_size; i++) + for (var i = 0; i < m_PerCharacterKerning_size; i++) { int first = reader.ReadInt32(); float second = reader.ReadSingle(); @@ -71,7 +66,7 @@ namespace AssetStudio var m_DefaultMaterial = new PPtr(reader); int m_CharacterRects_size = reader.ReadInt32(); - for (int i = 0; i < m_CharacterRects_size; i++) + for (var i = 0; i < m_CharacterRects_size; i++) { int index = reader.ReadInt32(); //Rectf uv @@ -96,7 +91,7 @@ namespace AssetStudio var m_Texture = new PPtr(reader); int m_KerningValues_size = reader.ReadInt32(); - for (int i = 0; i < m_KerningValues_size; i++) + for (var i = 0; i < m_KerningValues_size; i++) { int pairfirst = reader.ReadInt16(); int pairsecond = reader.ReadInt16(); diff --git a/AssetStudio/Classes/GameObject.cs b/AssetStudio/Classes/GameObject.cs index a97a362..6c439d3 100644 --- a/AssetStudio/Classes/GameObject.cs +++ b/AssetStudio/Classes/GameObject.cs @@ -1,10 +1,11 @@ -using System.Text.Json.Serialization; +using System.Collections.Generic; +using System.Text.Json.Serialization; namespace AssetStudio { public sealed class GameObject : EditorExtension { - public PPtr[] m_Components; + public List> m_Components; public string m_Name; public Transform m_Transform; @@ -18,15 +19,15 @@ namespace AssetStudio public GameObject(ObjectReader reader) : base(reader) { - var m_Component_size = reader.ReadInt32(); - m_Components = new PPtr[m_Component_size]; - for (var i = 0; i < m_Component_size; i++) + var m_ComponentSize = reader.ReadInt32(); + m_Components = new List>(); + for (var i = 0; i < m_ComponentSize; i++) { if (version < (5, 5)) //5.5 down { var first = reader.ReadInt32(); } - m_Components[i] = new PPtr(reader); + m_Components.Add(new PPtr(reader)); } var m_Layer = reader.ReadInt32(); diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index 39fe6a2..72c5a65 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -21,10 +21,10 @@ namespace AssetStudio public class UnityPropertySheet { - public KeyValuePair[] m_TexEnvs; - public KeyValuePair[] m_Ints; - public KeyValuePair[] m_Floats; - public KeyValuePair[] m_Colors; + public List> m_TexEnvs; + public List> m_Ints; + public List> m_Floats; + public List> m_Colors; public UnityPropertySheet() { } @@ -33,34 +33,34 @@ namespace AssetStudio var version = reader.version; int m_TexEnvsSize = reader.ReadInt32(); - m_TexEnvs = new KeyValuePair[m_TexEnvsSize]; - for (int i = 0; i < m_TexEnvsSize; i++) + m_TexEnvs = new List>(); + for (var i = 0; i < m_TexEnvsSize; i++) { - m_TexEnvs[i] = new KeyValuePair(reader.ReadAlignedString(), new UnityTexEnv(reader)); + m_TexEnvs.Add(new KeyValuePair(reader.ReadAlignedString(), new UnityTexEnv(reader))); } if (version >= 2021) //2021.1 and up { int m_IntsSize = reader.ReadInt32(); - m_Ints = new KeyValuePair[m_IntsSize]; - for (int i = 0; i < m_IntsSize; i++) + m_Ints = new List>(); + for (var i = 0; i < m_IntsSize; i++) { - m_Ints[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadInt32()); + m_Ints.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadInt32())); } } int m_FloatsSize = reader.ReadInt32(); - m_Floats = new KeyValuePair[m_FloatsSize]; - for (int i = 0; i < m_FloatsSize; i++) + m_Floats = new List>(); + for (var i = 0; i < m_FloatsSize; i++) { - m_Floats[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadSingle()); + m_Floats.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadSingle())); } int m_ColorsSize = reader.ReadInt32(); - m_Colors = new KeyValuePair[m_ColorsSize]; - for (int i = 0; i < m_ColorsSize; i++) + m_Colors = new List>(); + for (var i = 0; i < m_ColorsSize; i++) { - m_Colors[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadColor4()); + m_Colors.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadColor4())); } } } @@ -118,7 +118,7 @@ namespace AssetStudio if (version >= (5, 1)) //5.1 and up { var stringTagMapSize = reader.ReadInt32(); - for (int i = 0; i < stringTagMapSize; i++) + for (var i = 0; i < stringTagMapSize; i++) { var first = reader.ReadAlignedString(); var second = reader.ReadAlignedString(); diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 1ce7fa2..d429958 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -123,8 +123,8 @@ namespace AssetStudio { public uint m_CurrentChannels; public uint m_VertexCount; - public ChannelInfo[] m_Channels; - public StreamInfo[] m_Streams; + public List m_Channels; + public List m_Streams; public byte[] m_DataSize; public VertexData(ObjectReader reader) @@ -141,27 +141,23 @@ namespace AssetStudio if (version >= 4) //4.0 and up { var m_ChannelsSize = reader.ReadInt32(); - m_Channels = new ChannelInfo[m_ChannelsSize]; - for (int i = 0; i < m_ChannelsSize; i++) + m_Channels = new List(); + for (var i = 0; i < m_ChannelsSize; i++) { - m_Channels[i] = new ChannelInfo(reader); + m_Channels.Add(new ChannelInfo(reader)); } } if (version < 5) //5.0 down { - if (version < 4) - { - m_Streams = new StreamInfo[4]; - } - else - { - m_Streams = new StreamInfo[reader.ReadInt32()]; - } + var streamCount = version < 4 //4.0 down + ? 4 + : reader.ReadInt32(); - for (int i = 0; i < m_Streams.Length; i++) + m_Streams = new List(); + for (var i = 0; i < streamCount; i++) { - m_Streams[i] = new StreamInfo(reader); + m_Streams.Add(new StreamInfo(reader)); } if (version < 4) //4.0 down @@ -181,13 +177,13 @@ namespace AssetStudio private void GetStreams(UnityVersion version) { var streamCount = m_Channels.Max(x => x.stream) + 1; - m_Streams = new StreamInfo[streamCount]; + m_Streams = new List(); uint offset = 0; - for (int s = 0; s < streamCount; s++) + for (var s = 0; s < streamCount; s++) { uint chnMask = 0; uint stride = 0; - for (int chn = 0; chn < m_Channels.Length; chn++) + for (var chn = 0; chn < m_Channels.Count; chn++) { var m_Channel = m_Channels[chn]; if (m_Channel.stream == s) @@ -199,14 +195,14 @@ namespace AssetStudio } } } - m_Streams[s] = new StreamInfo + m_Streams.Add(new StreamInfo { channelMask = chnMask, offset = offset, stride = stride, dividerOp = 0, frequency = 0 - }; + }); offset += m_VertexCount * stride; //static size_t AlignStreamSize (size_t size) { return (size + (kVertexStreamAlign-1)) & ~(kVertexStreamAlign-1); } offset = (offset + (16u - 1u)) & ~(16u - 1u); @@ -215,17 +211,17 @@ namespace AssetStudio private void GetChannels(UnityVersion version) { - m_Channels = new ChannelInfo[6]; - for (int i = 0; i < 6; i++) + m_Channels = new List(6); + for (var i = 0; i < 6; i++) { - m_Channels[i] = new ChannelInfo(); + m_Channels.Add(new ChannelInfo()); } - for (var s = 0; s < m_Streams.Length; s++) + for (var s = 0; s < m_Streams.Count; s++) { var m_Stream = m_Streams[s]; var channelMask = new BitArray(new[] { (int)m_Stream.channelMask }); byte offset = 0; - for (int i = 0; i < 6; i++) + for (var i = 0; i < 6; i++) { if (channelMask.Get(i)) { @@ -344,8 +340,8 @@ namespace AssetStudio public class BlendShapeData { public BlendShapeVertex[] vertices; - public MeshBlendShape[] shapes; - public MeshBlendShapeChannel[] channels; + public List shapes; + public List channels; public float[] fullWeights; public BlendShapeData(ObjectReader reader) @@ -355,24 +351,25 @@ namespace AssetStudio if (version >= (4, 3)) //4.3 and up { int numVerts = reader.ReadInt32(); + reader.ThrowIfTooLarge(numVerts * 40f); vertices = new BlendShapeVertex[numVerts]; - for (int i = 0; i < numVerts; i++) + for (var i = 0; i < numVerts; i++) { vertices[i] = new BlendShapeVertex(reader); } int numShapes = reader.ReadInt32(); - shapes = new MeshBlendShape[numShapes]; - for (int i = 0; i < numShapes; i++) + shapes = new List(); + for (var i = 0; i < numShapes; i++) { - shapes[i] = new MeshBlendShape(reader); + shapes.Add(new MeshBlendShape(reader)); } int numChannels = reader.ReadInt32(); - channels = new MeshBlendShapeChannel[numChannels]; - for (int i = 0; i < numChannels; i++) + channels = new List(); + for (var i = 0; i < numChannels; i++) { - channels[i] = new MeshBlendShapeChannel(reader); + channels.Add(new MeshBlendShapeChannel(reader)); } fullWeights = reader.ReadSingleArray(); @@ -380,17 +377,17 @@ namespace AssetStudio else { var m_ShapesSize = reader.ReadInt32(); - var m_Shapes = new MeshBlendShape[m_ShapesSize]; - for (int i = 0; i < m_ShapesSize; i++) + var m_Shapes = new List(); + for (var i = 0; i < m_ShapesSize; i++) { - m_Shapes[i] = new MeshBlendShape(reader); + m_Shapes.Add(new MeshBlendShape(reader)); } reader.AlignStream(); var m_ShapeVerticesSize = reader.ReadInt32(); - var m_ShapeVertices = new BlendShapeVertex[m_ShapeVerticesSize]; //MeshBlendShapeVertex - for (int i = 0; i < m_ShapeVerticesSize; i++) + reader.ThrowIfTooLarge(m_ShapeVerticesSize * 40f); + for (var i = 0; i < m_ShapeVerticesSize; i++) { - m_ShapeVertices[i] = new BlendShapeVertex(reader); + var m_ShapeVertices = new BlendShapeVertex(reader); //MeshBlendShapeVertex } } } @@ -490,7 +487,7 @@ namespace AssetStudio public sealed class Mesh : NamedObject { private bool m_Use16BitIndices = true; - public SubMesh[] m_SubMeshes; + public List m_SubMeshes; private uint[] m_IndexBuffer; public BlendShapeData m_Shapes; public Matrix4x4[] m_BindPose; @@ -524,28 +521,29 @@ namespace AssetStudio if (version <= (2, 5)) //2.5 and down { - int m_IndexBuffer_size = reader.ReadInt32(); + int m_IndexBufferSize = reader.ReadInt32(); if (m_Use16BitIndices) { - m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; - for (int i = 0; i < m_IndexBuffer_size / 2; i++) + var indexBufferList = new List(); + for (var i = 0; i < m_IndexBufferSize / 2; i++) { - m_IndexBuffer[i] = reader.ReadUInt16(); + indexBufferList.Add(reader.ReadUInt16()); } reader.AlignStream(); + m_IndexBuffer = indexBufferList.ToArray(); } else { - m_IndexBuffer = reader.ReadUInt32Array(m_IndexBuffer_size / 4); + m_IndexBuffer = reader.ReadUInt32Array(m_IndexBufferSize / 4); } } int m_SubMeshesSize = reader.ReadInt32(); - m_SubMeshes = new SubMesh[m_SubMeshesSize]; - for (int i = 0; i < m_SubMeshesSize; i++) + m_SubMeshes = new List(); + for (var i = 0; i < m_SubMeshesSize; i++) { - m_SubMeshes[i] = new SubMesh(reader); + m_SubMeshes.Add(new SubMesh(reader)); } if (version >= (4, 1)) //4.1 and up @@ -565,13 +563,13 @@ namespace AssetStudio if (version >= 2019) //2019 and up { var m_BonesAABBSize = reader.ReadInt32(); - var m_BonesAABB = new MinMaxAABB[m_BonesAABBSize]; - for (int i = 0; i < m_BonesAABBSize; i++) + for (var i = 0; i < m_BonesAABBSize; i++) { - m_BonesAABB[i] = new MinMaxAABB(reader); + var m_BonesAABB = new MinMaxAABB(reader); } - var m_VariableBoneCountWeights = reader.ReadUInt32Array(); + var m_VariableBoneCountWeightsSize = reader.ReadInt32(); + reader.Position += m_VariableBoneCountWeightsSize * 4; //skip uint[] m_VariableBoneCountWeights } var m_MeshCompression = reader.ReadByte(); @@ -626,19 +624,20 @@ namespace AssetStudio m_Use16BitIndices = m_IndexFormat == 0; } - int m_IndexBuffer_size = reader.ReadInt32(); + int m_IndexBufferSize = reader.ReadInt32(); if (m_Use16BitIndices) { - m_IndexBuffer = new uint[m_IndexBuffer_size / 2]; - for (int i = 0; i < m_IndexBuffer_size / 2; i++) + var indexBufferList = new List(); + for (var i = 0; i < m_IndexBufferSize / 2; i++) { - m_IndexBuffer[i] = reader.ReadUInt16(); + indexBufferList.Add(reader.ReadUInt16()); } reader.AlignStream(); + m_IndexBuffer = indexBufferList.ToArray(); } else { - m_IndexBuffer = reader.ReadUInt32Array(m_IndexBuffer_size / 4); + m_IndexBuffer = reader.ReadUInt32Array(m_IndexBufferSize / 4); } } @@ -647,8 +646,10 @@ namespace AssetStudio m_VertexCount = reader.ReadInt32(); m_Vertices = reader.ReadSingleArray(m_VertexCount * 3); //Vector3 - m_Skin = new BoneWeights4[reader.ReadInt32()]; - for (int s = 0; s < m_Skin.Length; s++) + var numSkin = reader.ReadInt32(); + reader.ThrowIfTooLarge(numSkin * 32f); + m_Skin = new BoneWeights4[numSkin]; + for (var s = 0; s < numSkin; s++) { m_Skin[s] = new BoneWeights4(reader); } @@ -661,10 +662,11 @@ namespace AssetStudio if (version <= (2, 5)) //2.5 and down { - int m_TangentSpace_size = reader.ReadInt32(); - m_Normals = new float[m_TangentSpace_size * 3]; - m_Tangents = new float[m_TangentSpace_size * 4]; - for (int v = 0; v < m_TangentSpace_size; v++) + int m_TangentSpaceSize = reader.ReadInt32(); + reader.ThrowIfTooLarge(m_TangentSpaceSize * 28f); + m_Normals = new float[m_TangentSpaceSize * 3]; + m_Tangents = new float[m_TangentSpaceSize * 4]; + for (var v = 0; v < m_TangentSpaceSize; v++) { m_Normals[v * 3] = reader.ReadSingle(); m_Normals[v * 3 + 1] = reader.ReadSingle(); @@ -686,8 +688,10 @@ namespace AssetStudio { if (version < (2018, 2)) //2018.2 down { - m_Skin = new BoneWeights4[reader.ReadInt32()]; - for (int s = 0; s < m_Skin.Length; s++) + var numSkin = reader.ReadInt32(); + reader.ThrowIfTooLarge(numSkin * 32f); + m_Skin = new BoneWeights4[numSkin]; + for (var s = 0; s < numSkin; s++) { m_Skin[s] = new BoneWeights4(reader); } @@ -710,15 +714,16 @@ namespace AssetStudio if (version <= (3, 4)) //3.4.2 and earlier { - int m_Colors_size = reader.ReadInt32(); - m_Colors = new float[m_Colors_size * 4]; - for (int v = 0; v < m_Colors_size * 4; v++) + int m_ColorsSize = reader.ReadInt32(); + var m_ColorsList = new List(); + for (var v = 0; v < m_ColorsSize * 4; v++) { - m_Colors[v] = (float)reader.ReadByte() / 0xFF; + m_ColorsList.Add((float)reader.ReadByte() / 0xFF); } + m_Colors = m_ColorsList.ToArray(); - int m_CollisionTriangles_size = reader.ReadInt32(); - reader.Position += m_CollisionTriangles_size * 4; //UInt32 indices + int m_CollisionTrianglesSize = reader.ReadInt32(); + reader.Position += m_CollisionTrianglesSize * 4; //UInt32 indices int m_CollisionVertexCount = reader.ReadInt32(); } @@ -780,7 +785,7 @@ namespace AssetStudio { m_VertexCount = (int)m_VertexData.m_VertexCount; - for (var chn = 0; chn < m_VertexData.m_Channels.Length; chn++) + for (var chn = 0; chn < m_VertexData.m_Channels.Count; chn++) { var m_Channel = m_VertexData.m_Channels[chn]; if (m_Channel.dimension > 0) @@ -797,10 +802,10 @@ namespace AssetStudio var vertexFormat = MeshHelper.ToVertexFormat(m_Channel.format, version); var componentByteSize = (int)MeshHelper.GetFormatSize(vertexFormat); var componentBytes = new byte[m_VertexCount * m_Channel.dimension * componentByteSize]; - for (int v = 0; v < m_VertexCount; v++) + for (var v = 0; v < m_VertexCount; v++) { var vertexOffset = (int)m_Stream.offset + m_Channel.offset + (int)m_Stream.stride * v; - for (int d = 0; d < m_Channel.dimension; d++) + for (var d = 0; d < m_Channel.dimension; d++) { var componentOffset = vertexOffset + componentByteSize * d; Buffer.BlockCopy(m_VertexData.m_DataSize, componentOffset, componentBytes, componentByteSize * (v * m_Channel.dimension + d), componentByteSize); @@ -871,9 +876,9 @@ namespace AssetStudio { InitMSkin(); } - for (int i = 0; i < m_VertexCount; i++) + for (var i = 0; i < m_VertexCount; i++) { - for (int j = 0; j < m_Channel.dimension; j++) + for (var j = 0; j < m_Channel.dimension; j++) { m_Skin[i].weight[j] = componentsFloatArray[i * m_Channel.dimension + j]; } @@ -884,9 +889,9 @@ namespace AssetStudio { InitMSkin(); } - for (int i = 0; i < m_VertexCount; i++) + for (var i = 0; i < m_VertexCount; i++) { - for (int j = 0; j < m_Channel.dimension; j++) + for (var j = 0; j < m_Channel.dimension; j++) { m_Skin[i].boneIndex[j] = componentsIntArray[i * m_Channel.dimension + j]; } @@ -956,7 +961,7 @@ namespace AssetStudio const int kMaxTexCoordShaderChannels = 8; int uvSrcOffset = 0; - for (int uv = 0; uv < kMaxTexCoordShaderChannels; uv++) + for (var uv = 0; uv < kMaxTexCoordShaderChannels; uv++) { var texCoordBits = m_UVInfo >> (uv * kInfoBitsPerUV); texCoordBits &= (1u << kInfoBitsPerUV) - 1u; @@ -986,7 +991,7 @@ namespace AssetStudio m_BindPose = new Matrix4x4[m_CompressedMesh.m_BindPoses.m_NumItems / 16]; var m_BindPoses_Unpacked = m_CompressedMesh.m_BindPoses.UnpackFloats(16, 4 * 16); var buffer = new float[16]; - for (int i = 0; i < m_BindPose.Length; i++) + for (var i = 0; i < m_BindPose.Length; i++) { Array.Copy(m_BindPoses_Unpacked, i * 16, buffer, 0, 16); m_BindPose[i] = new Matrix4x4(buffer); @@ -999,7 +1004,7 @@ namespace AssetStudio var normalData = m_CompressedMesh.m_Normals.UnpackFloats(2, 4 * 2); var signs = m_CompressedMesh.m_NormalSigns.UnpackInts(); m_Normals = new float[m_CompressedMesh.m_Normals.m_NumItems / 2 * 3]; - for (int i = 0; i < m_CompressedMesh.m_Normals.m_NumItems / 2; ++i) + for (var i = 0; i < m_CompressedMesh.m_Normals.m_NumItems / 2; ++i) { var x = normalData[i * 2 + 0]; var y = normalData[i * 2 + 1]; @@ -1029,7 +1034,7 @@ namespace AssetStudio var tangentData = m_CompressedMesh.m_Tangents.UnpackFloats(2, 4 * 2); var signs = m_CompressedMesh.m_TangentSigns.UnpackInts(); m_Tangents = new float[m_CompressedMesh.m_Tangents.m_NumItems / 2 * 4]; - for (int i = 0; i < m_CompressedMesh.m_Tangents.m_NumItems / 2; ++i) + for (var i = 0; i < m_CompressedMesh.m_Tangents.m_NumItems / 2; ++i) { var x = tangentData[i * 2 + 0]; var y = tangentData[i * 2 + 1]; @@ -1076,7 +1081,7 @@ namespace AssetStudio int j = 0; int sum = 0; - for (int i = 0; i < m_CompressedMesh.m_Weights.m_NumItems; i++) + for (var i = 0; i < m_CompressedMesh.m_Weights.m_NumItems; i++) { //read bone index and weight. m_Skin[bonePos].weight[j] = weights[i] / 31.0f; @@ -1120,7 +1125,7 @@ namespace AssetStudio m_CompressedMesh.m_Colors.m_BitSize /= 4; var tempColors = m_CompressedMesh.m_Colors.UnpackInts(); m_Colors = new float[m_CompressedMesh.m_Colors.m_NumItems]; - for (int v = 0; v < m_CompressedMesh.m_Colors.m_NumItems; v++) + for (var v = 0; v < m_CompressedMesh.m_Colors.m_NumItems; v++) { m_Colors[v] = tempColors[v] / 255f; } @@ -1140,7 +1145,7 @@ namespace AssetStudio var topology = m_SubMesh.topology; if (topology == GfxPrimitiveType.Triangles) { - for (int i = 0; i < indexCount; i += 3) + for (var i = 0; i < indexCount; i += 3) { m_Indices.Add(m_IndexBuffer[firstIndex + i]); m_Indices.Add(m_IndexBuffer[firstIndex + i + 1]); @@ -1151,7 +1156,7 @@ namespace AssetStudio { // de-stripify : uint triIndex = 0; - for (int i = 0; i < indexCount - 2; i++) + for (var i = 0; i < indexCount - 2; i++) { var a = m_IndexBuffer[firstIndex + i]; var b = m_IndexBuffer[firstIndex + i + 1]; @@ -1180,7 +1185,7 @@ namespace AssetStudio } else if (topology == GfxPrimitiveType.Quads) { - for (int q = 0; q < indexCount; q += 4) + for (var q = 0; q < indexCount; q += 4) { m_Indices.Add(m_IndexBuffer[firstIndex + q]); m_Indices.Add(m_IndexBuffer[firstIndex + q + 1]); @@ -1202,7 +1207,7 @@ namespace AssetStudio private void InitMSkin() { m_Skin = new BoneWeights4[m_VertexCount]; - for (int i = 0; i < m_VertexCount; i++) + for (var i = 0; i < m_VertexCount; i++) { m_Skin[i] = new BoneWeights4(); } @@ -1405,7 +1410,7 @@ namespace AssetStudio var size = GetFormatSize(format); var len = inputBytes.Length / size; var result = new float[len]; - for (int i = 0; i < len; i++) + for (var i = 0; i < len; i++) { switch (format) { @@ -1437,7 +1442,7 @@ namespace AssetStudio var size = GetFormatSize(format); var len = inputBytes.Length / size; var result = new int[len]; - for (int i = 0; i < len; i++) + for (var i = 0; i < len; i++) { switch (format) { diff --git a/AssetStudio/Classes/MeshFilter.cs b/AssetStudio/Classes/MeshFilter.cs index d3c24bf..d3d614f 100644 --- a/AssetStudio/Classes/MeshFilter.cs +++ b/AssetStudio/Classes/MeshFilter.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class MeshFilter : Component { diff --git a/AssetStudio/Classes/MeshRenderer.cs b/AssetStudio/Classes/MeshRenderer.cs index 4b00e6f..e2a72ad 100644 --- a/AssetStudio/Classes/MeshRenderer.cs +++ b/AssetStudio/Classes/MeshRenderer.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class MeshRenderer : Renderer { diff --git a/AssetStudio/Classes/MonoScript.cs b/AssetStudio/Classes/MonoScript.cs index dd9776c..5f0b2fd 100644 --- a/AssetStudio/Classes/MonoScript.cs +++ b/AssetStudio/Classes/MonoScript.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class MonoScript : NamedObject { diff --git a/AssetStudio/Classes/MovieTexture.cs b/AssetStudio/Classes/MovieTexture.cs index 8fd9207..f49134b 100644 --- a/AssetStudio/Classes/MovieTexture.cs +++ b/AssetStudio/Classes/MovieTexture.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class MovieTexture : Texture { diff --git a/AssetStudio/Classes/NamedObject.cs b/AssetStudio/Classes/NamedObject.cs index d1ea5fd..6a56c99 100644 --- a/AssetStudio/Classes/NamedObject.cs +++ b/AssetStudio/Classes/NamedObject.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public class NamedObject : EditorExtension { diff --git a/AssetStudio/Classes/PreloadData.cs b/AssetStudio/Classes/PreloadData.cs index a1f2224..875dcc2 100644 --- a/AssetStudio/Classes/PreloadData.cs +++ b/AssetStudio/Classes/PreloadData.cs @@ -1,16 +1,18 @@ -namespace AssetStudio +using System.Collections.Generic; + +namespace AssetStudio { public sealed class PreloadData : NamedObject { - public PPtr[] m_Assets; + public List> m_Assets; public PreloadData(ObjectReader reader) : base(reader) { var m_PreloadTableSize = reader.ReadInt32(); - m_Assets = new PPtr[m_PreloadTableSize]; + m_Assets = new List>(); for (var i = 0; i < m_PreloadTableSize; i++) { - m_Assets[i] = new PPtr(reader); + m_Assets.Add(new PPtr(reader)); } /* diff --git a/AssetStudio/Classes/RectTransform.cs b/AssetStudio/Classes/RectTransform.cs index f47f09a..8724b6b 100644 --- a/AssetStudio/Classes/RectTransform.cs +++ b/AssetStudio/Classes/RectTransform.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class RectTransform : Transform { diff --git a/AssetStudio/Classes/Renderer.cs b/AssetStudio/Classes/Renderer.cs index 4ab0338..f00e97d 100644 --- a/AssetStudio/Classes/Renderer.cs +++ b/AssetStudio/Classes/Renderer.cs @@ -1,4 +1,6 @@ -namespace AssetStudio +using System.Collections.Generic; + +namespace AssetStudio { public class StaticBatchInfo { @@ -14,7 +16,7 @@ public abstract class Renderer : Component { - public PPtr[] m_Materials; + public List> m_Materials; public StaticBatchInfo m_StaticBatchInfo; public uint[] m_SubsetIndices; @@ -108,10 +110,10 @@ } var m_MaterialsSize = reader.ReadInt32(); - m_Materials = new PPtr[m_MaterialsSize]; - for (int i = 0; i < m_MaterialsSize; i++) + m_Materials = new List>(); + for (var i = 0; i < m_MaterialsSize; i++) { - m_Materials[i] = new PPtr(reader); + m_Materials.Add(new PPtr(reader)); } if (version < 3) //3.0 down diff --git a/AssetStudio/Classes/ResourceManager.cs b/AssetStudio/Classes/ResourceManager.cs index 05f159b..240ac99 100644 --- a/AssetStudio/Classes/ResourceManager.cs +++ b/AssetStudio/Classes/ResourceManager.cs @@ -4,15 +4,15 @@ namespace AssetStudio { public class ResourceManager : Object { - public KeyValuePair>[] m_Container; + public List>> m_Container; public ResourceManager(ObjectReader reader) : base(reader) { var m_ContainerSize = reader.ReadInt32(); - m_Container = new KeyValuePair>[m_ContainerSize]; - for (int i = 0; i < m_ContainerSize; i++) + m_Container = new List>>(); + for (var i = 0; i < m_ContainerSize; i++) { - m_Container[i] = new KeyValuePair>(reader.ReadAlignedString(), new PPtr(reader)); + m_Container.Add(new KeyValuePair>(reader.ReadAlignedString(), new PPtr(reader))); } } } diff --git a/AssetStudio/Classes/RuntimeAnimatorController.cs b/AssetStudio/Classes/RuntimeAnimatorController.cs index 5b6be8f..9931461 100644 --- a/AssetStudio/Classes/RuntimeAnimatorController.cs +++ b/AssetStudio/Classes/RuntimeAnimatorController.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public abstract class RuntimeAnimatorController : NamedObject { diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index f92aa78..6157c75 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -17,8 +17,8 @@ namespace AssetStudio public class StructParameter { - public MatrixParameter[] m_MatrixParams; - public VectorParameter[] m_VectorParams; + public List m_MatrixParams; + public List m_VectorParams; public StructParameter(BinaryReader reader) { @@ -28,17 +28,17 @@ namespace AssetStudio var m_StructSize = reader.ReadInt32(); int numVectorParams = reader.ReadInt32(); - m_VectorParams = new VectorParameter[numVectorParams]; - for (int i = 0; i < numVectorParams; i++) + m_VectorParams = new List(); + for (var i = 0; i < numVectorParams; i++) { - m_VectorParams[i] = new VectorParameter(reader); + m_VectorParams.Add(new VectorParameter(reader)); } int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new MatrixParameter[numMatrixParams]; - for (int i = 0; i < numMatrixParams; i++) + m_MatrixParams = new List(); + for (var i = 0; i < numMatrixParams; i++) { - m_MatrixParams[i] = new MatrixParameter(reader); + m_MatrixParams.Add(new MatrixParameter(reader)); } } } @@ -112,15 +112,15 @@ namespace AssetStudio public class SerializedProperties { - public SerializedProperty[] m_Props; + public List m_Props; public SerializedProperties(BinaryReader reader) { int numProps = reader.ReadInt32(); - m_Props = new SerializedProperty[numProps]; - for (int i = 0; i < numProps; i++) + m_Props = new List(); + for (var i = 0; i < numProps; i++) { - m_Props[i] = new SerializedProperty(reader); + m_Props.Add(new SerializedProperty(reader)); } } } @@ -237,7 +237,7 @@ namespace AssetStudio m_Name = reader.ReadAlignedString(); rtBlend = new SerializedShaderRTBlendState[8]; - for (int i = 0; i < 8; i++) + for (var i = 0; i < 8; i++) { rtBlend[i] = new SerializedShaderRTBlendState(reader); } @@ -290,16 +290,16 @@ namespace AssetStudio public class ParserBindChannels { - public ShaderBindChannel[] m_Channels; + public List m_Channels; public uint m_SourceMap; public ParserBindChannels(BinaryReader reader) { int numChannels = reader.ReadInt32(); - m_Channels = new ShaderBindChannel[numChannels]; - for (int i = 0; i < numChannels; i++) + m_Channels = new List(); + for (var i = 0; i < numChannels; i++) { - m_Channels[i] = new ShaderBindChannel(reader); + m_Channels.Add(new ShaderBindChannel(reader)); } reader.AlignStream(); @@ -390,9 +390,9 @@ namespace AssetStudio public class ConstantBuffer { public int m_NameIndex; - public MatrixParameter[] m_MatrixParams; - public VectorParameter[] m_VectorParams; - public StructParameter[] m_StructParams; + public List m_MatrixParams; + public List m_VectorParams; + public List m_StructParams; public int m_Size; public bool m_IsPartialCB; @@ -403,25 +403,25 @@ namespace AssetStudio m_NameIndex = reader.ReadInt32(); int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new MatrixParameter[numMatrixParams]; - for (int i = 0; i < numMatrixParams; i++) + m_MatrixParams = new List(); + for (var i = 0; i < numMatrixParams; i++) { - m_MatrixParams[i] = new MatrixParameter(reader); + m_MatrixParams.Add(new MatrixParameter(reader)); } int numVectorParams = reader.ReadInt32(); - m_VectorParams = new VectorParameter[numVectorParams]; - for (int i = 0; i < numVectorParams; i++) + m_VectorParams = new List(); + for (var i = 0; i < numVectorParams; i++) { - m_VectorParams[i] = new VectorParameter(reader); + m_VectorParams.Add(new VectorParameter(reader)); } if (version >= (2017, 3)) //2017.3 and up { int numStructParams = reader.ReadInt32(); - m_StructParams = new StructParameter[numStructParams]; - for (int i = 0; i < numStructParams; i++) + m_StructParams = new List(); + for (var i = 0; i < numStructParams; i++) { - m_StructParams[i] = new StructParameter(reader); + m_StructParams.Add(new StructParameter(reader)); } } m_Size = reader.ReadInt32(); @@ -488,71 +488,74 @@ namespace AssetStudio public class SerializedProgramParameters { - public VectorParameter[] m_VectorParams; - public MatrixParameter[] m_MatrixParams; - public TextureParameter[] m_TextureParams; - public BufferBinding[] m_BufferParams; - public ConstantBuffer[] m_ConstantBuffers; - public BufferBinding[] m_ConstantBufferBindings; - public UAVParameter[] m_UAVParams; - public SamplerParameter[] m_Samplers; + public List m_VectorParams; + public List m_MatrixParams; + public List m_TextureParams; + public List m_BufferParams; + public List m_ConstantBuffers; + public List m_ConstantBufferBindings; + public List m_UAVParams; + public List m_Samplers; public SerializedProgramParameters(ObjectReader reader) { int numVectorParams = reader.ReadInt32(); - m_VectorParams = new VectorParameter[numVectorParams]; - for (int i = 0; i < numVectorParams; i++) + m_VectorParams = new List(); + for (var i = 0; i < numVectorParams; i++) { - m_VectorParams[i] = new VectorParameter(reader); + m_VectorParams.Add(new VectorParameter(reader)); } int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new MatrixParameter[numMatrixParams]; - for (int i = 0; i < numMatrixParams; i++) + m_MatrixParams = new List(); + for (var i = 0; i < numMatrixParams; i++) { - m_MatrixParams[i] = new MatrixParameter(reader); + m_MatrixParams.Add(new MatrixParameter(reader)); } int numTextureParams = reader.ReadInt32(); - m_TextureParams = new TextureParameter[numTextureParams]; - for (int i = 0; i < numTextureParams; i++) + m_TextureParams = new List(); + for (var i = 0; i < numTextureParams; i++) { - m_TextureParams[i] = new TextureParameter(reader); + m_TextureParams.Add(new TextureParameter(reader)); } int numBufferParams = reader.ReadInt32(); - m_BufferParams = new BufferBinding[numBufferParams]; - for (int i = 0; i < numBufferParams; i++) + m_BufferParams = new List(); + for (var i = 0; i < numBufferParams; i++) { - m_BufferParams[i] = new BufferBinding(reader); + m_BufferParams.Add(new BufferBinding(reader)); } int numConstantBuffers = reader.ReadInt32(); - m_ConstantBuffers = new ConstantBuffer[numConstantBuffers]; - for (int i = 0; i < numConstantBuffers; i++) + m_ConstantBuffers = new List(); + for (var i = 0; i < numConstantBuffers; i++) { - m_ConstantBuffers[i] = new ConstantBuffer(reader); + m_ConstantBuffers.Add(new ConstantBuffer(reader)); } int numConstantBufferBindings = reader.ReadInt32(); - m_ConstantBufferBindings = new BufferBinding[numConstantBufferBindings]; - for (int i = 0; i < numConstantBufferBindings; i++) + m_ConstantBufferBindings = new List(); + for (var i = 0; i < numConstantBufferBindings; i++) { - m_ConstantBufferBindings[i] = new BufferBinding(reader); + m_ConstantBufferBindings.Add(new BufferBinding(reader)); } int numUAVParams = reader.ReadInt32(); - m_UAVParams = new UAVParameter[numUAVParams]; - for (int i = 0; i < numUAVParams; i++) + m_UAVParams = new List(); + for (var i = 0; i < numUAVParams; i++) { - m_UAVParams[i] = new UAVParameter(reader); + m_UAVParams.Add(new UAVParameter(reader)); } - int numSamplers = reader.ReadInt32(); - m_Samplers = new SamplerParameter[numSamplers]; - for (int i = 0; i < numSamplers; i++) + if (reader.version >= 2017) //2017 and up { - m_Samplers[i] = new SamplerParameter(reader); + int numSamplers = reader.ReadInt32(); + m_Samplers = new List(); + for (var i = 0; i < numSamplers; i++) + { + m_Samplers.Add(new SamplerParameter(reader)); + } } } } @@ -564,15 +567,7 @@ namespace AssetStudio public ushort[] m_KeywordIndices; public sbyte m_ShaderHardwareTier; public ShaderGpuProgramType m_GpuProgramType; - public SerializedProgramParameters m_Parameters; - public VectorParameter[] m_VectorParams; - public MatrixParameter[] m_MatrixParams; - public TextureParameter[] m_TextureParams; - public BufferBinding[] m_BufferParams; - public ConstantBuffer[] m_ConstantBuffers; - public BufferBinding[] m_ConstantBufferBindings; - public UAVParameter[] m_UAVParams; - public SamplerParameter[] m_Samplers; + public SerializedProgramParameters m_Parameters; // nested since 2020.3.2f1 and up; 2021.1.1f1 and up public SerializedSubProgram(ObjectReader reader) { @@ -601,72 +596,7 @@ namespace AssetStudio m_GpuProgramType = (ShaderGpuProgramType)reader.ReadSByte(); reader.AlignStream(); - if (version.IsInRange((2020, 3, 2), 2021) //2020.3.2f1 and up - || version >= (2021, 1, 1)) //2021.1.1f1 and up - { - m_Parameters = new SerializedProgramParameters(reader); - } - else - { - int numVectorParams = reader.ReadInt32(); - m_VectorParams = new VectorParameter[numVectorParams]; - for (int i = 0; i < numVectorParams; i++) - { - m_VectorParams[i] = new VectorParameter(reader); - } - - int numMatrixParams = reader.ReadInt32(); - m_MatrixParams = new MatrixParameter[numMatrixParams]; - for (int i = 0; i < numMatrixParams; i++) - { - m_MatrixParams[i] = new MatrixParameter(reader); - } - - int numTextureParams = reader.ReadInt32(); - m_TextureParams = new TextureParameter[numTextureParams]; - for (int i = 0; i < numTextureParams; i++) - { - m_TextureParams[i] = new TextureParameter(reader); - } - - int numBufferParams = reader.ReadInt32(); - m_BufferParams = new BufferBinding[numBufferParams]; - for (int i = 0; i < numBufferParams; i++) - { - m_BufferParams[i] = new BufferBinding(reader); - } - - int numConstantBuffers = reader.ReadInt32(); - m_ConstantBuffers = new ConstantBuffer[numConstantBuffers]; - for (int i = 0; i < numConstantBuffers; i++) - { - m_ConstantBuffers[i] = new ConstantBuffer(reader); - } - - int numConstantBufferBindings = reader.ReadInt32(); - m_ConstantBufferBindings = new BufferBinding[numConstantBufferBindings]; - for (int i = 0; i < numConstantBufferBindings; i++) - { - m_ConstantBufferBindings[i] = new BufferBinding(reader); - } - - int numUAVParams = reader.ReadInt32(); - m_UAVParams = new UAVParameter[numUAVParams]; - for (int i = 0; i < numUAVParams; i++) - { - m_UAVParams[i] = new UAVParameter(reader); - } - - if (version >= 2017) //2017 and up - { - int numSamplers = reader.ReadInt32(); - m_Samplers = new SamplerParameter[numSamplers]; - for (int i = 0; i < numSamplers; i++) - { - m_Samplers[i] = new SamplerParameter(reader); - } - } - } + m_Parameters = new SerializedProgramParameters(reader); if (version >= (2017, 2)) //2017.2 and up { @@ -684,7 +614,7 @@ namespace AssetStudio public class SerializedProgram { - public SerializedSubProgram[] m_SubPrograms; + public List m_SubPrograms; public SerializedProgramParameters m_CommonParameters; public ushort[] m_SerializedKeywordStateMask; @@ -693,10 +623,10 @@ namespace AssetStudio var version = reader.version; int numSubPrograms = reader.ReadInt32(); - m_SubPrograms = new SerializedSubProgram[numSubPrograms]; - for (int i = 0; i < numSubPrograms; i++) + m_SubPrograms = new List(); + for (var i = 0; i < numSubPrograms; i++) { - m_SubPrograms[i] = new SerializedSubProgram(reader); + m_SubPrograms.Add(new SerializedSubProgram(reader)); } if (version.IsInRange((2020, 3, 2), 2021) //2020.3.2f1 and up @@ -722,11 +652,11 @@ namespace AssetStudio public class SerializedPass { - public Hash128[] m_EditorDataHash; + public List m_EditorDataHash; public byte[] m_Platforms; public ushort[] m_LocalKeywordMask; public ushort[] m_GlobalKeywordMask; - public KeyValuePair[] m_NameIndices; + public List> m_NameIndices; public PassType m_Type; public SerializedShaderState m_State; public uint m_ProgramMask; @@ -750,10 +680,10 @@ namespace AssetStudio if (version >= (2020, 2)) //2020.2 and up { int numEditorDataHash = reader.ReadInt32(); - m_EditorDataHash = new Hash128[numEditorDataHash]; - for (int i = 0; i < numEditorDataHash; i++) + m_EditorDataHash = new List(); + for (var i = 0; i < numEditorDataHash; i++) { - m_EditorDataHash[i] = new Hash128(reader); + m_EditorDataHash.Add(new Hash128(reader)); } reader.AlignStream(); m_Platforms = reader.ReadUInt8Array(); @@ -768,10 +698,10 @@ namespace AssetStudio } int numIndices = reader.ReadInt32(); - m_NameIndices = new KeyValuePair[numIndices]; - for (int i = 0; i < numIndices; i++) + m_NameIndices = new List>(); + for (var i = 0; i < numIndices; i++) { - m_NameIndices[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadInt32()); + m_NameIndices.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadInt32())); } m_Type = (PassType)reader.ReadInt32(); @@ -806,32 +736,32 @@ namespace AssetStudio public class SerializedTagMap { - public KeyValuePair[] tags; + public List> tags; public SerializedTagMap(BinaryReader reader) { int numTags = reader.ReadInt32(); - tags = new KeyValuePair[numTags]; - for (int i = 0; i < numTags; i++) + tags = new List>(); + for (var i = 0; i < numTags; i++) { - tags[i] = new KeyValuePair(reader.ReadAlignedString(), reader.ReadAlignedString()); + tags.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadAlignedString())); } } } public class SerializedSubShader { - public SerializedPass[] m_Passes; + public List m_Passes; public SerializedTagMap m_Tags; public int m_LOD; public SerializedSubShader(ObjectReader reader) { int numPasses = reader.ReadInt32(); - m_Passes = new SerializedPass[numPasses]; - for (int i = 0; i < numPasses; i++) + m_Passes = new List(); + for (var i = 0; i < numPasses; i++) { - m_Passes[i] = new SerializedPass(reader); + m_Passes.Add(new SerializedPass(reader)); } m_Tags = new SerializedTagMap(reader); @@ -866,14 +796,14 @@ namespace AssetStudio public class SerializedShader { public SerializedProperties m_PropInfo; - public SerializedSubShader[] m_SubShaders; + public List m_SubShaders; public string[] m_KeywordNames; public byte[] m_KeywordFlags; public string m_Name; public string m_CustomEditorName; public string m_FallbackName; - public SerializedShaderDependency[] m_Dependencies; - public SerializedCustomEditorForRenderPipeline[] m_CustomEditorForRenderPipelines; + public List m_Dependencies; + public List m_CustomEditorForRenderPipelines; public bool m_DisableNoSubshadersMessage; public SerializedShader(ObjectReader reader) @@ -883,10 +813,10 @@ namespace AssetStudio m_PropInfo = new SerializedProperties(reader); int numSubShaders = reader.ReadInt32(); - m_SubShaders = new SerializedSubShader[numSubShaders]; - for (int i = 0; i < numSubShaders; i++) + m_SubShaders = new List(); + for (var i = 0; i < numSubShaders; i++) { - m_SubShaders[i] = new SerializedSubShader(reader); + m_SubShaders.Add(new SerializedSubShader(reader)); } if (version >= (2021, 2)) //2021.2 and up @@ -901,19 +831,19 @@ namespace AssetStudio m_FallbackName = reader.ReadAlignedString(); int numDependencies = reader.ReadInt32(); - m_Dependencies = new SerializedShaderDependency[numDependencies]; - for (int i = 0; i < numDependencies; i++) + m_Dependencies = new List(); + for (var i = 0; i < numDependencies; i++) { - m_Dependencies[i] = new SerializedShaderDependency(reader); + m_Dependencies.Add(new SerializedShaderDependency(reader)); } if (version >= 2021) //2021.1 and up { int m_CustomEditorForRenderPipelinesSize = reader.ReadInt32(); - m_CustomEditorForRenderPipelines = new SerializedCustomEditorForRenderPipeline[m_CustomEditorForRenderPipelinesSize]; - for (int i = 0; i < m_CustomEditorForRenderPipelinesSize; i++) + m_CustomEditorForRenderPipelines = new List(); + for (var i = 0; i < m_CustomEditorForRenderPipelinesSize; i++) { - m_CustomEditorForRenderPipelines[i] = new SerializedCustomEditorForRenderPipeline(reader); + m_CustomEditorForRenderPipelines.Add(new SerializedCustomEditorForRenderPipeline(reader)); } } @@ -988,18 +918,18 @@ namespace AssetStudio reader.AlignStream(); var m_DependenciesCount = reader.ReadInt32(); - for (int i = 0; i < m_DependenciesCount; i++) + for (var i = 0; i < m_DependenciesCount; i++) { - new PPtr(reader); + var m_Dependencies = new PPtr(reader); } if (version >= 2018) { var m_NonModifiableTexturesCount = reader.ReadInt32(); - for (int i = 0; i < m_NonModifiableTexturesCount; i++) + for (var i = 0; i < m_NonModifiableTexturesCount; i++) { var first = reader.ReadAlignedString(); - new PPtr(reader); + var second = new PPtr(reader); } } diff --git a/AssetStudio/Classes/SkinnedMeshRenderer.cs b/AssetStudio/Classes/SkinnedMeshRenderer.cs index 000de6a..105e964 100644 --- a/AssetStudio/Classes/SkinnedMeshRenderer.cs +++ b/AssetStudio/Classes/SkinnedMeshRenderer.cs @@ -1,14 +1,11 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; namespace AssetStudio { public sealed class SkinnedMeshRenderer : Renderer { public PPtr m_Mesh; - public PPtr[] m_Bones; + public List> m_Bones; public float[] m_BlendShapeWeights; public SkinnedMeshRenderer(ObjectReader reader) : base(reader) @@ -25,10 +22,11 @@ namespace AssetStudio m_Mesh = new PPtr(reader); - m_Bones = new PPtr[reader.ReadInt32()]; - for (int b = 0; b < m_Bones.Length; b++) + var numBones = reader.ReadInt32(); + m_Bones = new List>(); + for (var b = 0; b < numBones; b++) { - m_Bones[b] = new PPtr(reader); + m_Bones.Add(new PPtr(reader)); } if (version >= (4, 3)) //4.3 and up diff --git a/AssetStudio/Classes/Sprite.cs b/AssetStudio/Classes/Sprite.cs index 0c4be9c..8358bed 100644 --- a/AssetStudio/Classes/Sprite.cs +++ b/AssetStudio/Classes/Sprite.cs @@ -79,11 +79,11 @@ namespace AssetStudio { public PPtr texture; public PPtr alphaTexture; - public SecondarySpriteTexture[] secondaryTextures; - public SubMesh[] m_SubMeshes; + public List secondaryTextures; + public List m_SubMeshes; public byte[] m_IndexBuffer; public VertexData m_VertexData; - public SpriteVertex[] vertices; + public List vertices; public ushort[] indices; public Matrix4x4[] m_Bindpose; public BoneWeights4[] m_SourceSkin; @@ -104,20 +104,20 @@ namespace AssetStudio if (version >= 2019) //2019 and up { var secondaryTexturesSize = reader.ReadInt32(); - secondaryTextures = new SecondarySpriteTexture[secondaryTexturesSize]; - for (int i = 0; i < secondaryTexturesSize; i++) + secondaryTextures = new List(); + for (var i = 0; i < secondaryTexturesSize; i++) { - secondaryTextures[i] = new SecondarySpriteTexture(reader); + secondaryTextures.Add(new SecondarySpriteTexture(reader)); } } if (version >= (5, 6)) //5.6 and up { var m_SubMeshesSize = reader.ReadInt32(); - m_SubMeshes = new SubMesh[m_SubMeshesSize]; - for (int i = 0; i < m_SubMeshesSize; i++) + m_SubMeshes = new List(); + for (var i = 0; i < m_SubMeshesSize; i++) { - m_SubMeshes[i] = new SubMesh(reader); + m_SubMeshes.Add(new SubMesh(reader)); } m_IndexBuffer = reader.ReadUInt8Array(); @@ -128,10 +128,10 @@ namespace AssetStudio else { var verticesSize = reader.ReadInt32(); - vertices = new SpriteVertex[verticesSize]; - for (int i = 0; i < verticesSize; i++) + vertices = new List(); + for (var i = 0; i < verticesSize; i++) { - vertices[i] = new SpriteVertex(reader); + vertices.Add(new SpriteVertex(reader)); } indices = reader.ReadUInt16Array(); @@ -145,7 +145,9 @@ namespace AssetStudio if (version < (2018, 2)) //2018.2 down { var m_SourceSkinSize = reader.ReadInt32(); - for (int i = 0; i < m_SourceSkinSize; i++) + reader.ThrowIfTooLarge(m_SourceSkinSize * 32f); + m_SourceSkin = new BoneWeights4[m_SourceSkinSize]; + for (var i = 0; i < m_SourceSkinSize; i++) { m_SourceSkin[i] = new BoneWeights4(reader); } @@ -201,7 +203,7 @@ namespace AssetStudio public string[] m_AtlasTags; public PPtr m_SpriteAtlas; public SpriteRenderData m_RD; - public Vector2[][] m_PhysicsShape; + //public Vector2[][] m_PhysicsShape; public Sprite(ObjectReader reader) : base(reader) { @@ -238,17 +240,18 @@ namespace AssetStudio } m_RD = new SpriteRenderData(reader); - + /* if (version >= 2017) //2017 and up { var m_PhysicsShapeSize = reader.ReadInt32(); - m_PhysicsShape = new Vector2[m_PhysicsShapeSize][]; - for (int i = 0; i < m_PhysicsShapeSize; i++) + var physicsShapeList = new List(); + for (var i = 0; i < m_PhysicsShapeSize; i++) { - m_PhysicsShape[i] = reader.ReadVector2Array(); + physicsShapeList.Add(reader.ReadVector2Array()); } + m_PhysicsShape = physicsShapeList.ToArray(); } - + */ //vector m_Bones 2018 and up } } diff --git a/AssetStudio/Classes/SpriteAtlas.cs b/AssetStudio/Classes/SpriteAtlas.cs index d5174f4..a9c45f0 100644 --- a/AssetStudio/Classes/SpriteAtlas.cs +++ b/AssetStudio/Classes/SpriteAtlas.cs @@ -14,7 +14,7 @@ namespace AssetStudio public Vector4 uvTransform; public float downscaleMultiplier; public SpriteSettings settingsRaw; - public SecondarySpriteTexture[] secondaryTextures; + public List secondaryTextures; public SpriteAtlasData(ObjectReader reader) { @@ -33,10 +33,10 @@ namespace AssetStudio if (version >= (2020, 2)) //2020.2 and up { var secondaryTexturesSize = reader.ReadInt32(); - secondaryTextures = new SecondarySpriteTexture[secondaryTexturesSize]; - for (int i = 0; i < secondaryTexturesSize; i++) + secondaryTextures = new List(); + for (var i = 0; i < secondaryTexturesSize; i++) { - secondaryTextures[i] = new SecondarySpriteTexture(reader); + secondaryTextures.Add(new SecondarySpriteTexture(reader)); } reader.AlignStream(); } @@ -45,7 +45,7 @@ namespace AssetStudio public sealed class SpriteAtlas : NamedObject { - public PPtr[] m_PackedSprites; + public List> m_PackedSprites; [JsonConverter(typeof(JsonConverterHelper.RenderDataMapConverter))] public Dictionary, SpriteAtlasData> m_RenderDataMap; public bool m_IsVariant; @@ -53,17 +53,17 @@ namespace AssetStudio public SpriteAtlas(ObjectReader reader) : base(reader) { var m_PackedSpritesSize = reader.ReadInt32(); - m_PackedSprites = new PPtr[m_PackedSpritesSize]; - for (int i = 0; i < m_PackedSpritesSize; i++) + m_PackedSprites = new List>(); + for (var i = 0; i < m_PackedSpritesSize; i++) { - m_PackedSprites[i] = new PPtr(reader); + m_PackedSprites.Add(new PPtr(reader)); } var m_PackedSpriteNamesToIndex = reader.ReadStringArray(); var m_RenderDataMapSize = reader.ReadInt32(); - m_RenderDataMap = new Dictionary, SpriteAtlasData>(m_RenderDataMapSize); - for (int i = 0; i < m_RenderDataMapSize; i++) + m_RenderDataMap = new Dictionary, SpriteAtlasData>(); + for (var i = 0; i < m_RenderDataMapSize; i++) { var first = new Guid(reader.ReadBytes(16)); var second = reader.ReadInt64(); diff --git a/AssetStudio/Classes/TextAsset.cs b/AssetStudio/Classes/TextAsset.cs index ff47780..721f68e 100644 --- a/AssetStudio/Classes/TextAsset.cs +++ b/AssetStudio/Classes/TextAsset.cs @@ -1,10 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Linq.Expressions; -using System.Text; - -namespace AssetStudio +namespace AssetStudio { public sealed class TextAsset : NamedObject { diff --git a/AssetStudio/Classes/Transform.cs b/AssetStudio/Classes/Transform.cs index 4e730a0..076e9af 100644 --- a/AssetStudio/Classes/Transform.cs +++ b/AssetStudio/Classes/Transform.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Collections.Generic; namespace AssetStudio { @@ -10,7 +7,7 @@ namespace AssetStudio public Quaternion m_LocalRotation; public Vector3 m_LocalPosition; public Vector3 m_LocalScale; - public PPtr[] m_Children; + public List> m_Children; public PPtr m_Father; public Transform(ObjectReader reader) : base(reader) @@ -20,10 +17,10 @@ namespace AssetStudio m_LocalScale = reader.ReadVector3(); int m_ChildrenCount = reader.ReadInt32(); - m_Children = new PPtr[m_ChildrenCount]; - for (int i = 0; i < m_ChildrenCount; i++) + m_Children = new List>(); + for (var i = 0; i < m_ChildrenCount; i++) { - m_Children[i] = new PPtr(reader); + m_Children.Add(new PPtr(reader)); } m_Father = new PPtr(reader); } diff --git a/AssetStudio/Classes/VideoClip.cs b/AssetStudio/Classes/VideoClip.cs index bd73648..e036fe3 100644 --- a/AssetStudio/Classes/VideoClip.cs +++ b/AssetStudio/Classes/VideoClip.cs @@ -49,10 +49,9 @@ namespace AssetStudio if (version >= 2020) //2020.1 and up { var m_VideoShadersSize = reader.ReadInt32(); - var m_VideoShaders = new PPtr[m_VideoShadersSize]; - for (int i = 0; i < m_VideoShadersSize; i++) + for (var i = 0; i < m_VideoShadersSize; i++) { - m_VideoShaders[i] = new PPtr(reader); + var m_VideoShaders = new PPtr(reader); } } m_ExternalResources = new StreamedResource(reader); diff --git a/AssetStudio/Extensions/BinaryReaderExtensions.cs b/AssetStudio/Extensions/BinaryReaderExtensions.cs index 2e967ce..fbbf91a 100644 --- a/AssetStudio/Extensions/BinaryReaderExtensions.cs +++ b/AssetStudio/Extensions/BinaryReaderExtensions.cs @@ -1,18 +1,14 @@ using System; using System.Collections.Generic; using System.IO; +using System.Runtime.InteropServices; using System.Text; 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) + public static void AlignStream(this BinaryReader reader, int alignment = 4) { var pos = reader.BaseStream.Position; var mod = pos % alignment; @@ -25,7 +21,9 @@ namespace AssetStudio public static string ReadAlignedString(this BinaryReader reader) { var length = reader.ReadInt32(); - if (length > 0 && length <= reader.BaseStream.Length - reader.BaseStream.Position) + if (length > reader.BaseStream.Length - reader.BaseStream.Position) + throw new EndOfStreamException(); + if (length > 0) { var stringData = reader.ReadBytes(length); var result = Encoding.UTF8.GetString(stringData); @@ -102,24 +100,22 @@ namespace AssetStudio return new Color(reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle(), reader.ReadSingle()); } - public static Matrix4x4 ReadMatrix(this BinaryReader reader) + private static T[] ReadArray(BinaryReader reader, int byteLen) where T : struct { - return new Matrix4x4(reader.ReadSingleArray(16)); - } + if (byteLen < 0) + throw new ArgumentOutOfRangeException(nameof(byteLen)); + if (reader.BaseStream.Position + byteLen > reader.BaseStream.Length) + throw new EndOfStreamException(); + + var bytes = reader.ReadBytes(byteLen); - private static T[] ReadArray(Func del, int length) - { - var array = new T[length]; - for (int i = 0; i < length; i++) - { - array[i] = del(); - } - return array; + var span = MemoryMarshal.Cast(bytes); + return span.ToArray(); } public static bool[] ReadBooleanArray(this BinaryReader reader) { - return ReadArray(reader.ReadBoolean, reader.ReadInt32()); + return ReadArray(reader, reader.ReadInt32()); } public static byte[] ReadUInt8Array(this BinaryReader reader) @@ -129,62 +125,65 @@ namespace AssetStudio public static ushort[] ReadUInt16Array(this BinaryReader reader) { - return ReadArray(reader.ReadUInt16, reader.ReadInt32()); + return ReadArray(reader, reader.ReadInt32() * 2); } - public static int[] ReadInt32Array(this BinaryReader reader) + public static int[] ReadInt32Array(this BinaryReader reader, int length = -1) { - return ReadArray(reader.ReadInt32, reader.ReadInt32()); + if (length == -1) + length = reader.ReadInt32(); + return ReadArray(reader, length * 4); } - public static int[] ReadInt32Array(this BinaryReader reader, int length) + public static uint[] ReadUInt32Array(this BinaryReader reader, int length = -1) { - return ReadArray(reader.ReadInt32, length); - } - - public static uint[] ReadUInt32Array(this BinaryReader reader) - { - return ReadArray(reader.ReadUInt32, reader.ReadInt32()); + if (length == -1) + length = reader.ReadInt32(); + return ReadArray(reader, length * 4); } public static uint[][] ReadUInt32ArrayArray(this BinaryReader reader) { - return ReadArray(reader.ReadUInt32Array, reader.ReadInt32()); + var length = reader.ReadInt32(); + var list = new List(); + for (var i = 0; i < length; i++) + { + list.Add(ReadArray(reader, reader.ReadInt32() * 4)); + } + return list.ToArray(); } - public static uint[] ReadUInt32Array(this BinaryReader reader, int length) + public static float[] ReadSingleArray(this BinaryReader reader, int length = -1) { - return ReadArray(reader.ReadUInt32, length); - } - - public static float[] ReadSingleArray(this BinaryReader reader) - { - return ReadArray(reader.ReadSingle, reader.ReadInt32()); - } - - public static float[] ReadSingleArray(this BinaryReader reader, int length) - { - return ReadArray(reader.ReadSingle, length); + if (length == -1) + length = reader.ReadInt32(); + return ReadArray(reader, length * 4); } public static string[] ReadStringArray(this BinaryReader reader) { - return ReadArray(reader.ReadAlignedString, reader.ReadInt32()); + var length = reader.ReadInt32(); + var list = new List(); + for (var i = 0; i < length; i++) + { + list.Add(reader.ReadAlignedString()); + } + return list.ToArray(); } public static Vector2[] ReadVector2Array(this BinaryReader reader) { - return ReadArray(reader.ReadVector2, reader.ReadInt32()); + return ReadArray(reader, reader.ReadInt32() * 8); } public static Vector4[] ReadVector4Array(this BinaryReader reader) { - return ReadArray(reader.ReadVector4, reader.ReadInt32()); + return ReadArray(reader, reader.ReadInt32() * 16); } public static Matrix4x4[] ReadMatrixArray(this BinaryReader reader) { - return ReadArray(reader.ReadMatrix, reader.ReadInt32()); + return ReadArray(reader, reader.ReadInt32() * 64); } } } diff --git a/AssetStudio/ObjectReader.cs b/AssetStudio/ObjectReader.cs index 6f2493f..3c1b9f0 100644 --- a/AssetStudio/ObjectReader.cs +++ b/AssetStudio/ObjectReader.cs @@ -1,4 +1,5 @@ using System; +using System.IO; namespace AssetStudio { @@ -16,6 +17,8 @@ namespace AssetStudio public UnityVersion version => assetsFile.version; + public long Remaining => byteStart + byteSize - Position; + public ObjectReader(EndianBinaryReader reader, SerializedFile assetsFile, ObjectInfo objectInfo) : base(reader.BaseStream, reader.Endian) { this.assetsFile = assetsFile; @@ -36,6 +39,12 @@ namespace AssetStudio m_Version = assetsFile.header.m_Version; } + public void ThrowIfTooLarge(float val) + { + if (val < 0 || val > Remaining) + throw new EndOfStreamException(); + } + public void Reset() { Position = byteStart; diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index 33cc7c9..b0b54bb 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -112,8 +112,8 @@ namespace AssetStudio // Read Types int typeCount = reader.ReadInt32(); - m_Types = new List(typeCount); - for (int i = 0; i < typeCount; i++) + m_Types = new List(); + for (var i = 0; i < typeCount; i++) { m_Types.Add(ReadSerializedType(false)); } @@ -125,10 +125,10 @@ namespace AssetStudio // Read Objects int objectCount = reader.ReadInt32(); - m_Objects = new List(objectCount); - Objects = new List(objectCount); - ObjectsDic = new Dictionary(objectCount); - for (int i = 0; i < objectCount; i++) + m_Objects = new List(); + Objects = new List(); + ObjectsDic = new Dictionary(); + for (var i = 0; i < objectCount; i++) { var objectInfo = new ObjectInfo(); if (bigIDEnabled != 0) @@ -184,8 +184,8 @@ namespace AssetStudio if (header.m_Version >= SerializedFileFormatVersion.HasScriptTypeIndex) { int scriptCount = reader.ReadInt32(); - m_ScriptTypes = new List(scriptCount); - for (int i = 0; i < scriptCount; i++) + m_ScriptTypes = new List(); + for (var i = 0; i < scriptCount; i++) { var m_ScriptType = new LocalSerializedObjectIdentifier(); m_ScriptType.localSerializedFileIndex = reader.ReadInt32(); @@ -203,8 +203,8 @@ namespace AssetStudio } int externalsCount = reader.ReadInt32(); - m_Externals = new List(externalsCount); - for (int i = 0; i < externalsCount; i++) + m_Externals = new List(); + for (var i = 0; i < externalsCount; i++) { var m_External = new FileIdentifier(); if (header.m_Version >= SerializedFileFormatVersion.Unknown_6) @@ -224,8 +224,8 @@ namespace AssetStudio if (header.m_Version >= SerializedFileFormatVersion.SupportsRefObject) { int refTypesCount = reader.ReadInt32(); - m_RefTypes = new List(refTypesCount); - for (int i = 0; i < refTypesCount; i++) + m_RefTypes = new List(); + for (var i = 0; i < refTypesCount; i++) { m_RefTypes.Add(ReadSerializedType(true)); } @@ -322,7 +322,7 @@ namespace AssetStudio } int childrenCount = reader.ReadInt32(); - for (int i = 0; i < childrenCount; i++) + for (var i = 0; i < childrenCount; i++) { ReadTypeTree(m_Type, level + 1); } @@ -332,7 +332,7 @@ namespace AssetStudio { int numberOfNodes = reader.ReadInt32(); int stringBufferSize = reader.ReadInt32(); - for (int i = 0; i < numberOfNodes; i++) + for (var i = 0; i < numberOfNodes; i++) { var typeTreeNode = new TypeTreeNode(); m_Type.m_Nodes.Add(typeTreeNode); @@ -353,7 +353,7 @@ namespace AssetStudio using (var stringBufferReader = new BinaryReader(new MemoryStream(m_Type.m_StringBuffer))) { - for (int i = 0; i < numberOfNodes; i++) + for (var i = 0; i < numberOfNodes; i++) { var m_Node = m_Type.m_Nodes[i]; m_Node.m_Type = ReadString(stringBufferReader, m_Node.m_TypeStrOffset); diff --git a/AssetStudioCLI/Exporter.cs b/AssetStudioCLI/Exporter.cs index 6b5c84c..d4cfe7d 100644 --- a/AssetStudioCLI/Exporter.cs +++ b/AssetStudioCLI/Exporter.cs @@ -237,7 +237,7 @@ namespace AssetStudioCLI #region Face int sum = 0; - for (var i = 0; i < m_Mesh.m_SubMeshes.Length; i++) + for (var i = 0; i < m_Mesh.m_SubMeshes.Count; i++) { sb.AppendLine($"g {m_Mesh.m_Name}_{i}"); int indexCount = (int)m_Mesh.m_SubMeshes[i].indexCount; diff --git a/AssetStudioCLI/Studio.cs b/AssetStudioCLI/Studio.cs index cd41c9c..2ca9c27 100644 --- a/AssetStudioCLI/Studio.cs +++ b/AssetStudioCLI/Studio.cs @@ -198,7 +198,7 @@ namespace AssetStudioCLI var i = 0; foreach (var assetsFile in assetsManager.assetsFileList) { - var preloadTable = Array.Empty>(); + var preloadTable = new List>(); foreach (var asset in assetsFile.Objects) { var assetItem = new AssetItem(asset); @@ -221,7 +221,7 @@ namespace AssetStudioCLI foreach (var m_Container in m_AssetBundle.m_Container) { var preloadIndex = m_Container.Value.preloadIndex; - var preloadSize = isStreamedSceneAssetBundle ? preloadTable.Length : m_Container.Value.preloadSize; + var preloadSize = isStreamedSceneAssetBundle ? preloadTable.Count : m_Container.Value.preloadSize; var preloadEnd = preloadIndex + preloadSize; for (var k = preloadIndex; k < preloadEnd; k++) { diff --git a/AssetStudioGUI/Exporter.cs b/AssetStudioGUI/Exporter.cs index 2187929..fb240bc 100644 --- a/AssetStudioGUI/Exporter.cs +++ b/AssetStudioGUI/Exporter.cs @@ -197,7 +197,7 @@ namespace AssetStudioGUI #region Face int sum = 0; - for (var i = 0; i < m_Mesh.m_SubMeshes.Length; i++) + for (var i = 0; i < m_Mesh.m_SubMeshes.Count; i++) { sb.AppendLine($"g {m_Mesh.m_Name}_{i}"); int indexCount = (int)m_Mesh.m_SubMeshes[i].indexCount; diff --git a/AssetStudioGUI/Studio.cs b/AssetStudioGUI/Studio.cs index d41c864..8d834de 100644 --- a/AssetStudioGUI/Studio.cs +++ b/AssetStudioGUI/Studio.cs @@ -221,7 +221,7 @@ namespace AssetStudioGUI Progress.Reset(); foreach (var assetsFile in assetsManager.assetsFileList) { - var preloadTable = Array.Empty>(); + var preloadTable = new List>(); foreach (var asset in assetsFile.Objects) { @@ -333,7 +333,7 @@ namespace AssetStudioGUI { var preloadIndex = m_Container.Value.preloadIndex; var preloadSize = isStreamedSceneAssetBundle - ? preloadTable.Length + ? preloadTable.Count : m_Container.Value.preloadSize; var preloadEnd = preloadIndex + preloadSize; for (var k = preloadIndex; k < preloadEnd; k++) diff --git a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs index 85a08bc..b2e25c4 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Converter.cs @@ -39,7 +39,7 @@ namespace CubismLive2DExtractor for (int frameIndex = 1; frameIndex < streamedFrames.Count - 1; frameIndex++) { var frame = streamedFrames[frameIndex]; - for (int curveIndex = 0; curveIndex < frame.keyList.Length; curveIndex++) + for (int curveIndex = 0; curveIndex < frame.keyList.Count; curveIndex++) { ReadStreamedData(iAnim, m_ClipBindingConstant, frame.time, frame.keyList[curveIndex]); } @@ -90,7 +90,7 @@ namespace CubismLive2DExtractor GetLive2dPath(binding, out var target, out var boneName); if (string.IsNullOrEmpty(boneName)) { - Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}"); + Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {m_ClipBindingConstant.genericBindings.FindIndex(x => x == binding)}"); return; } @@ -105,7 +105,7 @@ namespace CubismLive2DExtractor GetLive2dPath(binding, out var target, out var boneName); if (string.IsNullOrEmpty(boneName)) { - Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {Array.IndexOf(m_ClipBindingConstant.genericBindings, binding)}"); + Logger.Warning($"[Motion Converter] \"{iAnim.Name}\" read fail on binding {m_ClipBindingConstant.genericBindings.FindIndex(x => x == binding)}"); return; } diff --git a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs index 13dd603..36fe956 100644 --- a/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs +++ b/AssetStudioUtility/CubismLive2DExtractor/CubismMotion3Json.cs @@ -116,7 +116,7 @@ namespace CubismLive2DExtractor // [Optional] Time of the overall Fade-Out for easing in seconds. FadeOutTime = fadeMotion.FadeOutTime, // The total number of curves. - CurveCount = (int)fadeMotion.ParameterCurves.LongCount(x => x.m_Curve.Length > 0), + CurveCount = (int)fadeMotion.ParameterCurves.LongCount(x => x.m_Curve.Count > 0), // [Optional] The total number of UserData. UserDataCount = 0 }; @@ -128,7 +128,7 @@ namespace CubismLive2DExtractor var actualCurveCount = 0; for (var i = 0; i < fadeMotion.ParameterCurves.Length; i++) { - if (fadeMotion.ParameterCurves[i].m_Curve.Length == 0) + if (fadeMotion.ParameterCurves[i].m_Curve.Count == 0) continue; string target; @@ -174,7 +174,7 @@ namespace CubismLive2DExtractor fadeMotion.ParameterCurves[i].m_Curve[0].value } }; - for (var j = 1; j < fadeMotion.ParameterCurves[i].m_Curve.Length; j++) + for (var j = 1; j < fadeMotion.ParameterCurves[i].m_Curve.Count; j++) { var curve = fadeMotion.ParameterCurves[i].m_Curve[j]; var preCurve = fadeMotion.ParameterCurves[i].m_Curve[j - 1]; diff --git a/AssetStudioUtility/ModelConverter.cs b/AssetStudioUtility/ModelConverter.cs index 3f5847c..ffe192d 100644 --- a/AssetStudioUtility/ModelConverter.cs +++ b/AssetStudioUtility/ModelConverter.cs @@ -203,7 +203,7 @@ namespace AssetStudio private ImportedFrame ConvertTransform(Transform trans) { - var frame = new ImportedFrame(trans.m_Children.Length); + var frame = new ImportedFrame(trans.m_Children.Count); transformDictionary.Add(trans, frame); trans.m_GameObject.TryGet(out var m_GameObject); frame.Name = m_GameObject.m_Name; @@ -286,7 +286,7 @@ namespace AssetStudio iMesh.hasColor = mesh.m_Colors?.Length > 0; int firstFace = 0; - for (int i = 0; i < mesh.m_SubMeshes.Length; i++) + for (int i = 0; i < mesh.m_SubMeshes.Count; i++) { int numFaces = (int)mesh.m_SubMeshes[i].indexCount / 3; if (subHashSet.Count > 0 && !subHashSet.Contains(i)) @@ -297,7 +297,7 @@ namespace AssetStudio var submesh = mesh.m_SubMeshes[i]; var iSubmesh = new ImportedSubmesh(); Material mat = null; - if (i - firstSubMesh < meshR.m_Materials.Length) + if (i - firstSubMesh < meshR.m_Materials.Count) { if (meshR.m_Materials[i - firstSubMesh].TryGet(out var m_Material)) { @@ -410,16 +410,16 @@ namespace AssetStudio * 2 - m_BoneNameHashes */ var boneType = 0; - if (sMesh.m_Bones.Length > 0) + if (sMesh.m_Bones.Count > 0) { - if (sMesh.m_Bones.Length == mesh.m_BindPose.Length) + if (sMesh.m_Bones.Count == mesh.m_BindPose.Length) { var verifiedBoneCount = sMesh.m_Bones.Count(x => x.TryGet(out _)); if (verifiedBoneCount > 0) { boneType = 1; } - if (verifiedBoneCount != sMesh.m_Bones.Length) + if (verifiedBoneCount != sMesh.m_Bones.Count) { //尝试使用m_BoneNameHashes 4.3 and up if (mesh.m_BindPose.Length > 0 && (mesh.m_BindPose.Length == mesh.m_BoneNameHashes?.Length)) @@ -449,7 +449,7 @@ namespace AssetStudio if (boneType == 1) { - var boneCount = sMesh.m_Bones.Length; + var boneCount = sMesh.m_Bones.Count; iMesh.BoneList = new List(boneCount); for (int i = 0; i < boneCount; i++) { @@ -480,13 +480,13 @@ namespace AssetStudio } //Morphs - if (mesh.m_Shapes?.channels?.Length > 0) + if (mesh.m_Shapes?.channels?.Count > 0) { var morph = new ImportedMorph(); MorphList.Add(morph); morph.Path = iMesh.Path; - morph.Channels = new List(mesh.m_Shapes.channels.Length); - for (int i = 0; i < mesh.m_Shapes.channels.Length; i++) + morph.Channels = new List(mesh.m_Shapes.channels.Count); + for (var i = 0; i < mesh.m_Shapes.channels.Count; i++) { var channel = new ImportedMorphChannel(); morph.Channels.Add(channel); @@ -501,7 +501,7 @@ namespace AssetStudio channel.Name = shapeChannel.name.Split('.').Last(); channel.KeyframeList = new List(shapeChannel.frameCount); var frameEnd = shapeChannel.frameIndex + shapeChannel.frameCount; - for (int frameIdx = shapeChannel.frameIndex; frameIdx < frameEnd; frameIdx++) + for (var frameIdx = shapeChannel.frameIndex; frameIdx < frameEnd; frameIdx++) { var keyframe = new ImportedMorphKeyframe(); channel.KeyframeList.Add(keyframe); @@ -890,7 +890,7 @@ namespace AssetStudio { var frame = streamedFrames[frameIndex]; var streamedValues = frame.keyList.Select(x => x.value).ToArray(); - for (var curveIndex = 0; curveIndex < frame.keyList.Length;) + for (var curveIndex = 0; curveIndex < frame.keyList.Count;) { ReadCurveData(iAnim, m_ClipBindingConstant, frame.keyList[curveIndex].index, frame.time, streamedValues, 0, ref curveIndex); } diff --git a/AssetStudioUtility/ShaderConverter.cs b/AssetStudioUtility/ShaderConverter.cs index 0202fef..0501e64 100644 --- a/AssetStudioUtility/ShaderConverter.cs +++ b/AssetStudioUtility/ShaderConverter.cs @@ -1,5 +1,6 @@ using K4os.Compression.LZ4; using System; +using System.Collections.Generic; using System.Globalization; using System.IO; using System.Linq; @@ -138,42 +139,42 @@ namespace AssetStudio { sb.Append(ConvertSerializedShaderState(m_Passe.m_State)); - if (m_Passe.progVertex.m_SubPrograms.Length > 0) + if (m_Passe.progVertex.m_SubPrograms.Count > 0) { sb.Append("Program \"vp\" {\n"); sb.Append(ConvertSerializedSubPrograms(m_Passe.progVertex.m_SubPrograms, platforms, shaderPrograms)); sb.Append("}\n"); } - if (m_Passe.progFragment.m_SubPrograms.Length > 0) + if (m_Passe.progFragment.m_SubPrograms.Count > 0) { sb.Append("Program \"fp\" {\n"); sb.Append(ConvertSerializedSubPrograms(m_Passe.progFragment.m_SubPrograms, platforms, shaderPrograms)); sb.Append("}\n"); } - if (m_Passe.progGeometry.m_SubPrograms.Length > 0) + if (m_Passe.progGeometry.m_SubPrograms.Count > 0) { sb.Append("Program \"gp\" {\n"); sb.Append(ConvertSerializedSubPrograms(m_Passe.progGeometry.m_SubPrograms, platforms, shaderPrograms)); sb.Append("}\n"); } - if (m_Passe.progHull.m_SubPrograms.Length > 0) + if (m_Passe.progHull.m_SubPrograms.Count > 0) { sb.Append("Program \"hp\" {\n"); sb.Append(ConvertSerializedSubPrograms(m_Passe.progHull.m_SubPrograms, platforms, shaderPrograms)); sb.Append("}\n"); } - if (m_Passe.progDomain.m_SubPrograms.Length > 0) + if (m_Passe.progDomain.m_SubPrograms.Count > 0) { sb.Append("Program \"dp\" {\n"); sb.Append(ConvertSerializedSubPrograms(m_Passe.progDomain.m_SubPrograms, platforms, shaderPrograms)); sb.Append("}\n"); } - if (m_Passe.progRayTracing?.m_SubPrograms.Length > 0) + if (m_Passe.progRayTracing?.m_SubPrograms.Count > 0) { sb.Append("Program \"rtp\" {\n"); sb.Append(ConvertSerializedSubPrograms(m_Passe.progRayTracing.m_SubPrograms, platforms, shaderPrograms)); @@ -185,7 +186,7 @@ namespace AssetStudio return sb.ToString(); } - private static string ConvertSerializedSubPrograms(SerializedSubProgram[] m_SubPrograms, ShaderCompilerPlatform[] platforms, ShaderProgram[] shaderPrograms) + private static string ConvertSerializedSubPrograms(List m_SubPrograms, ShaderCompilerPlatform[] platforms, ShaderProgram[] shaderPrograms) { var sb = new StringBuilder(); var groups = m_SubPrograms.GroupBy(x => x.m_BlobIndex); @@ -638,7 +639,7 @@ namespace AssetStudio private static string ConvertSerializedTagMap(SerializedTagMap m_Tags, int intent) { var sb = new StringBuilder(); - if (m_Tags.tags.Length > 0) + if (m_Tags.tags.Count > 0) { sb.Append(new string(' ', intent)); sb.Append("Tags { ");