1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2024-12-28 00:15:06 +00:00

Yet another osgpluginchecker rewrite

It turns out that it's possible for OSG plugins to be spread across multiple directories, and OSG doesn't account for this in osgDB::listAllAvailablePlugins(), even though it works when actually loading the plugin.

Instead, use code that's much more similar to how OSG actually loads plugin, and therefore less likely to miss anything.

Incidentally make things much simpler as we don't need  awkwardness from working around osgDB::listAllAvailablePlugins()'s limitations.
This commit is contained in:
AnyOldName3 2024-03-12 23:30:11 +00:00
parent 0730dc2ebb
commit 942eeb54c1

View File

@ -35,50 +35,14 @@ namespace Misc
bool checkRequiredOSGPluginsArePresent()
{
// work around osgDB::listAllAvailablePlugins() not working on some platforms due to a suspected OSG bug
std::filesystem::path pluginDirectoryName = std::string("osgPlugins-") + std::string(osgGetVersion());
osgDB::FilePathList& filepath = osgDB::getLibraryFilePathList();
for (const auto& path : filepath)
{
#ifdef OSG_USE_UTF8_FILENAME
std::filesystem::path osgPath{ StringUtils::stringToU8String(path) };
#else
std::filesystem::path osgPath{ path };
#endif
if (!osgPath.has_filename())
osgPath = osgPath.parent_path();
if (osgPath.filename() == pluginDirectoryName)
{
osgPath = osgPath.parent_path();
#ifdef OSG_USE_UTF8_FILENAME
std::string extraPath = StringUtils::u8StringToString(osgPath.u8string());
#else
std::string extraPath = osgPath.string();
#endif
filepath.emplace_back(std::move(extraPath));
}
}
auto availableOSGPlugins = osgDB::listAllAvailablePlugins();
// osgDB::listAllAvailablePlugins() lies, so don't use it
bool haveAllPlugins = true;
for (std::string_view plugin : USED_OSG_PLUGIN_NAMES)
{
if (std::find_if(availableOSGPlugins.begin(), availableOSGPlugins.end(),
[&](std::string_view availablePlugin) {
#ifdef OSG_USE_UTF8_FILENAME
std::filesystem::path pluginPath{ StringUtils::stringToU8String(availablePlugin) };
#else
std::filesystem::path pluginPath {availablePlugin};
#endif
return pluginPath.filename()
== std::filesystem::path(
osgDB::Registry::instance()->createLibraryNameForExtension(std::string{ plugin }))
.filename();
})
== availableOSGPlugins.end())
std::string libraryName = osgDB::Registry::instance()->createLibraryNameForExtension(std::string{ plugin });
if (osgDB::findLibraryFile(libraryName).empty())
{
Log(Debug::Error) << "Missing OSG plugin: " << plugin;
Log(Debug::Error) << "Missing OSG plugin: " << libraryName;
haveAllPlugins = false;
}
}