From 52ad0d352d48cd0d672a601779026fd7ed844e62 Mon Sep 17 00:00:00 2001 From: Razmoth <32140579+Razmoth@users.noreply.github.com> Date: Sat, 20 Jan 2024 21:57:01 +0400 Subject: [PATCH] - [Core] fix parsing issues [LoD] --- AssetStudio/Classes/AnimationClip.cs | 90 ++++++++++++++++++++--- AssetStudio/Classes/AnimatorController.cs | 4 + AssetStudio/Classes/Material.cs | 5 ++ AssetStudio/Classes/Mesh.cs | 7 +- AssetStudio/Classes/Shader.cs | 23 ++++++ AssetStudio/GameManager.cs | 1 + 6 files changed, 120 insertions(+), 10 deletions(-) diff --git a/AssetStudio/Classes/AnimationClip.cs b/AssetStudio/Classes/AnimationClip.cs index 11c4b09..7159afb 100644 --- a/AssetStudio/Classes/AnimationClip.cs +++ b/AssetStudio/Classes/AnimationClip.cs @@ -842,6 +842,49 @@ namespace AssetStudio } } + public class AclTransformTrackIDToBindingCurveID + { + public uint rotationIDToBindingCurveID; + public uint positionIDToBindingCurveID; + public uint scaleIDToBindingCurveID; + public AclTransformTrackIDToBindingCurveID(ObjectReader reader) + { + rotationIDToBindingCurveID = reader.ReadUInt32(); + positionIDToBindingCurveID = reader.ReadUInt32(); + scaleIDToBindingCurveID = reader.ReadUInt32(); + } + } + + public class LnDACLClip : ACLClip + { + public uint m_CurveCount; + public byte[] m_ClipData; + + public override bool IsSet => !m_ClipData.IsNullOrEmpty(); + public override uint CurveCount => m_CurveCount; + public override void Read(ObjectReader reader) + { + m_CurveCount = reader.ReadUInt32(); + var compressedTransformTracksSize = reader.ReadUInt32(); + var compressedScalarTracksSize = reader.ReadUInt32(); + var aclTransformCount = reader.ReadUInt32(); + var aclScalarCount = reader.ReadUInt32(); + + var compressedTransformTracksCount = reader.ReadInt32() * 0x10; + var compressedTransformTracks = reader.ReadBytes(compressedTransformTracksCount); + var compressedScalarTracksCount = reader.ReadInt32() * 0x10; + var compressedScalarTracks = reader.ReadBytes(compressedScalarTracksCount); + + int numaclTransformTrackIDToBindingCurveID = reader.ReadInt32(); + var aclTransformTrackIDToBindingCurveID = new List(); + for (int i = 0; i < numaclTransformTrackIDToBindingCurveID; i++) + { + aclTransformTrackIDToBindingCurveID.Add(new AclTransformTrackIDToBindingCurveID(reader)); + } + var aclScalarTrackIDToBindingCurveID = reader.ReadUInt32Array(); + } + } + public class GIACLClip : ACLClip { public uint m_CurveCount; @@ -1278,6 +1321,11 @@ namespace AssetStudio m_ACLClip = new MHYACLClip(); m_ACLClip.Read(reader); } + if (reader.Game.Type.IsLoveAndDeepspace()) + { + m_ACLClip = new LnDACLClip(); + m_ACLClip.Read(reader); + } if (version[0] < 2018 || (version[0] == 2018 && version[1] < 3)) //2018.3 down { m_Binding = new ValueArrayConstant(reader); @@ -1400,18 +1448,29 @@ namespace AssetStudio public ClipMuscleConstant(ObjectReader reader) { var version = reader.version; - m_DeltaPose = new HumanPose(reader); - m_StartX = reader.ReadXForm(); - if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up + if (reader.Game.Type.IsLoveAndDeepspace()) { - m_StopX = reader.ReadXForm(); + m_StartX = reader.ReadXForm(); + if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up + { + m_StopX = reader.ReadXForm(); + } } - m_LeftFootStartX = reader.ReadXForm(); - m_RightFootStartX = reader.ReadXForm(); - if (version[0] < 5)//5.0 down + else { - m_MotionStartX = reader.ReadXForm(); - m_MotionStopX = reader.ReadXForm(); + m_DeltaPose = new HumanPose(reader); + m_StartX = reader.ReadXForm(); + if (version[0] > 5 || (version[0] == 5 && version[1] >= 5))//5.5 and up + { + m_StopX = reader.ReadXForm(); + } + m_LeftFootStartX = reader.ReadXForm(); + m_RightFootStartX = reader.ReadXForm(); + if (version[0] < 5)//5.0 down + { + m_MotionStartX = reader.ReadXForm(); + m_MotionStopX = reader.ReadXForm(); + } } m_AverageSpeed = version[0] > 5 || (version[0] == 5 && version[1] >= 4) ? reader.ReadVector3() : (Vector3)reader.ReadVector4();//5.4 and up m_Clip = new Clip(reader); @@ -1774,6 +1833,19 @@ namespace AssetStudio { m_Legacy = true; } + if (reader.Game.Type.IsLoveAndDeepspace()) + { + reader.AlignStream(); + var m_aclTransformCache = reader.ReadUInt8Array(); + var m_aclScalarCache = reader.ReadUInt8Array(); + int numaclTransformTrackId2CurveId = reader.ReadInt32(); + var m_aclTransformTrackId2CurveId = new List(); + for (int i = 0; i < numaclTransformTrackId2CurveId; i++) + { + m_aclTransformTrackId2CurveId.Add(new AclTransformTrackIDToBindingCurveID(reader)); + } + var m_aclScalarTrackId2CurveId = reader.ReadUInt32Array(); + } m_Compressed = reader.ReadBoolean(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3))//4.3 and up { diff --git a/AssetStudio/Classes/AnimatorController.cs b/AssetStudio/Classes/AnimatorController.cs index 3919b2e..e332cb2 100644 --- a/AssetStudio/Classes/AnimatorController.cs +++ b/AssetStudio/Classes/AnimatorController.cs @@ -71,6 +71,10 @@ namespace AssetStudio m_StateMachineMotionSetIndex = reader.ReadUInt32(); m_BodyMask = new HumanPoseMask(reader); m_SkeletonMask = new SkeletonMask(reader); + if (reader.Game.Type.IsLoveAndDeepspace()) + { + var m_GenericMask = new SkeletonMask(reader); + } m_Binding = reader.ReadUInt32(); m_LayerBlendingMode = reader.ReadInt32(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 2)) //4.2 and up diff --git a/AssetStudio/Classes/Material.cs b/AssetStudio/Classes/Material.cs index 9d444f3..2f84db7 100644 --- a/AssetStudio/Classes/Material.cs +++ b/AssetStudio/Classes/Material.cs @@ -110,6 +110,11 @@ namespace AssetStudio var m_CustomRenderQueue = reader.ReadInt32(); } + if (reader.Game.Type.IsLoveAndDeepspace()) + { + var m_MaterialType = reader.ReadUInt32(); + } + if (version[0] > 5 || (version[0] == 5 && version[1] >= 1)) //5.1 and up { var stringTagMapSize = reader.ReadInt32(); diff --git a/AssetStudio/Classes/Mesh.cs b/AssetStudio/Classes/Mesh.cs index 64ce81e..1833a63 100644 --- a/AssetStudio/Classes/Mesh.cs +++ b/AssetStudio/Classes/Mesh.cs @@ -313,7 +313,7 @@ namespace AssetStudio } hasNormals = reader.ReadBoolean(); hasTangents = reader.ReadBoolean(); - if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up + if (!reader.Game.Type.IsLoveAndDeepspace() && version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up { reader.AlignStream(); } @@ -371,6 +371,11 @@ namespace AssetStudio } fullWeights = reader.ReadSingleArray(); + if (reader.Game.Type.IsLoveAndDeepspace()) + { + var varintVertices = reader.ReadUInt8Array(); + reader.AlignStream(); + } } else { diff --git a/AssetStudio/Classes/Shader.cs b/AssetStudio/Classes/Shader.cs index 75e1b6b..e29c5f0 100644 --- a/AssetStudio/Classes/Shader.cs +++ b/AssetStudio/Classes/Shader.cs @@ -272,6 +272,15 @@ namespace AssetStudio gpuProgramID = reader.ReadInt32(); m_Tags = new SerializedTagMap(reader); m_LOD = reader.ReadInt32(); + if (reader.Game.Type.IsLoveAndDeepspace()) + { + int numOverrideKeywordAndStage = reader.ReadInt32(); + var m_OverrideKeywordAndStage = new List>(); + for (int i = 0; i < numOverrideKeywordAndStage; i++) + { + m_OverrideKeywordAndStage.Add(new KeyValuePair(reader.ReadAlignedString(), reader.ReadUInt32())); + } + } lighting = reader.ReadBoolean(); reader.AlignStream(); } @@ -584,6 +593,11 @@ namespace AssetStudio public SerializedSubProgram(ObjectReader reader) { var version = reader.version; + + if (reader.Game.Type.IsLoveAndDeepspace()) + { + var m_CodeHash = new Hash128(reader); + } m_BlobIndex = reader.ReadUInt32(); m_Channels = new ParserBindChannels(reader); @@ -1074,6 +1088,15 @@ namespace AssetStudio } } + if (reader.Game.Type.IsLoveAndDeepspace()) + { + var codeOffsets = reader.ReadUInt32ArrayArray(); + var codeCompressedLengths = reader.ReadUInt32ArrayArray(); + var codeDecompressedLengths = reader.ReadUInt32ArrayArray(); + var codeCompressedBlob = reader.ReadUInt8Array(); + reader.AlignStream(); + } + if ((version[0] == 2021 && version[1] > 3) || version[0] == 2021 && version[1] == 3 && version[2] >= 12 || //2021.3.12f1 and up (version[0] == 2022 && version[1] > 1) || diff --git a/AssetStudio/GameManager.cs b/AssetStudio/GameManager.cs index 6dc916a..48cf9ba 100644 --- a/AssetStudio/GameManager.cs +++ b/AssetStudio/GameManager.cs @@ -190,6 +190,7 @@ namespace AssetStudio public static bool IsOPFP(this GameType type) => type == GameType.OPFP; public static bool IsNetEase(this GameType type) => type == GameType.NetEase; public static bool IsArknightsEndfield(this GameType type) => type == GameType.ArknightsEndfield; + public static bool IsLoveAndDeepspace(this GameType type) => type == GameType.LoveAndDeepspace; public static bool IsGIGroup(this GameType type) => type switch { GameType.GI or GameType.GI_Pack or GameType.GI_CB1 or GameType.GI_CB2 or GameType.GI_CB3 or GameType.GI_CB3Pre => true,