Mercurial > hg > orthanc-stone
annotate Samples/WebAssembly/dev.h @ 890:77c96ba899f9
removing OpenGLCompositor::UpdateSize()
author | Sebastien Jodogne <s.jodogne@gmail.com> |
---|---|
date | Wed, 10 Jul 2019 15:23:13 +0200 |
parents | 2de01660debe |
children | 0aff28f15ea2 |
rev | line source |
---|---|
826 | 1 /** |
2 * Stone of Orthanc | |
3 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics | |
4 * Department, University Hospital of Liege, Belgium | |
5 * Copyright (C) 2017-2019 Osimis S.A., Belgium | |
6 * | |
7 * This program is free software: you can redistribute it and/or | |
8 * modify it under the terms of the GNU Affero General Public License | |
9 * as published by the Free Software Foundation, either version 3 of | |
10 * the License, or (at your option) any later version. | |
11 * | |
12 * This program is distributed in the hope that it will be useful, but | |
13 * WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Affero General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Affero General Public License | |
18 * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
19 **/ | |
20 | |
21 | |
22 #pragma once | |
23 | |
24 #include "../../Framework/OpenGL/WebAssemblyOpenGLContext.h" | |
25 #include "../../Framework/Scene2D/OpenGLCompositor.h" | |
26 #include "../../Framework/Scene2D/PanSceneTracker.h" | |
27 #include "../../Framework/Scene2D/RotateSceneTracker.h" | |
28 #include "../../Framework/Scene2D/ZoomSceneTracker.h" | |
890
77c96ba899f9
removing OpenGLCompositor::UpdateSize()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
826
diff
changeset
|
29 #include "../../Framework/Scene2DViewport/UndoStack.h" |
826 | 30 #include "../../Framework/Scene2DViewport/ViewportController.h" |
31 | |
32 #include <Core/OrthancException.h> | |
33 | |
34 #include <emscripten/html5.h> | |
890
77c96ba899f9
removing OpenGLCompositor::UpdateSize()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
826
diff
changeset
|
35 #include <boost/make_shared.hpp> |
826 | 36 |
37 static const unsigned int FONT_SIZE = 32; | |
38 | |
39 namespace OrthancStone | |
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), | |
890
77c96ba899f9
removing OpenGLCompositor::UpdateSize()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
826
diff
changeset
|
57 controller_(new ViewportController(boost::make_shared<UndoStack>(), broker)), |
826 | 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(); | |
890
77c96ba899f9
removing OpenGLCompositor::UpdateSize()
Sebastien Jodogne <s.jodogne@gmail.com>
parents:
826
diff
changeset
|
78 //compositor_.UpdateSize(); |
826 | 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 | |
114 { | |
115 private: | |
116 boost::shared_ptr<IFlexiblePointerTracker> tracker_; | |
117 std::string canvasIdentifier_; | |
118 bool insideCanvas_; | |
119 | |
120 public: | |
121 ActiveTracker(const boost::shared_ptr<IFlexiblePointerTracker>& tracker, | |
122 const WebAssemblyViewport& viewport) : | |
123 tracker_(tracker), | |
124 canvasIdentifier_(viewport.GetCanvasIdentifier()), | |
125 insideCanvas_(true) | |
126 { | |
127 if (tracker_.get() == NULL) | |
128 { | |
129 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer); | |
130 } | |
131 } | |
132 | |
133 bool IsAlive() const | |
134 { | |
135 return tracker_->IsAlive(); | |
136 } | |
137 | |
138 void PointerMove(const PointerEvent& event) | |
139 { | |
140 tracker_->PointerMove(event); | |
141 } | |
142 | |
143 void PointerUp(const PointerEvent& event) | |
144 { | |
145 tracker_->PointerUp(event); | |
146 } | |
147 }; | |
148 } | |
149 | |
150 static OrthancStone::PointerEvent* ConvertMouseEvent( | |
151 const EmscriptenMouseEvent& source, | |
152 OrthancStone::WebAssemblyViewport& viewport) | |
153 { | |
154 std::auto_ptr<OrthancStone::PointerEvent> target( | |
155 new OrthancStone::PointerEvent); | |
156 | |
157 target->AddPosition(viewport.GetPixelCenterCoordinates( | |
158 source.targetX, source.targetY)); | |
159 target->SetAltModifier(source.altKey); | |
160 target->SetControlModifier(source.ctrlKey); | |
161 target->SetShiftModifier(source.shiftKey); | |
162 | |
163 return target.release(); | |
164 } | |
165 | |
166 std::auto_ptr<OrthancStone::ActiveTracker> tracker_; | |
167 | |
168 EM_BOOL OnMouseEvent(int eventType, | |
169 const EmscriptenMouseEvent *mouseEvent, | |
170 void *userData) | |
171 { | |
172 if (mouseEvent != NULL && | |
173 userData != NULL) | |
174 { | |
175 OrthancStone::WebAssemblyViewport& viewport = | |
176 *reinterpret_cast<OrthancStone::WebAssemblyViewport*>(userData); | |
177 | |
178 switch (eventType) | |
179 { | |
180 case EMSCRIPTEN_EVENT_CLICK: | |
181 { | |
182 static unsigned int count = 0; | |
183 char buf[64]; | |
184 sprintf(buf, "click %d", count++); | |
185 | |
186 std::auto_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer); | |
187 layer->SetText(buf); | |
188 viewport.GetScene().SetLayer(100, layer.release()); | |
189 viewport.Refresh(); | |
190 break; | |
191 } | |
192 | |
193 case EMSCRIPTEN_EVENT_MOUSEDOWN: | |
194 { | |
195 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t; | |
196 | |
197 { | |
198 std::auto_ptr<OrthancStone::PointerEvent> event( | |
199 ConvertMouseEvent(*mouseEvent, viewport)); | |
200 | |
201 switch (mouseEvent->button) | |
202 { | |
203 case 0: // Left button | |
204 emscripten_console_log("Creating RotateSceneTracker"); | |
205 t.reset(new OrthancStone::RotateSceneTracker( | |
206 viewport.GetController(), *event)); | |
207 break; | |
208 | |
209 case 1: // Middle button | |
210 emscripten_console_log("Creating PanSceneTracker"); | |
211 LOG(INFO) << "Creating PanSceneTracker" ; | |
212 t.reset(new OrthancStone::PanSceneTracker( | |
213 viewport.GetController(), *event)); | |
214 break; | |
215 | |
216 case 2: // Right button | |
217 emscripten_console_log("Creating ZoomSceneTracker"); | |
218 t.reset(new OrthancStone::ZoomSceneTracker( | |
219 viewport.GetController(), *event, viewport.GetCanvasWidth())); | |
220 break; | |
221 | |
222 default: | |
223 break; | |
224 } | |
225 } | |
226 | |
227 if (t.get() != NULL) | |
228 { | |
229 tracker_.reset( | |
230 new OrthancStone::ActiveTracker(t, viewport)); | |
231 viewport.Refresh(); | |
232 } | |
233 | |
234 break; | |
235 } | |
236 | |
237 case EMSCRIPTEN_EVENT_MOUSEMOVE: | |
238 if (tracker_.get() != NULL) | |
239 { | |
240 std::auto_ptr<OrthancStone::PointerEvent> event( | |
241 ConvertMouseEvent(*mouseEvent, viewport)); | |
242 tracker_->PointerMove(*event); | |
243 viewport.Refresh(); | |
244 } | |
245 break; | |
246 | |
247 case EMSCRIPTEN_EVENT_MOUSEUP: | |
248 if (tracker_.get() != NULL) | |
249 { | |
250 std::auto_ptr<OrthancStone::PointerEvent> event( | |
251 ConvertMouseEvent(*mouseEvent, viewport)); | |
252 tracker_->PointerUp(*event); | |
253 viewport.Refresh(); | |
254 if (!tracker_->IsAlive()) | |
255 tracker_.reset(); | |
256 } | |
257 break; | |
258 | |
259 default: | |
260 break; | |
261 } | |
262 } | |
263 | |
264 return true; | |
265 } | |
266 | |
267 | |
268 void OrthancStone::WebAssemblyViewport::SetupEvents(const std::string& canvas) | |
269 { | |
270 emscripten_set_mousedown_callback(canvas.c_str(), this, false, OnMouseEvent); | |
271 emscripten_set_mousemove_callback(canvas.c_str(), this, false, OnMouseEvent); | |
272 emscripten_set_mouseup_callback(canvas.c_str(), this, false, OnMouseEvent); | |
273 } |