comparison Deprecated/Samples/WebAssembly/dev.h @ 1402:65e1e4b08302

moved deprecated samples into Deprecated
author Alain Mazy <alain@mazy.be>
date Wed, 29 Apr 2020 20:50:53 +0200
parents Samples/Deprecated/WebAssembly/dev.h@eac254fb6791
children
comparison
equal deleted inserted replaced
1401:f6a2d46d2b76 1402:65e1e4b08302
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-2020 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/Viewport/WebAssemblyViewport.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"
29 #include "../../Framework/Scene2DViewport/UndoStack.h"
30 #include "../../Framework/Scene2DViewport/ViewportController.h"
31
32 #include <Core/OrthancException.h>
33
34 #include <emscripten/html5.h>
35 #include <boost/make_shared.hpp>
36
37 static const unsigned int FONT_SIZE = 32;
38
39 namespace OrthancStone
40 {
41 class ActiveTracker : public boost::noncopyable
42 {
43 private:
44 boost::shared_ptr<IFlexiblePointerTracker> tracker_;
45 std::string canvasIdentifier_;
46 bool insideCanvas_;
47
48 public:
49 ActiveTracker(const boost::shared_ptr<IFlexiblePointerTracker>& tracker,
50 const std::string& canvasId) :
51 tracker_(tracker),
52 canvasIdentifier_(canvasId),
53 insideCanvas_(true)
54 {
55 if (tracker_.get() == NULL)
56 {
57 throw Orthanc::OrthancException(Orthanc::ErrorCode_NullPointer);
58 }
59 }
60
61 bool IsAlive() const
62 {
63 return tracker_->IsAlive();
64 }
65
66 void PointerMove(const PointerEvent& event)
67 {
68 tracker_->PointerMove(event);
69 }
70
71 void PointerUp(const PointerEvent& event)
72 {
73 tracker_->PointerUp(event);
74 }
75 };
76 }
77
78 static OrthancStone::PointerEvent* ConvertMouseEvent(
79 const EmscriptenMouseEvent& source,
80 OrthancStone::IViewport& viewport)
81 {
82 std::unique_ptr<OrthancStone::PointerEvent> target(
83 new OrthancStone::PointerEvent);
84
85 target->AddPosition(viewport.GetPixelCenterCoordinates(
86 source.targetX, source.targetY));
87 target->SetAltModifier(source.altKey);
88 target->SetControlModifier(source.ctrlKey);
89 target->SetShiftModifier(source.shiftKey);
90
91 return target.release();
92 }
93
94 std::unique_ptr<OrthancStone::ActiveTracker> tracker_;
95
96 EM_BOOL OnMouseEvent(int eventType,
97 const EmscriptenMouseEvent *mouseEvent,
98 void *userData)
99 {
100 if (mouseEvent != NULL &&
101 userData != NULL)
102 {
103 boost::shared_ptr<OrthancStone::ViewportController>& controller =
104 *reinterpret_cast<boost::shared_ptr<OrthancStone::ViewportController>*>(userData);
105
106 switch (eventType)
107 {
108 case EMSCRIPTEN_EVENT_CLICK:
109 {
110 static unsigned int count = 0;
111 char buf[64];
112 sprintf(buf, "click %d", count++);
113
114 std::unique_ptr<OrthancStone::TextSceneLayer> layer(new OrthancStone::TextSceneLayer);
115 layer->SetText(buf);
116 controller->GetViewport().GetScene().SetLayer(100, layer.release());
117 controller->GetViewport().Refresh();
118 break;
119 }
120
121 case EMSCRIPTEN_EVENT_MOUSEDOWN:
122 {
123 boost::shared_ptr<OrthancStone::IFlexiblePointerTracker> t;
124
125 {
126 std::unique_ptr<OrthancStone::PointerEvent> event(
127 ConvertMouseEvent(*mouseEvent, controller->GetViewport()));
128
129 switch (mouseEvent->button)
130 {
131 case 0: // Left button
132 emscripten_console_log("Creating RotateSceneTracker");
133 t.reset(new OrthancStone::RotateSceneTracker(
134 controller, *event));
135 break;
136
137 case 1: // Middle button
138 emscripten_console_log("Creating PanSceneTracker");
139 LOG(INFO) << "Creating PanSceneTracker" ;
140 t.reset(new OrthancStone::PanSceneTracker(
141 controller, *event));
142 break;
143
144 case 2: // Right button
145 emscripten_console_log("Creating ZoomSceneTracker");
146 t.reset(new OrthancStone::ZoomSceneTracker(
147 controller, *event, controller->GetViewport().GetCanvasWidth()));
148 break;
149
150 default:
151 break;
152 }
153 }
154
155 if (t.get() != NULL)
156 {
157 tracker_.reset(
158 new OrthancStone::ActiveTracker(t, controller->GetViewport().GetCanvasIdentifier()));
159 controller->GetViewport().Refresh();
160 }
161
162 break;
163 }
164
165 case EMSCRIPTEN_EVENT_MOUSEMOVE:
166 if (tracker_.get() != NULL)
167 {
168 std::unique_ptr<OrthancStone::PointerEvent> event(
169 ConvertMouseEvent(*mouseEvent, controller->GetViewport()));
170 tracker_->PointerMove(*event);
171 controller->GetViewport().Refresh();
172 }
173 break;
174
175 case EMSCRIPTEN_EVENT_MOUSEUP:
176 if (tracker_.get() != NULL)
177 {
178 std::unique_ptr<OrthancStone::PointerEvent> event(
179 ConvertMouseEvent(*mouseEvent, controller->GetViewport()));
180 tracker_->PointerUp(*event);
181 controller->GetViewport().Refresh();
182 if (!tracker_->IsAlive())
183 tracker_.reset();
184 }
185 break;
186
187 default:
188 break;
189 }
190 }
191
192 return true;
193 }
194
195
196 void SetupEvents(const std::string& canvas,
197 boost::shared_ptr<OrthancStone::ViewportController>& controller)
198 {
199 emscripten_set_mousedown_callback(canvas.c_str(), &controller, false, OnMouseEvent);
200 emscripten_set_mousemove_callback(canvas.c_str(), &controller, false, OnMouseEvent);
201 emscripten_set_mouseup_callback(canvas.c_str(), &controller, false, OnMouseEvent);
202 }