Program * ProgramManager::AddProgram(const String &vertFileName, const String &fragFileName) { ProgramMapIterator it = mPrograms.find(vertFileName); if (it != mPrograms.end()) return (*it).second; InputStream *vertStream = FileSystem::GetPtr()->GetInputStream(vertFileName); if (!vertStream) { LogError("Unable to open vertex shader file %s", vertFileName); return NULL; } InputStream *fragStream = FileSystem::GetPtr()->GetInputStream(fragFileName); if (!fragStream) { LogError("Unable to open fragment shader file %s", fragFileName); return NULL; } Program *program = mGraphicsDevice->CreateProgram(vertFileName); if (!program->LoadShader(Program::ShaderType_Vertex, vertStream)) { LogError("Unable to load vertex shader %s", vertStream->GetFileName()); SafeDelete(program); return NULL; } if (!program->LoadShader(Program::ShaderType_Fragment, fragStream)) { LogError("Unable to load frag shader %s", fragStream->GetFileName()); SafeDelete(program); return NULL; } if (!program->Link()) { LogError("Unable to link program %s", vertStream->GetFileName()); SafeDelete(program); return NULL; } mPrograms[vertStream->GetFileName()] = program; return program; }