- } else {
- program = new Program;
- // Add vertex shaders, then fragment shaders
- PropertyList& pvec = pVertShaders;
- Shader::Type stype = Shader::VERTEX;
- for (int i = 0; i < 2; ++i) {
- for (PropertyList::iterator nameItr = pvec.begin(), e = pvec.end();
- nameItr != e;
- ++nameItr) {
- string shaderName = (*nameItr)->getStringValue();
- string fileName = osgDB::findDataFile(shaderName, options);
- if (fileName.empty())
- throw BuilderException(string("couldn't find shader ") +
- shaderName);
- ShaderKey skey(fileName, stype);
- ShaderMap::iterator sitr = shaderMap.find(skey);
- if (sitr != shaderMap.end()) {
- program->addShader(sitr->second.get());
- } else {
- ref_ptr<Shader> shader = new Shader(stype);
- if (shader->loadShaderSourceFromFile(fileName)) {
- program->addShader(shader.get());
- shaderMap.insert(ShaderMap::value_type(skey, shader));
- }
- }
+ pass->setAttributeAndModes(program);
+ return;
+ }
+ // The program wasn't in the map using the load path passed in with
+ // the options, but it might have already been loaded using a
+ // different load path i.e., its shaders were found in the fg data
+ // directory. So, resolve the shaders' file names and look in the
+ // resolvedProgramMap for a program using those shaders.
+ ProgramKey resolvedKey;
+ resolvedKey.attributes = prgKey.attributes;
+ BOOST_FOREACH(const ShaderKey& shaderKey, prgKey.shaders)
+ {
+ const string& shaderName = shaderKey.first;
+ Shader::Type stype = (Shader::Type)shaderKey.second;
+ string fileName = SGModelLib::findDataFile(shaderName, options);
+ if (fileName.empty())
+ throw BuilderException(string("couldn't find shader ") +
+ shaderName);
+ resolvedKey.shaders.push_back(ShaderKey(fileName, stype));
+ }
+ ProgramMap::iterator resitr = resolvedProgramMap.find(resolvedKey);
+ if (resitr != resolvedProgramMap.end()) {
+ program = resitr->second.get();
+ programMap.insert(ProgramMap::value_type(prgKey, program));
+ pass->setAttributeAndModes(program);
+ return;
+ }
+ program = new Program;
+ BOOST_FOREACH(const ShaderKey& skey, resolvedKey.shaders)
+ {
+ const string& fileName = skey.first;
+ Shader::Type stype = (Shader::Type)skey.second;
+ ShaderMap::iterator sitr = shaderMap.find(skey);
+ if (sitr != shaderMap.end()) {
+ program->addShader(sitr->second.get());
+ } else {
+ ref_ptr<Shader> shader = new Shader(stype);
+ shader->setName(fileName);
+ if (shader->loadShaderSourceFromFile(fileName)) {
+ program->addShader(shader.get());
+ shaderMap.insert(ShaderMap::value_type(skey, shader));