//////////////////////////////////////////////////////////////// // // CEffectTemplateImpl::CloneD3DEffect // // Clone the d3d effect // //////////////////////////////////////////////////////////////// ID3DXEffect* CEffectTemplateImpl::CloneD3DEffect ( SString& strOutStatus, bool& bOutUsesVertexShader, bool& bOutUsesDepthBuffer ) { // Clone D3DXEffect ID3DXEffect* pNewD3DEffect = NULL; LPDIRECT3DDEVICE9 pDevice = NULL; m_pD3DEffect->GetDevice ( &pDevice ); m_pD3DEffect->CloneEffect ( pDevice, &pNewD3DEffect ); if ( !pNewD3DEffect ) return NULL; // Set the same technique { D3DXHANDLE hTechnique = m_pD3DEffect->GetCurrentTechnique (); D3DXTECHNIQUE_DESC TechniqueDesc; m_pD3DEffect->GetTechniqueDesc( hTechnique, &TechniqueDesc ); pNewD3DEffect->SetTechnique ( pNewD3DEffect->GetTechniqueByName ( TechniqueDesc.Name ) ); // Output technique name strOutStatus = TechniqueDesc.Name; } // Check if any technique uses a vertex shader bOutUsesVertexShader = false; D3DXEFFECT_DESC EffectDesc; m_pD3DEffect->GetDesc ( &EffectDesc ); for ( uint i = 0 ; i < EffectDesc.Techniques ; i++ ) { D3DXHANDLE hTechnique = m_pD3DEffect->GetTechnique ( i ); D3DXTECHNIQUE_DESC TechniqueDesc; m_pD3DEffect->GetTechniqueDesc( hTechnique, &TechniqueDesc ); for ( uint i = 0 ; i < TechniqueDesc.Passes ; i++ ) { D3DXPASS_DESC PassDesc; m_pD3DEffect->GetPassDesc ( m_pD3DEffect->GetPass ( hTechnique, i ), &PassDesc ); if ( PassDesc.pVertexShaderFunction ) bOutUsesVertexShader = true; } } bOutUsesDepthBuffer = m_bUsesDepthBuffer; // Add to list of clones assert ( !MapContains ( m_CloneList, pNewD3DEffect ) ); MapInsert ( m_CloneList, pNewD3DEffect ); return pNewD3DEffect; }