diff Applications/Sdl/SdlEngine.cpp @ 53:c2dc924f1a63 wasm

removing threading out of the framework
author Sebastien Jodogne <s.jodogne@gmail.com>
date Thu, 27 Apr 2017 16:57:49 +0200
parents b340879da9bd
children 9e3c2e75b870
line wrap: on
line diff
--- a/Applications/Sdl/SdlEngine.cpp	Thu Apr 27 14:50:40 2017 +0200
+++ b/Applications/Sdl/SdlEngine.cpp	Thu Apr 27 16:57:49 2017 +0200
@@ -38,7 +38,14 @@
 
     viewportChanged_ = false;
 
-    if (buffering_.RenderOffscreen(viewport_))
+    bool updated;
+    
+    {
+      BasicApplicationContext::ViewportLocker locker(context_);
+      updated = buffering_.RenderOffscreen(locker.GetViewport());
+    }
+
+    if (updated)
     {
       // Do not notify twice when a new frame was rendered, to avoid
       // spoiling the SDL event queue
@@ -119,10 +126,11 @@
   }
 
 
-  void SdlEngine::SetSize(unsigned int width,
+  void SdlEngine::SetSize(BasicApplicationContext::ViewportLocker& locker,
+                          unsigned int width,
                           unsigned int height)
   {
-    buffering_.SetSize(width, height, viewport_);
+    buffering_.SetSize(width, height, locker.GetViewport());
     viewportChanged_ = true;
     Refresh();
   }
@@ -146,16 +154,18 @@
 
 
   SdlEngine::SdlEngine(SdlWindow& window,
-                       IViewport& viewport) :
+                       BasicApplicationContext& context) :
     window_(window),
-    viewport_(viewport),
+    context_(context),
     continue_(true)
   {
     refreshEvent_ = SDL_RegisterEvents(1);
 
-    SetSize(window_.GetWidth(), window_.GetHeight());
-
-    viewport_.Register(*this);
+    {
+      BasicApplicationContext::ViewportLocker locker(context_);
+      SetSize(locker, window_.GetWidth(), window_.GetHeight());
+      locker.GetViewport().Register(*this);
+    }
 
     renderThread_ = boost::thread(RenderThread, this);
   }
@@ -165,7 +175,10 @@
   {
     Stop();
 
-    viewport_.Unregister(*this);
+    {
+      BasicApplicationContext::ViewportLocker locker(context_);
+      locker.GetViewport().Unregister(*this);
+    }
   }
 
 
@@ -183,6 +196,8 @@
 
       while (SDL_PollEvent(&event))
       {
+        BasicApplicationContext::ViewportLocker locker(context_);
+
         if (event.type == SDL_QUIT) 
         {
           stop = true;
@@ -199,15 +214,15 @@
           switch (event.button.button)
           {
             case SDL_BUTTON_LEFT:
-              viewport_.MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers);
+              locker.GetViewport().MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers);
               break;
             
             case SDL_BUTTON_RIGHT:
-              viewport_.MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers);
+              locker.GetViewport().MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers);
               break;
             
             case SDL_BUTTON_MIDDLE:
-              viewport_.MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers);
+              locker.GetViewport().MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers);
               break;
 
             default:
@@ -216,26 +231,26 @@
         }
         else if (event.type == SDL_MOUSEMOTION)
         {
-          viewport_.MouseMove(event.button.x, event.button.y);
+          locker.GetViewport().MouseMove(event.button.x, event.button.y);
         }
         else if (event.type == SDL_MOUSEBUTTONUP)
         {
-          viewport_.MouseUp();
+          locker.GetViewport().MouseUp();
         }
         else if (event.type == SDL_WINDOWEVENT)
         {
           switch (event.window.event)
           {
             case SDL_WINDOWEVENT_LEAVE:
-              viewport_.MouseLeave();
+              locker.GetViewport().MouseLeave();
               break;
 
             case SDL_WINDOWEVENT_ENTER:
-              viewport_.MouseEnter();
+              locker.GetViewport().MouseEnter();
               break;
 
             case SDL_WINDOWEVENT_SIZE_CHANGED:
-              SetSize(event.window.data1, event.window.data2);
+              SetSize(locker, event.window.data1, event.window.data2);
               break;
 
             default:
@@ -251,11 +266,11 @@
 
           if (event.wheel.y > 0)
           {
-            viewport_.MouseWheel(MouseWheelDirection_Up, x, y, modifiers);
+            locker.GetViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers);
           }
           else if (event.wheel.y < 0)
           {
-            viewport_.MouseWheel(MouseWheelDirection_Down, x, y, modifiers);
+            locker.GetViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers);
           }
         }
         else if (event.type == SDL_KEYDOWN)
