Mercurial > hg > orthanc-stone
diff Applications/Sdl/SdlEngine.cpp @ 56:9e3c2e75b870 wasm
extremely simplified SDL engine
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Fri, 28 Apr 2017 21:46:41 +0200 |
parents | c2dc924f1a63 |
children | ca644004d2ee |
line wrap: on
line diff
--- a/Applications/Sdl/SdlEngine.cpp Fri Apr 28 17:24:18 2017 +0200 +++ b/Applications/Sdl/SdlEngine.cpp Fri Apr 28 21:46:41 2017 +0200 @@ -29,55 +29,27 @@ namespace OrthancStone { + void SdlEngine::SetSize(BasicApplicationContext::ViewportLocker& locker, + unsigned int width, + unsigned int height) + { + locker.GetViewport().SetSize(width, height); + surface_.SetSize(width, height); + } + + void SdlEngine::RenderFrame() { - if (!viewportChanged_) - { - return; - } - - viewportChanged_ = false; - - bool updated; - + if (viewportChanged_) { BasicApplicationContext::ViewportLocker locker(context_); - updated = buffering_.RenderOffscreen(locker.GetViewport()); - } + surface_.Render(locker.GetViewport()); - if (updated) - { - // Do not notify twice when a new frame was rendered, to avoid - // spoiling the SDL event queue - SDL_Event event; - SDL_memset(&event, 0, sizeof(event)); - event.type = refreshEvent_; - event.user.code = 0; - event.user.data1 = 0; - event.user.data2 = 0; - SDL_PushEvent(&event); + viewportChanged_ = false; } } - void SdlEngine::RenderThread(SdlEngine* that) - { - for (;;) - { - that->renderFrame_.Wait(); - - if (that->continue_) - { - that->RenderFrame(); - } - else - { - return; - } - } - } - - KeyboardModifiers SdlEngine::GetKeyboardModifiers(const uint8_t* keyboardState, const int scancodeCount) { @@ -126,55 +98,23 @@ } - void SdlEngine::SetSize(BasicApplicationContext::ViewportLocker& locker, - unsigned int width, - unsigned int height) - { - buffering_.SetSize(width, height, locker.GetViewport()); - viewportChanged_ = true; - Refresh(); - } - - - void SdlEngine::Stop() - { - if (continue_) - { - continue_ = false; - renderFrame_.Signal(); // Unlock the render thread - renderThread_.join(); - } - } - - - void SdlEngine::Refresh() - { - renderFrame_.Signal(); - } - - SdlEngine::SdlEngine(SdlWindow& window, BasicApplicationContext& context) : window_(window), context_(context), - continue_(true) + surface_(window), + viewportChanged_(true) { - refreshEvent_ = SDL_RegisterEvents(1); - { BasicApplicationContext::ViewportLocker locker(context_); SetSize(locker, window_.GetWidth(), window_.GetHeight()); locker.GetViewport().Register(*this); } - - renderThread_ = boost::thread(RenderThread, this); } SdlEngine::~SdlEngine() { - Stop(); - { BasicApplicationContext::ViewportLocker locker(context_); locker.GetViewport().Unregister(*this); @@ -190,11 +130,12 @@ bool stop = false; while (!stop) { - Refresh(); + RenderFrame(); SDL_Event event; - while (SDL_PollEvent(&event)) + while (!stop && + SDL_PollEvent(&event)) { BasicApplicationContext::ViewportLocker locker(context_); @@ -203,10 +144,6 @@ stop = true; break; } - else if (event.type == refreshEvent_) - { - buffering_.SwapToScreen(window_); - } else if (event.type == SDL_MOUSEBUTTONDOWN) { KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); @@ -273,7 +210,8 @@ locker.GetViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); } } - else if (event.type == SDL_KEYDOWN) + else if (event.type == SDL_KEYDOWN && + event.key.repeat == 0 /* Ignore key bounce */) { KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); @@ -311,11 +249,7 @@ } } } - - SDL_Delay(10); // Necessary for mouse wheel events to work } - - Stop(); }