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 }