VertexShader<RS>* ShaderManager<RS>::getVertexShader(const String& file, const String& function, const Vertex* p) { VertexShader<RS>* out = 0; auto f = vShaders.find(file); if(f != vShaders.end()) { auto fn = (*f).second.find(function); if(fn != (*f).second.end()) { out = (*fn).second; } else { out = new VertexShader<RS>(); if(p) out->associateVertex(*p); try { out->Shader::init(file, function); vShaders[file][function] = out; } catch(DeviceFailureException e) { LOG(e.what()); out->destroy(); out = vShaders[Defaults::mapName][Defaults::mapName]; } } } else { vShaders[file] = HashMap<String,VertexShader<RS>*>(); out = new VertexShader<RS>(); if(p) out->associateVertex(*p); try { out->Shader::init(file, function); vShaders[file][function] = out; } catch(DeviceFailureException e) { LOG(e.what()); out->destroy(); out = vShaders[Defaults::mapName][Defaults::mapName]; } } return out; }