@@ -13,7 +13,7 @@ namespace xivModdingFramework.Models.FileTypes
13
13
{
14
14
internal static class MdlVertexReader
15
15
{
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 )
17
17
{
18
18
var vertexData = new VertexData ( ) ;
19
19
@@ -24,45 +24,37 @@ public static void ReadVertexData(BinaryReader br, MeshData meshData, int lodVer
24
24
var block1Offset = meshData . MeshInfo . VertexDataOffset1 + lodVertexOffset ;
25
25
var indexOffset = ( meshData . MeshInfo . IndexDataOffset * 2 ) + lodIndexOffset ;
26
26
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 ++ )
30
32
{
31
- foreach ( var entry in block0Sorted )
33
+ foreach ( var entry in block0Sorted )
32
34
{
33
- ReadData ( vertexData , br , entry . DataUsage , entry . DataType , entry . Count ) ;
35
+ ReadData ( vertexData , block0Reader , entry . DataUsage , entry . DataType , entry . Count ) ;
34
36
}
35
37
}
36
38
37
- if ( br . BaseStream . Position != block0Offset + ( vertexCount * meshData . MeshInfo . VertexDataEntrySize0 ) )
38
- {
39
+ if ( block0Reader . BaseStream . Position != block0Reader . BaseStream . Length )
39
40
throw new InvalidDataException ( "Vertex Data Size Mismatch. Some part(s) of the vertex data in stream 0 were not read properly." ) ;
40
- }
41
41
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 ) ) ;
44
43
for ( int i = 0 ; i < vertexCount ; i ++ )
45
44
{
46
45
foreach ( var entry in block1Sorted )
47
46
{
48
- ReadData ( vertexData , br , entry . DataUsage , entry . DataType , entry . Count ) ;
47
+ ReadData ( vertexData , block1Reader , entry . DataUsage , entry . DataType , entry . Count ) ;
49
48
}
50
49
}
51
50
52
- if ( br . BaseStream . Position != block1Offset + ( vertexCount * meshData . MeshInfo . VertexDataEntrySize1 ) )
53
- {
51
+ if ( block1Reader . BaseStream . Position != block1Reader . BaseStream . Length )
54
52
throw new InvalidDataException ( "Vertex Data Size Mismatch. Some part(s) of the vertex data in stream 1 were not read properly." ) ;
55
- }
56
53
57
- br . BaseStream . Seek ( indexOffset , SeekOrigin . Begin ) ;
54
+ var indexReader = new BinaryReader ( new MemoryStream ( mdlData , indexOffset , indexCount * 2 ) ) ;
58
55
for ( var i = 0 ; i < indexCount ; i ++ )
59
56
{
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 ( ) ) ;
66
58
}
67
59
68
60
meshData . VertexData = vertexData ;
0 commit comments