From e4b6b17d39f828d00a8931bf336d00f8370b4b46 Mon Sep 17 00:00:00 2001 From: VaDiM Date: Sat, 27 Jun 2026 04:27:19 +0300 Subject: [PATCH] Add support for parsing SkinnedMeshRenderer via typetree --- AssetStudio/AssetsManager.cs | 3 ++ AssetStudio/Classes/Object.cs | 16 ++++++++ AssetStudio/Classes/Renderer.cs | 2 + AssetStudio/Classes/SkinnedMeshRenderer.cs | 47 ++++++++++++++-------- 4 files changed, 52 insertions(+), 16 deletions(-) diff --git a/AssetStudio/AssetsManager.cs b/AssetStudio/AssetsManager.cs index ff164a2..dc5e3c2 100644 --- a/AssetStudio/AssetsManager.cs +++ b/AssetStudio/AssetsManager.cs @@ -735,6 +735,9 @@ namespace AssetStudio case ClassIDType.Shader when objectReader.version < 2021: obj = new Shader(objectReader); break; + case ClassIDType.SkinnedMeshRenderer when parseByTypeTree: + obj = new SkinnedMeshRenderer(objectReader, TypeTreeHelper.ReadTypeByteArray(objectReader.serializedType.m_Type, objectReader), jsonOptions); + break; case ClassIDType.SkinnedMeshRenderer: obj = objectReader.version < (2, 1) ? new SkinnedMeshFilter(objectReader).ToSkinnedMeshRenderer() diff --git a/AssetStudio/Classes/Object.cs b/AssetStudio/Classes/Object.cs index bec509a..9f4e858 100644 --- a/AssetStudio/Classes/Object.cs +++ b/AssetStudio/Classes/Object.cs @@ -132,4 +132,20 @@ namespace AssetStudio return reader.ReadBytes((int)byteSize); } } + + public static class ObjectExtensions + { + public static void CopyObjectDataFromReader(this Object obj, ObjectReader reader) + { + obj.reader = reader; + obj.assetsFile = reader.assetsFile; + obj.type = reader.type; + obj.m_PathID = reader.m_PathID; + obj.version = reader.version; + obj.platform = reader.platform; + obj.serializedType = reader.serializedType; + obj.classID = reader.classID; + obj.byteSize = reader.byteSize; + } + } } diff --git a/AssetStudio/Classes/Renderer.cs b/AssetStudio/Classes/Renderer.cs index 11fd56a..dc10fbc 100644 --- a/AssetStudio/Classes/Renderer.cs +++ b/AssetStudio/Classes/Renderer.cs @@ -7,6 +7,8 @@ namespace AssetStudio public ushort firstSubMesh; public ushort subMeshCount; + public StaticBatchInfo() { } + public StaticBatchInfo(ObjectReader reader) { firstSubMesh = reader.ReadUInt16(); diff --git a/AssetStudio/Classes/SkinnedMeshRenderer.cs b/AssetStudio/Classes/SkinnedMeshRenderer.cs index bc4426e..c04ea23 100644 --- a/AssetStudio/Classes/SkinnedMeshRenderer.cs +++ b/AssetStudio/Classes/SkinnedMeshRenderer.cs @@ -1,4 +1,5 @@ using System.Collections.Generic; +using System.Text.Json; namespace AssetStudio { @@ -11,6 +12,21 @@ namespace AssetStudio public SkinnedMeshRenderer() { } + public SkinnedMeshRenderer(ObjectReader reader, byte[] type, JsonSerializerOptions jsonOptions) + { + this.CopyObjectDataFromReader(reader); + var parsedAsset = version < (2, 1) + ? JsonSerializer.Deserialize(type, jsonOptions).ToSkinnedMeshRenderer() + : JsonSerializer.Deserialize(type, jsonOptions); + m_GameObject = parsedAsset.m_GameObject; + m_Materials = parsedAsset.m_Materials; + m_StaticBatchInfo = parsedAsset.m_StaticBatchInfo; + m_SubsetIndices = parsedAsset.m_SubsetIndices; + m_Mesh = parsedAsset.m_Mesh; + m_Bones = parsedAsset.m_Bones; + m_BlendShapeWeights = parsedAsset.m_BlendShapeWeights; + } + public SkinnedMeshRenderer(ObjectReader reader) : base(reader) { int m_Quality = reader.ReadInt32(); @@ -42,12 +58,14 @@ namespace AssetStudio //unity 1.x - 2.1 down public sealed class SkinnedMeshFilter { - private PPtr m_Mesh; - private List> m_Bones; - private PPtr m_GameObject; - private List> m_Materials; + public PPtr m_LodMesh; + public List> m_Bones; + public PPtr m_GameObject; + public List> m_Materials; private readonly ObjectReader _reader; + public SkinnedMeshFilter(){ } + public SkinnedMeshFilter(ObjectReader reader) { _reader = reader; @@ -78,27 +96,24 @@ namespace AssetStudio { m_Bones.Add(new PPtr(reader)); } - m_Mesh = new PPtr(reader); + m_LodMesh = new PPtr(reader); } public SkinnedMeshRenderer ToSkinnedMeshRenderer() { - return new SkinnedMeshRenderer() + var skinnedMeshRenderer = new SkinnedMeshRenderer() { - reader = _reader, - assetsFile = _reader.assetsFile, - serializedType = _reader.serializedType, - version = _reader.version, - platform = _reader.platform, - type = _reader.type, - classID = _reader.classID, - m_PathID = _reader.m_PathID, - byteSize = _reader.byteSize, m_GameObject = m_GameObject, m_Materials = m_Materials, - m_Mesh = m_Mesh, + m_Mesh = m_LodMesh, m_Bones = m_Bones, }; + if (_reader != null) + { + skinnedMeshRenderer.CopyObjectDataFromReader(_reader); + } + + return skinnedMeshRenderer; } } }