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