FPS_UINT32 MaterialManager::CreateShader( const MATERIAL_SHADER &p_ShaderInfo, std::list< std::string > &p_ShaderParameters, MD5_DIGEST &p_ShaderDigest ) { Shader *pMaterialShader = new Shader( ); if( p_ShaderInfo.Types & SHADER_TYPE_VERTEX ) { if( pMaterialShader->CreateShaderFromSource( p_ShaderInfo.VertexSource, SHADER_TYPE_VERTEX, p_ShaderInfo.VertexFile ) != FPS_OK ) { std::cout << "[FPS::MaterialManager::CreateShader] <ERROR> " "Failed to compile the vertex shader" << std::endl; return FPS_FAIL; } } if( p_ShaderInfo.Types & SHADER_TYPE_FRAGMENT ) { if( pMaterialShader->CreateShaderFromSource( p_ShaderInfo.FragmentSource, SHADER_TYPE_FRAGMENT, p_ShaderInfo.FragmentFile ) != FPS_OK ) { std::cout << "[FPS::MaterialManager::CreateShader] <ERROR> " "Failed to compile the vertex shader" << std::endl; return FPS_FAIL; } } if( p_ShaderInfo.Types & SHADER_TYPE_GEOMETRY ) { if( pMaterialShader->CreateShaderFromSource( p_ShaderInfo.GeometrySource, SHADER_TYPE_GEOMETRY, p_ShaderInfo.GeometryFile ) != FPS_OK ) { std::cout << "[FPS::MaterialManager::CreateShader] <ERROR> " "Failed to compile the vertex shader" << std::endl; return FPS_FAIL; } } pMaterialShader->GetShaderParameters( p_ShaderParameters ); pMaterialShader->Link( ); pMaterialShader->GetDigest( p_ShaderDigest ); std::pair< std::map< MD5_DIGEST, Shader * >::iterator, bool > ShaderMapResult; ShaderMapResult = m_Shaders.insert( std::pair< MD5_DIGEST, Shader * >( p_ShaderDigest, pMaterialShader ) ); if( ShaderMapResult.second == false ) { // The shader wasn't added, so delete it std::cout << "[FPS::MaterialManager::CreateShader] <INFO> " "Duplicate shader detected, not adding" << std::endl; SafeDelete< Shader >( pMaterialShader ); } return FPS_OK; }