示例#1
0
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;
}