Add support for parsing SkinnedMeshRenderer via typetree

This commit is contained in:
VaDiM
2026-06-27 04:27:19 +03:00
parent b736dd3c5c
commit e4b6b17d39
4 changed files with 52 additions and 16 deletions
+3
View File
@@ -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()
+16
View File
@@ -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;
}
}
}
+2
View File
@@ -7,6 +7,8 @@ namespace AssetStudio
public ushort firstSubMesh;
public ushort subMeshCount;
public StaticBatchInfo() { }
public StaticBatchInfo(ObjectReader reader)
{
firstSubMesh = reader.ReadUInt16();
+31 -16
View File
@@ -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<SkinnedMeshFilter>(type, jsonOptions).ToSkinnedMeshRenderer()
: JsonSerializer.Deserialize<SkinnedMeshRenderer>(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<Mesh> m_Mesh;
private List<PPtr<Transform>> m_Bones;
private PPtr<GameObject> m_GameObject;
private List<PPtr<Material>> m_Materials;
public PPtr<Mesh> m_LodMesh;
public List<PPtr<Transform>> m_Bones;
public PPtr<GameObject> m_GameObject;
public List<PPtr<Material>> 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<Transform>(reader));
}
m_Mesh = new PPtr<Mesh>(reader);
m_LodMesh = new PPtr<Mesh>(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;
}
}
}