Mercurial > hg > orthanc-stone
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 } |