protected virtual void ReadMesh( BinaryReader reader )
{
MeshChunkID chunkID;
// Never automatically build edge lists for this version
// expect them in the file or not at all
mesh.AutoBuildEdgeLists = false;
// is this mesh animated?
isSkeletallyAnimated = ReadBool( reader );
// find all sub chunks
if ( !IsEOF( reader ) )
{
chunkID = ReadChunk( reader );
while ( !IsEOF( reader ) &&
( chunkID == MeshChunkID.Geometry ||
chunkID == MeshChunkID.SubMesh ||
chunkID == MeshChunkID.MeshSkeletonLink ||
chunkID == MeshChunkID.MeshBoneAssignment ||
chunkID == MeshChunkID.MeshLOD ||
chunkID == MeshChunkID.MeshBounds ||
chunkID == MeshChunkID.SubMeshNameTable ||
chunkID == MeshChunkID.EdgeLists ||
chunkID == MeshChunkID.Poses ||
chunkID == MeshChunkID.Animations ||
//chunkID == MeshChunkID.TableExtremes ||
chunkID == MeshChunkID.AttachmentPoint ) )
{
switch ( chunkID )
{
case MeshChunkID.Geometry:
mesh.SharedVertexData = new VertexData();
// read geometry into shared vertex data
ReadGeometry( reader, mesh.SharedVertexData );
// TODO: trap errors here
break;
case MeshChunkID.SubMesh:
// read the sub mesh data
ReadSubMesh( reader );
break;
case MeshChunkID.MeshSkeletonLink:
// read skeleton link
ReadSkeletonLink( reader );
break;
case MeshChunkID.MeshBoneAssignment:
// read mesh bone assignments
ReadMeshBoneAssignment( reader );
break;
case MeshChunkID.MeshLOD:
// Handle meshes with LOD
ReadMeshLodInfo( reader );
break;
case MeshChunkID.MeshBounds:
// read the pre-calculated bounding information
ReadBoundsInfo( reader );
break;
case MeshChunkID.SubMeshNameTable:
ReadSubMeshNameTable( reader );
break;
case MeshChunkID.EdgeLists:
ReadEdgeList( reader );
break;
case MeshChunkID.Poses:
ReadPoses( reader );
break;
case MeshChunkID.Animations:
ReadAnimations( reader );
break;
//case MeshChunkID.TableExtremes:
// ReadExtremes( reader );
// break;
case MeshChunkID.AttachmentPoint:
ReadAttachmentPoint( reader );
break;
} // switch
// grab the next chunk
if ( !IsEOF( reader ) )
{
chunkID = ReadChunk( reader );
}
} // while
// backpedal to the start of the chunk
if ( !IsEOF( reader ) )
{
Seek( reader, -ChunkOverheadSize );
}
}
}