void CMesh::SetupGLSurfaces(ProgramMap& shaders) { _glSurfaces.clear(); _glSurfaces.reserve(surfaces.size()); for (long i = 0; i < surfaces.size(); i++) { CGLSurface glSrf(surfaces[i]); // Shader program Surface * pSrf = &surfaces[i]; CGLProgram * program = PrgOverride(*pSrf); if (NULL != program) glSrf._program = program; else { ProgramMap::const_iterator shaderIt = shaders.find(std::string(pSrf->program_name)); if (shaderIt != shaders.end()) { glSrf._program = shaderIt->second; std::string surf_name(pSrf->name); m_Editors.push_back(new CEditor(surf_name + ": " + shaderIt->first, std::string(((*shaderIt->second).vs.GetLines() == NULL) ? "<Shader not loaded...>" : (*shaderIt->second).vs.GetLines()))); m_Editors.push_back(new CEditor(surf_name + ": " + shaderIt->first, std::string(((*shaderIt->second).fs.GetLines() == NULL) ? "<Shader not loaded...>" : (*shaderIt->second).fs.GetLines()))); } else { glSrf._program = &fixedFunc; Log::CLog::Write("CMesh::SetupGLSurfaces: WARNING: Could not find any suitable shader with name: %s\r\n", pSrf->program_name); } } _glSurfaces.push_back(glSrf); } }
const gl::ProgramPtr & GlUtils::getProgram(Resource vs, Resource fs) { typedef ShaderInfo<GL_VERTEX_SHADER> VShader; typedef ShaderInfo<GL_FRAGMENT_SHADER> FShader; typedef std::unordered_map<Resource, VShader> VMap; typedef std::unordered_map<Resource, FShader> FMap; static VMap vShaders; static FMap fShaders; typedef std::unordered_map<std::string, gl::ProgramPtr> ProgramMap; static ProgramMap programs; gl::shader_error lastError(0, "none"); VShader & vsi = vShaders[vs]; FShader & fsi = fShaders[fs]; std::string key = Resources::getResourcePath(vs) + ":" + Resources::getResourcePath(fs); try { bool relink = vsi.update(vs) | fsi.update(fs); if (relink || programs.end() == programs.find(key)) { std::cerr << "Relinking " + key << std::endl; programs[key] = gl::ProgramPtr(new gl::Program(vsi.shader, fsi.shader)); } } catch (const gl::shader_error & error) { lastError = error; } if (!programs[key]) { throw lastError; } const gl::ProgramPtr & ptr = programs[key]; //GL_CHECK_ERROR; return ptr; }
ProgramPtr Platform::getProgram(const string & vs, const string & fs) { typedef ShaderInfo<GL_VERTEX_SHADER> VShader; typedef ShaderInfo<GL_FRAGMENT_SHADER> FShader; typedef map<string, VShader> VMap; typedef map<string, FShader> FMap; static VMap vShaders; static FMap fShaders; VShader & vsi = vShaders[vs]; FShader & fsi = fShaders[fs]; bool relink = vsi.update(vs) | fsi.update(fs); typedef map<string, ProgramPtr> ProgramMap; string key = vs + ":" + fs; static ProgramMap programs; if (relink || programs.end() == programs.find(key)) { cerr << "Relinking " + key << endl; programs[key] = ProgramPtr(new Program(vsi.shader, fsi.shader)); } return programs[key]; }