Exemplo n.º 1
0
//////////////////////////////////////////////////////////////////////////
// splitIntoBonePalettes
std::vector< MdlMesh >& MdlMesh::splitIntoBonePalettes( BcU32 PaletteSize )
{
	// Empty current submeshes.
	SubMeshes_.clear();

	// Build a triangle array.
	MdlTriangleArray Triangles;
	BcU32 NoofTriangles = aIndices_.size() / 3;
	Triangles.reserve( NoofTriangles );
	for( BcU32 Idx = 0; Idx < NoofTriangles; ++Idx )
	{
		BcU32 StartIndex = Idx * 3;
		MdlTriangle Triangle = 
		{
			aVertices_[ aIndices_[ StartIndex + 0 ].iVertex_ ],
			aVertices_[ aIndices_[ StartIndex + 1 ].iVertex_ ],
			aVertices_[ aIndices_[ StartIndex + 2 ].iVertex_ ]
		};
		Triangles.push_back( Triangle );
	}

	while( Triangles.size() > 0 )
	{
		MdlBonePalette NewBonePalette( PaletteSize );
		MdlTriangleArray NewTriangles;
		NewTriangles.reserve( Triangles.size() );

		// Iterate over triangles, and add them to the bone palette if possible.
		for( MdlTriangleArray::iterator It( Triangles.begin() ); It != Triangles.end(); )
		{
			MdlTriangle& Triangle = (*It);

			// If we can add it, add it to the new triangles array + erase it.
			if( NewBonePalette.addTriangle( Triangle ) )
			{
				NewTriangles.push_back( Triangle );
				It = Triangles.erase( It );
			}
			else
			{
				++It;
			}
		}

		// Construct a new mesh for the triangles.
		MdlMesh NewMesh;
		NewMesh.bonePalette( NewBonePalette );

		// Add materials.
		BcAssert( aMaterials_.size() == 1 );
		for( BcU32 Idx = 0; Idx < aMaterials_.size(); ++Idx )
		{
			NewMesh.addMaterial( aMaterials_[ Idx ] );
		}

		// Add triangles.
		for( BcU32 Idx = 0; Idx < NewTriangles.size(); ++Idx )
		{
			const MdlTriangle& Triangle( NewTriangles[ Idx ] );
			
			for( BcU32 VertIdx = 0; VertIdx < 3; ++VertIdx )
			{
				MdlIndex Index;
				Index.iVertex_ = NewMesh.addVertexShared( Triangle.Vertex_[ VertIdx ] );
				Index.iMaterial_ = 0;
				NewMesh.addIndex( Index );
			}
		}

		BcAssert( NewMesh.findBoneCount() <= PaletteSize );

		SubMeshes_.push_back( NewMesh );
	}
	
	return SubMeshes_;
}