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; }