Mercurial > hg > orthanc-stone
comparison Samples/WebAssembly/dev.h @ 897:9c2f6d6b9f4a am-dev
Merge
author | Alain Mazy <alain@mazy.be> |
---|---|
date | Tue, 16 Jul 2019 12:37:29 +0200 |
parents | 6073c980323a 0aff28f15ea2 |
children | 2d8ab34c8c91 |
comparison
equal
deleted
inserted
replaced
896:875bd6aca5e6 | 897:9c2f6d6b9f4a |
---|---|
19 **/ | 19 **/ |
20 | 20 |
21 | 21 |
22 #pragma once | 22 #pragma once |
23 | 23 |
24 #include "../../Framework/OpenGL/WebAssemblyOpenGLContext.h" | 24 #include "../../Framework/Viewport/WebAssemblyViewport.h" |
25 #include "../../Framework/Scene2D/OpenGLCompositor.h" | 25 #include "../../Framework/Scene2D/OpenGLCompositor.h" |
26 #include "../../Framework/Scene2D/PanSceneTracker.h" | 26 #include "../../Framework/Scene2D/PanSceneTracker.h" |
27 #include "../../Framework/Scene2D/RotateSceneTracker.h" | 27 #include "../../Framework/Scene2D/RotateSceneTracker.h" |
28 #include "../../Framework/Scene2D/ZoomSceneTracker.h" | 28 #include "../../Framework/Scene2D/ZoomSceneTracker.h" |
29 #include "../../Framework/Scene2DViewport/UndoStack.h" | |
29 #include "../../Framework/Scene2DViewport/ViewportController.h" | 30 #include "../../Framework/Scene2DViewport/ViewportController.h" |
30 #include "../../Framework/Scene2DViewport/UndoStack.h" | |
31 | 31 |
32 #include <Core/OrthancException.h> | 32 #include <Core/OrthancException.h> |
33 | |
34 #include <emscripten/html5.h> | |
33 #include <boost/make_shared.hpp> | 35 #include <boost/make_shared.hpp> |
34 | 36 |
35 #include <emscripten/html5.h> | |
36 | |
37 static const unsigned int FONT_SIZE = 32; | 37 static const unsigned int FONT_SIZE = 32; |
38 | 38 |
39 namespace OrthancStone | 39 namespace OrthancStone |
40 { | 40 { |
41 class WebAssemblyViewport : public boost::noncopyable | |
42 { | |
43 private: | |
44 // the construction order is important because compositor_ | |
45 // will hold a reference to the scene that belong to the | |
46 // controller_ object | |
47 OpenGL::WebAssemblyOpenGLContext context_; | |
48 boost::shared_ptr<ViewportController> controller_; | |
49 OpenGLCompositor compositor_; | |
50 | |
51 void SetupEvents(const std::string& canvas); | |
52 | |
53 public: | |
54 WebAssemblyViewport(MessageBroker& broker, | |
55 const std::string& canvas) : | |
56 context_(canvas), | |
57 controller_(new ViewportController(boost::make_shared<UndoStack>(), broker)), | |
58 compositor_(context_, *controller_->GetScene()) | |
59 { | |
60 compositor_.SetFont(0, Orthanc::EmbeddedResources::UBUNTU_FONT, | |
61 FONT_SIZE, Orthanc::Encoding_Latin1); | |
62 SetupEvents(canvas); | |
63 } | |
64 | |
65 Scene2D& GetScene() | |
66 { | |
67 return *controller_->GetScene(); | |
68 } | |
69 | |
70 const boost::shared_ptr<ViewportController>& GetController() | |
71 { | |
72 return controller_; | |
73 } | |
74 | |
75 void UpdateSize() | |
76 { | |
77 context_.UpdateSize(); | |
78 compositor_.UpdateSize(); | |
79 Refresh(); | |
80 } | |
81 | |
82 void Refresh() | |
83 { | |
84 compositor_.Refresh(); | |
85 } | |
86 | |
87 void FitContent() | |
88 { | |
89 GetScene().FitContent(context_.GetCanvasWidth(), context_.GetCanvasHeight()); | |
90 } | |
91 | |
92 const std::string& GetCanvasIdentifier() const | |
93 { | |
94 return context_.GetCanvasIdentifier(); | |
95 } | |
96 | |
97 ScenePoint2D GetPixelCenterCoordinates(int x, int y) const | |
98 { | |
99 return compositor_.GetPixelCenterCoordinates(x, y); | |
100 } | |
101 | |
102 unsigned int GetCanvasWidth() const | |
103 { | |
104 return context_.GetCanvasWidth(); | |
105 } | |
106 | |
107 unsigned int GetCanvasHeight() const | |
108 { | |
109 return context_.GetCanvasHeight(); | |
110 } | |
111 }; | |
112 | |
113 class ActiveTracker : public boost::noncopyable | 41 class ActiveTracker : public boost::noncopyable |
114 { | 42 { |
115 private: | 43 private: |
116 boost::shared_ptr<IFlexiblePointerTracker> tracker_; | 44 boost::shared_ptr<IFlexiblePointerTracker> tracker_; |
117 std::string canvasIdentifier_; | 45 std::string canvasIdentifier_; |
118 bool insideCanvas_; | 46 bool insideCanvas_; |
119 | 47 |
120 public: | 48 public: |
121 ActiveTracker(const boost::shared_ptr<IFlexiblePointerTracker>& tracker, | 49 ActiveTracker(const boost::shared_ptr<IFlexiblePointerTracker>& tracker, |
122 const std::string& canvasIdentifier) : | 50 const std::string& canvasId) : |
123 tracker_(tracker), | 51 tracker_(tracker), |
124 canvasIdentifier_(canvasIdentifier), | 52 canvasIdentifier_(canvasId), |
125 insideCanvas_(true) | 53 insideCanvas_(true) |
126 { | 54 { |
127 if (tracker_.get() == NULL) | 55 if (tracker_.get() == NULL) |
128 { | 56 { |
129 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | 57 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); |
147 }; | 75 }; |
148 } | 76 } |
149 | 77 |
150 static OrthancStone::PointerEvent* ConvertMouseEvent( | 78 static OrthancStone::PointerEvent* ConvertMouseEvent( |
151 const EmscriptenMouseEvent& source, | 79 const EmscriptenMouseEvent& source, |
152 OrthancStone::WebAssemblyViewport& viewport) | 80 OrthancStone::IViewport& viewport) |
153 { | 81 { |
154 std::auto_ptr<OrthancStone::PointerEvent> target( | 82 std::auto_ptr<OrthancStone::PointerEvent> target( |
155 new OrthancStone::PointerEvent); | 83 new OrthancStone::PointerEvent); |
156 | 84 |
157 target->AddPosition(viewport.GetPixelCenterCoordinates( | 85 target->AddPosition(viewport.GetPixelCenterCoordinates( |
158 source.targetX, source.targetY)); | 86 source.targetX, source.targetY)); |
159 target->SetAltModifier(source.altKey); | 87 target->SetAltModifier(source.altKey); |
160 target->SetControlModifier(source.ctrlKey); | 88 target->SetControlModifier(source.ctrlKey); |
161 target->SetShiftModifier(source.shiftKey); | 89 target->SetShiftModifier(source.shiftKey); |
162 | 90 |
163 return target.release(); | 91 return target.release(); |
170 void *userData) | 98 void *userData) |
171 { | 99 { |
172 if (mouseEvent != NULL && | 100 if (mouseEvent != NULL && |
173 userData != NULL) | 101 userData != NULL) |
174 { | 102 { |
175 OrthancStone::WebAssemblyViewport& viewport = | 103 boost::shared_ptr<OrthancStone::ViewportController>& controller = |
176 *reinterpret_cast<OrthancStone::WebAssemblyViewport*>(userData); | 104 *reinterpret_cast<boost::shared_ptr<OrthancStone::ViewportController>*>(userData); |
177 | 105 |
178 switch (eventType) | 106 switch (eventType) |
179 { | 107 { |
180 case EMSCRIPTEN_EVENT_CLICK: | 108 case EMSCRIPTEN_EVENT_CLICK: |
181 { | 109 { |
183 char buf[64]; | 111 char buf[64]; |
184 sprintf(buf, "click %d", count++); | 112 sprintf(buf, "click %d", count++); |
185 | 113 |
186 std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer); | 114 std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer); |
187 layer->SetText(buf); | 115 layer->SetText(buf); |
188 viewport.GetScene().SetLayer(100, layer.release()); | 116 controller->GetViewport().GetScene().SetLayer(100, layer.release()); |
189 viewport.Refresh(); | 117 controller->GetViewport().Refresh(); |
190 break; | 118 break; |
191 } | 119 } |
192 | 120 |
193 case EMSCRIPTEN_EVENT_MOUSEDOWN: | 121 case EMSCRIPTEN_EVENT_MOUSEDOWN: |
194 { | 122 { |
195 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t; | 123 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t; |
196 | 124 |
197 { | 125 { |
198 std::auto_ptr<OrthancStone::PointerEvent> event( | 126 std::auto_ptr<OrthancStone::PointerEvent> event( |
199 ConvertMouseEvent(*mouseEvent, viewport)); | 127 ConvertMouseEvent(*mouseEvent, controller->GetViewport())); |
200 | 128 |
201 switch (mouseEvent->button) | 129 switch (mouseEvent->button) |
202 { | 130 { |
203 case 0: // Left button | 131 case 0: // Left button |
204 emscripten_console_log("Creating RotateSceneTracker"); | 132 emscripten_console_log("Creating RotateSceneTracker"); |
205 t.reset(new OrthancStone::RotateSceneTracker( | 133 t.reset(new OrthancStone::RotateSceneTracker( |
206 viewport.GetController(), *event)); | 134 controller, *event)); |
207 break; | 135 break; |
208 | 136 |
209 case 1: // Middle button | 137 case 1: // Middle button |
210 emscripten_console_log("Creating PanSceneTracker"); | 138 emscripten_console_log("Creating PanSceneTracker"); |
211 LOG(INFO) << "Creating PanSceneTracker" ; | 139 LOG(INFO) << "Creating PanSceneTracker" ; |
212 t.reset(new OrthancStone::PanSceneTracker( | 140 t.reset(new OrthancStone::PanSceneTracker( |
213 viewport.GetController(), *event)); | 141 controller, *event)); |
214 break; | 142 break; |
215 | 143 |
216 case 2: // Right button | 144 case 2: // Right button |
217 emscripten_console_log("Creating ZoomSceneTracker"); | 145 emscripten_console_log("Creating ZoomSceneTracker"); |
218 t.reset(new OrthancStone::ZoomSceneTracker( | 146 t.reset(new OrthancStone::ZoomSceneTracker( |
219 viewport.GetController(), *event, viewport.GetCanvasWidth())); | 147 controller, *event, controller->GetViewport().GetCanvasWidth())); |
220 break; | 148 break; |
221 | 149 |
222 default: | 150 default: |
223 break; | 151 break; |
224 } | 152 } |
225 } | 153 } |
226 | 154 |
227 if (t.get() != NULL) | 155 if (t.get() != NULL) |
228 { | 156 { |
229 tracker_.reset( | 157 tracker_.reset( |
230 new OrthancStone::ActiveTracker(t, viewport.GetCanvasIdentifier())); | 158 new OrthancStone::ActiveTracker(t, controller->GetViewport().GetCanvasIdentifier())); |
231 viewport.Refresh(); | 159 controller->GetViewport().Refresh(); |
232 } | 160 } |
233 | 161 |
234 break; | 162 break; |
235 } | 163 } |
236 | 164 |
237 case EMSCRIPTEN_EVENT_MOUSEMOVE: | 165 case EMSCRIPTEN_EVENT_MOUSEMOVE: |
238 if (tracker_.get() != NULL) | 166 if (tracker_.get() != NULL) |
239 { | 167 { |
240 std::auto_ptr<OrthancStone::PointerEvent> event( | 168 std::auto_ptr<OrthancStone::PointerEvent> event( |
241 ConvertMouseEvent(*mouseEvent, viewport)); | 169 ConvertMouseEvent(*mouseEvent, controller->GetViewport())); |
242 tracker_->PointerMove(*event); | 170 tracker_->PointerMove(*event); |
243 viewport.Refresh(); | 171 controller->GetViewport().Refresh(); |
244 } | 172 } |
245 break; | 173 break; |
246 | 174 |
247 case EMSCRIPTEN_EVENT_MOUSEUP: | 175 case EMSCRIPTEN_EVENT_MOUSEUP: |
248 if (tracker_.get() != NULL) | 176 if (tracker_.get() != NULL) |
249 { | 177 { |
250 std::auto_ptr<OrthancStone::PointerEvent> event( | 178 std::auto_ptr<OrthancStone::PointerEvent> event( |
251 ConvertMouseEvent(*mouseEvent, viewport)); | 179 ConvertMouseEvent(*mouseEvent, controller->GetViewport())); |
252 tracker_->PointerUp(*event); | 180 tracker_->PointerUp(*event); |
253 viewport.Refresh(); | 181 controller->GetViewport().Refresh(); |
254 if (!tracker_->IsAlive()) | 182 if (!tracker_->IsAlive()) |
255 tracker_.reset(); | 183 tracker_.reset(); |
256 } | 184 } |
257 break; | 185 break; |
258 | 186 |
263 | 191 |
264 return true; | 192 return true; |
265 } | 193 } |
266 | 194 |
267 | 195 |
268 void OrthancStone::WebAssemblyViewport::SetupEvents(const std::string& canvas) | 196 void SetupEvents(const std::string& canvas, |
269 { | 197 boost::shared_ptr<OrthancStone::ViewportController>& controller) |
270 emscripten_set_mousedown_callback(canvas.c_str(), this, false, OnMouseEvent); | 198 { |
271 emscripten_set_mousemove_callback(canvas.c_str(), this, false, OnMouseEvent); | 199 emscripten_set_mousedown_callback(canvas.c_str(), &controller, false, OnMouseEvent); |
272 emscripten_set_mouseup_callback(canvas.c_str(), this, false, OnMouseEvent); | 200 emscripten_set_mousemove_callback(canvas.c_str(), &controller, false, OnMouseEvent); |
273 } | 201 emscripten_set_mouseup_callback(canvas.c_str(), &controller, false, OnMouseEvent); |
202 } |