# HG changeset patch # User Sebastien Jodogne # Date 1496246733 -7200 # Node ID 474d85e7649958dc9f8af8c8026d653ab0ab0d11 # Parent fcec0ab44054c9829a0d253b58a9fdea168c79f7 mpr diff -r fcec0ab44054 -r 474d85e76499 Applications/Samples/SingleVolumeApplication.h --- a/Applications/Samples/SingleVolumeApplication.h Wed May 31 17:01:18 2017 +0200 +++ b/Applications/Samples/SingleVolumeApplication.h Wed May 31 18:05:33 2017 +0200 @@ -120,7 +120,7 @@ LayerWidget* widget_; - OrthancVolumeImage* volume_; + const OrthancVolumeImage* volume_; VolumeProjection projection_; std::auto_ptr slices_; size_t slice_; diff -r fcec0ab44054 -r 474d85e76499 Framework/Widgets/LayerWidget.cpp --- a/Framework/Widgets/LayerWidget.cpp Wed May 31 17:01:18 2017 +0200 +++ b/Framework/Widgets/LayerWidget.cpp Wed May 31 18:05:33 2017 +0200 @@ -375,6 +375,8 @@ ResetPendingScene(); layer->Register(*this); + ResetChangedLayers(); + return index; } @@ -435,7 +437,9 @@ if (LookupLayer(i, source)) { LOG(INFO) << "Geometry ready for layer " << i; - layers_[i]->ScheduleLayerCreation(slice_); + + changedLayers_[i] = true; + //layers_[i]->ScheduleLayerCreation(slice_); } } @@ -451,7 +455,9 @@ for (size_t i = 0; i < layers_.size(); i++) { assert(layers_[i] != NULL); - layers_[i]->ScheduleLayerCreation(slice_); + changedLayers_[i] = true; + + //layers_[i]->ScheduleLayerCreation(slice_); } } @@ -464,7 +470,9 @@ } assert(layers_[layer] != NULL); - layers_[layer]->ScheduleLayerCreation(slice_); + changedLayers_[layer] = true; + + //layers_[layer]->ScheduleLayerCreation(slice_); } @@ -473,7 +481,7 @@ size_t index; if (LookupLayer(index, source)) { - layers_[index]->ScheduleLayerCreation(slice_); + InvalidateLayer(index); } } @@ -486,7 +494,7 @@ size_t index; if (LookupLayer(index, source)) { - layers_[index]->ScheduleLayerCreation(slice_); + InvalidateLayer(index); } } } @@ -521,4 +529,31 @@ } } } + + + void LayerWidget::ResetChangedLayers() + { + changedLayers_.resize(layers_.size()); + + for (size_t i = 0; i < changedLayers_.size(); i++) + { + changedLayers_[i] = false; + } + } + + + void LayerWidget::UpdateContent() + { + assert(changedLayers_.size() <= layers_.size()); + + for (size_t i = 0; i < changedLayers_.size(); i++) + { + if (changedLayers_[i]) + { + layers_[i]->ScheduleLayerCreation(slice_); + } + } + + ResetChangedLayers(); + } } diff -r fcec0ab44054 -r 474d85e76499 Framework/Widgets/LayerWidget.h --- a/Framework/Widgets/LayerWidget.h Wed May 31 17:01:18 2017 +0200 +++ b/Framework/Widgets/LayerWidget.h Wed May 31 18:05:33 2017 +0200 @@ -45,7 +45,7 @@ SliceGeometry slice_; std::auto_ptr currentScene_; std::auto_ptr pendingScene_; - + std::vector changedLayers_; bool LookupLayer(size_t& index /* out */, const ILayerSource& layer) const; @@ -67,6 +67,7 @@ const Slice& slice, bool isError); + void ResetChangedLayers(); protected: virtual void GetSceneExtent(double& x1, @@ -108,5 +109,12 @@ { return slice_; } + + virtual bool HasUpdateContent() const + { + return true; + } + + virtual void UpdateContent(); }; }