Mercurial > hg > orthanc-stone
comparison Samples/Sdl/TrackerSampleApp.cpp @ 698:8b6adfb62a2f refactor-viewport-controller
Code is broken -- stashing ongoing work in a branch
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 15 May 2019 16:56:17 +0200 |
parents | cb3b76d16234 |
children | 5c551f078c18 |
comparison
equal
deleted
inserted
replaced
660:cb3b76d16234 | 698:8b6adfb62a2f |
---|---|
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | 19 **/ |
20 | 20 |
21 #include "TrackerSampleApp.h" | 21 #include "TrackerSampleApp.h" |
22 | 22 |
23 #include "../Common/CreateLineMeasureTracker.h" | 23 #include <Framework/Scene2DViewport/CreateLineMeasureTracker.h> |
24 #include "../Common/CreateAngleMeasureTracker.h" | 24 #include <Framework/Scene2DViewport/CreateAngleMeasureTracker.h> |
25 | 25 |
26 #include "../../Applications/Sdl/SdlOpenGLWindow.h" | 26 #include <Framework/Scene2D/PanSceneTracker.h> |
27 | 27 #include <Framework/Scene2D/RotateSceneTracker.h> |
28 #include "../../Framework/Scene2D/PanSceneTracker.h" | 28 #include <Framework/Scene2D/Scene2D.h> |
29 #include "../../Framework/Scene2D/RotateSceneTracker.h" | 29 #include <Framework/Scene2D/ZoomSceneTracker.h> |
30 #include "../../Framework/Scene2D/Scene2D.h" | 30 #include <Framework/Scene2D/CairoCompositor.h> |
31 #include "../../Framework/Scene2D/ZoomSceneTracker.h" | 31 #include <Framework/Scene2D/ColorTextureSceneLayer.h> |
32 #include "../../Framework/Scene2D/CairoCompositor.h" | 32 #include <Framework/Scene2D/OpenGLCompositor.h> |
33 #include "../../Framework/Scene2D/ColorTextureSceneLayer.h" | 33 |
34 #include "../../Framework/Scene2D/OpenGLCompositor.h" | 34 #include <Framework/StoneInitialization.h> |
35 #include "../../Framework/StoneInitialization.h" | 35 |
36 | 36 #include <Applications/Sdl/SdlOpenGLWindow.h> |
37 // From Orthanc framework | 37 |
38 // From Orthanc framework | |
38 #include <Core/Logging.h> | 39 #include <Core/Logging.h> |
39 #include <Core/OrthancException.h> | 40 #include <Core/OrthancException.h> |
40 #include <Core/Images/Image.h> | 41 #include <Core/Images/Image.h> |
41 #include <Core/Images/ImageProcessing.h> | 42 #include <Core/Images/ImageProcessing.h> |
42 #include <Core/Images/PngWriter.h> | 43 #include <Core/Images/PngWriter.h> |
65 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); | 66 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError, "Wrong tool index"); |
66 } | 67 } |
67 return descs[i]; | 68 return descs[i]; |
68 } | 69 } |
69 | 70 |
70 Scene2D& TrackerSampleApp::GetScene() | 71 Scene2DPtr TrackerSampleApp::GetScene() |
71 { | 72 { |
72 return scene_; | 73 return controller_.GetScene(); |
73 } | 74 } |
74 | 75 |
75 void TrackerSampleApp::SelectNextTool() | 76 void TrackerSampleApp::SelectNextTool() |
76 { | 77 { |
77 currentTool_ = static_cast<GuiTool>(currentTool_ + 1); | 78 currentTool_ = static_cast<GuiTool>(currentTool_ + 1); |
92 msg << kv.first << " : " << kv.second << std::endl; | 93 msg << kv.first << " : " << kv.second << std::endl; |
93 } | 94 } |
94 auto msgS = msg.str(); | 95 auto msgS = msg.str(); |
95 | 96 |
96 TextSceneLayer* layerP = NULL; | 97 TextSceneLayer* layerP = NULL; |
97 if (scene_.HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) | 98 if (GetScene()->HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) |
98 { | 99 { |
99 TextSceneLayer& layer = dynamic_cast<TextSceneLayer&>( | 100 TextSceneLayer& layer = dynamic_cast<TextSceneLayer&>( |
100 scene_.GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); | 101 GetScene()->GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); |
101 layerP = &layer; | 102 layerP = &layer; |
102 } | 103 } |
103 else | 104 else |
104 { | 105 { |
105 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); | 106 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); |
107 layer->SetColor(0, 255, 0); | 108 layer->SetColor(0, 255, 0); |
108 layer->SetFontIndex(1); | 109 layer->SetFontIndex(1); |
109 layer->SetBorder(20); | 110 layer->SetBorder(20); |
110 layer->SetAnchor(BitmapAnchor_TopLeft); | 111 layer->SetAnchor(BitmapAnchor_TopLeft); |
111 //layer->SetPosition(0,0); | 112 //layer->SetPosition(0,0); |
112 scene_.SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); | 113 GetScene()->SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); |
113 } | 114 } |
114 // position the fixed info text in the upper right corner | 115 // position the fixed info text in the upper right corner |
115 layerP->SetText(msgS.c_str()); | 116 layerP->SetText(msgS.c_str()); |
116 double cX = compositor_->GetCanvasWidth() * (-0.5); | 117 double cX = compositor_->GetCanvasWidth() * (-0.5); |
117 double cY = compositor_->GetCanvasHeight() * (-0.5); | 118 double cY = compositor_->GetCanvasHeight() * (-0.5); |
118 scene_.GetCanvasToSceneTransform().Apply(cX,cY); | 119 GetScene()->GetCanvasToSceneTransform().Apply(cX,cY); |
119 layerP->SetPosition(cX, cY); | 120 layerP->SetPosition(cX, cY); |
120 } | 121 } |
121 | 122 |
122 void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) | 123 void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) |
123 { | 124 { |
124 ScenePoint2D p = e.GetMainPosition().Apply(scene_.GetCanvasToSceneTransform()); | 125 ScenePoint2D p = e.GetMainPosition().Apply(GetScene()->GetCanvasToSceneTransform()); |
125 | 126 |
126 char buf[128]; | 127 char buf[128]; |
127 sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", | 128 sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", |
128 p.GetX(), p.GetY(), | 129 p.GetX(), p.GetY(), |
129 e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); | 130 e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); |
130 | 131 |
131 if (scene_.HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) | 132 if (GetScene()->HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) |
132 { | 133 { |
133 TextSceneLayer& layer = | 134 TextSceneLayer& layer = |
134 dynamic_cast<TextSceneLayer&>(scene_.GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); | 135 dynamic_cast<TextSceneLayer&>(GetScene()->GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); |
135 layer.SetText(buf); | 136 layer.SetText(buf); |
136 layer.SetPosition(p.GetX(), p.GetY()); | 137 layer.SetPosition(p.GetX(), p.GetY()); |
137 } | 138 } |
138 else | 139 else |
139 { | 140 { |
141 layer->SetColor(0, 255, 0); | 142 layer->SetColor(0, 255, 0); |
142 layer->SetText(buf); | 143 layer->SetText(buf); |
143 layer->SetBorder(20); | 144 layer->SetBorder(20); |
144 layer->SetAnchor(BitmapAnchor_BottomCenter); | 145 layer->SetAnchor(BitmapAnchor_BottomCenter); |
145 layer->SetPosition(p.GetX(), p.GetY()); | 146 layer->SetPosition(p.GetX(), p.GetY()); |
146 scene_.SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); | 147 GetScene()->SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); |
147 } | 148 } |
148 } | 149 } |
149 | 150 |
150 void TrackerSampleApp::HideInfoText() | 151 void TrackerSampleApp::HideInfoText() |
151 { | 152 { |
152 scene_.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); | 153 GetScene()->DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); |
153 } | 154 } |
154 | 155 |
155 void TrackerSampleApp::HandleApplicationEvent( | 156 void TrackerSampleApp::HandleApplicationEvent( |
156 const SDL_Event & event) | 157 const SDL_Event & event) |
157 { | 158 { |
247 " is taking place"; | 248 " is taking place"; |
248 } | 249 } |
249 break; | 250 break; |
250 | 251 |
251 case SDLK_s: | 252 case SDLK_s: |
252 scene_.FitContent(compositor_->GetCanvasWidth(), | 253 GetScene()->FitContent(compositor_->GetCanvasWidth(), |
253 compositor_->GetCanvasHeight()); | 254 compositor_->GetCanvasHeight()); |
254 break; | 255 break; |
255 | 256 |
256 case SDLK_c: | 257 case SDLK_c: |
257 TakeScreenshot( | 258 TakeScreenshot( |
278 { | 279 { |
279 switch (event.button.button) | 280 switch (event.button.button) |
280 { | 281 { |
281 case SDL_BUTTON_MIDDLE: | 282 case SDL_BUTTON_MIDDLE: |
282 return CreateSimpleTrackerAdapter(PointerTrackerPtr( | 283 return CreateSimpleTrackerAdapter(PointerTrackerPtr( |
283 new PanSceneTracker(scene_, e))); | 284 new PanSceneTracker(*GetScene(), e))); |
284 | 285 |
285 case SDL_BUTTON_RIGHT: | 286 case SDL_BUTTON_RIGHT: |
286 return CreateSimpleTrackerAdapter(PointerTrackerPtr( | 287 return CreateSimpleTrackerAdapter(PointerTrackerPtr( |
287 new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); | 288 new ZoomSceneTracker(*GetScene(), e, compositor_->GetCanvasHeight()))); |
288 | 289 |
289 case SDL_BUTTON_LEFT: | 290 case SDL_BUTTON_LEFT: |
290 { | 291 { |
291 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; | 292 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; |
292 // TODO: we need to iterate on the set of measuring tool and perform | 293 // TODO: we need to iterate on the set of measuring tool and perform |
308 switch (currentTool_) | 309 switch (currentTool_) |
309 { | 310 { |
310 case GuiTool_Rotate: | 311 case GuiTool_Rotate: |
311 //LOG(TRACE) << "Creating RotateSceneTracker"; | 312 //LOG(TRACE) << "Creating RotateSceneTracker"; |
312 return CreateSimpleTrackerAdapter(PointerTrackerPtr( | 313 return CreateSimpleTrackerAdapter(PointerTrackerPtr( |
313 new RotateSceneTracker(scene_, e))); | 314 new RotateSceneTracker(*GetScene(), e))); |
314 case GuiTool_Pan: | 315 case GuiTool_Pan: |
315 return CreateSimpleTrackerAdapter(PointerTrackerPtr( | 316 return CreateSimpleTrackerAdapter(PointerTrackerPtr( |
316 new PanSceneTracker(scene_, e))); | 317 new PanSceneTracker(*GetScene(), e))); |
317 case GuiTool_Zoom: | 318 case GuiTool_Zoom: |
318 return CreateSimpleTrackerAdapter(PointerTrackerPtr( | 319 return CreateSimpleTrackerAdapter(PointerTrackerPtr( |
319 new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); | 320 new ZoomSceneTracker(*GetScene(), e, compositor_->GetCanvasHeight()))); |
320 //case GuiTool_AngleMeasure: | 321 //case GuiTool_AngleMeasure: |
321 // return new AngleMeasureTracker(scene_, measureTools_, undoStack_, e); | 322 // return new AngleMeasureTracker(GetScene(), measureTools_, undoStack_, e); |
322 //case GuiTool_CircleMeasure: | 323 //case GuiTool_CircleMeasure: |
323 // return new CircleMeasureTracker(scene_, measureTools_, undoStack_, e); | 324 // return new CircleMeasureTracker(GetScene(), measureTools_, undoStack_, e); |
324 //case GuiTool_EllipseMeasure: | 325 //case GuiTool_EllipseMeasure: |
325 // return new EllipseMeasureTracker(scene_, measureTools_, undoStack_, e); | 326 // return new EllipseMeasureTracker(GetScene(), measureTools_, undoStack_, e); |
326 case GuiTool_LineMeasure: | 327 case GuiTool_LineMeasure: |
327 return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker( | 328 return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker( |
328 IObserver::GetBroker(), scene_, undoStack_, measureTools_, e)); | 329 IObserver::GetBroker(), GetScene(), undoStack_, measureTools_, e)); |
329 case GuiTool_AngleMeasure: | 330 case GuiTool_AngleMeasure: |
330 return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker( | 331 return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker( |
331 IObserver::GetBroker(), scene_, undoStack_, measureTools_, e)); | 332 IObserver::GetBroker(), GetScene(), undoStack_, measureTools_, e)); |
332 return NULL; | 333 return NULL; |
333 case GuiTool_CircleMeasure: | 334 case GuiTool_CircleMeasure: |
334 LOG(ERROR) << "Not implemented yet!"; | 335 LOG(ERROR) << "Not implemented yet!"; |
335 return NULL; | 336 return NULL; |
336 case GuiTool_EllipseMeasure: | 337 case GuiTool_EllipseMeasure: |
347 } | 348 } |
348 | 349 |
349 | 350 |
350 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) | 351 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) |
351 , currentTool_(GuiTool_Rotate) | 352 , currentTool_(GuiTool_Rotate) |
352 , scene_(broker) | 353 { |
353 { | 354 controller_ = ViewportControllerPtr(new ViewportController(broker)); |
354 scene_.RegisterObserverCallback( | 355 |
355 new Callable<TrackerSampleApp, Scene2D::SceneTransformChanged> | 356 controller_->RegisterObserverCallback( |
357 new Callable<TrackerSampleApp, ViewportController::SceneTransformChanged> | |
356 (*this, &TrackerSampleApp::OnSceneTransformChanged)); | 358 (*this, &TrackerSampleApp::OnSceneTransformChanged)); |
357 | 359 |
358 TEXTURE_2x2_1_ZINDEX = 1; | 360 TEXTURE_2x2_1_ZINDEX = 1; |
359 TEXTURE_1x1_ZINDEX = 2; | 361 TEXTURE_1x1_ZINDEX = 2; |
360 TEXTURE_2x2_2_ZINDEX = 3; | 362 TEXTURE_2x2_2_ZINDEX = 3; |
361 LINESET_1_ZINDEX = 4; | 363 LINESET_1_ZINDEX = 4; |
362 LINESET_2_ZINDEX = 5; | 364 LINESET_2_ZINDEX = 5; |
363 FLOATING_INFOTEXT_LAYER_ZINDEX = 6; | 365 FLOATING_INFOTEXT_LAYER_ZINDEX = 6; |
364 FIXED_INFOTEXT_LAYER_ZINDEX = 7; | 366 FIXED_INFOTEXT_LAYER_ZINDEX = 7; |
365 | |
366 | |
367 } | 367 } |
368 | 368 |
369 void TrackerSampleApp::PrepareScene() | 369 void TrackerSampleApp::PrepareScene() |
370 { | 370 { |
371 // Texture of 2x2 size | 371 // Texture of 2x2 size |
388 | 388 |
389 p[3] = 255; | 389 p[3] = 255; |
390 p[4] = 0; | 390 p[4] = 0; |
391 p[5] = 0; | 391 p[5] = 0; |
392 | 392 |
393 scene_.SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); | 393 GetScene()->SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); |
394 | 394 |
395 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); | 395 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); |
396 l->SetOrigin(-3, 2); | 396 l->SetOrigin(-3, 2); |
397 l->SetPixelSpacing(1.5, 1); | 397 l->SetPixelSpacing(1.5, 1); |
398 l->SetAngle(20.0 / 180.0 * M_PI); | 398 l->SetAngle(20.0 / 180.0 * M_PI); |
399 scene_.SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); | 399 GetScene()->SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); |
400 } | 400 } |
401 | 401 |
402 // Texture of 1x1 size | 402 // Texture of 1x1 size |
403 { | 403 { |
404 Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); | 404 Orthanc::Image i(Orthanc::PixelFormat_RGB24, 1, 1, false); |
409 p[2] = 0; | 409 p[2] = 0; |
410 | 410 |
411 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); | 411 std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); |
412 l->SetOrigin(-2, 1); | 412 l->SetOrigin(-2, 1); |
413 l->SetAngle(20.0 / 180.0 * M_PI); | 413 l->SetAngle(20.0 / 180.0 * M_PI); |
414 scene_.SetLayer(TEXTURE_1x1_ZINDEX, l.release()); | 414 GetScene()->SetLayer(TEXTURE_1x1_ZINDEX, l.release()); |
415 } | 415 } |
416 | 416 |
417 // Some lines | 417 // Some lines |
418 { | 418 { |
419 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer); | 419 std::auto_ptr<PolylineSceneLayer> layer(new PolylineSceneLayer); |
441 chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); | 441 chain.push_back(ScenePoint2D(-4, -4 + 2.0 * dy)); |
442 chain.push_back(ScenePoint2D(4, 2)); | 442 chain.push_back(ScenePoint2D(4, 2)); |
443 layer->AddChain(chain, false); | 443 layer->AddChain(chain, false); |
444 | 444 |
445 layer->SetColor(0, 255, 255); | 445 layer->SetColor(0, 255, 255); |
446 scene_.SetLayer(LINESET_1_ZINDEX, layer.release()); | 446 GetScene()->SetLayer(LINESET_1_ZINDEX, layer.release()); |
447 } | 447 } |
448 | 448 |
449 // Some text | 449 // Some text |
450 { | 450 { |
451 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); | 451 std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); |
452 layer->SetText("Hello"); | 452 layer->SetText("Hello"); |
453 scene_.SetLayer(LINESET_2_ZINDEX, layer.release()); | 453 GetScene()->SetLayer(LINESET_2_ZINDEX, layer.release()); |
454 } | 454 } |
455 } | 455 } |
456 | 456 |
457 | 457 |
458 void TrackerSampleApp::DisableTracker() | 458 void TrackerSampleApp::DisableTracker() |
466 | 466 |
467 void TrackerSampleApp::TakeScreenshot(const std::string& target, | 467 void TrackerSampleApp::TakeScreenshot(const std::string& target, |
468 unsigned int canvasWidth, | 468 unsigned int canvasWidth, |
469 unsigned int canvasHeight) | 469 unsigned int canvasHeight) |
470 { | 470 { |
471 CairoCompositor compositor(scene_, canvasWidth, canvasHeight); | 471 CairoCompositor compositor(GetScene(), canvasWidth, canvasHeight); |
472 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); | 472 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); |
473 compositor.Refresh(); | 473 compositor.Refresh(); |
474 | 474 |
475 Orthanc::ImageAccessor canvas; | 475 Orthanc::ImageAccessor canvas; |
476 compositor.GetCanvas().GetReadOnlyAccessor(canvas); | 476 compositor.GetCanvas().GetReadOnlyAccessor(canvas); |
512 { | 512 { |
513 // False means we do NOT let Windows treat this as a legacy application | 513 // False means we do NOT let Windows treat this as a legacy application |
514 // that needs to be scaled | 514 // that needs to be scaled |
515 SdlOpenGLWindow window("Hello", 1024, 1024, false); | 515 SdlOpenGLWindow window("Hello", 1024, 1024, false); |
516 | 516 |
517 GetScene().FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); | 517 GetScene()->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); |
518 | 518 |
519 glEnable(GL_DEBUG_OUTPUT); | 519 glEnable(GL_DEBUG_OUTPUT); |
520 glDebugMessageCallback(OpenGLMessageCallback, 0); | 520 glDebugMessageCallback(OpenGLMessageCallback, 0); |
521 | 521 |
522 compositor_.reset(new OpenGLCompositor(window, GetScene())); | 522 compositor_.reset(new OpenGLCompositor(window, GetScene())); |