0032433: Visualization, TKService - introduce Wasm_Window implementing Aspect_Window...
[occt.git] / samples / webgl / WasmOcctView.h
1 // Copyright (c) 2019 OPEN CASCADE SAS
2 //
3 // This file is part of the examples of the Open CASCADE Technology software library.
4 //
5 // Permission is hereby granted, free of charge, to any person obtaining a copy
6 // of this software and associated documentation files (the "Software"), to deal
7 // in the Software without restriction, including without limitation the rights
8 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 // copies of the Software, and to permit persons to whom the Software is
10 // furnished to do so, subject to the following conditions:
11 //
12 // The above copyright notice and this permission notice shall be included in all
13 // copies or substantial portions of the Software.
14 //
15 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE
21
22 #ifndef _WasmOcctView_HeaderFile
23 #define _WasmOcctView_HeaderFile
24
25 #include <AIS_InteractiveContext.hxx>
26 #include <AIS_ViewController.hxx>
27 #include <V3d_View.hxx>
28
29 #include <emscripten.h>
30 #include <emscripten/html5.h>
31
32 class AIS_ViewCube;
33
34 //! Sample class creating 3D Viewer within Emscripten canvas.
35 class WasmOcctView : protected AIS_ViewController
36 {
37 public:
38
39   //! Return global viewer instance.
40   static WasmOcctView& Instance();
41
42 public: //! @name methods exported by Module
43
44   //! Set cubemap background.
45   //! File will be loaded asynchronously.
46   //! @param theImagePath [in] image path to load
47   static void setCubemapBackground (const std::string& theImagePath);
48
49   //! Clear all named objects from viewer.
50   static void removeAllObjects();
51
52   //! Fit all/selected objects into view.
53   //! @param theAuto [in] fit selected objects (TRUE) or all objects (FALSE)
54   static void fitAllObjects (bool theAuto);
55
56   //! Remove named object from viewer.
57   //! @param theName [in] object name
58   //! @return FALSE if object was not found
59   static bool removeObject (const std::string& theName);
60
61   //! Temporarily hide named object.
62   //! @param theName [in] object name
63   //! @return FALSE if object was not found
64   static bool eraseObject (const std::string& theName);
65
66   //! Display temporarily hidden object.
67   //! @param theName [in] object name
68   //! @return FALSE if object was not found
69   static bool displayObject (const std::string& theName);
70
71   //! Show/hide ground.
72   //! @param theToShow [in] show or hide flag
73   static void displayGround (bool theToShow);
74
75   //! Open object from the given URL.
76   //! File will be loaded asynchronously.
77   //! @param theName      [in] object name
78   //! @param theModelPath [in] model path
79   static void openFromUrl (const std::string& theName,
80                            const std::string& theModelPath);
81
82   //! Open object from memory.
83   //! @param theName    [in] object name
84   //! @param theBuffer  [in] pointer to data
85   //! @param theDataLen [in] data length
86   //! @param theToFree  [in] free theBuffer if set to TRUE
87   //! @return FALSE on reading error
88   static bool openFromMemory (const std::string& theName,
89                               uintptr_t theBuffer, int theDataLen,
90                               bool theToFree);
91
92   //! Open BRep object from memory.
93   //! @param theName    [in] object name
94   //! @param theBuffer  [in] pointer to data
95   //! @param theDataLen [in] data length
96   //! @param theToFree  [in] free theBuffer if set to TRUE
97   //! @return FALSE on reading error
98   static bool openBRepFromMemory (const std::string& theName,
99                                   uintptr_t theBuffer, int theDataLen,
100                                   bool theToFree);
101
102 public:
103
104   //! Default constructor.
105   WasmOcctView();
106
107   //! Destructor.
108   virtual ~WasmOcctView();
109
110   //! Main application entry point.
111   void run();
112
113   //! Return interactive context.
114   const Handle(AIS_InteractiveContext)& Context() const { return myContext; }
115
116   //! Return view.
117   const Handle(V3d_View)& View() const { return myView; }
118
119   //! Return device pixel ratio for handling high DPI displays.
120   float DevicePixelRatio() const { return myDevicePixelRatio; }
121
122   //! Request view redrawing.
123   void UpdateView();
124
125 private:
126
127   //! Create window.
128   void initWindow();
129
130   //! Create 3D Viewer.
131   bool initViewer();
132
133   //! Fill 3D Viewer with a DEMO items.
134   void initDemoScene();
135
136   //! Application event loop.
137   void mainloop();
138
139   //! Flush events and redraw view.
140   void redrawView();
141
142   //! Handle view redraw.
143   virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx,
144                                  const Handle(V3d_View)& theView) override;
145
146   //! Schedule processing of window input events with the next repaint event.
147   virtual void ProcessInput() override;
148
149   //! Handle key down event.
150   virtual void KeyDown (Aspect_VKey theKey,
151                         double theTime,
152                         double thePressure) override;
153
154   //! Handle key up event.
155   virtual void KeyUp (Aspect_VKey theKey,
156                       double theTime) override;
157
158   //! Dump WebGL context information.
159   void dumpGlInfo (bool theIsBasic);
160
161   //! Initialize pixel scale ratio.
162   void initPixelScaleRatio();
163
164 //! @name Emscripten callbacks
165 private:
166   //! Window resize event.
167   EM_BOOL onResizeEvent (int theEventType, const EmscriptenUiEvent* theEvent);
168
169   //! Mouse event.
170   EM_BOOL onMouseEvent (int theEventType, const EmscriptenMouseEvent* theEvent);
171
172   //! Scroll event.
173   EM_BOOL onWheelEvent (int theEventType, const EmscriptenWheelEvent* theEvent);
174
175   //! Touch event.
176   EM_BOOL onTouchEvent (int theEventType, const EmscriptenTouchEvent* theEvent);
177
178   //! Key down event.
179   EM_BOOL onKeyDownEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent);
180
181   //! Key up event.
182   EM_BOOL onKeyUpEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent);
183
184 //! @name Emscripten callbacks (static functions)
185 private:
186
187   static EM_BOOL onResizeCallback (int theEventType, const EmscriptenUiEvent* theEvent, void* theView)
188   { return ((WasmOcctView* )theView)->onResizeEvent (theEventType, theEvent); }
189
190   static void onRedrawView (void* theView)
191   { return ((WasmOcctView* )theView)->redrawView(); }
192
193   static EM_BOOL onMouseCallback (int theEventType, const EmscriptenMouseEvent* theEvent, void* theView)
194   { return ((WasmOcctView* )theView)->onMouseEvent (theEventType, theEvent); }
195
196   static EM_BOOL onWheelCallback (int theEventType, const EmscriptenWheelEvent* theEvent, void* theView)
197   { return ((WasmOcctView* )theView)->onWheelEvent (theEventType, theEvent); }
198
199   static EM_BOOL onTouchCallback (int theEventType, const EmscriptenTouchEvent* theEvent, void* theView)
200   { return ((WasmOcctView* )theView)->onTouchEvent (theEventType, theEvent); }
201
202   static EM_BOOL onKeyDownCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView)
203   { return ((WasmOcctView* )theView)->onKeyDownEvent (theEventType, theEvent); }
204
205   static EM_BOOL onKeyUpCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView)
206   { return ((WasmOcctView* )theView)->onKeyUpEvent (theEventType, theEvent); }
207
208 private:
209
210   //! Register hot-keys for specified Action.
211   void addActionHotKeys (Aspect_VKey theAction,
212                          unsigned int theHotKey1 = 0,
213                          unsigned int theHotKey2 = 0,
214                          unsigned int theHotKey3 = 0,
215                          unsigned int theHotKey4 = 0,
216                          unsigned int theHotKey5 = 0)
217   {
218     if (theHotKey1 != 0) { myNavKeyMap.Bind (theHotKey1, theAction); }
219     if (theHotKey2 != 0) { myNavKeyMap.Bind (theHotKey2, theAction); }
220     if (theHotKey3 != 0) { myNavKeyMap.Bind (theHotKey3, theAction); }
221     if (theHotKey4 != 0) { myNavKeyMap.Bind (theHotKey4, theAction); }
222     if (theHotKey5 != 0) { myNavKeyMap.Bind (theHotKey5, theAction); }
223   }
224
225   //! Handle navigation keys.
226   bool navigationKeyModifierSwitch (unsigned int theModifOld,
227                                     unsigned int theModifNew,
228                                     double       theTimeStamp);
229
230   //! Handle hot-key.
231   bool processKeyPress (Aspect_VKey theKey);
232
233 private:
234
235   NCollection_IndexedDataMap<TCollection_AsciiString, Handle(AIS_InteractiveObject)> myObjects; //!< map of named objects
236
237   NCollection_DataMap<unsigned int, Aspect_VKey> myNavKeyMap; //!< map of Hot-Key (key+modifiers) to Action
238
239   Handle(AIS_InteractiveContext) myContext;          //!< interactive context
240   Handle(V3d_View)               myView;             //!< 3D view
241   Handle(Prs3d_TextAspect)       myTextStyle;        //!< text style for OSD elements
242   Handle(AIS_ViewCube)           myViewCube;         //!< view cube object
243   TCollection_AsciiString        myCanvasId;         //!< canvas element id on HTML page
244   Graphic3d_Vec2i                myWinSizeOld;
245   float                          myDevicePixelRatio; //!< device pixel ratio for handling high DPI displays
246   unsigned int                   myUpdateRequests;   //!< counter for unhandled update requests
247
248 };
249
250 #endif // _WasmOcctView_HeaderFile