diff --git a/AssetStudio/Classes/Renderer.cs b/AssetStudio/Classes/Renderer.cs index 2feda34..b02a192 100644 --- a/AssetStudio/Classes/Renderer.cs +++ b/AssetStudio/Classes/Renderer.cs @@ -46,6 +46,10 @@ namespace AssetStudio var m_MotionVectors = reader.ReadByte(); var m_LightProbeUsage = reader.ReadByte(); var m_ReflectionProbeUsage = reader.ReadByte(); + if (version[0] > 2019 || (version[0] == 2019 && version[0] >= 3)) //2019.3 and up + { + var m_RayTracingMode = reader.ReadByte(); + } reader.AlignStream(); } else diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 8c98b3a..24a004a 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -591,6 +591,7 @@ namespace AssetStudio public SerializedProgram progGeometry; public SerializedProgram progHull; public SerializedProgram progDomain; + public SerializedProgram progRayTracing; public bool m_HasInstancingVariant; public string m_UseName; public string m_Name; @@ -616,6 +617,10 @@ namespace AssetStudio progGeometry = new SerializedProgram(reader); progHull = new SerializedProgram(reader); progDomain = new SerializedProgram(reader); + if (version[0] > 2019 || (version[0] == 2019 && version[0] >= 3)) //2019.3 and up + { + progRayTracing = new SerializedProgram(reader); + } m_HasInstancingVariant = reader.ReadBoolean(); if (version[0] >= 2018) //2018 and up { @@ -759,9 +764,18 @@ namespace AssetStudio { m_ParsedForm = new SerializedShader(reader); platforms = reader.ReadUInt32Array().Select(x => (ShaderCompilerPlatform)x).ToArray(); - offsets = reader.ReadUInt32Array(); - compressedLengths = reader.ReadUInt32Array(); - decompressedLengths = reader.ReadUInt32Array(); + if (version[0] > 2019 || (version[0] == 2019 && version[0] >= 3)) //2019.3 and up + { + offsets = reader.ReadUInt32ArrayArray().Select(x => x[0]).ToArray(); + compressedLengths = reader.ReadUInt32ArrayArray().Select(x => x[0]).ToArray(); + decompressedLengths = reader.ReadUInt32ArrayArray().Select(x => x[0]).ToArray(); + } + else + { + offsets = reader.ReadUInt32Array(); + compressedLengths = reader.ReadUInt32Array(); + decompressedLengths = reader.ReadUInt32Array(); + } compressedBlob = reader.ReadBytes(reader.ReadInt32()); } else diff --git a/AssetStudio/Extensions/BinaryReaderExtensions.cs b/AssetStudio/Extensions/BinaryReaderExtensions.cs index bf01a3f..90ee086 100644 --- a/AssetStudio/Extensions/BinaryReaderExtensions.cs +++ b/AssetStudio/Extensions/BinaryReaderExtensions.cs @@ -122,6 +122,11 @@ namespace AssetStudio return ReadArray(reader.ReadUInt32, reader.ReadInt32()); } + public static uint[][] ReadUInt32ArrayArray(this BinaryReader reader) + { + return ReadArray(reader.ReadUInt32Array, reader.ReadInt32()); + } + public static uint[] ReadUInt32Array(this BinaryReader reader, int length) { return ReadArray(reader.ReadUInt32, length); diff --git a/AssetStudio/SerializedFile.cs b/AssetStudio/SerializedFile.cs index a426945..6c0d6e8 100644 --- a/AssetStudio/SerializedFile.cs +++ b/AssetStudio/SerializedFile.cs @@ -186,6 +186,11 @@ namespace AssetStudio { //var userInformation = reader.ReadStringToNull(); } + + if (header.m_Version >= 21) + { + //var unknown = reader.ReadInt32(); + } } public void SetVersion(string stringVersion) @@ -307,7 +312,10 @@ namespace AssetStudio } reader.Position += stringBufferSize; } - + if (header.m_Version >= 21) + { + reader.Position += 4; + } string ReadString(BinaryReader stringBufferReader, uint value) { var isOffset = (value & 0x80000000) == 0; diff --git a/AssetStudioUtility/ShaderConverter.cs b/AssetStudioUtility/ShaderConverter.cs index 4dbf268..98041de 100644 --- a/AssetStudioUtility/ShaderConverter.cs +++ b/AssetStudioUtility/ShaderConverter.cs @@ -20,7 +20,7 @@ namespace AssetStudio } using (var blobReader = new BinaryReader(new MemoryStream(decompressedBytes))) { - var program = new ShaderProgram(blobReader); + var program = new ShaderProgram(blobReader, shader.version); return program.Export(Encoding.UTF8.GetString(shader.m_Script)); } } @@ -49,7 +49,7 @@ namespace AssetStudio } using (var blobReader = new BinaryReader(new MemoryStream(decompressedBytes))) { - var program = new ShaderProgram(blobReader); + var program = new ShaderProgram(blobReader, shader.version); var m_Script = ConvertSerializedShader(shader.m_ParsedForm, shader.platforms[i]); strs[i] = header + program.Export(m_Script); } @@ -556,13 +556,22 @@ namespace AssetStudio { private ShaderSubProgram[] m_SubPrograms; - public ShaderProgram(BinaryReader reader) + public ShaderProgram(BinaryReader reader, int[] version) { var subProgramsCapacity = reader.ReadInt32(); m_SubPrograms = new ShaderSubProgram[subProgramsCapacity]; + int entrySize; + if (version[0] > 2019 || (version[0] == 2019 && version[0] >= 3)) //2019.3 and up + { + entrySize = 12; + } + else + { + entrySize = 8; + } for (int i = 0; i < subProgramsCapacity; i++) { - reader.BaseStream.Position = 4 + i * 8; + reader.BaseStream.Position = 4 + i * entrySize; var offset = reader.ReadInt32(); reader.BaseStream.Position = offset; m_SubPrograms[i] = new ShaderSubProgram(reader);