diff Framework/Volumes/VolumeSceneLayerSource.cpp @ 1433:8635b333fa5b

[BREAKING] VolumeSceneLayerSource now locks the viewport properly before using the scene. The ctor now accepts the viewport instead of a ref. to the scene. RtViewer sample has been adapted accordingly.
author Benjamin Golinvaux <bgo@osimis.io>
date Tue, 19 May 2020 13:22:48 +0200
parents 0d6a01ffa1dd
children 30deba7bc8e2
line wrap: on
line diff
--- a/Framework/Volumes/VolumeSceneLayerSource.cpp	Fri May 15 21:14:35 2020 +0200
+++ b/Framework/Volumes/VolumeSceneLayerSource.cpp	Tue May 19 13:22:48 2020 +0200
@@ -22,6 +22,7 @@
 #include "VolumeSceneLayerSource.h"
 
 #include "../Scene2D/NullLayer.h"
+#include "../Viewport/IViewport.h"
 #include "../StoneException.h"
 
 #include <Core/OrthancException.h>
@@ -40,16 +41,20 @@
 
   void VolumeSceneLayerSource::ClearLayer()
   {
-    scene_.DeleteLayer(layerDepth_);
+    {
+      std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+      ViewportController& controller = lock->GetController();
+      Scene2D& scene = controller.GetScene();
+      scene.DeleteLayer(layerDepth_);
+    }
     lastPlane_.reset(NULL);
   }
 
-
   VolumeSceneLayerSource::VolumeSceneLayerSource(
-    Scene2D& scene,
+    boost::shared_ptr<OrthancStone::IViewport>  viewport,
     int layerDepth,
     const boost::shared_ptr<IVolumeSlicer>& slicer)
-    : scene_(scene)
+    : viewport_(viewport)
     , layerDepth_(layerDepth)
     , slicer_(slicer)
   {
@@ -57,11 +62,17 @@
     {
       throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
     }
-    ORTHANC_ASSERT(!scene_.HasLayer(layerDepth_));
 
-    // we need to book the scene layer depth by adding a dummy layer
-    std::unique_ptr<NullLayer> nullLayer(new NullLayer);
-    scene_.SetLayer(layerDepth_,nullLayer.release());
+    {
+      std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+      ViewportController& controller = lock->GetController();
+      Scene2D& scene = controller.GetScene();
+      ORTHANC_ASSERT(!scene.HasLayer(layerDepth_));
+
+      // we need to book the scene layer depth by adding a dummy layer
+      std::unique_ptr<NullLayer> nullLayer(new NullLayer);
+      scene.SetLayer(layerDepth_,nullLayer.release());
+    }
   }
 
   VolumeSceneLayerSource::~VolumeSceneLayerSource()
@@ -104,6 +115,10 @@
 
   void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane)
   {
+    std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
+    ViewportController& controller = lock->GetController();
+    Scene2D& scene = controller.GetScene();
+
     assert(slicer_.get() != NULL);
     std::unique_ptr<IVolumeSlicer::IExtractedSlice> slice(slicer_->ExtractSlice(plane));
 
@@ -126,9 +141,9 @@
 
       if (configurator_.get() != NULL &&
           configurator_->GetRevision() != lastConfiguratorRevision_ &&
-          scene_.HasLayer(layerDepth_))
+          scene.HasLayer(layerDepth_))
       {
-        configurator_->ApplyStyle(scene_.GetLayer(layerDepth_));
+        configurator_->ApplyStyle(scene.GetLayer(layerDepth_));
       }
     }
     else
@@ -153,7 +168,7 @@
           configurator_->ApplyStyle(*layer);
         }
 
-        scene_.SetLayer(layerDepth_, layer.release());
+        scene.SetLayer(layerDepth_, layer.release());
       }
     }
   }