uint ParseConstants( CXMLElement * pBranch, TUniform ** ppUniforms ) { const size_t nUniformCount = pBranch->GetNumAttrs(); //pShader->m_nUniformCount = pBranch->GetNumAttrs(); if ( 0 == nUniformCount ) return 0; (*ppUniforms) = NEW TUniform [ nUniformCount ]; if ( NULL == (*ppUniforms) ) return 0; for ( size_t n = 0; n < nUniformCount; ++n ) { const CXMLAttr * pAttr = pBranch->GetAttr( n ); CStr sType( pAttr->GetValue() ); const char * szArray = strstr( sType.GetString(), " [" ); TUniform * pUnfm = (*ppUniforms) + n; if ( szArray ) { CStr sCount = szArray + 2; // skip " [" substring sCount.Cut( sCount.GetSize() - 1 ); // cutoff ending ']' symbol pointer nOffset = szArray - sType.GetString() + 1; sType.Cut( nOffset ); // cutoff [##] string pUnfm->nCount= atoi( sCount ); } else { pUnfm->nCount = 1; /* switch ( pShader->m_pUniforms[ n ].eType ) { case TYPE_VEC4: pShader->m_pUniforms[ n ].nCount = 1; break; case TYPE_MAT4: pShader->m_pUniforms[ n ].nCount = 4; break; default: DEBUG_ASSERT( !"unexpected type" ); pShader->m_pUniforms[ n ].nCount = 0; } */ } pUnfm->sName = pAttr->GetName(); pUnfm->eType = g_pSystem->GetType( sType.GetString() ); //pUnfm->nLoc = pShader->GetUniformLoc( pUnfm->sName ); } return nUniformCount; }