# HG changeset patch # User Sebastien Jodogne # Date 1791557412 -7200 # Node ID d27f022ac3ec005b0017343b22be80a2d3ef24ea # Parent 6a631b1d18ae94a8d66302a88a6b0cd77556684d removed dependency of VolumeSceneLayerSource on IViewport diff -r 6a631b1d18ae -r d27f022ac3ec Applications/Samples/Common/RtViewerView.cpp --- a/Applications/Samples/Common/RtViewerView.cpp Fri Oct 09 16:33:43 2026 +0200 +++ b/Applications/Samples/Common/RtViewerView.cpp Fri Oct 09 16:50:12 2026 +0200 @@ -234,15 +234,15 @@ { if (ctVolumeLayerSource_.get() != NULL) { - ctVolumeLayerSource_->Update(planes_[currentPlane_]); + ctVolumeLayerSource_->Update(lock->GetController().GetScene(), planes_[currentPlane_]); } if (doseVolumeLayerSource_.get() != NULL) { - doseVolumeLayerSource_->Update(planes_[currentPlane_]); + doseVolumeLayerSource_->Update(lock->GetController().GetScene(), planes_[currentPlane_]); } if (structLayerSource_.get() != NULL) { - structLayerSource_->Update(planes_[currentPlane_]); + structLayerSource_->Update(lock->GetController().GetScene(), planes_[currentPlane_]); } } lock->Invalidate(); @@ -322,10 +322,10 @@ { std::unique_ptr lock(viewport_->Lock()); ViewportController& controller = lock->GetController(); - const Scene2D& scene = controller.GetScene(); + Scene2D& scene = controller.GetScene(); int depth = scene.GetMaxDepth() + 1; - ctVolumeLayerSource_.reset(new VolumeSceneLayerSource(viewport_, depth, volume)); + ctVolumeLayerSource_.reset(new VolumeSceneLayerSource(scene, depth, volume)); if (style != NULL) { @@ -340,10 +340,10 @@ { std::unique_ptr lock(viewport_->Lock()); ViewportController& controller = lock->GetController(); - const Scene2D& scene = controller.GetScene(); + Scene2D& scene = controller.GetScene(); int depth = scene.GetMaxDepth() + 1; - doseVolumeLayerSource_.reset(new VolumeSceneLayerSource(viewport_, depth, volume)); + doseVolumeLayerSource_.reset(new VolumeSceneLayerSource(scene, depth, volume)); if (style != NULL) { @@ -355,9 +355,9 @@ { std::unique_ptr lock(viewport_->Lock()); ViewportController& controller = lock->GetController(); - const Scene2D& scene = controller.GetScene(); + Scene2D& scene = controller.GetScene(); int depth = scene.GetMaxDepth() + 1; - structLayerSource_.reset(new VolumeSceneLayerSource(viewport_, depth, volume)); + structLayerSource_.reset(new VolumeSceneLayerSource(scene, depth, volume)); } } diff -r 6a631b1d18ae -r d27f022ac3ec OrthancStone/Sources/Scene2DViewport/ViewportController.cpp --- a/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp Fri Oct 09 16:33:43 2026 +0200 +++ b/OrthancStone/Sources/Scene2DViewport/ViewportController.cpp Fri Oct 09 16:50:12 2026 +0200 @@ -236,8 +236,7 @@ boost::shared_ptr sharedViewport(viewport_); if (sharedViewport) { - std::unique_ptr lock(sharedViewport->Lock()); - activeTracker_.reset(interactor.CreateTracker(lock->GetController().GetScene(), event, viewportWidth, viewportHeight)); + activeTracker_.reset(interactor.CreateTracker(GetScene(), event, viewportWidth, viewportHeight)); } else { diff -r 6a631b1d18ae -r d27f022ac3ec OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp --- a/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp Fri Oct 09 16:33:43 2026 +0200 +++ b/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.cpp Fri Oct 09 16:50:12 2026 +0200 @@ -24,12 +24,12 @@ #include "VolumeSceneLayerSource.h" #include "../Scene2D/NullLayer.h" -#include "../Viewport/IViewport.h" #include "../StoneException.h" -#include "../Scene2DViewport/ViewportController.h" +#include #include + namespace OrthancStone { static bool IsSameCuttingPlane(const CoordinateSystem3D& a, @@ -41,43 +41,15 @@ LinearAlgebra::IsCloseToZero(distance)); } - void VolumeSceneLayerSource::ClearLayer() + void VolumeSceneLayerSource::ClearLayer(Scene2D& scene) { - { - std::unique_ptr lock(GetViewportLock()); - if (lock.get()) - { - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - scene.DeleteLayer(layerDepth_); - } - } + scene.DeleteLayer(layerDepth_); lastPlane_.reset(NULL); } - IViewport::ILock* VolumeSceneLayerSource::GetViewportLock() - { - boost::shared_ptr viewport = viewport_.lock(); - if (viewport) - return viewport->Lock(); - else - return NULL; - } - - IViewport::ILock* VolumeSceneLayerSource::GetViewportLock() const - { - boost::shared_ptr viewport = viewport_.lock(); - if (viewport) - return viewport->Lock(); - else - return NULL; - } - - - VolumeSceneLayerSource::VolumeSceneLayerSource(boost::weak_ptr viewport, + VolumeSceneLayerSource::VolumeSceneLayerSource(Scene2D& scene, int layerDepth, const boost::shared_ptr& slicer) : - viewport_(viewport), layerDepth_(layerDepth), slicer_(slicer), lastRevision_(0), @@ -88,22 +60,15 @@ throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); } + if (scene.HasLayer(layerDepth_)) { - std::unique_ptr lock(GetViewportLock()); - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); - ORTHANC_ASSERT(!scene.HasLayer(layerDepth_)); + throw Orthanc::OrthancException(Orthanc::ErrorCode_BadSequenceOfCalls); + } - // we need to book the scene layer depth by adding a dummy layer - std::unique_ptr nullLayer(new NullLayer); - scene.SetLayer(layerDepth_,nullLayer.release()); - } + // we need to book the scene layer depth by adding a dummy layer + scene.SetLayer(layerDepth_, new NullLayer); } - VolumeSceneLayerSource::~VolumeSceneLayerSource() - { - ClearLayer(); - } void VolumeSceneLayerSource::RemoveConfigurator() { @@ -138,65 +103,59 @@ } - void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane) + void VolumeSceneLayerSource::Update(Scene2D& scene, + const CoordinateSystem3D& plane) { - std::unique_ptr lock(GetViewportLock()); - if(lock) - { - ViewportController& controller = lock->GetController(); - Scene2D& scene = controller.GetScene(); + assert(slicer_.get() != NULL); + std::unique_ptr slice(slicer_->ExtractSlice(plane)); - assert(slicer_.get() != NULL); - std::unique_ptr slice(slicer_->ExtractSlice(plane)); - - if (slice.get() == NULL) - { - throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); - } + if (slice.get() == NULL) + { + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } - if (!slice->IsValid()) - { - // The slicer cannot handle this cutting plane: Clear the layer - ClearLayer(); - } - else if (lastPlane_.get() != NULL && - IsSameCuttingPlane(*lastPlane_, plane) && - lastRevision_ == slice->GetRevision()) + if (!slice->IsValid()) + { + // The slicer cannot handle this cutting plane: Clear the layer + ClearLayer(scene); + } + else if (lastPlane_.get() != NULL && + IsSameCuttingPlane(*lastPlane_, plane) && + lastRevision_ == slice->GetRevision()) + { + // The content of the slice has not changed: Don't update the + // layer content, but possibly update its style + + if (configurator_.get() != NULL && + configurator_->GetRevision() != lastConfiguratorRevision_ && + scene.HasLayer(layerDepth_)) { - // The content of the slice has not changed: Don't update the - // layer content, but possibly update its style + configurator_->ApplyStyle(scene.GetLayer(layerDepth_)); + } + } + else + { + LOG(TRACE) << "VolumeSceneLayerSource::Update -- Content has changed: An update is needed"; + // Content has changed: An update is needed + lastPlane_.reset(new CoordinateSystem3D(plane)); + lastRevision_ = slice->GetRevision(); - if (configurator_.get() != NULL && - configurator_->GetRevision() != lastConfiguratorRevision_ && - scene.HasLayer(layerDepth_)) - { - configurator_->ApplyStyle(scene.GetLayer(layerDepth_)); - } + std::unique_ptr layer(slice->CreateSceneLayer(configurator_.get(), plane)); + if (layer.get() == NULL) + { + LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() == NULL)"; + ClearLayer(scene); } else { - LOG(TRACE) << "VolumeSceneLayerSource::Update -- Content has changed: An update is needed"; - // Content has changed: An update is needed - lastPlane_.reset(new CoordinateSystem3D(plane)); - lastRevision_ = slice->GetRevision(); - - std::unique_ptr layer(slice->CreateSceneLayer(configurator_.get(), plane)); - if (layer.get() == NULL) + LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() != NULL)"; + if (configurator_.get() != NULL) { - LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() == NULL)"; - ClearLayer(); + lastConfiguratorRevision_ = configurator_->GetRevision(); + configurator_->ApplyStyle(*layer); } - else - { - LOG(TRACE) << "VolumeSceneLayerSource::Update -- (layer.get() != NULL)"; - if (configurator_.get() != NULL) - { - lastConfiguratorRevision_ = configurator_->GetRevision(); - configurator_->ApplyStyle(*layer); - } - scene.SetLayer(layerDepth_, layer.release()); - } + scene.SetLayer(layerDepth_, layer.release()); } } } diff -r 6a631b1d18ae -r d27f022ac3ec OrthancStone/Sources/Volumes/VolumeSceneLayerSource.h --- a/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.h Fri Oct 09 16:33:43 2026 +0200 +++ b/OrthancStone/Sources/Volumes/VolumeSceneLayerSource.h Fri Oct 09 16:50:12 2026 +0200 @@ -24,7 +24,6 @@ #pragma once #include "../Scene2D/Scene2D.h" -#include "../Viewport/IViewport.h" #include "IVolumeSlicer.h" #include @@ -42,7 +41,6 @@ class VolumeSceneLayerSource : public boost::noncopyable { private: - boost::weak_ptr viewport_; int layerDepth_; boost::shared_ptr slicer_; std::unique_ptr configurator_; @@ -50,22 +48,13 @@ uint64_t lastRevision_; uint64_t lastConfiguratorRevision_; - void ClearLayer(); - - /** - This will return a scoped lock to the viewport. - If the viewport does not exist anymore, then nullptr is returned. - */ - IViewport::ILock* GetViewportLock(); - IViewport::ILock* GetViewportLock() const; + void ClearLayer(Scene2D& scene); public: - VolumeSceneLayerSource(boost::weak_ptr viewport, + VolumeSceneLayerSource(Scene2D& scene, int layerDepth, const boost::shared_ptr& slicer); - ~VolumeSceneLayerSource(); - const IVolumeSlicer& GetSlicer() const { return *slicer_; @@ -90,6 +79,7 @@ you can lock the whole viewport data (including scene) by means of the IViewport::Lock method. */ - void Update(const CoordinateSystem3D& plane); + void Update(Scene2D& scene, + const CoordinateSystem3D& plane); }; }