Mercurial > hg > orthanc-stone
diff Samples/Sdl/TrackerSampleApp.cpp @ 728:8190213e2279 am-dev
Merged default into am-dev
author | Alain Mazy <am@osimis.io> |
---|---|
date | Tue, 21 May 2019 13:25:58 +0200 |
parents | 28b9e3a54200 |
children | 4d69256d2a46 284f37dc1c66 |
line wrap: on
line diff
--- a/Samples/Sdl/TrackerSampleApp.cpp Thu May 16 19:10:38 2019 +0200 +++ b/Samples/Sdl/TrackerSampleApp.cpp Tue May 21 13:25:58 2019 +0200 @@ -20,21 +20,22 @@ #include "TrackerSampleApp.h" -#include "../Common/CreateLineMeasureTracker.h" -#include "../Common/CreateAngleMeasureTracker.h" - -#include "../../Applications/Sdl/SdlOpenGLWindow.h" +#include <Framework/Scene2DViewport/CreateLineMeasureTracker.h> +#include <Framework/Scene2DViewport/CreateAngleMeasureTracker.h> -#include "../../Framework/Scene2D/PanSceneTracker.h" -#include "../../Framework/Scene2D/RotateSceneTracker.h" -#include "../../Framework/Scene2D/Scene2D.h" -#include "../../Framework/Scene2D/ZoomSceneTracker.h" -#include "../../Framework/Scene2D/CairoCompositor.h" -#include "../../Framework/Scene2D/ColorTextureSceneLayer.h" -#include "../../Framework/Scene2D/OpenGLCompositor.h" -#include "../../Framework/StoneInitialization.h" +#include <Framework/Scene2D/PanSceneTracker.h> +#include <Framework/Scene2D/RotateSceneTracker.h> +#include <Framework/Scene2D/Scene2D.h> +#include <Framework/Scene2D/ZoomSceneTracker.h> +#include <Framework/Scene2D/CairoCompositor.h> +#include <Framework/Scene2D/ColorTextureSceneLayer.h> +#include <Framework/Scene2D/OpenGLCompositor.h> - // From Orthanc framework +#include <Framework/StoneInitialization.h> + +#include <Applications/Sdl/SdlOpenGLWindow.h> + +// From Orthanc framework #include <Core/Logging.h> #include <Core/OrthancException.h> #include <Core/Images/Image.h> @@ -67,9 +68,9 @@ return descs[i]; } - Scene2D& TrackerSampleApp::GetScene() + Scene2DPtr TrackerSampleApp::GetScene() { - return scene_; + return controller_->GetScene(); } void TrackerSampleApp::SelectNextTool() @@ -87,17 +88,19 @@ return; std::stringstream msg; - for (auto kv : infoTextMap_) + + for (std::map<std::string, std::string>::const_iterator kv = infoTextMap_.begin(); + kv != infoTextMap_.end(); ++kv) { - msg << kv.first << " : " << kv.second << std::endl; + msg << kv->first << " : " << kv->second << std::endl; } - auto msgS = msg.str(); + std::string msgS = msg.str(); TextSceneLayer* layerP = NULL; - if (scene_.HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) + if (GetScene()->HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) { TextSceneLayer& layer = dynamic_cast<TextSceneLayer&>( - scene_.GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); + GetScene()->GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); layerP = &layer; } else @@ -109,29 +112,29 @@ layer->SetBorder(20); layer->SetAnchor(BitmapAnchor_TopLeft); //layer->SetPosition(0,0); - scene_.SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); + GetScene()->SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); } // position the fixed info text in the upper right corner layerP->SetText(msgS.c_str()); double cX = compositor_->GetCanvasWidth() * (-0.5); double cY = compositor_->GetCanvasHeight() * (-0.5); - scene_.GetCanvasToSceneTransform().Apply(cX,cY); + GetScene()->GetCanvasToSceneTransform().Apply(cX,cY); layerP->SetPosition(cX, cY); } void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) { - ScenePoint2D p = e.GetMainPosition().Apply(scene_.GetCanvasToSceneTransform()); + ScenePoint2D p = e.GetMainPosition().Apply(GetScene()->GetCanvasToSceneTransform()); char buf[128]; sprintf(buf, "S:(%0.02f,%0.02f) C:(%0.02f,%0.02f)", p.GetX(), p.GetY(), e.GetMainPosition().GetX(), e.GetMainPosition().GetY()); - if (scene_.HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) + if (GetScene()->HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) { TextSceneLayer& layer = - dynamic_cast<TextSceneLayer&>(scene_.GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); + dynamic_cast<TextSceneLayer&>(GetScene()->GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); layer.SetText(buf); layer.SetPosition(p.GetX(), p.GetY()); } @@ -143,13 +146,13 @@ layer->SetBorder(20); layer->SetAnchor(BitmapAnchor_BottomCenter); layer->SetPosition(p.GetX(), p.GetY()); - scene_.SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); + GetScene()->SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); } } void TrackerSampleApp::HideInfoText() { - scene_.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); + GetScene()->DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); } void TrackerSampleApp::HandleApplicationEvent( @@ -191,8 +194,8 @@ // e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); activeTracker_->PointerMove(e); - if (!activeTracker_->IsActive()) - activeTracker_ = NULL; + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); } } } @@ -203,8 +206,8 @@ PointerEvent e; e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y)); activeTracker_->PointerUp(e); - if (!activeTracker_->IsActive()) - activeTracker_ = NULL; + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); } } else if (event.type == SDL_MOUSEBUTTONDOWN) @@ -215,8 +218,8 @@ if (activeTracker_) { activeTracker_->PointerDown(e); - if (!activeTracker_->IsActive()) - activeTracker_ = NULL; + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); } else { @@ -233,8 +236,8 @@ if (activeTracker_) { activeTracker_->Cancel(); - if (!activeTracker_->IsActive()) - activeTracker_ = NULL; + if (!activeTracker_->IsAlive()) + activeTracker_.reset(); } break; @@ -249,7 +252,7 @@ break; case SDLK_s: - scene_.FitContent(compositor_->GetCanvasWidth(), + controller_->FitContent(compositor_->GetCanvasWidth(), compositor_->GetCanvasHeight()); break; @@ -267,7 +270,8 @@ } - void TrackerSampleApp::OnSceneTransformChanged(const Scene2D::SceneTransformChanged& message) + void TrackerSampleApp::OnSceneTransformChanged( + const ViewportController::SceneTransformChanged& message) { DisplayInfoText(); } @@ -279,12 +283,12 @@ switch (event.button.button) { case SDL_BUTTON_MIDDLE: - return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new PanSceneTracker(scene_, e))); + return FlexiblePointerTrackerPtr(new PanSceneTracker + (controller_, e)); case SDL_BUTTON_RIGHT: - return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); + return FlexiblePointerTrackerPtr(new ZoomSceneTracker + (controller_, e, compositor_->GetCanvasHeight())); case SDL_BUTTON_LEFT: { @@ -309,50 +313,50 @@ { case GuiTool_Rotate: //LOG(TRACE) << "Creating RotateSceneTracker"; - return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new RotateSceneTracker(scene_, e))); + return FlexiblePointerTrackerPtr(new RotateSceneTracker( + controller_, e)); case GuiTool_Pan: - return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new PanSceneTracker(scene_, e))); + return FlexiblePointerTrackerPtr(new PanSceneTracker( + controller_, e)); case GuiTool_Zoom: - return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); + return FlexiblePointerTrackerPtr(new ZoomSceneTracker( + controller_, e, compositor_->GetCanvasHeight())); //case GuiTool_AngleMeasure: - // return new AngleMeasureTracker(scene_, measureTools_, undoStack_, e); + // return new AngleMeasureTracker(GetScene(), e); //case GuiTool_CircleMeasure: - // return new CircleMeasureTracker(scene_, measureTools_, undoStack_, e); + // return new CircleMeasureTracker(GetScene(), e); //case GuiTool_EllipseMeasure: - // return new EllipseMeasureTracker(scene_, measureTools_, undoStack_, e); + // return new EllipseMeasureTracker(GetScene(), e); case GuiTool_LineMeasure: return FlexiblePointerTrackerPtr(new CreateLineMeasureTracker( - IObserver::GetBroker(), scene_, undoStack_, measureTools_, e)); + IObserver::GetBroker(), controller_, e)); case GuiTool_AngleMeasure: return FlexiblePointerTrackerPtr(new CreateAngleMeasureTracker( - IObserver::GetBroker(), scene_, undoStack_, measureTools_, e)); - return NULL; + IObserver::GetBroker(), controller_, e)); case GuiTool_CircleMeasure: LOG(ERROR) << "Not implemented yet!"; - return NULL; + return FlexiblePointerTrackerPtr(); case GuiTool_EllipseMeasure: LOG(ERROR) << "Not implemented yet!"; - return NULL; + return FlexiblePointerTrackerPtr(); default: throw OrthancException(ErrorCode_InternalError, "Wrong tool!"); } } } default: - return NULL; + return FlexiblePointerTrackerPtr(); } } TrackerSampleApp::TrackerSampleApp(MessageBroker& broker) : IObserver(broker) - , scene_(broker) , currentTool_(GuiTool_Rotate) { - scene_.RegisterObserverCallback( - new Callable<TrackerSampleApp, Scene2D::SceneTransformChanged> + controller_ = ViewportControllerPtr(new ViewportController(broker)); + + controller_->RegisterObserverCallback( + new Callable<TrackerSampleApp, ViewportController::SceneTransformChanged> (*this, &TrackerSampleApp::OnSceneTransformChanged)); TEXTURE_2x2_1_ZINDEX = 1; @@ -362,8 +366,6 @@ LINESET_2_ZINDEX = 5; FLOATING_INFOTEXT_LAYER_ZINDEX = 6; FIXED_INFOTEXT_LAYER_ZINDEX = 7; - - } void TrackerSampleApp::PrepareScene() @@ -390,13 +392,13 @@ p[4] = 0; p[5] = 0; - scene_.SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); + GetScene()->SetLayer(TEXTURE_2x2_1_ZINDEX, new ColorTextureSceneLayer(i)); std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); l->SetOrigin(-3, 2); l->SetPixelSpacing(1.5, 1); l->SetAngle(20.0 / 180.0 * M_PI); - scene_.SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); + GetScene()->SetLayer(TEXTURE_2x2_2_ZINDEX, l.release()); } // Texture of 1x1 size @@ -411,7 +413,7 @@ std::auto_ptr<ColorTextureSceneLayer> l(new ColorTextureSceneLayer(i)); l->SetOrigin(-2, 1); l->SetAngle(20.0 / 180.0 * M_PI); - scene_.SetLayer(TEXTURE_1x1_ZINDEX, l.release()); + GetScene()->SetLayer(TEXTURE_1x1_ZINDEX, l.release()); } // Some lines @@ -443,14 +445,14 @@ layer->AddChain(chain, false); layer->SetColor(0, 255, 255); - scene_.SetLayer(LINESET_1_ZINDEX, layer.release()); + GetScene()->SetLayer(LINESET_1_ZINDEX, layer.release()); } // Some text { std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); layer->SetText("Hello"); - scene_.SetLayer(LINESET_2_ZINDEX, layer.release()); + GetScene()->SetLayer(LINESET_2_ZINDEX, layer.release()); } } @@ -460,7 +462,7 @@ if (activeTracker_) { activeTracker_->Cancel(); - activeTracker_ = NULL; + activeTracker_.reset(); } } @@ -468,7 +470,7 @@ unsigned int canvasWidth, unsigned int canvasHeight) { - CairoCompositor compositor(scene_, canvasWidth, canvasHeight); + CairoCompositor compositor(*GetScene(), canvasWidth, canvasHeight); compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); compositor.Refresh(); @@ -486,7 +488,7 @@ FlexiblePointerTrackerPtr TrackerSampleApp::TrackerHitTest(const PointerEvent & e) { // std::vector<MeasureToolPtr> measureTools_; - return nullptr; + return FlexiblePointerTrackerPtr(); } static void GLAPIENTRY @@ -514,12 +516,12 @@ // that needs to be scaled SdlOpenGLWindow window("Hello", 1024, 1024, false); - GetScene().FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); + controller_->FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); glEnable(GL_DEBUG_OUTPUT); glDebugMessageCallback(OpenGLMessageCallback, 0); - compositor_.reset(new OpenGLCompositor(window, GetScene())); + compositor_.reset(new OpenGLCompositor(window, *GetScene())); compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); @@ -564,6 +566,9 @@ } SDL_Delay(1); } + + // the following is paramount because the compositor holds a reference + // to the scene and we do not want this reference to become dangling compositor_.reset(NULL); }