protected void WriteSubMesh( BinaryWriter writer, SubMesh subMesh )
{
// cache header location
long start_offset = writer.Seek( 0, SeekOrigin.Current );
// Header
WriteChunk( writer, MeshChunkID.SubMesh, 0 );
// Name
WriteString( writer, subMesh.MaterialName );
// useSharedVertices
WriteBool( writer, subMesh.useSharedVertices );
// indexCount
WriteUInt( writer, (uint)subMesh.indexData.indexCount );
// indexes32bit
bool indexes32bit = ( subMesh.indexData.indexBuffer.Type == IndexType.Size32 );
WriteBool( writer, indexes32bit );
IntPtr buf = subMesh.indexData.indexBuffer.Lock( BufferLocking.Discard );
try
{
if ( indexes32bit )
WriteInts( writer, subMesh.indexData.indexCount, buf );
else
WriteShorts( writer, subMesh.indexData.indexCount, buf );
}
finally
{
subMesh.indexData.indexBuffer.Unlock();
}
if ( !subMesh.useSharedVertices )
WriteGeometry( writer, subMesh.vertexData );
WriteSubMeshOperation( writer, subMesh );
Dictionary<int, List<VertexBoneAssignment>> weights = subMesh.BoneAssignmentList;
foreach ( int v in weights.Keys )
{
List<VertexBoneAssignment> vbaList = weights[ v ];
foreach ( VertexBoneAssignment vba in vbaList )
WriteSubMeshBoneAssignment( writer, vba );
}
// Write the texture alias (not currently supported)
long end_offset = writer.Seek( 0, SeekOrigin.Current );
writer.Seek( (int)start_offset, SeekOrigin.Begin );
WriteChunk( writer, MeshChunkID.SubMesh, (int)( end_offset - start_offset ) );
writer.Seek( (int)end_offset, SeekOrigin.Begin );
}