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; }
void ShaderManager<RS>::init() { //construct safe default shader VertexShader<RS>* dv = 0; FragmentShader<RS>* df = 0; dv = new VertexShader<RS>(); df = new FragmentShader<RS>(); Vertex def; def.addVector3("POSITION"); def.finalize(); dv->associateVertex(def); if(RS == RS_DX11) { dv->initFromDef(Defaults::shaderDefDX, Defaults::vertexFunc); df->initFromDef(Defaults::shaderDefDX, Defaults::fragmentFunc); } else { dv->initFromDef(Defaults::shaderDefGL, Defaults::vertexFunc); df->initFromDef(Defaults::shaderDefGL, Defaults::fragmentFunc); } vShaders[Defaults::mapName][Defaults::mapName] = dv; fShaders[Defaults::mapName][Defaults::mapName] = df; }