Mercurial > hg > orthanc-stone
annotate 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 |
rev | line source |
---|---|
0 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
40
7207a407bcd8
shared copyright with osimis
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
16
diff
changeset
|
5 * Copyright (C) 2017 Osimis, Belgium |
0 | 6 * |
7 * This program is free software: you can redistribute it and/or | |
47 | 8 * modify it under the terms of the GNU Affero General Public License |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
0 | 11 * |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
47 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
0 | 18 * along with this program. If not, see <http://www.gnu.org/licenses/>. |
19 **/ | |
20 | |
21 | |
22 #include "SdlEngine.h" | |
23 | |
24 #if ORTHANC_ENABLE_SDL == 1 | |
25 | |
16 | 26 #include "../../../Resources/Orthanc/Core/Logging.h" |
0 | 27 |
28 #include <SDL.h> | |
29 | |
30 namespace OrthancStone | |
31 { | |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
32 void SdlEngine::SetSize(BasicApplicationContext::ViewportLocker& locker, |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
33 unsigned int width, |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
34 unsigned int height) |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
35 { |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
36 locker.GetViewport().SetSize(width, height); |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
37 surface_.SetSize(width, height); |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
38 } |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
39 |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
40 |
0 | 41 void SdlEngine::RenderFrame() |
42 { | |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
43 if (viewportChanged_) |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
44 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
45 BasicApplicationContext::ViewportLocker locker(context_); |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
46 surface_.Render(locker.GetViewport()); |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
47 |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
48 viewportChanged_ = false; |
0 | 49 } |
50 } | |
51 | |
52 | |
53 KeyboardModifiers SdlEngine::GetKeyboardModifiers(const uint8_t* keyboardState, | |
54 const int scancodeCount) | |
55 { | |
56 int result = KeyboardModifiers_None; | |
57 | |
58 if (keyboardState != NULL) | |
59 { | |
60 if (SDL_SCANCODE_LSHIFT < scancodeCount && | |
61 keyboardState[SDL_SCANCODE_LSHIFT]) | |
62 { | |
63 result |= KeyboardModifiers_Shift; | |
64 } | |
65 | |
66 if (SDL_SCANCODE_RSHIFT < scancodeCount && | |
67 keyboardState[SDL_SCANCODE_RSHIFT]) | |
68 { | |
69 result |= KeyboardModifiers_Shift; | |
70 } | |
71 | |
72 if (SDL_SCANCODE_LCTRL < scancodeCount && | |
73 keyboardState[SDL_SCANCODE_LCTRL]) | |
74 { | |
75 result |= KeyboardModifiers_Control; | |
76 } | |
77 | |
78 if (SDL_SCANCODE_RCTRL < scancodeCount && | |
79 keyboardState[SDL_SCANCODE_RCTRL]) | |
80 { | |
81 result |= KeyboardModifiers_Control; | |
82 } | |
83 | |
84 if (SDL_SCANCODE_LALT < scancodeCount && | |
85 keyboardState[SDL_SCANCODE_LALT]) | |
86 { | |
87 result |= KeyboardModifiers_Alt; | |
88 } | |
89 | |
90 if (SDL_SCANCODE_RALT < scancodeCount && | |
91 keyboardState[SDL_SCANCODE_RALT]) | |
92 { | |
93 result |= KeyboardModifiers_Alt; | |
94 } | |
95 } | |
96 | |
97 return static_cast<KeyboardModifiers>(result); | |
98 } | |
99 | |
100 | |
101 SdlEngine::SdlEngine(SdlWindow& window, | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
102 BasicApplicationContext& context) : |
0 | 103 window_(window), |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
104 context_(context), |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
105 surface_(window), |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
106 viewportChanged_(true) |
0 | 107 { |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
108 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
109 BasicApplicationContext::ViewportLocker locker(context_); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
110 SetSize(locker, window_.GetWidth(), window_.GetHeight()); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
111 locker.GetViewport().Register(*this); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
112 } |
0 | 113 } |
114 | |
115 | |
116 SdlEngine::~SdlEngine() | |
117 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
118 { |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
119 BasicApplicationContext::ViewportLocker locker(context_); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
120 locker.GetViewport().Unregister(*this); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
121 } |
0 | 122 } |
123 | |
124 | |
125 void SdlEngine::Run() | |
126 { | |
127 int scancodeCount = 0; | |
128 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount); | |
129 | |
130 bool stop = false; | |
131 while (!stop) | |
132 { | |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
133 RenderFrame(); |
0 | 134 |
135 SDL_Event event; | |
136 | |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
137 while (!stop && |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
138 SDL_PollEvent(&event)) |
0 | 139 { |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
140 BasicApplicationContext::ViewportLocker locker(context_); |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
141 |
0 | 142 if (event.type == SDL_QUIT) |
143 { | |
144 stop = true; | |
145 break; | |
146 } | |
147 else if (event.type == SDL_MOUSEBUTTONDOWN) | |
148 { | |
149 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); | |
150 | |
151 switch (event.button.button) | |
152 { | |
153 case SDL_BUTTON_LEFT: | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
154 locker.GetViewport().MouseDown(MouseButton_Left, event.button.x, event.button.y, modifiers); |
0 | 155 break; |
156 | |
157 case SDL_BUTTON_RIGHT: | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
158 locker.GetViewport().MouseDown(MouseButton_Right, event.button.x, event.button.y, modifiers); |
0 | 159 break; |
160 | |
161 case SDL_BUTTON_MIDDLE: | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
162 locker.GetViewport().MouseDown(MouseButton_Middle, event.button.x, event.button.y, modifiers); |
0 | 163 break; |
164 | |
165 default: | |
166 break; | |
167 } | |
168 } | |
169 else if (event.type == SDL_MOUSEMOTION) | |
170 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
171 locker.GetViewport().MouseMove(event.button.x, event.button.y); |
0 | 172 } |
173 else if (event.type == SDL_MOUSEBUTTONUP) | |
174 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
175 locker.GetViewport().MouseUp(); |
0 | 176 } |
177 else if (event.type == SDL_WINDOWEVENT) | |
178 { | |
179 switch (event.window.event) | |
180 { | |
181 case SDL_WINDOWEVENT_LEAVE: | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
182 locker.GetViewport().MouseLeave(); |
0 | 183 break; |
184 | |
185 case SDL_WINDOWEVENT_ENTER: | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
186 locker.GetViewport().MouseEnter(); |
0 | 187 break; |
188 | |
189 case SDL_WINDOWEVENT_SIZE_CHANGED: | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
190 SetSize(locker, event.window.data1, event.window.data2); |
0 | 191 break; |
192 | |
193 default: | |
194 break; | |
195 } | |
196 } | |
197 else if (event.type == SDL_MOUSEWHEEL) | |
198 { | |
199 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); | |
200 | |
201 int x, y; | |
202 SDL_GetMouseState(&x, &y); | |
203 | |
204 if (event.wheel.y > 0) | |
205 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
206 locker.GetViewport().MouseWheel(MouseWheelDirection_Up, x, y, modifiers); |
0 | 207 } |
208 else if (event.wheel.y < 0) | |
209 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
210 locker.GetViewport().MouseWheel(MouseWheelDirection_Down, x, y, modifiers); |
0 | 211 } |
212 } | |
56
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
213 else if (event.type == SDL_KEYDOWN && |
9e3c2e75b870
extremely simplified SDL engine
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
53
diff
changeset
|
214 event.key.repeat == 0 /* Ignore key bounce */) |
0 | 215 { |
216 KeyboardModifiers modifiers = GetKeyboardModifiers(keyboardState, scancodeCount); | |
217 | |
218 switch (event.key.keysym.sym) | |
219 { | |
53
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
220 case SDLK_a: locker.GetViewport().KeyPressed('a', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
221 case SDLK_b: locker.GetViewport().KeyPressed('b', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
222 case SDLK_c: locker.GetViewport().KeyPressed('c', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
223 case SDLK_d: locker.GetViewport().KeyPressed('d', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
224 case SDLK_e: locker.GetViewport().KeyPressed('e', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
225 case SDLK_f: window_.ToggleMaximize(); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
226 case SDLK_g: locker.GetViewport().KeyPressed('g', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
227 case SDLK_h: locker.GetViewport().KeyPressed('h', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
228 case SDLK_i: locker.GetViewport().KeyPressed('i', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
229 case SDLK_j: locker.GetViewport().KeyPressed('j', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
230 case SDLK_k: locker.GetViewport().KeyPressed('k', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
231 case SDLK_l: locker.GetViewport().KeyPressed('l', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
232 case SDLK_m: locker.GetViewport().KeyPressed('m', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
233 case SDLK_n: locker.GetViewport().KeyPressed('n', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
234 case SDLK_o: locker.GetViewport().KeyPressed('o', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
235 case SDLK_p: locker.GetViewport().KeyPressed('p', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
236 case SDLK_q: stop = true; break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
237 case SDLK_r: locker.GetViewport().KeyPressed('r', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
238 case SDLK_s: locker.GetViewport().KeyPressed('s', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
239 case SDLK_t: locker.GetViewport().KeyPressed('t', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
240 case SDLK_u: locker.GetViewport().KeyPressed('u', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
241 case SDLK_v: locker.GetViewport().KeyPressed('v', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
242 case SDLK_w: locker.GetViewport().KeyPressed('w', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
243 case SDLK_x: locker.GetViewport().KeyPressed('x', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
244 case SDLK_y: locker.GetViewport().KeyPressed('y', modifiers); break; |
c2dc924f1a63
removing threading out of the framework
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
51
diff
changeset
|
245 case SDLK_z: locker.GetViewport().KeyPressed('z', modifiers); break; |
0 | 246 |
247 default: | |
248 break; | |
249 } | |
250 } | |
251 } | |
252 } | |
253 } | |
254 | |
255 | |
256 void SdlEngine::GlobalInitialize() | |
257 { | |
258 SDL_Init(SDL_INIT_VIDEO); | |
259 } | |
260 | |
261 | |
262 void SdlEngine::GlobalFinalize() | |
263 { | |
264 SDL_Quit(); | |
265 } | |
266 } | |
267 | |
268 #endif |