comparison 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
comparison
equal deleted inserted replaced
52:37e504582af6 53:c2dc924f1a63
36 return; 36 return;
37 } 37 }
38 38
39 viewportChanged_ = false; 39 viewportChanged_ = false;
40 40
41 if (buffering_.RenderOffscreen(viewport_)) 41 bool updated;
42
43 {
44 BasicApplicationContext::ViewportLocker locker(context_);
45 updated = buffering_.RenderOffscreen(locker.GetViewport());
46 }
47
48 if (updated)
42 { 49 {
43 // Do not notify twice when a new frame was rendered, to avoid 50 // Do not notify twice when a new frame was rendered, to avoid
44 // spoiling the SDL event queue 51 // spoiling the SDL event queue
45 SDL_Event event; 52 SDL_Event event;
46 SDL_memset(&event, 0, sizeof(event)); 53 SDL_memset(&event, 0, sizeof(event));
117 124
118 return static_cast<KeyboardModifiers>(result); 125 return static_cast<KeyboardModifiers>(result);
119 } 126 }
120 127
121 128
122 void SdlEngine::SetSize(unsigned int width, 129 void SdlEngine::SetSize(BasicApplicationContext::ViewportLocker& locker,
130 unsigned int width,
123 unsigned int height) 131 unsigned int height)
124 { 132 {
125 buffering_.SetSize(width, height, viewport_); 133 buffering_.SetSize(width, height, locker.GetViewport());
126 viewportChanged_ = true; 134 viewportChanged_ = true;
127 Refresh(); 135 Refresh();
128 } 136 }
129 137
130 138
144 renderFrame_.Signal(); 152 renderFrame_.Signal();
145 } 153 }
146 154
147 155
148 SdlEngine::SdlEngine(SdlWindow& window, 156 SdlEngine::SdlEngine(SdlWindow& window,
149 IViewport& viewport) : 157 BasicApplicationContext& context) :
150 window_(window), 158 window_(window),
151 viewport_(viewport), 159 context_(context),
152 continue_(true) 160 continue_(true)
153 { 161 {
154 refreshEvent_ = SDL_RegisterEvents(1); 162 refreshEvent_ = SDL_RegisterEvents(1);
155 163
156 SetSize(window_.GetWidth(), window_.GetHeight()); 164 {
157 165 BasicApplicationContext::ViewportLocker locker(context_);
158 viewport_.Register(*this); 166 SetSize(locker, window_.GetWidth(), window_.GetHeight());
167 locker.GetViewport().Register(*this);
168 }
159 169
160 renderThread_ = boost::thread(RenderThread, this); 170 renderThread_ = boost::thread(RenderThread, this);
161 } 171 }
162 172
163 173
164 SdlEngine::~SdlEngine() 174 SdlEngine::~SdlEngine()
165 { 175 {
166 Stop(); 176 Stop();
167 177
168 viewport_.Unregister(*this); 178 {
179 BasicApplicationContext::ViewportLocker locker(context_);
180 locker.GetViewport().Unregister(*this);
181 }
169 } 182 }
170 183
171 184
172 void SdlEngine::Run() 185 void SdlEngine::Run()
173 { 186 {
181 194
182 SDL_Event event; 195 SDL_Event event;
183 196
184 while (SDL_PollEvent(&event)) 197 while (SDL_PollEvent(&event))
185 { 198 {
199 BasicApplicationContext::ViewportLocker locker(context_);
200
186 if (event.type == SDL_QUIT) 201 if (event.type == SDL_QUIT)
187 { 202 {
188 stop = true; 203 stop = true;
189 break; 204 break;
190 } 205 }
197 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); 212 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount);
198 213
199 switch (event.button.button) 214 switch (event.button.button)
200 { 215 {
201 case SDL_BUTTON_LEFT: 216 case SDL_BUTTON_LEFT:
202 viewport_.MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers); 217 locker.GetViewport().MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers);
203 break; 218 break;
204 219
205 case SDL_BUTTON_RIGHT: 220 case SDL_BUTTON_RIGHT:
206 viewport_.MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers); 221 locker.GetViewport().MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers);
207 break; 222 break;
208 223
209 case SDL_BUTTON_MIDDLE: 224 case SDL_BUTTON_MIDDLE:
210 viewport_.MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers); 225 locker.GetViewport().MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers);
211 break; 226 break;
212 227
213 default: 228 default:
214 break; 229 break;
215 } 230 }
216 } 231 }
217 else if (event.type == SDL_MOUSEMOTION) 232 else if (event.type == SDL_MOUSEMOTION)
218 { 233 {
219 viewport_.MouseMove(event.button.x, event.button.y); 234 locker.GetViewport().MouseMove(event.button.x, event.button.y);
220 } 235 }
221 else if (event.type == SDL_MOUSEBUTTONUP) 236 else if (event.type == SDL_MOUSEBUTTONUP)
222 { 237 {
223 viewport_.MouseUp(); 238 locker.GetViewport().MouseUp();
224 } 239 }
225 else if (event.type == SDL_WINDOWEVENT) 240 else if (event.type == SDL_WINDOWEVENT)
226 { 241 {
227 switch (event.window.event) 242 switch (event.window.event)
228 { 243 {
229 case SDL_WINDOWEVENT_LEAVE: 244 case SDL_WINDOWEVENT_LEAVE:
230 viewport_.MouseLeave(); 245 locker.GetViewport().MouseLeave();
231 break; 246 break;
232 247
233 case SDL_WINDOWEVENT_ENTER: 248 case SDL_WINDOWEVENT_ENTER:
234 viewport_.MouseEnter(); 249 locker.GetViewport().MouseEnter();
235 break; 250 break;
236 251
237 case SDL_WINDOWEVENT_SIZE_CHANGED: 252 case SDL_WINDOWEVENT_SIZE_CHANGED:
238 SetSize(event.window.data1, event.window.data2); 253 SetSize(locker, event.window.data1, event.window.data2);
239 break; 254 break;
240 255
241 default: 256 default:
242 break; 257 break;
243 } 258 }
249 int x, y; 264 int x, y;
250 SDL_GetMouseState(&x, &y); 265 SDL_GetMouseState(&x, &y);
251 266
252 if (event.wheel.y > 0) 267 if (event.wheel.y > 0)
253 { 268 {
254 viewport_.MouseWheel(MouseWheelDirection_Up, x, y, modifiers); 269 locker.GetViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers);
255 } 270 }
256 else if (event.wheel.y < 0) 271 else if (event.wheel.y < 0)
257 { 272 {
258 viewport_.MouseWheel(MouseWheelDirection_Down, x, y, modifiers); 273 locker.GetViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers);
259 } 274 }
260 } 275 }
261 else if (event.type == SDL_KEYDOWN) 276 else if (event.type == SDL_KEYDOWN)
262 { 277 {
263 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); 278 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount);
264 279
265 switch (event.key.keysym.sym) 280 switch (event.key.keysym.sym)
266 { 281 {
267 case SDLK_a: viewport_.KeyPressed('a', modifiers); break; 282 case SDLK_a: locker.GetViewport().KeyPressed('a', modifiers); break;
268 case SDLK_b: viewport_.KeyPressed('b', modifiers); break; 283 case SDLK_b: locker.GetViewport().KeyPressed('b', modifiers); break;
269 case SDLK_c: viewport_.KeyPressed('c', modifiers); break; 284 case SDLK_c: locker.GetViewport().KeyPressed('c', modifiers); break;
270 case SDLK_d: viewport_.KeyPressed('d', modifiers); break; 285 case SDLK_d: locker.GetViewport().KeyPressed('d', modifiers); break;
271 case SDLK_e: viewport_.KeyPressed('e', modifiers); break; 286 case SDLK_e: locker.GetViewport().KeyPressed('e', modifiers); break;
272 case SDLK_f: window_.ToggleMaximize(); break; 287 case SDLK_f: window_.ToggleMaximize(); break;
273 case SDLK_g: viewport_.KeyPressed('g', modifiers); break; 288 case SDLK_g: locker.GetViewport().KeyPressed('g', modifiers); break;
274 case SDLK_h: viewport_.KeyPressed('h', modifiers); break; 289 case SDLK_h: locker.GetViewport().KeyPressed('h', modifiers); break;
275 case SDLK_i: viewport_.KeyPressed('i', modifiers); break; 290 case SDLK_i: locker.GetViewport().KeyPressed('i', modifiers); break;
276 case SDLK_j: viewport_.KeyPressed('j', modifiers); break; 291 case SDLK_j: locker.GetViewport().KeyPressed('j', modifiers); break;
277 case SDLK_k: viewport_.KeyPressed('k', modifiers); break; 292 case SDLK_k: locker.GetViewport().KeyPressed('k', modifiers); break;
278 case SDLK_l: viewport_.KeyPressed('l', modifiers); break; 293 case SDLK_l: locker.GetViewport().KeyPressed('l', modifiers); break;
279 case SDLK_m: viewport_.KeyPressed('m', modifiers); break; 294 case SDLK_m: locker.GetViewport().KeyPressed('m', modifiers); break;
280 case SDLK_n: viewport_.KeyPressed('n', modifiers); break; 295 case SDLK_n: locker.GetViewport().KeyPressed('n', modifiers); break;
281 case SDLK_o: viewport_.KeyPressed('o', modifiers); break; 296 case SDLK_o: locker.GetViewport().KeyPressed('o', modifiers); break;
282 case SDLK_p: viewport_.KeyPressed('p', modifiers); break; 297 case SDLK_p: locker.GetViewport().KeyPressed('p', modifiers); break;
283 case SDLK_q: stop = true; break; 298 case SDLK_q: stop = true; break;
284 case SDLK_r: viewport_.KeyPressed('r', modifiers); break; 299 case SDLK_r: locker.GetViewport().KeyPressed('r', modifiers); break;
285 case SDLK_s: viewport_.KeyPressed('s', modifiers); break; 300 case SDLK_s: locker.GetViewport().KeyPressed('s', modifiers); break;
286 case SDLK_t: viewport_.KeyPressed('t', modifiers); break; 301 case SDLK_t: locker.GetViewport().KeyPressed('t', modifiers); break;
287 case SDLK_u: viewport_.KeyPressed('u', modifiers); break; 302 case SDLK_u: locker.GetViewport().KeyPressed('u', modifiers); break;
288 case SDLK_v: viewport_.KeyPressed('v', modifiers); break; 303 case SDLK_v: locker.GetViewport().KeyPressed('v', modifiers); break;
289 case SDLK_w: viewport_.KeyPressed('w', modifiers); break; 304 case SDLK_w: locker.GetViewport().KeyPressed('w', modifiers); break;
290 case SDLK_x: viewport_.KeyPressed('x', modifiers); break; 305 case SDLK_x: locker.GetViewport().KeyPressed('x', modifiers); break;
291 case SDLK_y: viewport_.KeyPressed('y', modifiers); break; 306 case SDLK_y: locker.GetViewport().KeyPressed('y', modifiers); break;
292 case SDLK_z: viewport_.KeyPressed('z', modifiers); break; 307 case SDLK_z: locker.GetViewport().KeyPressed('z', modifiers); break;
293 308
294 default: 309 default:
295 break; 310 break;
296 } 311 }
297 } 312 }