in src/esp/sim/Simulator.cpp [108:208]
void Simulator::reconfigure(const SimulatorConfiguration& cfg) {
// set metadata mediator's cfg upon creation or reconfigure
if (!metadataMediator_) {
metadataMediator_ = metadata::MetadataMediator::create(cfg);
} else {
metadataMediator_->setSimulatorConfiguration(cfg);
}
// assign MM to RM on create or reconfigure
if (!resourceManager_) {
assets::ResourceManager::Flags flags{};
if (cfg.pbrImageBasedLighting) {
flags |= assets::ResourceManager::Flag::PbrImageBasedLighting;
}
resourceManager_ =
std::make_unique<assets::ResourceManager>(metadataMediator_, flags);
// needs to be called after ResourceManager exists but before any assets
// have been loaded
reconfigureReplayManager(cfg.enableGfxReplaySave);
} else {
resourceManager_->setMetadataMediator(metadataMediator_);
}
if (!sceneManager_) {
sceneManager_ = scene::SceneManager::create_unique();
}
// if configuration is unchanged, just reset and return
if (cfg == config_) {
// This is a check to make sure that pathfinder_ is not null after
// a reconfigure. We check to see if it's null so that an existing
// one isn't overwritten.
if (!pathfinder_) {
pathfinder_ = nav::PathFinder::create();
}
reset();
return;
}
// otherwise set current configuration and initialize
// TODO can optimize to do partial re-initialization instead of from-scratch
config_ = cfg;
if (!config_.createRenderer) {
config_.requiresTextures = false;
}
if (requiresTextures_ == Cr::Containers::NullOpt) {
requiresTextures_ = config_.requiresTextures;
resourceManager_->setRequiresTextures(config_.requiresTextures);
} else if (!(*requiresTextures_) && config_.requiresTextures) {
throw std::runtime_error(
"requiresTextures was changed to True from False. Must call close() "
"before changing this value.");
} else if ((*requiresTextures_) && !config_.requiresTextures) {
ESP_WARNING() << "Not changing requiresTextures as the simulator was "
"initialized with True. Call close() to change this.";
}
if (config_.createRenderer) {
/* When creating a viewer based app, there is no need to create a
WindowlessContext since a (windowed) context already exists. */
if (!context_ && !Magnum::GL::Context::hasCurrent()) {
context_ = gfx::WindowlessContext::create_unique(config_.gpuDeviceId);
}
// reinitialize members
if (!renderer_) {
gfx::Renderer::Flags flags;
if (!(*requiresTextures_))
flags |= gfx::Renderer::Flag::NoTextures;
#ifdef ESP_BUILD_WITH_BACKGROUND_RENDERER
if (context_)
flags |= gfx::Renderer::Flag::BackgroundRenderer;
if (context_ && config_.leaveContextWithBackgroundRenderer)
flags |= gfx::Renderer::Flag::LeaveContextWithBackgroundRenderer;
#endif
renderer_ = gfx::Renderer::create(context_.get(), flags);
}
#ifndef CORRADE_TARGET_EMSCRIPTEN
flextGLInit(Magnum::GL::Context::current());
#endif
renderer_->acquireGlContext();
} else {
CORRADE_ASSERT(
!Magnum::GL::Context::hasCurrent(),
"Simulator::reconfigure() : Unexpected existing context when "
"createRenderer==false", );
}
// (re) create scene instance
bool success = createSceneInstance(config_.activeSceneName);
ESP_DEBUG() << "CreateSceneInstance success =="
<< (success ? "true" : "false")
<< "for active scene name :" << config_.activeSceneName
<< (config_.createRenderer ? " with" : " without") << "renderer.";
} // Simulator::reconfigure