comparison Samples/WebAssembly/dev.h @ 891:0aff28f15ea2

new abstraction: IViewport
author Sebastien Jodogne <s.jodogne@gmail.com>
date Wed, 10 Jul 2019 18:18:42 +0200
parents 77c96ba899f9
children 9c2f6d6b9f4a
comparison
equal deleted inserted replaced
890:77c96ba899f9 891:0aff28f15ea2
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/UndoStack.h"
36 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 WebAssemblyViewport& viewport) : 50 const std::string& canvasId) :
123 tracker_(tracker), 51 tracker_(tracker),
124 canvasIdentifier_(viewport.GetCanvasIdentifier()), 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)); 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 }