Mercurial > hg > orthanc-stone
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 } |