@@ -264,32 +279,32 @@
 
           switch (event.key.keysym.sym)
           {
-            case SDLK_a:  viewport_.KeyPressed('a', modifiers);  break;
-            case SDLK_b:  viewport_.KeyPressed('b', modifiers);  break;
-            case SDLK_c:  viewport_.KeyPressed('c', modifiers);  break;
-            case SDLK_d:  viewport_.KeyPressed('d', modifiers);  break;
-            case SDLK_e:  viewport_.KeyPressed('e', modifiers);  break;
-            case SDLK_f:  window_.ToggleMaximize();              break;
-            case SDLK_g:  viewport_.KeyPressed('g', modifiers);  break;
-            case SDLK_h:  viewport_.KeyPressed('h', modifiers);  break;
-            case SDLK_i:  viewport_.KeyPressed('i', modifiers);  break;
-            case SDLK_j:  viewport_.KeyPressed('j', modifiers);  break;
-            case SDLK_k:  viewport_.KeyPressed('k', modifiers);  break;
-            case SDLK_l:  viewport_.KeyPressed('l', modifiers);  break;
-            case SDLK_m:  viewport_.KeyPressed('m', modifiers);  break;
-            case SDLK_n:  viewport_.KeyPressed('n', modifiers);  break;
-            case SDLK_o:  viewport_.KeyPressed('o', modifiers);  break;
-            case SDLK_p:  viewport_.KeyPressed('p', modifiers);  break;
-            case SDLK_q:  stop = true;                           break;
-            case SDLK_r:  viewport_.KeyPressed('r', modifiers);  break;
-            case SDLK_s:  viewport_.KeyPressed('s', modifiers);  break;
-            case SDLK_t:  viewport_.KeyPressed('t', modifiers);  break;
-            case SDLK_u:  viewport_.KeyPressed('u', modifiers);  break;
-            case SDLK_v:  viewport_.KeyPressed('v', modifiers);  break;
-            case SDLK_w:  viewport_.KeyPressed('w', modifiers);  break;
-            case SDLK_x:  viewport_.KeyPressed('x', modifiers);  break;
-            case SDLK_y:  viewport_.KeyPressed('y', modifiers);  break;
-            case SDLK_z:  viewport_.KeyPressed('z', modifiers);  break;
+            case SDLK_a:  locker.GetViewport().KeyPressed('a', modifiers);  break;
+            case SDLK_b:  locker.GetViewport().KeyPressed('b', modifiers);  break;
+            case SDLK_c:  locker.GetViewport().KeyPressed('c', modifiers);  break;
+            case SDLK_d:  locker.GetViewport().KeyPressed('d', modifiers);  break;
+            case SDLK_e:  locker.GetViewport().KeyPressed('e', modifiers);  break;
+            case SDLK_f:  window_.ToggleMaximize();                         break;
+            case SDLK_g:  locker.GetViewport().KeyPressed('g', modifiers);  break;
+            case SDLK_h:  locker.GetViewport().KeyPressed('h', modifiers);  break;
+            case SDLK_i:  locker.GetViewport().KeyPressed('i', modifiers);  break;
+            case SDLK_j:  locker.GetViewport().KeyPressed('j', modifiers);  break;
+            case SDLK_k:  locker.GetViewport().KeyPressed('k', modifiers);  break;
+            case SDLK_l:  locker.GetViewport().KeyPressed('l', modifiers);  break;
+            case SDLK_m:  locker.GetViewport().KeyPressed('m', modifiers);  break;
+            case SDLK_n:  locker.GetViewport().KeyPressed('n', modifiers);  break;
+            case SDLK_o:  locker.GetViewport().KeyPressed('o', modifiers);  break;
+            case SDLK_p:  locker.GetViewport().KeyPressed('p', modifiers);  break;
+            case SDLK_q:  stop = true;                                      break;
+            case SDLK_r:  locker.GetViewport().KeyPressed('r', modifiers);  break;
+            case SDLK_s:  locker.GetViewport().KeyPressed('s', modifiers);  break;
+            case SDLK_t:  locker.GetViewport().KeyPressed('t', modifiers);  break;
+            case SDLK_u:  locker.GetViewport().KeyPressed('u', modifiers);  break;
+            case SDLK_v:  locker.GetViewport().KeyPressed('v', modifiers);  break;
+            case SDLK_w:  locker.GetViewport().KeyPressed('w', modifiers);  break;
+            case SDLK_x:  locker.GetViewport().KeyPressed('x', modifiers);  break;
+            case SDLK_y:  locker.GetViewport().KeyPressed('y', modifiers);  break;
+            case SDLK_z:  locker.GetViewport().KeyPressed('z', modifiers);  break;
 
             default:
               break;