Axiom.Serialization.MeshSerializerImpl.ReadSubMesh C# (CSharp) Метод

ReadSubMesh() защищенный Метод

protected ReadSubMesh ( BinaryReader reader ) : void
reader System.IO.BinaryReader
Результат void
		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 );
			}
		}