diff --git a/modules/globebrowsing/globebrowsingmodule_lua.inl b/modules/globebrowsing/globebrowsingmodule_lua.inl index 7900c3f72e..0cde723e46 100644 --- a/modules/globebrowsing/globebrowsingmodule_lua.inl +++ b/modules/globebrowsing/globebrowsingmodule_lua.inl @@ -84,7 +84,10 @@ int addLayer(lua_State* L) { return 0; } - globe->layerManager()->addLayer(groupID, d); + std::shared_ptr layer = globe->layerManager()->addLayer(groupID, d); + if (layer) { + layer->initialize(); + } return 0; } diff --git a/modules/globebrowsing/rendering/layer/layer.cpp b/modules/globebrowsing/rendering/layer/layer.cpp index 0fd1297c2d..db6eb46fa5 100644 --- a/modules/globebrowsing/rendering/layer/layer.cpp +++ b/modules/globebrowsing/rendering/layer/layer.cpp @@ -171,12 +171,16 @@ Layer::Layer(layergroupid::GroupID id, const ghoul::Dictionary& layerDict, } }); - _remove.onChange([&](){ - if (_tileProvider) { - _tileProvider->reset(); + _remove.onChange([&]() { + try { + if (_tileProvider) { + _tileProvider->reset(); + } + } + catch (...) { + _parent.deleteLayer(name()); + throw; } - - _parent.deleteLayer(name()); }); _typeOption.onChange([&](){ diff --git a/modules/globebrowsing/rendering/layer/layergroup.cpp b/modules/globebrowsing/rendering/layer/layergroup.cpp index e4c1a487a2..979d0e47df 100644 --- a/modules/globebrowsing/rendering/layer/layergroup.cpp +++ b/modules/globebrowsing/rendering/layer/layergroup.cpp @@ -102,15 +102,17 @@ void LayerGroup::update() { } } -void LayerGroup::addLayer(const ghoul::Dictionary& layerDict) { +std::shared_ptr LayerGroup::addLayer(const ghoul::Dictionary& layerDict) { if (!layerDict.hasKeyAndValue("Name")) { LERROR("'Name' must be specified for layer."); - return; + return nullptr; } auto layer = std::make_shared(_groupId, layerDict, *this); layer->onChange(_onChangeCallback); if (hasPropertySubOwner(layer->name())) { LINFO("Layer with name " + layer->name() + " already exists."); + _levelBlendingEnabled.setVisibility(properties::Property::Visibility::User); + return nullptr; } else { _layers.push_back(layer); @@ -119,15 +121,16 @@ void LayerGroup::addLayer(const ghoul::Dictionary& layerDict) { _onChangeCallback(); } addPropertySubOwner(layer.get()); + _levelBlendingEnabled.setVisibility(properties::Property::Visibility::User); + return layer; } - - _levelBlendingEnabled.setVisibility(properties::Property::Visibility::User); } void LayerGroup::deleteLayer(const std::string& layerName) { for (std::vector>::iterator it = _layers.begin(); it != _layers.end(); ++it) { if (it->get()->name() == layerName) { removePropertySubOwner(it->get()); + (*it)->deinitialize(); _layers.erase(it); update(); if (_onChangeCallback) { diff --git a/modules/globebrowsing/rendering/layer/layergroup.h b/modules/globebrowsing/rendering/layer/layergroup.h index eb83bc78a6..e08641b333 100644 --- a/modules/globebrowsing/rendering/layer/layergroup.h +++ b/modules/globebrowsing/rendering/layer/layergroup.h @@ -52,7 +52,7 @@ struct LayerGroup : public properties::PropertyOwner { /// Updates all layers tile providers within this group void update(); - void addLayer(const ghoul::Dictionary& layerDict); + std::shared_ptr addLayer(const ghoul::Dictionary& layerDict); void deleteLayer(const std::string& layerName); /// @returns const vector of all layers diff --git a/modules/globebrowsing/rendering/layer/layermanager.cpp b/modules/globebrowsing/rendering/layer/layermanager.cpp index 5ffea1eee7..d3a870d063 100644 --- a/modules/globebrowsing/rendering/layer/layermanager.cpp +++ b/modules/globebrowsing/rendering/layer/layermanager.cpp @@ -80,9 +80,11 @@ void LayerManager::deinitialize() { } } -void LayerManager::addLayer(layergroupid::GroupID groupId, ghoul::Dictionary layerDict) { +std::shared_ptr LayerManager::addLayer(layergroupid::GroupID groupId, + ghoul::Dictionary layerDict) +{ ghoul_assert(groupId != layergroupid::Unknown, "Layer group ID must be known"); - _layerGroups[groupId]->addLayer(layerDict); + return _layerGroups[groupId]->addLayer(layerDict); } void LayerManager::deleteLayer(layergroupid::GroupID groupId, std::string layerName) { diff --git a/modules/globebrowsing/rendering/layer/layermanager.h b/modules/globebrowsing/rendering/layer/layermanager.h index 0867426fba..1ffbbeb334 100644 --- a/modules/globebrowsing/rendering/layer/layermanager.h +++ b/modules/globebrowsing/rendering/layer/layermanager.h @@ -48,7 +48,7 @@ public: void initialize(); void deinitialize(); - void addLayer(layergroupid::GroupID groupId, ghoul::Dictionary layerDict); + std::shared_ptr addLayer(layergroupid::GroupID groupId, ghoul::Dictionary layerDict); void deleteLayer(layergroupid::GroupID groupId, std::string layerName); const LayerGroup& layerGroup(size_t groupId); diff --git a/modules/iswa/rendering/iswakameleongroup.cpp b/modules/iswa/rendering/iswakameleongroup.cpp index b60c826ea6..5d6e0eeff6 100644 --- a/modules/iswa/rendering/iswakameleongroup.cpp +++ b/modules/iswa/rendering/iswakameleongroup.cpp @@ -78,7 +78,7 @@ std::vector IswaKameleonGroup::fieldlineValue(){ } void IswaKameleonGroup::setFieldlineInfo(std::string fieldlineIndexFile, - std::string kameleonPath + std::string kameleonPath) { if (fieldlineIndexFile != _fieldlineIndexFile) { _fieldlineIndexFile = fieldlineIndexFile; diff --git a/src/engine/openspaceengine.cpp b/src/engine/openspaceengine.cpp index aa095bc258..175aae5897 100644 --- a/src/engine/openspaceengine.cpp +++ b/src/engine/openspaceengine.cpp @@ -679,6 +679,8 @@ void OpenSpaceEngine::loadScene(const std::string& scenePath) { _loadingScreen->render(); } + _windowWrapper->swapBuffer(); + t.join(); _loadingScreen = nullptr;