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()));