1
0
mirror of https://gitlab.com/OpenMW/openmw.git synced 2025-01-05 15:55:45 +00:00
OpenMW/components/misc/osgpluginchecker.cpp.in

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

82 lines
2.5 KiB
C++
Raw Normal View History

#include "components/misc/osgpluginchecker.hpp"
#include <components/debug/debuglog.hpp>
#include <components/misc/strings/conversion.hpp>
#include <osg/Config>
#include <osg/Version>
#include <osgDB/FileUtils>
#include <osgDB/PluginQuery>
#include <algorithm>
#include <array>
#include <filesystem>
#include <string_view>
namespace Misc
{
#ifdef OSG_LIBRARY_STATIC
bool checkRequiredOSGPluginsArePresent()
{
// assume they were linked in at build time and CMake would have failed if they were missing
return true;
}
#else
namespace
{
constexpr auto USED_OSG_PLUGIN_FILENAMES = std::to_array<std::string_view>({${USED_OSG_PLUGIN_FILENAMES_FORMATTED}});
}
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 {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 = u8StringToString(osgPath.u8string_view());
#else
std::string extraPath = osgPath.string();
#endif
filepath.emplace_back(std::move(extraPath));
}
}
auto availableOSGPlugins = osgDB::listAllAvailablePlugins();
bool haveAllPlugins = true;
for (std::string_view plugin : USED_OSG_PLUGIN_FILENAMES)
{
2024-01-07 17:35:52 +00:00
if (std::find_if(availableOSGPlugins.begin(), availableOSGPlugins.end(), [&](std::string_view availablePlugin) {
#ifdef OSG_USE_UTF8_FILENAME
std::filesystem::path pluginPath {stringToU8String(availablePlugin)};
#else
std::filesystem::path pluginPath {availablePlugin};
#endif
return pluginPath.filename() == plugin;
}) == availableOSGPlugins.end())
{
Log(Debug::Error) << "Missing OSG plugin: " << plugin;
haveAllPlugins = false;
}
}
return haveAllPlugins;
}
#endif
}