improved mesh read

This commit is contained in:
Perfare 2018-12-23 23:17:01 +08:00
parent f449d7a8ab
commit ff550b457f
3 changed files with 71 additions and 48 deletions

View File

@ -291,11 +291,25 @@ namespace AssetStudio
public MeshBlendShape(ObjectReader reader) public MeshBlendShape(ObjectReader reader)
{ {
var version = reader.version;
if (version[0] == 4 && version[1] < 3) //4.3 down
{
var name = reader.ReadAlignedString();
}
firstVertex = reader.ReadUInt32(); firstVertex = reader.ReadUInt32();
vertexCount = reader.ReadUInt32(); vertexCount = reader.ReadUInt32();
if (version[0] == 4 && version[1] < 3) //4.3 down
{
var aabbMinDelta = reader.ReadVector3();
var aabbMaxDelta = reader.ReadVector3();
}
hasNormals = reader.ReadBoolean(); hasNormals = reader.ReadBoolean();
hasTangents = reader.ReadBoolean(); hasTangents = reader.ReadBoolean();
reader.AlignStream(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
reader.AlignStream();
}
} }
} }
@ -324,28 +338,49 @@ namespace AssetStudio
public BlendShapeData(ObjectReader reader) public BlendShapeData(ObjectReader reader)
{ {
int numVerts = reader.ReadInt32(); var version = reader.version;
vertices = new BlendShapeVertex[numVerts];
for (int i = 0; i < numVerts; i++)
{
vertices[i] = new BlendShapeVertex(reader);
}
int numShapes = reader.ReadInt32(); if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
shapes = new MeshBlendShape[numShapes];
for (int i = 0; i < numShapes; i++)
{ {
shapes[i] = new MeshBlendShape(reader); int numVerts = reader.ReadInt32();
} vertices = new BlendShapeVertex[numVerts];
for (int i = 0; i < numVerts; i++)
{
vertices[i] = new BlendShapeVertex(reader);
}
int numChannels = reader.ReadInt32(); int numShapes = reader.ReadInt32();
channels = new MeshBlendShapeChannel[numChannels]; shapes = new MeshBlendShape[numShapes];
for (int i = 0; i < numChannels; i++) for (int i = 0; i < numShapes; i++)
{
shapes[i] = new MeshBlendShape(reader);
}
int numChannels = reader.ReadInt32();
channels = new MeshBlendShapeChannel[numChannels];
for (int i = 0; i < numChannels; i++)
{
channels[i] = new MeshBlendShapeChannel(reader);
}
fullWeights = reader.ReadSingleArray();
}
else
{ {
channels[i] = new MeshBlendShapeChannel(reader); var m_ShapesSize = reader.ReadInt32();
var m_Shapes = new MeshBlendShape[m_ShapesSize];
for (int i = 0; i < m_ShapesSize; i++)
{
m_Shapes[i] = new MeshBlendShape(reader);
}
reader.AlignStream();
var m_ShapeVerticesSize = reader.ReadInt32();
var m_ShapeVertices = new BlendShapeVertex[m_ShapeVerticesSize]; //MeshBlendShapeVertex
for (int i = 0; i < m_ShapeVerticesSize; i++)
{
m_ShapeVertices[i] = new BlendShapeVertex(reader);
}
} }
fullWeights = reader.ReadSingleArray();
} }
} }
@ -433,11 +468,7 @@ namespace AssetStudio
} }
else else
{ {
m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; m_IndexBuffer = reader.ReadUInt32Array(m_IndexBuffer_size / 4);
for (int i = 0; i < m_IndexBuffer_size / 4; i++)
{
m_IndexBuffer[i] = reader.ReadUInt32();
}
} }
} }
@ -448,25 +479,13 @@ namespace AssetStudio
m_SubMeshes[i] = new SubMesh(reader); m_SubMeshes[i] = new SubMesh(reader);
} }
if (version[0] == 4 && ((version[1] == 1 && !buildType.IsAlpha) || (version[1] > 1 && version[1] <= 2))) //4.1.0 to 4.2.x, excluding 4.1.0 alpha if (version[0] > 4 || (version[0] == 4 && version[1] >= 1)) //4.1 and up
{
int m_Shapes_size = reader.ReadInt32();
if (m_Shapes_size > 0)
{
//bool stop = true;
}
for (int s = 0; s < m_Shapes_size; s++) //untested
{
var shape_name = reader.ReadAlignedString();
reader.Position += 36; //uint firstVertex, vertexCount; Vector3f aabbMinDelta, aabbMaxDelta; bool hasNormals, hasTangents
}
int m_ShapeVertices_size = reader.ReadInt32();
reader.Position += m_ShapeVertices_size * 40; //vertex positions, normals, tangents & uint index
}
else if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3.0 and later
{ {
m_Shapes = new BlendShapeData(reader); m_Shapes = new BlendShapeData(reader);
}
if (version[0] > 4 || (version[0] == 4 && version[1] >= 3)) //4.3 and up
{
m_BindPose = reader.ReadMatrixArray(); m_BindPose = reader.ReadMatrixArray();
m_BoneNameHashes = reader.ReadUInt32Array(); m_BoneNameHashes = reader.ReadUInt32Array();
var m_RootBoneNameHash = reader.ReadUInt32(); var m_RootBoneNameHash = reader.ReadUInt32();
@ -507,12 +526,7 @@ namespace AssetStudio
} }
else else
{ {
m_IndexBuffer = new uint[m_IndexBuffer_size / 4]; m_IndexBuffer = reader.ReadUInt32Array(m_IndexBuffer_size / 4);
for (int i = 0; i < m_IndexBuffer_size / 4; i++)
{
m_IndexBuffer[i] = reader.ReadUInt32();
}
reader.AlignStream();
} }
} }
@ -537,12 +551,16 @@ namespace AssetStudio
{ {
int m_TangentSpace_size = reader.ReadInt32(); int m_TangentSpace_size = reader.ReadInt32();
m_Normals = new float[m_TangentSpace_size * 3]; m_Normals = new float[m_TangentSpace_size * 3];
m_Tangents = new float[m_TangentSpace_size * 4];
for (int v = 0; v < m_TangentSpace_size; v++) for (int v = 0; v < m_TangentSpace_size; v++)
{ {
m_Normals[v * 3] = reader.ReadSingle(); m_Normals[v * 3] = reader.ReadSingle();
m_Normals[v * 3 + 1] = reader.ReadSingle(); m_Normals[v * 3 + 1] = reader.ReadSingle();
m_Normals[v * 3 + 2] = reader.ReadSingle(); m_Normals[v * 3 + 2] = reader.ReadSingle();
reader.Position += 16; //Vector3f tangent & float handedness m_Tangents[v * 3] = reader.ReadSingle();
m_Tangents[v * 3 + 1] = reader.ReadSingle();
m_Tangents[v * 3 + 2] = reader.ReadSingle();
m_Tangents[v * 3 + 3] = reader.ReadSingle(); //handedness
} }
} }
else //2.6.0 and later else //2.6.0 and later

View File

@ -131,6 +131,11 @@ namespace AssetStudio
return ReadArray(reader.ReadUInt32, reader.ReadInt32()); return ReadArray(reader.ReadUInt32, reader.ReadInt32());
} }
public static uint[] ReadUInt32Array(this BinaryReader reader, int length)
{
return ReadArray(reader.ReadUInt32, length);
}
public static float[] ReadSingleArray(this BinaryReader reader) public static float[] ReadSingleArray(this BinaryReader reader)
{ {
return ReadArray(reader.ReadSingle, reader.ReadInt32()); return ReadArray(reader.ReadSingle, reader.ReadInt32());

View File

@ -407,7 +407,7 @@ namespace AssetStudio
} }
//Morphs //Morphs
if (mesh.m_Shapes != null) if (mesh.m_Shapes?.channels != null)
{ {
foreach (var channel in mesh.m_Shapes.channels) foreach (var channel in mesh.m_Shapes.channels)
{ {