Program::Pointer ProgramFactory::loadProgram(const std::string& file, ObjectsCache& cache, const StringList& defines) { auto cachedPrograms = cache.findObjects(file); for (Program::Pointer cached : cachedPrograms) { if (cached.valid()) { if (cached->defines().size() == defines.size()) { bool same = true; for (auto& inDefine : defines) { for (auto& cDefine : cached->defines()) { if (inDefine != cDefine) { same = false; break; } if (!same) break; } } if (same) return cached; } } } std::string vertex_shader; std::string geom_shader; std::string frag_shader; StringList sourceFiles = loadProgramSources(file, vertex_shader, geom_shader, frag_shader); if (sourceFiles.empty()) return Program::Pointer::create(renderContext()); std::string workFolder = getFilePath(file); parseSourceCode(ShaderType_Vertex, vertex_shader, defines, workFolder); parseSourceCode(ShaderType_Geometry, geom_shader, defines, workFolder); parseSourceCode(ShaderType_Fragment, frag_shader, defines, workFolder); Program::Pointer program = Program::Pointer::create(renderContext(), vertex_shader, geom_shader, frag_shader, getFileName(file), file, defines); for (auto& s : sourceFiles) program->addOrigin(s); cache.manage(program, _private->loader); return program; }