comparison 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
comparison
equal deleted inserted replaced
1431:1eaf19af15bf 1433:8635b333fa5b
20 20
21 21
22 #include "VolumeSceneLayerSource.h" 22 #include "VolumeSceneLayerSource.h"
23 23
24 #include "../Scene2D/NullLayer.h" 24 #include "../Scene2D/NullLayer.h"
25 #include "../Viewport/IViewport.h"
25 #include "../StoneException.h" 26 #include "../StoneException.h"
26 27
27 #include <Core/OrthancException.h> 28 #include <Core/OrthancException.h>
28 29
29 namespace OrthancStone 30 namespace OrthancStone
38 } 39 }
39 40
40 41
41 void VolumeSceneLayerSource::ClearLayer() 42 void VolumeSceneLayerSource::ClearLayer()
42 { 43 {
43 scene_.DeleteLayer(layerDepth_); 44 {
45 std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
46 ViewportController& controller = lock->GetController();
47 Scene2D& scene = controller.GetScene();
48 scene.DeleteLayer(layerDepth_);
49 }
44 lastPlane_.reset(NULL); 50 lastPlane_.reset(NULL);
45 } 51 }
46 52
47
48 VolumeSceneLayerSource::VolumeSceneLayerSource( 53 VolumeSceneLayerSource::VolumeSceneLayerSource(
49 Scene2D& scene, 54 boost::shared_ptr<OrthancStone::IViewport> viewport,
50 int layerDepth, 55 int layerDepth,
51 const boost::shared_ptr<IVolumeSlicer>& slicer) 56 const boost::shared_ptr<IVolumeSlicer>& slicer)
52 : scene_(scene) 57 : viewport_(viewport)
53 , layerDepth_(layerDepth) 58 , layerDepth_(layerDepth)
54 , slicer_(slicer) 59 , slicer_(slicer)
55 { 60 {
56 if (slicer == NULL) 61 if (slicer == NULL)
57 { 62 {
58 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); 63 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
59 } 64 }
60 ORTHANC_ASSERT(!scene_.HasLayer(layerDepth_));
61 65
62 // we need to book the scene layer depth by adding a dummy layer 66 {
63 std::unique_ptr<NullLayer> nullLayer(new NullLayer); 67 std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
64 scene_.SetLayer(layerDepth_,nullLayer.release()); 68 ViewportController& controller = lock->GetController();
69 Scene2D& scene = controller.GetScene();
70 ORTHANC_ASSERT(!scene.HasLayer(layerDepth_));
71
72 // we need to book the scene layer depth by adding a dummy layer
73 std::unique_ptr<NullLayer> nullLayer(new NullLayer);
74 scene.SetLayer(layerDepth_,nullLayer.release());
75 }
65 } 76 }
66 77
67 VolumeSceneLayerSource::~VolumeSceneLayerSource() 78 VolumeSceneLayerSource::~VolumeSceneLayerSource()
68 { 79 {
69 ClearLayer(); 80 ClearLayer();
102 } 113 }
103 114
104 115
105 void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane) 116 void VolumeSceneLayerSource::Update(const CoordinateSystem3D& plane)
106 { 117 {
118 std::unique_ptr<IViewport::ILock> lock(viewport_->Lock());
119 ViewportController& controller = lock->GetController();
120 Scene2D& scene = controller.GetScene();
121
107 assert(slicer_.get() != NULL); 122 assert(slicer_.get() != NULL);
108 std::unique_ptr<IVolumeSlicer::IExtractedSlice> slice(slicer_->ExtractSlice(plane)); 123 std::unique_ptr<IVolumeSlicer::IExtractedSlice> slice(slicer_->ExtractSlice(plane));
109 124
110 if (slice.get() == NULL) 125 if (slice.get() == NULL)
111 { 126 {
124 // The content of the slice has not changed: Don't update the 139 // The content of the slice has not changed: Don't update the
125 // layer content, but possibly update its style 140 // layer content, but possibly update its style
126 141
127 if (configurator_.get() != NULL && 142 if (configurator_.get() != NULL &&
128 configurator_->GetRevision() != lastConfiguratorRevision_ && 143 configurator_->GetRevision() != lastConfiguratorRevision_ &&
129 scene_.HasLayer(layerDepth_)) 144 scene.HasLayer(layerDepth_))
130 { 145 {
131 configurator_->ApplyStyle(scene_.GetLayer(layerDepth_)); 146 configurator_->ApplyStyle(scene.GetLayer(layerDepth_));
132 } 147 }
133 } 148 }
134 else 149 else
135 { 150 {
136 LOG(TRACE) << "VolumeSceneLayerSource::Update -- Content has changed: An update is needed"; 151 LOG(TRACE) << "VolumeSceneLayerSource::Update -- Content has changed: An update is needed";
151 { 166 {
152 lastConfiguratorRevision_ = configurator_->GetRevision(); 167 lastConfiguratorRevision_ = configurator_->GetRevision();
153 configurator_->ApplyStyle(*layer); 168 configurator_->ApplyStyle(*layer);
154 } 169 }
155 170
156 scene_.SetLayer(layerDepth_, layer.release()); 171 scene.SetLayer(layerDepth_, layer.release());
157 } 172 }
158 } 173 }
159 } 174 }
160 } 175 }