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