Build indices for entire mesh

This commit is contained in:
ackwell 2023-12-31 15:33:37 +11:00
parent f7a2c17415
commit 309f0351fa

View file

@ -67,6 +67,7 @@ public sealed class MeshConverter
private IMeshBuilder<MaterialBuilder>[] BuildMesh() private IMeshBuilder<MaterialBuilder>[] BuildMesh()
{ {
var indices = BuildIndices();
var vertices = BuildVertices(); var vertices = BuildVertices();
// TODO: handle submeshCount = 0 // TODO: handle submeshCount = 0
@ -74,13 +75,14 @@ public sealed class MeshConverter
return _mdl.SubMeshes return _mdl.SubMeshes
.Skip(Mesh.SubMeshIndex) .Skip(Mesh.SubMeshIndex)
.Take(Mesh.SubMeshCount) .Take(Mesh.SubMeshCount)
.Select(submesh => BuildSubMesh(submesh, vertices)) .Select(submesh => BuildSubMesh(submesh, indices, vertices))
.ToArray(); .ToArray();
} }
private IMeshBuilder<MaterialBuilder> BuildSubMesh(MdlStructs.SubmeshStruct submesh, IReadOnlyList<IVertexBuilder> vertices) private IMeshBuilder<MaterialBuilder> BuildSubMesh(MdlStructs.SubmeshStruct submesh, IReadOnlyList<ushort> indices, IReadOnlyList<IVertexBuilder> vertices)
{ {
var indices = BuildIndices(submesh); // Index indices are specified relative to the LOD's 0, but we're reading chunks for each mesh.
var startIndex = (int)(submesh.IndexOffset - Mesh.StartIndex);
var meshBuilderType = typeof(MeshBuilder<,,,>).MakeGenericType( var meshBuilderType = typeof(MeshBuilder<,,,>).MakeGenericType(
typeof(MaterialBuilder), typeof(MaterialBuilder),
@ -102,19 +104,19 @@ public sealed class MeshConverter
// TODO: split by submeshes // TODO: split by submeshes
for (var indexOffset = 0; indexOffset < submesh.IndexCount; indexOffset += 3) for (var indexOffset = 0; indexOffset < submesh.IndexCount; indexOffset += 3)
primitiveBuilder.AddTriangle( primitiveBuilder.AddTriangle(
vertices[indices[indexOffset + 0]], vertices[indices[indexOffset + startIndex + 0]],
vertices[indices[indexOffset + 1]], vertices[indices[indexOffset + startIndex + 1]],
vertices[indices[indexOffset + 2]] vertices[indices[indexOffset + startIndex + 2]]
); );
return meshBuilder; return meshBuilder;
} }
private IReadOnlyList<ushort> BuildIndices(MdlStructs.SubmeshStruct submesh) private IReadOnlyList<ushort> BuildIndices()
{ {
var reader = new BinaryReader(new MemoryStream(_mdl.RemainingData)); var reader = new BinaryReader(new MemoryStream(_mdl.RemainingData));
reader.Seek(_mdl.IndexOffset[_lod] + submesh.IndexOffset * sizeof(ushort)); reader.Seek(_mdl.IndexOffset[_lod] + Mesh.StartIndex * sizeof(ushort));
return reader.ReadStructuresAsArray<ushort>((int)submesh.IndexCount); return reader.ReadStructuresAsArray<ushort>((int)Mesh.IndexCount);
} }
private IReadOnlyList<IVertexBuilder> BuildVertices() private IReadOnlyList<IVertexBuilder> BuildVertices()