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;
    }