Example #1
0
bool CModel::LoadMaterial( CXMLElement * pMaterial )
{
    CXMLAttr *		pNameAttr	= pMaterial->GetAttr( "Name" );
    const char *	szMatName	= ( NULL != pNameAttr ) ? pNameAttr->GetValue() : NULL;

    CXMLAttr *		pShader		= pMaterial->GetAttr( "Shader" );
    const char *	szShader	= ( NULL != pShader ) ? pShader->GetValue() : NULL;

    if ( !szMatName )
    {
        DEBUG_ASSERT( !"No material name!" );
        return false;
    }

    // Пробигаем по всем объектам модели, пытаемся найти
    // нужный материал по имени ( szName )
    //for ( uint n = 0; n < m_nNumObjects; ++n )
    {
        //CObject &	pObj	= m_pObjects[ n ];
        IMesh *		pMesh	= (IMesh *)m_pShape;

        IMaterial * pNewMaterial = g_pEngine->CreateMaterial();

        if ( !pNewMaterial )
        {
            // Ошибка выделения памяти
            return false;
        }

        m_pMaterial = pNewMaterial;
        pNewMaterial->SetShader( g_pRenderer->GetShader( szShader ) );

        for ( uint n = 0; n < pMesh->GetSurfCount(); ++n )
        {
            IMaterial *	pSubMat = NULL;

            if ( CStr::Compare( szMatName, pMesh->GetSurfName( n ) ) )
            {
                pSubMat = g_pEngine->CreateMaterial();

                if ( pSubMat )
                {
                    //pSubMat->SetShader( g_pRenderer->GetShader( szShader ) );
                    pSubMat->SetShader( g_pRenderer->GetShader( MESH_SHADER ) );
                }
            }

            pNewMaterial->AddSubMaterial( pSubMat );
        }

        DEBUG_ASSERT( pNewMaterial->GetSubCount() == pMesh->GetSurfCount() );
    }

    return true;
}