Mercurial > hg > orthanc-stone
diff Samples/Sdl/SdlHelpers.h @ 1392:ffdb82850e98
Sdl run loop in /Common (might revert if need to customize)
Segregation ongoing between sdl wasm
Both samples ok SDL msvc v141 x64
author | Benjamin Golinvaux <bgo@osimis.io> |
---|---|
date | Tue, 28 Apr 2020 13:52:21 +0200 |
parents | 240531afdd2d |
children | 3e644f6fadd4 |
line wrap: on
line diff
--- a/Samples/Sdl/SdlHelpers.h Tue Apr 28 13:26:41 2020 +0200 +++ b/Samples/Sdl/SdlHelpers.h Tue Apr 28 13:52:21 2020 +0200 @@ -4,6 +4,10 @@ # error This file cannot be used if ORTHANC_ENABLE_SDL != 1 #endif +#include <Framework/Viewport/SdlViewport.h> + +#include <boost/shared_ptr.hpp> + #include <SDL.h> #include <map> @@ -11,6 +15,7 @@ namespace OrthancStoneHelpers { + inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, const int scancodeCount) { @@ -93,5 +98,121 @@ p.SetControlModifier(modifiers & KeyboardModifiers_Control); p.SetShiftModifier(modifiers & KeyboardModifiers_Shift); } + + + inline void SdlRunLoop(boost::shared_ptr<OrthancStone::SdlViewport> viewport, + OrthancStone::IViewportInteractor& interactor) + { + using namespace OrthancStone; + { + int scancodeCount = 0; + const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); + + bool stop = false; + while (!stop) + { + bool paint = false; + SDL_Event event; + while (SDL_PollEvent(&event)) + { + if (event.type == SDL_QUIT) + { + 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)) + { + 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; + } + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) + { + switch (event.key.keysym.sym) + { + case SDLK_f: + viewport->ToggleMaximize(); + break; + + case SDLK_s: + { + std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); + lock->GetCompositor().FitContent(lock->GetController().GetScene()); + lock->Invalidate(); + } + break; + + case SDLK_q: + stop = true; + break; + + default: + break; + } + } + else if (event.type == SDL_MOUSEBUTTONDOWN || + event.type == SDL_MOUSEMOTION || + event.type == SDL_MOUSEBUTTONUP) + { + std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); + if (lock->HasCompositor()) + { + OrthancStone::PointerEvent p; + OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), + event, keyboardState, scancodeCount); + + switch (event.type) + { + case SDL_MOUSEBUTTONDOWN: + lock->GetController().HandleMousePress(interactor, p, + lock->GetCompositor().GetCanvasWidth(), + lock->GetCompositor().GetCanvasHeight()); + lock->Invalidate(); + break; + + case SDL_MOUSEMOTION: + if (lock->GetController().HandleMouseMove(p)) + { + lock->Invalidate(); + } + break; + + case SDL_MOUSEBUTTONUP: + lock->GetController().HandleMouseRelease(p); + lock->Invalidate(); + break; + + default: + throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); + } + } + } + } + + if (paint) + { + viewport->Paint(); + } + + // Small delay to avoid using 100% of CPU + SDL_Delay(1); + } + } + } + + + + }