Mercurial > hg > orthanc-stone
diff Samples/Sdl/SdlHelpers.h @ 1404:3e644f6fadd4
Three-viewport is now OK in SDL and Wasm
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Wed, 29 Apr 2020 22:06:24 +0200 |
parents | ffdb82850e98 |
children | 5d7ee14dc1eb |
line wrap: on
line diff
--- a/Samples/Sdl/SdlHelpers.h Wed Apr 29 18:11:49 2020 +0200 +++ b/Samples/Sdl/SdlHelpers.h Wed Apr 29 22:06:24 2020 +0200 @@ -99,8 +99,23 @@ p.SetShiftModifier(modifiers & KeyboardModifiers_Shift); } + static boost::shared_ptr<OrthancStone::SdlViewport> GetSdlViewportFromWindowId( + const std::vector<boost::shared_ptr<OrthancStone::SdlViewport> >& viewports, + Uint32 windowID) + { + using namespace OrthancStone; + for (size_t i = 0; i < viewports.size(); ++i) + { + boost::shared_ptr<IViewport> viewport = viewports[i]; + boost::shared_ptr<SdlViewport> sdlViewport = boost::dynamic_pointer_cast<SdlViewport>(viewport); + Uint32 curWindowID = sdlViewport->GetSdlWindowId(); + if (windowID == curWindowID) + return sdlViewport; + } + return NULL; + } - inline void SdlRunLoop(boost::shared_ptr<OrthancStone::SdlViewport> viewport, + inline void SdlRunLoop(const std::vector<boost::shared_ptr<OrthancStone::SdlViewport> >& viewports, OrthancStone::IViewportInteractor& interactor) { using namespace OrthancStone; @@ -120,25 +135,28 @@ stop = true; break; } - else if (viewport->IsRefreshEvent(event)) - { - paint = true; - } else if (event.type == SDL_WINDOWEVENT && (event.window.event == SDL_WINDOWEVENT_RESIZED || event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) { + boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( + viewports, event.window.windowID); viewport->UpdateSize(event.window.data1, event.window.data2); } else if (event.type == SDL_WINDOWEVENT && (event.window.event == SDL_WINDOWEVENT_SHOWN || event.window.event == SDL_WINDOWEVENT_EXPOSED)) { - paint = true; + boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( + viewports, event.window.windowID); + viewport->Paint(); } else if (event.type == SDL_KEYDOWN && event.key.repeat == 0 /* Ignore key bounce */) { + boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( + viewports, event.window.windowID); + switch (event.key.keysym.sym) { case SDLK_f: @@ -146,12 +164,12 @@ break; case SDLK_s: - { - std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); - lock->GetCompositor().FitContent(lock->GetController().GetScene()); - lock->Invalidate(); - } - break; + { + std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + break; case SDLK_q: stop = true; @@ -165,6 +183,9 @@ event.type == SDL_MOUSEMOTION || event.type == SDL_MOUSEBUTTONUP) { + boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId( + viewports, event.window.windowID); + std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); if (lock->HasCompositor()) { @@ -198,21 +219,21 @@ } } } + else + { + for (size_t i = 0; i < viewports.size(); ++i) + { + boost::shared_ptr<SdlViewport> viewport = viewports[i]; + if (viewport->IsRefreshEvent(event)) + viewport->Paint(); + } + } } - - if (paint) - { - viewport->Paint(); - } - - // Small delay to avoid using 100% of CPU - SDL_Delay(1); } + // Small delay to avoid using 100% of CPU + SDL_Delay(1); } } - +} - -} -