protected void WriteMesh( BinaryWriter writer )
{
// cache header location
long start_offset = writer.Seek( 0, SeekOrigin.Current );
// Header
WriteChunk( writer, MeshChunkID.Mesh, 0 );
// bool skeletallyAnimated
WriteBool( writer, mesh.HasSkeleton );
// Write shared geometry
if ( mesh.SharedVertexData != null )
{
WriteGeometry( writer, mesh.SharedVertexData );
}
// Write Submeshes
for ( int i = 0; i < mesh.SubMeshCount; ++i )
{
SubMesh subMesh = mesh.GetSubMesh( i );
LogManager.Instance.Write( "Writing submesh {0} ...", subMesh.Name );
WriteSubMesh( writer, subMesh );
LogManager.Instance.Write( "Submesh exported." );
}
// Write skeleton info if required
if ( mesh.Skeleton != null )
{
// Write skeleton link
LogManager.Instance.Write( "Exporting skeleton link..." );
WriteSkeletonLink( writer );
LogManager.Instance.Write( "Skeleton link exported." );
// Write bone assignments
LogManager.Instance.Write( "Exporting shared geometry bone assignments..." );
Dictionary<int, List<VertexBoneAssignment>> weights = mesh.BoneAssignmentList;
foreach ( int v in weights.Keys )
{
List<VertexBoneAssignment> vbaList = weights[ v ];
foreach ( VertexBoneAssignment vba in vbaList )
WriteMeshBoneAssignment( writer, vba );
}
LogManager.Instance.Write( "Shared geometry bone assignments exported." );
}
// Write LOD data if any
if ( mesh.LodLevelCount > 1 )
{
LogManager.Instance.Write( "Exporting LOD information..." );
this.WriteMeshLodInfo( writer );
LogManager.Instance.Write( "LOD information exported." );
}
// Write Bounds information
LogManager.Instance.Write( "Exporting bounds Information..." );
WriteMeshBounds( writer );
LogManager.Instance.Write( "Bounds information exported." );
// Write submesh name table
LogManager.Instance.Write( "Exporting submesh name table..." );
WriteSubMeshNameTable( writer );
LogManager.Instance.Write( "Submesh name table exported." );
// Write edge lists
LogManager.Instance.Write( "Exporting edge lists..." );
//WriteEdgeLists( writer );
LogManager.Instance.Write( "Edge lists exported." );
//Write morph animation
LogManager.Instance.Write( "Exporting morph animations..." );
if ( mesh.PoseList.Count > 0 )
WritePoses( writer );
if ( mesh.HasVertexAnimation )
WriteAnimations( writer );
LogManager.Instance.Write( "Morph animations exported." );
// Write submesh extremes
LogManager.Instance.Write( "Exporting submesh extremes..." );
//WriteExtremes( writer );
LogManager.Instance.Write( "Submesh extremes information exported." );
// Write Attachment Points
LogManager.Instance.Write( "Exporting attachment points..." );
foreach ( AttachmentPoint ap in mesh.AttachmentPoints )
WriteAttachmentPoint( writer, ap );
LogManager.Instance.Write( "Attachment points exported." );
// Some ending stuff...
long end_offset = writer.Seek( 0, SeekOrigin.Current );
writer.Seek( (int)start_offset, SeekOrigin.Begin );
WriteChunk( writer, MeshChunkID.Mesh, (int)( end_offset - start_offset ) );
writer.Seek( (int)end_offset, SeekOrigin.Begin );
}