mirror of
https://github.com/aelurum/AssetStudio.git
synced 2026-11-14 11:18:47 -05:00
Add support for parsing SkinnedMeshRenderer via typetree
This commit is contained in:
@@ -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()
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,6 +7,8 @@ namespace AssetStudio
|
||||
public ushort firstSubMesh;
|
||||
public ushort subMeshCount;
|
||||
|
||||
public StaticBatchInfo() { }
|
||||
|
||||
public StaticBatchInfo(ObjectReader reader)
|
||||
{
|
||||
firstSubMesh = reader.ReadUInt16();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user