comparison Samples/Sdl/SdlHelpers.h @ 1392:ffdb82850e98

Sdl run loop in /Common (might revert if need to customize) Segregation ongoing between sdl wasm Both samples ok SDL msvc v141 x64
author Benjamin Golinvaux <bgo@osimis.io>
date Tue, 28 Apr 2020 13:52:21 +0200
parents 240531afdd2d
children 3e644f6fadd4
comparison
equal deleted inserted replaced
1391:32272ecfc6c2 1392:ffdb82850e98
2 2
3 #if ORTHANC_ENABLE_SDL != 1 3 #if ORTHANC_ENABLE_SDL != 1
4 # error This file cannot be used if ORTHANC_ENABLE_SDL != 1 4 # error This file cannot be used if ORTHANC_ENABLE_SDL != 1
5 #endif 5 #endif
6 6
7 #include <Framework/Viewport/SdlViewport.h>
8
9 #include <boost/shared_ptr.hpp>
10
7 #include <SDL.h> 11 #include <SDL.h>
8 12
9 #include <map> 13 #include <map>
10 #include <string> 14 #include <string>
11 15
12 namespace OrthancStoneHelpers 16 namespace OrthancStoneHelpers
13 { 17 {
18
14 inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState, 19 inline OrthancStone::KeyboardModifiers GetKeyboardModifiers(const uint8_t* keyboardState,
15 const int scancodeCount) 20 const int scancodeCount)
16 { 21 {
17 using namespace OrthancStone; 22 using namespace OrthancStone;
18 int result = KeyboardModifiers_None; 23 int result = KeyboardModifiers_None;
91 p.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y)); 96 p.AddPosition(compositor.GetPixelCenterCoordinates(event.button.x, event.button.y));
92 p.SetAltModifier(modifiers & KeyboardModifiers_Alt); 97 p.SetAltModifier(modifiers & KeyboardModifiers_Alt);
93 p.SetControlModifier(modifiers & KeyboardModifiers_Control); 98 p.SetControlModifier(modifiers & KeyboardModifiers_Control);
94 p.SetShiftModifier(modifiers & KeyboardModifiers_Shift); 99 p.SetShiftModifier(modifiers & KeyboardModifiers_Shift);
95 } 100 }
101
102
103 inline void SdlRunLoop(boost::shared_ptr<OrthancStone::SdlViewport> viewport,
104 OrthancStone::IViewportInteractor& interactor)
105 {
106 using namespace OrthancStone;
107 {
108 int scancodeCount = 0;
109 const uint8_t* keyboardState = SDL_GetKeyboardState(&scancodeCount);
110
111 bool stop = false;
112 while (!stop)
113 {
114 bool paint = false;
115 SDL_Event event;
116 while (SDL_PollEvent(&event))
117 {
118 if (event.type == SDL_QUIT)
119 {
120 stop = true;
121 break;
122 }
123 else if (viewport->IsRefreshEvent(event))
124 {
125 paint = true;
126 }
127 else if (event.type == SDL_WINDOWEVENT &&
128 (event.window.event == SDL_WINDOWEVENT_RESIZED ||
129 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED))
130 {
131 viewport->UpdateSize(event.window.data1, event.window.data2);
132 }
133 else if (event.type == SDL_WINDOWEVENT &&
134 (event.window.event == SDL_WINDOWEVENT_SHOWN ||
135 event.window.event == SDL_WINDOWEVENT_EXPOSED))
136 {
137 paint = true;
138 }
139 else if (event.type == SDL_KEYDOWN &&
140 event.key.repeat == 0 /* Ignore key bounce */)
141 {
142 switch (event.key.keysym.sym)
143 {
144 case SDLK_f:
145 viewport->ToggleMaximize();
146 break;
147
148 case SDLK_s:
149 {
150 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock());
151 lock->GetCompositor().FitContent(lock->GetController().GetScene());
152 lock->Invalidate();
153 }
154 break;
155
156 case SDLK_q:
157 stop = true;
158 break;
159
160 default:
161 break;
162 }
163 }
164 else if (event.type == SDL_MOUSEBUTTONDOWN ||
165 event.type == SDL_MOUSEMOTION ||
166 event.type == SDL_MOUSEBUTTONUP)
167 {
168 std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock());
169 if (lock->HasCompositor())
170 {
171 OrthancStone::PointerEvent p;
172 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(),
173 event, keyboardState, scancodeCount);
174
175 switch (event.type)
176 {
177 case SDL_MOUSEBUTTONDOWN:
178 lock->GetController().HandleMousePress(interactor, p,
179 lock->GetCompositor().GetCanvasWidth(),
180 lock->GetCompositor().GetCanvasHeight());
181 lock->Invalidate();
182 break;
183
184 case SDL_MOUSEMOTION:
185 if (lock->GetController().HandleMouseMove(p))
186 {
187 lock->Invalidate();
188 }
189 break;
190
191 case SDL_MOUSEBUTTONUP:
192 lock->GetController().HandleMouseRelease(p);
193 lock->Invalidate();
194 break;
195
196 default:
197 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
198 }
199 }
200 }
201 }
202
203 if (paint)
204 {
205 viewport->Paint();
206 }
207
208 // Small delay to avoid using 100% of CPU
209 SDL_Delay(1);
210 }
211 }
212 }
213
214
215
216
96 } 217 }
97 218