Something went wrong. Try again.
OpenMW is an open implementation of the Morrowind engine
Something went wrong. Try again.
1.9 kB · 51 lines
C++
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152#include <components/files/configurationmanager.hpp>#include <components/resource/resourcesystem.hpp>#include <components/resource/scenemanager.hpp>#include <components/sceneutil/shadow.hpp>#include <components/toutf8/toutf8.hpp>#include <components/vfs/manager.hpp>
#include <gmock/gmock.h>#include <gtest/gtest.h>
#include <thread>
namespace{ using namespace testing;
TEST(ResourceResourceSystem, scenemanager_getinstance_should_be_thread_safe) { const VFS::Manager vfsManager; const ToUTF8::Utf8Encoder encoder(ToUTF8::WINDOWS_1252); Resource::ResourceSystem resourceSystem(&vfsManager, 1.0, &encoder.getStatelessEncoder()); Resource::SceneManager* sceneManager = resourceSystem.getSceneManager(); const Files::ConfigurationManager configurationManager; sceneManager->setShaderPath(configurationManager.getLocalPath() / "resources/shaders");
auto defines = Shader::getDefaultDefines();
auto shadowDefines = SceneUtil::ShadowManager::getShadowsDisabledDefines();
osg::ref_ptr<SceneUtil::LightManager> lightManager = new SceneUtil::LightManager(SceneUtil::LightSettings{}, &resourceSystem); auto lightDefines = lightManager->getLightDefines();
for (const auto& define : shadowDefines) defines[define.first] = define.second; for (const auto& define : lightDefines) defines[define.first] = define.second;
sceneManager->getShaderManager().setGlobalDefines(defines);
constexpr VFS::Path::NormalizedView noSuchPath("meshes/whatever.nif"); std::vector<std::thread> threads;
for (int i = 0; i < 50; ++i) { threads.emplace_back([=]() { sceneManager->getInstance(noSuchPath); }); } for (std::thread& thread : threads) thread.join(); }}