diff OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp @ 1606:874e178f34e9

- ViewportController now has weak ptr to Viewport - Measuring tools + related commands and all trackers now store only a weak_ptr to the Viewport and lock() on demand for usage - LayerHolder and FixedPoint aligner store only a weak_ptr to the Viewport, too - Fixed float/double warning in GrayscaleWindowingSceneTracker
author Benjamin Golinvaux <bgo@osimis.io>
date Wed, 28 Oct 2020 20:14:34 +0100
parents 8563ea5d8ae4
children 646e581e115b
line wrap: on
line diff
--- a/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp	Wed Oct 28 20:06:55 2020 +0100
+++ b/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp	Wed Oct 28 20:14:34 2020 +0100
@@ -40,11 +40,10 @@
             LinearAlgebra::IsCloseToZero(distance));
   }
 
-
   void VolumeSceneLayerSource::ClearLayer()
   {
     {
-      std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+      std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
       ViewportController& controller = lock->GetController();
       Scene2D& scene = controller.GetScene();
       scene.DeleteLayer(layerDepth_);
@@ -52,8 +51,27 @@
     lastPlane_.reset(NULL);
   }
 
+  IViewport::ILock* VolumeSceneLayerSource::GetViewportLock()
+  {
+    boost::shared_ptr<IViewport> viewport = viewport_.lock();
+    if (viewport)
+      return viewport->Lock();
+    else
+      return nullptr;
+  }
+
+  IViewport::ILock* VolumeSceneLayerSource::GetViewportLock() const
+  {
+    boost::shared_ptr<IViewport> viewport = viewport_.lock();
+    if (viewport)
+      return viewport->Lock();
+    else
+      return nullptr;
+  }
+
+
   VolumeSceneLayerSource::VolumeSceneLayerSource(
-    boost::shared_ptr<OrthancStone::IViewport>  viewport,
+    boost::weak_ptr<OrthancStone::IViewport>  viewport,
     int layerDepth,
     const boost::shared_ptr<IVolumeSlicer>& slicer) :
     viewport_(viewport),
@@ -68,7 +86,7 @@
     }
 
     {
-      std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+      std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
       ViewportController& controller = lock->GetController();
       Scene2D& scene = controller.GetScene();
       ORTHANC_ASSERT(!scene.HasLayer(layerDepth_));
@@ -119,7 +137,7 @@
 
   void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane)
   {
-    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+    std::unique_ptr<IViewport::ILock> lock(GetViewportLock());
     ViewportController& controller = lock->GetController();
     Scene2D& scene = controller.GetScene();