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