comparison Samples/Sdl/SdlHelpers.h @ 1404:3e644f6fadd4

Three-viewport is now OK in SDL and Wasm
author Benjamin Golinvaux <bgo@osimis.io>
date Wed, 29 Apr 2020 22:06:24 +0200
parents ffdb82850e98
children 5d7ee14dc1eb
comparison
equal deleted inserted replaced
1395:62dc0d737e7b 1404:3e644f6fadd4
97 p.SetAltModifier(modifiers & KeyboardModifiers_Alt); 97 p.SetAltModifier(modifiers & KeyboardModifiers_Alt);
98 p.SetControlModifier(modifiers & KeyboardModifiers_Control); 98 p.SetControlModifier(modifiers & KeyboardModifiers_Control);
99 p.SetShiftModifier(modifiers & KeyboardModifiers_Shift); 99 p.SetShiftModifier(modifiers & KeyboardModifiers_Shift);
100 } 100 }
101 101
102 102 static boost::shared_ptr<OrthancStone::SdlViewport> GetSdlViewportFromWindowId(
103 inline void SdlRunLoop(boost::shared_ptr<OrthancStone::SdlViewport> viewport, 103 const std::vector<boost::shared_ptr<OrthancStone::SdlViewport> >& viewports,
104 Uint32 windowID)
105 {
106 using namespace OrthancStone;
107 for (size_t i = 0; i < viewports.size(); ++i)
108 {
109 boost::shared_ptr<IViewport> viewport = viewports[i];
110 boost::shared_ptr<SdlViewport> sdlViewport = boost::dynamic_pointer_cast<SdlViewport>(viewport);
111 Uint32 curWindowID = sdlViewport->GetSdlWindowId();
112 if (windowID == curWindowID)
113 return sdlViewport;
114 }
115 return NULL;
116 }
117
118 inline void SdlRunLoop(const std::vector<boost::shared_ptr<OrthancStone::SdlViewport> >& viewports,
104 OrthancStone::IViewportInteractor& interactor) 119 OrthancStone::IViewportInteractor& interactor)
105 { 120 {
106 using namespace OrthancStone; 121 using namespace OrthancStone;
107 { 122 {
108 int scancodeCount = 0; 123 int scancodeCount = 0;
118 if (event.type == SDL_QUIT) 133 if (event.type == SDL_QUIT)
119 { 134 {
120 stop = true; 135 stop = true;
121 break; 136 break;
122 } 137 }
123 else if (viewport->IsRefreshEvent(event))
124 {
125 paint = true;
126 }
127 else if (event.type == SDL_WINDOWEVENT && 138 else if (event.type == SDL_WINDOWEVENT &&
128 (event.window.event == SDL_WINDOWEVENT_RESIZED || 139 (event.window.event == SDL_WINDOWEVENT_RESIZED ||
129 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED)) 140 event.window.event == SDL_WINDOWEVENT_SIZE_CHANGED))
130 { 141 {
142 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId(
143 viewports, event.window.windowID);
131 viewport->UpdateSize(event.window.data1, event.window.data2); 144 viewport->UpdateSize(event.window.data1, event.window.data2);
132 } 145 }
133 else if (event.type == SDL_WINDOWEVENT && 146 else if (event.type == SDL_WINDOWEVENT &&
134 (event.window.event == SDL_WINDOWEVENT_SHOWN || 147 (event.window.event == SDL_WINDOWEVENT_SHOWN ||
135 event.window.event == SDL_WINDOWEVENT_EXPOSED)) 148 event.window.event == SDL_WINDOWEVENT_EXPOSED))
136 { 149 {
137 paint = true; 150 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId(
151 viewports, event.window.windowID);
152 viewport->Paint();
138 } 153 }
139 else if (event.type == SDL_KEYDOWN && 154 else if (event.type == SDL_KEYDOWN &&
140 event.key.repeat == 0 /* Ignore key bounce */) 155 event.key.repeat == 0 /* Ignore key bounce */)
141 { 156 {
157 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId(
158 viewports, event.window.windowID);
159
142 switch (event.key.keysym.sym) 160 switch (event.key.keysym.sym)
143 { 161 {
144 case SDLK_f: 162 case SDLK_f:
145 viewport->ToggleMaximize(); 163 viewport->ToggleMaximize();
146 break; 164 break;
147 165
148 case SDLK_s: 166 case SDLK_s:
149 { 167 {
150 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); 168 std::unique_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock());
151 lock->GetCompositor().FitContent(lock->GetController().GetScene()); 169 lock->GetCompositor().FitContent(lock->GetController().GetScene());
152 lock->Invalidate(); 170 lock->Invalidate();
153 } 171 }
154 break; 172 break;
155 173
156 case SDLK_q: 174 case SDLK_q:
157 stop = true; 175 stop = true;
158 break; 176 break;
159 177
163 } 181 }
164 else if (event.type == SDL_MOUSEBUTTONDOWN || 182 else if (event.type == SDL_MOUSEBUTTONDOWN ||
165 event.type == SDL_MOUSEMOTION || 183 event.type == SDL_MOUSEMOTION ||
166 event.type == SDL_MOUSEBUTTONUP) 184 event.type == SDL_MOUSEBUTTONUP)
167 { 185 {
186 boost::shared_ptr<SdlViewport> viewport = GetSdlViewportFromWindowId(
187 viewports, event.window.windowID);
188
168 std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock()); 189 std::auto_ptr<OrthancStone::IViewport::ILock> lock(viewport->Lock());
169 if (lock->HasCompositor()) 190 if (lock->HasCompositor())
170 { 191 {
171 OrthancStone::PointerEvent p; 192 OrthancStone::PointerEvent p;
172 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(), 193 OrthancStoneHelpers::GetPointerEvent(p, lock->GetCompositor(),
196 default: 217 default:
197 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError); 218 throw Orthanc::OrthancException(Orthanc::ErrorCode_InternalError);
198 } 219 }
199 } 220 }
200 } 221 }
222 else
223 {
224 for (size_t i = 0; i < viewports.size(); ++i)
225 {
226 boost::shared_ptr<SdlViewport> viewport = viewports[i];
227 if (viewport->IsRefreshEvent(event))
228 viewport->Paint();
229 }
230 }
201 } 231 }
202 232 }
203 if (paint) 233 // Small delay to avoid using 100% of CPU
204 { 234 SDL_Delay(1);
205 viewport->Paint(); 235 }
206 } 236 }
207
208 // Small delay to avoid using 100% of CPU
209 SDL_Delay(1);
210 }
211 }
212 }
213
214
215
216
217 } 237 }
218 238
239