protected virtual void ReadSubMesh( BinaryReader reader )
{
MeshChunkID chunkID;
SubMesh subMesh = mesh.CreateSubMesh();
// get the material name
string materialName = ReadString( reader );
MeshManager.Instance.FireProcessMaterialName( this.mesh, materialName );
subMesh.MaterialName = materialName;
// use shared vertices?
subMesh.useSharedVertices = ReadBool( reader );
subMesh.indexData.indexStart = 0;
subMesh.indexData.indexCount = ReadInt( reader );
// does this use 32 bit index buffer
bool idx32bit = ReadBool( reader );
HardwareIndexBuffer idxBuffer = null;
if ( idx32bit )
{
// create the index buffer
idxBuffer =
HardwareBufferManager.Instance.
CreateIndexBuffer(
IndexType.Size32,
subMesh.indexData.indexCount,
mesh.IndexBufferUsage,
mesh.UseIndexShadowBuffer );
IntPtr indices = idxBuffer.Lock( BufferLocking.Discard );
// read the ints into the buffer data
ReadInts( reader, subMesh.indexData.indexCount, indices );
// unlock the buffer to commit
idxBuffer.Unlock();
}
else
{ // 16-bit
// create the index buffer
idxBuffer =
HardwareBufferManager.Instance.
CreateIndexBuffer(
IndexType.Size16,
subMesh.indexData.indexCount,
mesh.IndexBufferUsage,
mesh.UseIndexShadowBuffer );
IntPtr indices = idxBuffer.Lock( BufferLocking.Discard );
// read the shorts into the buffer data
ReadShorts( reader, subMesh.indexData.indexCount, indices );
idxBuffer.Unlock();
}
// save the index buffer
subMesh.indexData.indexBuffer = idxBuffer;
// Geometry chunk (optional, only present if useSharedVertices = false)
if ( !subMesh.useSharedVertices )
{
chunkID = ReadChunk( reader );
if ( chunkID != MeshChunkID.Geometry )
{
throw new AxiomException( "Missing geometry data in mesh file." );
}
subMesh.vertexData = new VertexData();
// read the geometry data
ReadGeometry( reader, subMesh.vertexData );
}
// get the next chunkID
chunkID = ReadChunk( reader );
// walk through all the bone assignments for this submesh
while ( !IsEOF( reader ) &&
( chunkID == MeshChunkID.SubMeshBoneAssignment ||
chunkID == MeshChunkID.SubMeshOperation ) )
{
switch ( chunkID )
{
case MeshChunkID.SubMeshBoneAssignment:
ReadSubMeshBoneAssignment( reader, subMesh );
break;
case MeshChunkID.SubMeshOperation:
ReadSubMeshOperation( reader, subMesh );
break;
}
// read the next chunkID
if ( !IsEOF( reader ) )
{
chunkID = ReadChunk( reader );
}
} // while
// walk back to the beginning of the last chunk ID read since
// we already moved past it and it wasnt of interest to us
if ( !IsEOF( reader ) )
{
Seek( reader, -ChunkOverheadSize );
}
}