comparison Samples/Sdl/TrackerSampleApp.cpp @ 893:0c5201499af8

Fixes to TrackerSampleApp following IViewport refactoring (FusionMprSdl not working yet) Removal of the useless scene_ inside ViewportController
author Benjamin Golinvaux <bgo@osimis.io>
date Mon, 15 Jul 2019 12:48:19 +0200
parents 0aff28f15ea2
children f9ae731fdc25
comparison
equal deleted inserted replaced
892:50cd372e2460 893:0c5201499af8
77 } 77 }
78 78
79 void TrackerSampleApp::DisplayInfoText() 79 void TrackerSampleApp::DisplayInfoText()
80 { 80 {
81 // do not try to use stuff too early! 81 // do not try to use stuff too early!
82 if (compositor_.get() == NULL)
83 return;
84
85 std::stringstream msg; 82 std::stringstream msg;
86 83
87 for (std::map<std::string, std::string>::const_iterator kv = infoTextMap_.begin(); 84 for (std::map<std::string, std::string>::const_iterator kv = infoTextMap_.begin();
88 kv != infoTextMap_.end(); ++kv) 85 kv != infoTextMap_.end(); ++kv)
89 { 86 {
109 //layer->SetPosition(0,0); 106 //layer->SetPosition(0,0);
110 controller_->GetScene().SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); 107 controller_->GetScene().SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release());
111 } 108 }
112 // position the fixed info text in the upper right corner 109 // position the fixed info text in the upper right corner
113 layerP->SetText(msgS.c_str()); 110 layerP->SetText(msgS.c_str());
114 double cX = compositor_->GetCanvasWidth() * (-0.5); 111 double cX = GetCompositor().GetCanvasWidth() * (-0.5);
115 double cY = compositor_->GetCanvasHeight() * (-0.5); 112 double cY = GetCompositor().GetCanvasHeight() * (-0.5);
116 controller_->GetScene().GetCanvasToSceneTransform().Apply(cX,cY); 113 controller_->GetScene().GetCanvasToSceneTransform().Apply(cX,cY);
117 layerP->SetPosition(cX, cY); 114 layerP->SetPosition(cX, cY);
118 } 115 }
119 116
120 void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) 117 void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e)
150 controller_->GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); 147 controller_->GetScene().DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX);
151 } 148 }
152 149
153 ScenePoint2D TrackerSampleApp::GetRandomPointInScene() const 150 ScenePoint2D TrackerSampleApp::GetRandomPointInScene() const
154 { 151 {
155 unsigned int w = compositor_->GetCanvasWidth(); 152 unsigned int w = GetCompositor().GetCanvasWidth();
156 LOG(TRACE) << "compositor_->GetCanvasWidth() = " << 153 LOG(TRACE) << "GetCompositor().GetCanvasWidth() = " <<
157 compositor_->GetCanvasWidth(); 154 GetCompositor().GetCanvasWidth();
158 unsigned int h = compositor_->GetCanvasHeight(); 155 unsigned int h = GetCompositor().GetCanvasHeight();
159 LOG(TRACE) << "compositor_->GetCanvasHeight() = " << 156 LOG(TRACE) << "GetCompositor().GetCanvasHeight() = " <<
160 compositor_->GetCanvasHeight(); 157 GetCompositor().GetCanvasHeight();
161 158
162 if ((w >= RAND_MAX) || (h >= RAND_MAX)) 159 if ((w >= RAND_MAX) || (h >= RAND_MAX))
163 LOG(WARNING) << "Canvas is too big : tools will not be randomly placed"; 160 LOG(WARNING) << "Canvas is too big : tools will not be randomly placed";
164 161
165 int x = rand() % w; 162 int x = rand() % w;
166 int y = rand() % h; 163 int y = rand() % h;
167 LOG(TRACE) << "random x = " << x << "random y = " << y; 164 LOG(TRACE) << "random x = " << x << "random y = " << y;
168 165
169 ScenePoint2D p = compositor_->GetPixelCenterCoordinates(x, y); 166 ScenePoint2D p = controller_->GetViewport().GetPixelCenterCoordinates(x, y);
170 LOG(TRACE) << "--> p.GetX() = " << p.GetX() << " p.GetY() = " << p.GetY(); 167 LOG(TRACE) << "--> p.GetX() = " << p.GetX() << " p.GetY() = " << p.GetY();
171 168
172 ScenePoint2D r = p.Apply(controller_->GetScene().GetCanvasToSceneTransform()); 169 ScenePoint2D r = p.Apply(controller_->GetScene().GetCanvasToSceneTransform());
173 LOG(TRACE) << "--> r.GetX() = " << r.GetX() << " r.GetY() = " << r.GetY(); 170 LOG(TRACE) << "--> r.GetX() = " << r.GetX() << " r.GetY() = " << r.GetY();
174 return r; 171 return r;
230 keyboardState[SDL_SCANCODE_LALT]) 227 keyboardState[SDL_SCANCODE_LALT])
231 { 228 {
232 // The "left-ctrl" key is down, while no tracker is present 229 // The "left-ctrl" key is down, while no tracker is present
233 // Let's display the info text 230 // Let's display the info text
234 PointerEvent e; 231 PointerEvent e;
235 e.AddPosition(compositor_->GetPixelCenterCoordinates( 232 e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(
236 event.button.x, event.button.y)); 233 event.button.x, event.button.y));
237 234
238 DisplayFloatingCtrlInfoText(e); 235 DisplayFloatingCtrlInfoText(e);
239 } 236 }
240 else if (activeTracker_.get() != NULL) 237 else if (activeTracker_.get() != NULL)
243 //LOG(TRACE) << "(event.type == SDL_MOUSEMOTION)"; 240 //LOG(TRACE) << "(event.type == SDL_MOUSEMOTION)";
244 if (activeTracker_.get() != NULL) 241 if (activeTracker_.get() != NULL)
245 { 242 {
246 //LOG(TRACE) << "(activeTracker_.get() != NULL)"; 243 //LOG(TRACE) << "(activeTracker_.get() != NULL)";
247 PointerEvent e; 244 PointerEvent e;
248 e.AddPosition(compositor_->GetPixelCenterCoordinates( 245 e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(
249 event.button.x, event.button.y)); 246 event.button.x, event.button.y));
250 247
251 //LOG(TRACE) << "event.button.x = " << event.button.x << " " << 248 //LOG(TRACE) << "event.button.x = " << event.button.x << " " <<
252 // "event.button.y = " << event.button.y; 249 // "event.button.y = " << event.button.y;
253 LOG(TRACE) << "activeTracker_->PointerMove(e); " << 250 LOG(TRACE) << "activeTracker_->PointerMove(e); " <<
261 else 258 else
262 { 259 {
263 HideInfoText(); 260 HideInfoText();
264 261
265 PointerEvent e; 262 PointerEvent e;
266 e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y)); 263 e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y));
267 264
268 ScenePoint2D scenePos = e.GetMainPosition().Apply( 265 ScenePoint2D scenePos = e.GetMainPosition().Apply(
269 controller_->GetScene().GetCanvasToSceneTransform()); 266 controller_->GetScene().GetCanvasToSceneTransform());
270 //auto measureTools = GetController()->HitTestMeasureTools(scenePos); 267 //auto measureTools = GetController()->HitTestMeasureTools(scenePos);
271 //LOG(TRACE) << "# of hit tests: " << measureTools.size(); 268 //LOG(TRACE) << "# of hit tests: " << measureTools.size();
288 else if (event.type == SDL_MOUSEBUTTONUP) 285 else if (event.type == SDL_MOUSEBUTTONUP)
289 { 286 {
290 if (activeTracker_) 287 if (activeTracker_)
291 { 288 {
292 PointerEvent e; 289 PointerEvent e;
293 e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y)); 290 e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(event.button.x, event.button.y));
294 activeTracker_->PointerUp(e); 291 activeTracker_->PointerUp(e);
295 if (!activeTracker_->IsAlive()) 292 if (!activeTracker_->IsAlive())
296 activeTracker_.reset(); 293 activeTracker_.reset();
297 } 294 }
298 } 295 }
299 else if (event.type == SDL_MOUSEBUTTONDOWN) 296 else if (event.type == SDL_MOUSEBUTTONDOWN)
300 { 297 {
301 PointerEvent e; 298 PointerEvent e;
302 e.AddPosition(compositor_->GetPixelCenterCoordinates( 299 e.AddPosition(controller_->GetViewport().GetPixelCenterCoordinates(
303 event.button.x, event.button.y)); 300 event.button.x, event.button.y));
304 if (activeTracker_) 301 if (activeTracker_)
305 { 302 {
306 activeTracker_->PointerDown(e); 303 activeTracker_->PointerDown(e);
307 if (!activeTracker_->IsAlive()) 304 if (!activeTracker_->IsAlive())
339 336
340 case SDLK_m: 337 case SDLK_m:
341 CreateRandomMeasureTool(); 338 CreateRandomMeasureTool();
342 break; 339 break;
343 case SDLK_s: 340 case SDLK_s:
344 controller_->FitContent(compositor_->GetCanvasWidth(), 341 controller_->FitContent(GetCompositor().GetCanvasWidth(),
345 compositor_->GetCanvasHeight()); 342 GetCompositor().GetCanvasHeight());
346 break; 343 break;
347 344
348 case SDLK_z: 345 case SDLK_z:
349 LOG(TRACE) << "SDLK_z has been pressed. event.key.keysym.mod == " << event.key.keysym.mod; 346 LOG(TRACE) << "SDLK_z has been pressed. event.key.keysym.mod == " << event.key.keysym.mod;
350 if (event.key.keysym.mod & KMOD_CTRL) 347 if (event.key.keysym.mod & KMOD_CTRL)
378 break; 375 break;
379 376
380 case SDLK_c: 377 case SDLK_c:
381 TakeScreenshot( 378 TakeScreenshot(
382 "screenshot.png", 379 "screenshot.png",
383 compositor_->GetCanvasWidth(), 380 GetCompositor().GetCanvasWidth(),
384 compositor_->GetCanvasHeight()); 381 GetCompositor().GetCanvasHeight());
385 break; 382 break;
386 383
387 default: 384 default:
388 break; 385 break;
389 } 386 }
409 return boost::shared_ptr<IFlexiblePointerTracker>(new PanSceneTracker 406 return boost::shared_ptr<IFlexiblePointerTracker>(new PanSceneTracker
410 (controller_, e)); 407 (controller_, e));
411 408
412 case SDL_BUTTON_RIGHT: 409 case SDL_BUTTON_RIGHT:
413 return boost::shared_ptr<IFlexiblePointerTracker>(new ZoomSceneTracker 410 return boost::shared_ptr<IFlexiblePointerTracker>(new ZoomSceneTracker
414 (controller_, e, compositor_->GetCanvasHeight())); 411 (controller_, e, GetCompositor().GetCanvasHeight()));
415 412
416 case SDL_BUTTON_LEFT: 413 case SDL_BUTTON_LEFT:
417 { 414 {
418 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:"; 415 //LOG(TRACE) << "CreateSuitableTracker: case SDL_BUTTON_LEFT:";
419 // TODO: we need to iterate on the set of measuring tool and perform 416 // TODO: we need to iterate on the set of measuring tool and perform
441 case GuiTool_Pan: 438 case GuiTool_Pan:
442 return boost::shared_ptr<IFlexiblePointerTracker>(new PanSceneTracker( 439 return boost::shared_ptr<IFlexiblePointerTracker>(new PanSceneTracker(
443 controller_, e)); 440 controller_, e));
444 case GuiTool_Zoom: 441 case GuiTool_Zoom:
445 return boost::shared_ptr<IFlexiblePointerTracker>(new ZoomSceneTracker( 442 return boost::shared_ptr<IFlexiblePointerTracker>(new ZoomSceneTracker(
446 controller_, e, compositor_->GetCanvasHeight())); 443 controller_, e, GetCompositor().GetCanvasHeight()));
447 //case GuiTool_AngleMeasure: 444 //case GuiTool_AngleMeasure:
448 // return new AngleMeasureTracker(GetScene(), e); 445 // return new AngleMeasureTracker(GetScene(), e);
449 //case GuiTool_CircleMeasure: 446 //case GuiTool_CircleMeasure:
450 // return new CircleMeasureTracker(GetScene(), e); 447 // return new CircleMeasureTracker(GetScene(), e);
451 //case GuiTool_EllipseMeasure: 448 //case GuiTool_EllipseMeasure:
474 471
475 472
476 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) 473 TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker)
477 , currentTool_(GuiTool_Rotate) 474 , currentTool_(GuiTool_Rotate)
478 , undoStack_(new UndoStack) 475 , undoStack_(new UndoStack)
476 , viewport_("Hello", 1024, 1024, false) // False means we do NOT let Windows treat this as a legacy application that needs to be scaled
479 { 477 {
480 controller_ = boost::shared_ptr<ViewportController>( 478 controller_ = boost::shared_ptr<ViewportController>(
481 new ViewportController(undoStack_, broker)); 479 new ViewportController(undoStack_, broker, viewport_));
482 480
483 controller_->RegisterObserverCallback( 481 controller_->RegisterObserverCallback(
484 new Callable<TrackerSampleApp, ViewportController::SceneTransformChanged> 482 new Callable<TrackerSampleApp, ViewportController::SceneTransformChanged>
485 (*this, &TrackerSampleApp::OnSceneTransformChanged)); 483 (*this, &TrackerSampleApp::OnSceneTransformChanged));
486 484
592 590
593 void TrackerSampleApp::TakeScreenshot(const std::string& target, 591 void TrackerSampleApp::TakeScreenshot(const std::string& target,
594 unsigned int canvasWidth, 592 unsigned int canvasWidth,
595 unsigned int canvasHeight) 593 unsigned int canvasHeight)
596 { 594 {
597 CairoCompositor compositor(*GetScene(), canvasWidth, canvasHeight); 595 CairoCompositor compositor(controller_->GetScene(), canvasWidth, canvasHeight);
598 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); 596 compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1);
599 compositor.Refresh(); 597 compositor.Refresh();
600 598
601 Orthanc::ImageAccessor canvas; 599 Orthanc::ImageAccessor canvas;
602 compositor.GetCanvas().GetReadOnlyAccessor(canvas); 600 compositor.GetCanvas().GetReadOnlyAccessor(canvas);
641 } 639 }
642 } 640 }
643 641
644 static bool g_stopApplication = false; 642 static bool g_stopApplication = false;
645 643
644 OpenGLCompositor& TrackerSampleApp::GetCompositor()
645 {
646 using namespace Orthanc;
647 try
648 {
649 SdlViewport& viewport = dynamic_cast<SdlViewport&>(viewport_);
650 return viewport.GetCompositor();
651 }
652 catch (std::bad_cast e)
653 {
654 throw OrthancException(ErrorCode_InternalError, "Wrong viewport type!");
655 }
656 }
657
658 const OpenGLCompositor& TrackerSampleApp::GetCompositor() const
659 {
660 using namespace Orthanc;
661 try
662 {
663 SdlViewport& viewport = const_cast<SdlViewport&>(dynamic_cast<const SdlViewport&>(viewport_));
664 return viewport.GetCompositor();
665 }
666 catch (std::bad_cast e)
667 {
668 throw OrthancException(ErrorCode_InternalError, "Wrong viewport type!");
669 }
670 }
671
672
646 void TrackerSampleApp::Run() 673 void TrackerSampleApp::Run()
647 { 674 {
648 // False means we do NOT let Windows treat this as a legacy application 675 controller_->FitContent(viewport_.GetCanvasWidth(), viewport_.GetCanvasHeight());
649 // that needs to be scaled
650 SdlOpenGLContext window("Hello", 1024, 1024, false);
651
652 controller_->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight());
653 676
654 glEnable(GL_DEBUG_OUTPUT); 677 glEnable(GL_DEBUG_OUTPUT);
655 glDebugMessageCallback(OpenGLMessageCallback, 0); 678 glDebugMessageCallback(OpenGLMessageCallback, 0);
656 679
657 compositor_.reset(new OpenGLCompositor(window, *GetScene())); 680 GetCompositor().SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT,
658
659 compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT,
660 FONT_SIZE_0, Orthanc::Encoding_Latin1); 681 FONT_SIZE_0, Orthanc::Encoding_Latin1);
661 compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, 682 GetCompositor().SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT,
662 FONT_SIZE_1, Orthanc::Encoding_Latin1); 683 FONT_SIZE_1, Orthanc::Encoding_Latin1);
663 684
664 while (!g_stopApplication) 685 while (!g_stopApplication)
665 { 686 {
666 compositor_->Refresh(); 687 GetCompositor().Refresh();
667 688
668 SDL_Event event; 689 SDL_Event event;
669 while (!g_stopApplication && SDL_PollEvent(&event)) 690 while (!g_stopApplication && SDL_PollEvent(&event))
670 { 691 {
671 if (event.type == SDL_QUIT) 692 if (event.type == SDL_QUIT)
682 event.key.repeat == 0 /* Ignore key bounce */) 703 event.key.repeat == 0 /* Ignore key bounce */)
683 { 704 {
684 switch (event.key.keysym.sym) 705 switch (event.key.keysym.sym)
685 { 706 {
686 case SDLK_f: 707 case SDLK_f:
687 window.GetWindow().ToggleMaximize(); 708 viewport_.GetContext().GetWindow().ToggleMaximize();
688 break; 709 break;
689 710
690 case SDLK_q: 711 case SDLK_q:
691 g_stopApplication = true; 712 g_stopApplication = true;
692 break; 713 break;
696 } 717 }
697 HandleApplicationEvent(event); 718 HandleApplicationEvent(event);
698 } 719 }
699 SDL_Delay(1); 720 SDL_Delay(1);
700 } 721 }
701
702 // the following is paramount because the compositor holds a reference
703 // to the scene and we do not want this reference to become dangling
704 compositor_.reset(NULL);
705 } 722 }
706 723
707 void TrackerSampleApp::SetInfoDisplayMessage( 724 void TrackerSampleApp::SetInfoDisplayMessage(
708 std::string key, std::string value) 725 std::string key, std::string value)
709 { 726 {