diff --git a/modules/globebrowsing/src/layer.cpp b/modules/globebrowsing/src/layer.cpp index 7c30f94048..91f263208e 100644 --- a/modules/globebrowsing/src/layer.cpp +++ b/modules/globebrowsing/src/layer.cpp @@ -26,6 +26,8 @@ #include #include +#include +#include #include #include #include @@ -320,7 +322,7 @@ Layer::Layer(layers::Group::ID id, const ghoul::Dictionary& layerDict, LayerGrou _remove.onChange([this]() { if (_tileProvider) { _tileProvider->reset(); - _parent.deleteLayer(identifier()); + _parent.scheduleDeleteLayer(identifier()); } }); diff --git a/modules/globebrowsing/src/layergroup.cpp b/modules/globebrowsing/src/layergroup.cpp index e85439fbc8..0b8ae03134 100644 --- a/modules/globebrowsing/src/layergroup.cpp +++ b/modules/globebrowsing/src/layergroup.cpp @@ -89,6 +89,11 @@ void LayerGroup::deinitialize() { void LayerGroup::update() { ZoneScoped; + for (const std::string& layer : _layersToDelete) { + deleteLayer(layer); + } + _layersToDelete.clear(); + _activeLayers.clear(); for (const std::unique_ptr& layer : _layers) { @@ -217,6 +222,10 @@ void LayerGroup::deleteLayer(const std::string& layerName) { LERROR("Could not find layer " + layerName); } +void LayerGroup::scheduleDeleteLayer(const std::string& layerName) { + _layersToDelete.push_back(layerName); +} + void LayerGroup::moveLayer(int oldPosition, int newPosition) { if (_layers.size() == 1) { ghoul_assert( diff --git a/modules/globebrowsing/src/layergroup.h b/modules/globebrowsing/src/layergroup.h index 91609612b0..1844178662 100644 --- a/modules/globebrowsing/src/layergroup.h +++ b/modules/globebrowsing/src/layergroup.h @@ -53,6 +53,9 @@ struct LayerGroup : public properties::PropertyOwner { Layer* addLayer(const ghoul::Dictionary& layerDict); void deleteLayer(const std::string& layerName); + + // The same as `deleteLayer` but executed later before the next frame + void scheduleDeleteLayer(const std::string& layerName); void moveLayer(int oldPosition, int newPosition); /** @@ -81,6 +84,8 @@ private: std::vector> _layers; std::vector _activeLayers; + std::vector _layersToDelete; + properties::BoolProperty _levelBlendingEnabled; std::function _onChangeCallback; };