Mercurial > hg > orthanc-stone
comparison Samples/WebAssembly/BasicScene.cpp @ 617:7efa2543699d
simplification
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Thu, 02 May 2019 18:21:59 +0200 |
parents | 97926984d5d0 |
children | 0925b27e8750 |
comparison
equal
deleted
inserted
replaced
616:97926984d5d0 | 617:7efa2543699d |
---|---|
35 #include "../../Framework/StoneInitialization.h" | 35 #include "../../Framework/StoneInitialization.h" |
36 #include "../../Framework/OpenGL/WebAssemblyOpenGLContext.h" | 36 #include "../../Framework/OpenGL/WebAssemblyOpenGLContext.h" |
37 | 37 |
38 // From Orthanc framework | 38 // From Orthanc framework |
39 #include <Core/Images/Image.h> | 39 #include <Core/Images/Image.h> |
40 #include <Core/Logging.h> | |
40 | 41 |
41 #include <stdio.h> | 42 #include <stdio.h> |
42 | 43 |
43 static const unsigned int FONT_SIZE = 32; | 44 static const unsigned int FONT_SIZE = 32; |
44 | 45 |
137 } | 138 } |
138 | 139 |
139 | 140 |
140 | 141 |
141 | 142 |
142 | 143 namespace OrthancStone |
143 class WebAssemblyCanvas : public boost::noncopyable | 144 { |
144 { | 145 class WebAssemblyCanvas : public boost::noncopyable |
145 private: | 146 { |
146 OrthancStone::OpenGL::WebAssemblyOpenGLContext context_; | 147 private: |
147 OrthancStone::Scene2D scene_; | 148 OpenGL::WebAssemblyOpenGLContext context_; |
148 OrthancStone::OpenGLCompositor compositor_; | 149 Scene2D scene_; |
149 | 150 OpenGLCompositor compositor_; |
150 public: | 151 |
151 WebAssemblyCanvas(const std::string& canvas) : | 152 void SetupEvents(const std::string& canvas); |
152 context_(canvas), | 153 |
153 compositor_(context_, scene_) | 154 public: |
154 { | 155 WebAssemblyCanvas(const std::string& canvas) : |
155 compositor_.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, | 156 context_(canvas), |
156 FONT_SIZE, Orthanc::Encoding_Latin1); | 157 compositor_(context_, scene_) |
157 } | 158 { |
158 | 159 compositor_.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, |
159 OrthancStone::Scene2D& GetScene() | 160 FONT_SIZE, Orthanc::Encoding_Latin1); |
160 { | 161 SetupEvents(canvas); |
161 return scene_; | 162 } |
162 } | 163 |
163 | 164 Scene2D& GetScene() |
164 void UpdateSize() | 165 { |
165 { | 166 return scene_; |
166 context_.UpdateSize(); | 167 } |
167 compositor_.UpdateSize(); | 168 |
168 Refresh(); | 169 void UpdateSize() |
169 } | 170 { |
170 | 171 context_.UpdateSize(); |
171 void Refresh() | 172 compositor_.UpdateSize(); |
172 { | 173 Refresh(); |
173 compositor_.Refresh(); | 174 } |
174 } | 175 |
175 }; | 176 void Refresh() |
176 | 177 { |
177 | 178 compositor_.Refresh(); |
178 | 179 } |
179 std::auto_ptr<WebAssemblyCanvas> canvas1_; | 180 |
180 std::auto_ptr<WebAssemblyCanvas> canvas2_; | 181 const std::string& GetCanvasIdentifier() const |
181 std::auto_ptr<WebAssemblyCanvas> canvas3_; | 182 { |
183 return context_.GetCanvasIdentifier(); | |
184 } | |
185 | |
186 ScenePoint2D GetPixelCenterCoordinates(int x, int y) const | |
187 { | |
188 return compositor_.GetPixelCenterCoordinates(x, y); | |
189 } | |
190 }; | |
191 | |
192 | |
193 | |
194 class ActiveTracker : public boost::noncopyable | |
195 { | |
196 private: | |
197 std::auto_ptr<IPointerTracker> tracker_; | |
198 std::string canvasIdentifier_; | |
199 bool insideCanvas_; | |
200 | |
201 public: | |
202 ActiveTracker(IPointerTracker* tracker, | |
203 const WebAssemblyCanvas& canvas) : | |
204 tracker_(tracker), | |
205 canvasIdentifier_(canvas.GetCanvasIdentifier()), | |
206 insideCanvas_(true) | |
207 { | |
208 } | |
209 }; | |
210 } | |
211 | |
212 | |
213 | |
214 static OrthancStone::PointerEvent* ConvertMouseEvent(const EmscriptenMouseEvent& source, | |
215 OrthancStone::WebAssemblyCanvas& canvas) | |
216 { | |
217 std::auto_ptr<OrthancStone::PointerEvent> target(new OrthancStone::PointerEvent); | |
218 | |
219 target->AddPosition(canvas.GetPixelCenterCoordinates(source.clientX, source.clientY)); | |
220 target->SetAltModifier(source.altKey); | |
221 target->SetControlModifier(source.ctrlKey); | |
222 target->SetShiftModifier(source.shiftKey); | |
223 | |
224 return target.release(); | |
225 } | |
226 | |
227 | |
228 EM_BOOL OnMouseEvent(int eventType, | |
229 const EmscriptenMouseEvent *mouseEvent, | |
230 void *userData) | |
231 { | |
232 if (userData != NULL) | |
233 { | |
234 OrthancStone::WebAssemblyCanvas& canvas = *reinterpret_cast<OrthancStone::WebAssemblyCanvas*>(userData); | |
235 | |
236 switch (eventType) | |
237 { | |
238 case EMSCRIPTEN_EVENT_CLICK: | |
239 { | |
240 static unsigned int count = 0; | |
241 char buf[64]; | |
242 sprintf(buf, "click %d", count++); | |
243 | |
244 std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer); | |
245 layer->SetText(buf); | |
246 canvas.GetScene().SetLayer(100, layer.release()); | |
247 canvas.Refresh(); | |
248 break; | |
249 } | |
250 | |
251 case EMSCRIPTEN_EVENT_MOUSEDOWN: | |
252 LOG(ERROR) << "Mouse down"; | |
253 break; | |
254 | |
255 default: | |
256 break; | |
257 } | |
258 } | |
259 | |
260 return true; | |
261 } | |
262 | |
263 | |
264 void OrthancStone::WebAssemblyCanvas::SetupEvents(const std::string& canvas) | |
265 { | |
266 emscripten_set_click_callback(canvas.c_str(), this, false, OnMouseEvent); | |
267 //emscripten_set_mousedown_callback(canvas.c_str(), this, false, OnMouseEvent); | |
268 } | |
269 | |
270 | |
271 | |
272 | |
273 std::auto_ptr<OrthancStone::WebAssemblyCanvas> canvas1_; | |
274 std::auto_ptr<OrthancStone::WebAssemblyCanvas> canvas2_; | |
275 std::auto_ptr<OrthancStone::WebAssemblyCanvas> canvas3_; | |
276 std::auto_ptr<OrthancStone::ActiveTracker> tracker_; | |
182 | 277 |
183 | 278 |
184 EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) | 279 EM_BOOL OnWindowResize(int eventType, const EmscriptenUiEvent *uiEvent, void *userData) |
185 { | 280 { |
186 if (canvas1_.get() != NULL) | 281 if (canvas1_.get() != NULL) |
200 | 295 |
201 return true; | 296 return true; |
202 } | 297 } |
203 | 298 |
204 | 299 |
205 EM_BOOL OnMouseClick(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData) | |
206 { | |
207 if (userData != NULL) | |
208 { | |
209 WebAssemblyCanvas& canvas = *reinterpret_cast<WebAssemblyCanvas*>(userData); | |
210 | |
211 static unsigned int count = 0; | |
212 char buf[64]; | |
213 sprintf(buf, "click %d", count++); | |
214 | |
215 std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer); | |
216 layer->SetText(buf); | |
217 canvas.GetScene().SetLayer(100, layer.release()); | |
218 canvas.Refresh(); | |
219 } | |
220 | |
221 return true; | |
222 } | |
223 | |
224 | 300 |
225 extern "C" | 301 extern "C" |
226 { | 302 { |
227 int main(int argc, char const *argv[]) | 303 int main(int argc, char const *argv[]) |
228 { | 304 { |
231 } | 307 } |
232 | 308 |
233 EMSCRIPTEN_KEEPALIVE | 309 EMSCRIPTEN_KEEPALIVE |
234 void Initialize() | 310 void Initialize() |
235 { | 311 { |
236 canvas1_.reset(new WebAssemblyCanvas("mycanvas1")); | 312 canvas1_.reset(new OrthancStone::WebAssemblyCanvas("mycanvas1")); |
237 PrepareScene(canvas1_->GetScene()); | 313 PrepareScene(canvas1_->GetScene()); |
238 canvas1_->UpdateSize(); | 314 canvas1_->UpdateSize(); |
239 | 315 |
240 canvas2_.reset(new WebAssemblyCanvas("mycanvas2")); | 316 canvas2_.reset(new OrthancStone::WebAssemblyCanvas("mycanvas2")); |
241 PrepareScene(canvas2_->GetScene()); | 317 PrepareScene(canvas2_->GetScene()); |
242 canvas2_->UpdateSize(); | 318 canvas2_->UpdateSize(); |
243 | 319 |
244 canvas3_.reset(new WebAssemblyCanvas("mycanvas3")); | 320 canvas3_.reset(new OrthancStone::WebAssemblyCanvas("mycanvas3")); |
245 PrepareScene(canvas3_->GetScene()); | 321 PrepareScene(canvas3_->GetScene()); |
246 canvas3_->UpdateSize(); | 322 canvas3_->UpdateSize(); |
247 | 323 |
248 emscripten_set_resize_callback("#window", NULL, false, OnWindowResize); | 324 emscripten_set_resize_callback("#window", NULL, false, OnWindowResize); |
249 emscripten_set_click_callback("mycanvas1", canvas1_.get(), false, OnMouseClick); | 325 } |
250 emscripten_set_click_callback("mycanvas2", canvas2_.get(), false, OnMouseClick); | 326 } |
251 emscripten_set_click_callback("mycanvas3", canvas3_.get(), false, OnMouseClick); | |
252 } | |
253 } |