osgDB/Registry.cpp
ReaderWriter::ReadResult Registry::read(const ReadFunctor& readFunctor){
...
std::string libraryName = createLibraryNameForFile(readFunctor._filename);
if (loadLibrary(libraryName)!=NOT_LOADED)
{
for(;itr.valid();++itr)
{
ReaderWriter::ReadResult rr = readFunctor.doRead(*itr);
if (readFunctor.isValid(rr)) return rr;
else results.push_back(rr);
}
}
...
}
createLibraryNameForFile会根据文件扩展名加载相应的插件动态链接库,这里的文件扩展名就是.earth,那么他所对应的插件动态链接库就是osgPlugins-3.6.3/osgdb_earthd.dll,该动态库加载后,会执行动态库中的注册代码:
osgEarthDrivers/earth/ReaderWriterOsgEarth.cpp
REGISTER_OSGPLUGIN(earth, ReaderWriterEarth)
osgDB/Registry
#define REGISTER_OSGPLUGIN(ext, classname) \
extern "C" void osgdb_##ext(void) {} \
static osgDB::RegisterReade