Mercurial > hg > orthanc-stone
diff Samples/Sdl/TrackerSampleApp.cpp @ 656:002d9562c8f5
Added support to DISABLE legacy scaling in SDL Windows (only in WIN32... this
might also be needed on macos and GNU/Linux ?) + fixed text info overlay pos
for angle measure (this requires the app to be aware of the compositor)
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 14 May 2019 16:54:13 +0200 |
parents | 462a5074f914 |
children | cb3b76d16234 |
line wrap: on
line diff
--- a/Samples/Sdl/TrackerSampleApp.cpp Tue May 14 13:51:32 2019 +0200 +++ b/Samples/Sdl/TrackerSampleApp.cpp Tue May 14 16:54:13 2019 +0200 @@ -80,17 +80,51 @@ printf("Current tool is now: %s\n", MeasureToolToString(currentTool_)); } - void TrackerSampleApp::DisplayInfoText(const PointerEvent& e) + void TrackerSampleApp::DisplayInfoText() + { + char buf[256]; + sprintf(buf, "INFO TEXT\n*** INFO TEXT ***\ntoto tata tutu titi\nprrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrout"); + + TextSceneLayer* layerP = NULL; + if (scene_.HasLayer(FIXED_INFOTEXT_LAYER_ZINDEX)) + { + TextSceneLayer& layer = dynamic_cast<TextSceneLayer&>( + scene_.GetLayer(FIXED_INFOTEXT_LAYER_ZINDEX)); + layerP = &layer; + } + else + { + std::auto_ptr<TextSceneLayer> layer(new TextSceneLayer); + layerP = layer.get(); + layer->SetColor(0, 255, 0); + layer->SetFontIndex(1); + layer->SetText(buf); + layer->SetBorder(20); + layer->SetAnchor(BitmapAnchor_TopLeft); + //layer->SetPosition(0,0); + scene_.SetLayer(FIXED_INFOTEXT_LAYER_ZINDEX, layer.release()); + } + // position the fixed info text in the upper right corner + layerP->SetText(buf); + double cX = compositor_->GetCanvasWidth() * (-0.5); + double cY = compositor_->GetCanvasHeight() * (-0.5); + scene_.GetCanvasToSceneTransform().Apply(cX,cY); + layerP->SetPosition(cX, cY); + } + + void TrackerSampleApp::DisplayFloatingCtrlInfoText(const PointerEvent& e) { ScenePoint2D p = e.GetMainPosition().Apply(scene_.GetCanvasToSceneTransform()); - char buf[64]; - sprintf(buf, "(%0.02f,%0.02f)", p.GetX(), p.GetY()); + 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(INFOTEXT_LAYER_ZINDEX)) + if (scene_.HasLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)) { TextSceneLayer& layer = - dynamic_cast<TextSceneLayer&>(scene_.GetLayer(INFOTEXT_LAYER_ZINDEX)); + dynamic_cast<TextSceneLayer&>(scene_.GetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX)); layer.SetText(buf); layer.SetPosition(p.GetX(), p.GetY()); } @@ -102,19 +136,20 @@ layer->SetBorder(20); layer->SetAnchor(BitmapAnchor_BottomCenter); layer->SetPosition(p.GetX(), p.GetY()); - scene_.SetLayer(INFOTEXT_LAYER_ZINDEX, layer.release()); + scene_.SetLayer(FLOATING_INFOTEXT_LAYER_ZINDEX, layer.release()); } } void TrackerSampleApp::HideInfoText() { - scene_.DeleteLayer(INFOTEXT_LAYER_ZINDEX); + scene_.DeleteLayer(FLOATING_INFOTEXT_LAYER_ZINDEX); } void TrackerSampleApp::HandleApplicationEvent( - const OpenGLCompositor & compositor, const SDL_Event & event) { + DisplayInfoText(); + if (event.type == SDL_MOUSEMOTION) { int scancodeCount = 0; @@ -127,8 +162,10 @@ // The "left-ctrl" key is down, while no tracker is present // Let's display the info text PointerEvent e; - e.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); - DisplayInfoText(e); + e.AddPosition(compositor_->GetPixelCenterCoordinates( + event.button.x, event.button.y)); + + DisplayFloatingCtrlInfoText(e); } else { @@ -138,11 +175,14 @@ { //LOG(TRACE) << "(activeTracker_.get() != NULL)"; PointerEvent e; - e.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); + e.AddPosition(compositor_->GetPixelCenterCoordinates( + event.button.x, event.button.y)); + //LOG(TRACE) << "event.button.x = " << event.button.x << " " << // "event.button.y = " << event.button.y; //LOG(TRACE) << "activeTracker_->PointerMove(e); " << // e.GetMainPosition().GetX() << " " << e.GetMainPosition().GetY(); + activeTracker_->PointerMove(e); if (!activeTracker_->IsActive()) activeTracker_ = NULL; @@ -154,7 +194,7 @@ if (activeTracker_) { PointerEvent e; - e.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); + e.AddPosition(compositor_->GetPixelCenterCoordinates(event.button.x, event.button.y)); activeTracker_->PointerUp(e); if (!activeTracker_->IsActive()) activeTracker_ = NULL; @@ -163,7 +203,7 @@ else if (event.type == SDL_MOUSEBUTTONDOWN) { PointerEvent e; - e.AddPosition(compositor.GetPixelCenterCoordinates( + e.AddPosition(compositor_->GetPixelCenterCoordinates( event.button.x, event.button.y)); if (activeTracker_) { @@ -174,7 +214,7 @@ else { // we ATTEMPT to create a tracker if need be - activeTracker_ = CreateSuitableTracker(event, e, compositor); + activeTracker_ = CreateSuitableTracker(event, e); } } else if (event.type == SDL_KEYDOWN && @@ -202,15 +242,15 @@ break; case SDLK_s: - scene_.FitContent(compositor.GetCanvasWidth(), - compositor.GetCanvasHeight()); + scene_.FitContent(compositor_->GetCanvasWidth(), + compositor_->GetCanvasHeight()); break; case SDLK_c: TakeScreenshot( "screenshot.png", - compositor.GetCanvasWidth(), - compositor.GetCanvasHeight()); + compositor_->GetCanvasWidth(), + compositor_->GetCanvasHeight()); break; default: @@ -219,10 +259,17 @@ } } + + void TrackerSampleApp::OnSceneTransformChanged(const Scene2D::SceneTransformChanged& message) + { + // do not try to call this too early! + if(compositor_.get() != NULL) + DisplayInfoText(); + } + FlexiblePointerTrackerPtr TrackerSampleApp::CreateSuitableTracker( const SDL_Event & event, - const PointerEvent & e, - const OpenGLCompositor & compositor) + const PointerEvent & e) { switch (event.button.button) { @@ -232,7 +279,7 @@ case SDL_BUTTON_RIGHT: return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new ZoomSceneTracker(scene_, e, compositor.GetCanvasHeight()))); + new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); case SDL_BUTTON_LEFT: { @@ -264,7 +311,7 @@ new PanSceneTracker(scene_, e))); case GuiTool_Zoom: return CreateSimpleTrackerAdapter(PointerTrackerPtr( - new ZoomSceneTracker(scene_, e, compositor.GetCanvasHeight()))); + new ZoomSceneTracker(scene_, e, compositor_->GetCanvasHeight()))); //case GuiTool_AngleMeasure: // return new AngleMeasureTracker(scene_, measureTools_, undoStack_, e); //case GuiTool_CircleMeasure: @@ -397,9 +444,8 @@ unsigned int canvasWidth, unsigned int canvasHeight) { - // Take a screenshot, then save it as PNG file CairoCompositor compositor(scene_, canvasWidth, canvasHeight); - compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE, Orthanc::Encoding_Latin1); + compositor.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, FONT_SIZE_0, Orthanc::Encoding_Latin1); compositor.Refresh(); Orthanc::ImageAccessor canvas; @@ -419,6 +465,84 @@ return nullptr; } + static void GLAPIENTRY + OpenGLMessageCallback(GLenum source, + GLenum type, + GLuint id, + GLenum severity, + GLsizei length, + const GLchar* message, + const void* userParam) + { + if (severity != GL_DEBUG_SEVERITY_NOTIFICATION) + { + fprintf(stderr, "GL CALLBACK: %s type = 0x%x, severity = 0x%x, message = %s\n", + (type == GL_DEBUG_TYPE_ERROR ? "** GL ERROR **" : ""), + type, severity, message); + } + } + + static bool g_stopApplication = false; + + void TrackerSampleApp::Run() + { + // False means we do NOT let Windows treat this as a legacy application + // that needs to be scaled + SdlOpenGLWindow window("Hello", 1024, 1024, false); + + GetScene().FitContent(window.GetCanvasWidth(), window.GetCanvasHeight()); + + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(OpenGLMessageCallback, 0); + + compositor_.reset(new OpenGLCompositor(window, GetScene())); + + compositor_->SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_0, Orthanc::Encoding_Latin1); + compositor_->SetFont(1, Orthanc::EmbeddedResources::UBUNTU_FONT, + FONT_SIZE_1, Orthanc::Encoding_Latin1); + + while (!g_stopApplication) + { + compositor_->Refresh(); + + SDL_Event event; + while (!g_stopApplication && SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + g_stopApplication = true; + break; + } + else if (event.type == SDL_WINDOWEVENT && + event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED) + { + DisableTracker(); // was: tracker.reset(NULL); + compositor_->UpdateSize(); + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + window.GetWindow().ToggleMaximize(); + break; + + case SDLK_q: + g_stopApplication = true; + break; + default: + break; + } + } + HandleApplicationEvent(event); + } + SDL_Delay(1); + } + compositor_.reset(NULL); + } + }