Skip to content

Commit 213b76b

Browse files
Good speed-up on MdlVertexReader as well
1 parent 2bcb964 commit 213b76b

File tree

2 files changed

+16
-29
lines changed

2 files changed

+16
-29
lines changed

xivModdingFramework/Models/FileTypes/Mdl.cs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,6 @@ public static async Task<XivMdl> GetXivMdl(string mdlPath, bool getOriginal = fa
348348

349349
public static XivMdl GetXivMdl(byte[] mdlData, string mdlPath = "")
350350
{
351-
352351
var xivMdl = new XivMdl { MdlPath = mdlPath };
353352
int totalNonNullMaterials = 0;
354353
var getShapeData = true;
@@ -1019,7 +1018,7 @@ public static XivMdl GetXivMdl(byte[] mdlData, string mdlPath = "")
10191018
}
10201019

10211020

1022-
var lodNum = 0;
1021+
var lodNum = 0;
10231022
var totalMeshNum = 0;
10241023
foreach (var lod in xivMdl.LoDList)
10251024
{
@@ -1031,16 +1030,12 @@ public static XivMdl GetXivMdl(byte[] mdlData, string mdlPath = "")
10311030
{
10321031
throw new Exception("Failed to parse some meshes in previous LoD level.");
10331032
}
1034-
1035-
// Seek to the start of the LoD.
1036-
br.BaseStream.Seek(lod.VertexDataOffset, SeekOrigin.Begin);
1037-
var LoDStart = br.BaseStream.Position;
10381033

10391034
var mIdx = 0;
10401035

10411036
foreach (var meshData in meshDataList)
10421037
{
1043-
MdlVertexReader.ReadVertexData(br, meshData, lod.VertexDataOffset, lod.IndexDataOffset);
1038+
MdlVertexReader.ReadVertexData(mdlData, meshData, lod.VertexDataOffset, lod.IndexDataOffset);
10441039

10451040
mIdx++;
10461041
totalMeshNum++;

xivModdingFramework/Models/FileTypes/MdlVertexReader.cs

Lines changed: 14 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace xivModdingFramework.Models.FileTypes
1313
{
1414
internal static class MdlVertexReader
1515
{
16-
public static void ReadVertexData(BinaryReader br, MeshData meshData, int lodVertexOffset, int lodIndexOffset)
16+
public static void ReadVertexData(byte[] mdlData, MeshData meshData, int lodVertexOffset, int lodIndexOffset)
1717
{
1818
var vertexData = new VertexData();
1919

@@ -24,45 +24,37 @@ public static void ReadVertexData(BinaryReader br, MeshData meshData, int lodVer
2424
var block1Offset = meshData.MeshInfo.VertexDataOffset1 + lodVertexOffset;
2525
var indexOffset = (meshData.MeshInfo.IndexDataOffset * 2) + lodIndexOffset;
2626

27-
br.BaseStream.Seek(block0Offset, SeekOrigin.Begin);
28-
var block0Sorted = info.Where(x => x.DataBlock == 0).OrderBy(x => x.DataOffset);
29-
for(int i = 0; i < vertexCount; i++)
27+
var block0Sorted = info.Where(x => x.DataBlock == 0).OrderBy(x => x.DataOffset).ToList();
28+
var block1Sorted = info.Where(x => x.DataBlock == 1).OrderBy(x => x.DataOffset).ToList();
29+
30+
var block0Reader = new BinaryReader(new MemoryStream(mdlData, block0Offset, vertexCount * meshData.MeshInfo.VertexDataEntrySize0));
31+
for (int i = 0; i < vertexCount; i++)
3032
{
31-
foreach(var entry in block0Sorted)
33+
foreach (var entry in block0Sorted)
3234
{
33-
ReadData(vertexData, br, entry.DataUsage, entry.DataType, entry.Count);
35+
ReadData(vertexData, block0Reader, entry.DataUsage, entry.DataType, entry.Count);
3436
}
3537
}
3638

37-
if(br.BaseStream.Position != block0Offset + (vertexCount * meshData.MeshInfo.VertexDataEntrySize0))
38-
{
39+
if (block0Reader.BaseStream.Position != block0Reader.BaseStream.Length)
3940
throw new InvalidDataException("Vertex Data Size Mismatch. Some part(s) of the vertex data in stream 0 were not read properly.");
40-
}
4141

42-
br.BaseStream.Seek(block1Offset, SeekOrigin.Begin);
43-
var block1Sorted = info.Where(x => x.DataBlock == 1).OrderBy(x => x.DataOffset);
42+
var block1Reader = new BinaryReader(new MemoryStream(mdlData, block1Offset, vertexCount * meshData.MeshInfo.VertexDataEntrySize1));
4443
for (int i = 0; i < vertexCount; i++)
4544
{
4645
foreach (var entry in block1Sorted)
4746
{
48-
ReadData(vertexData, br, entry.DataUsage, entry.DataType, entry.Count);
47+
ReadData(vertexData, block1Reader, entry.DataUsage, entry.DataType, entry.Count);
4948
}
5049
}
5150

52-
if (br.BaseStream.Position != block1Offset + (vertexCount * meshData.MeshInfo.VertexDataEntrySize1))
53-
{
51+
if (block1Reader.BaseStream.Position != block1Reader.BaseStream.Length)
5452
throw new InvalidDataException("Vertex Data Size Mismatch. Some part(s) of the vertex data in stream 1 were not read properly.");
55-
}
5653

57-
br.BaseStream.Seek(indexOffset, SeekOrigin.Begin);
54+
var indexReader = new BinaryReader(new MemoryStream(mdlData, indexOffset, indexCount * 2));
5855
for (var i = 0; i < indexCount; i++)
5956
{
60-
vertexData.Indices.Add(br.ReadUInt16());
61-
}
62-
63-
if (br.BaseStream.Position != indexOffset + (indexCount * 2))
64-
{
65-
throw new InvalidDataException("Index Size Mismatch. Some part(s) of the index data were not read properly.");
57+
vertexData.Indices.Add(indexReader.ReadUInt16());
6658
}
6759

6860
meshData.VertexData = vertexData;

0 commit comments

Comments
 (0)