0031070: Configuration - fix building issues when using Emscripten toolchain
[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   //! Default constructor.
39   WasmOcctView();
40
41   //! Destructor.
42   virtual ~WasmOcctView();
43
44   //! Main application entry point.
45   void run();
46
47   //! Return interactive context.
48   const Handle(AIS_InteractiveContext)& Context() const { return myContext; }
49
50   //! Return view.
51   const Handle(V3d_View)& View() const { return myView; }
52
53   //! Return device pixel ratio for handling high DPI displays.
54   float DevicePixelRatio() const { return myDevicePixelRatio; }
55
56 private:
57
58   //! Create window.
59   void initWindow();
60
61   //! Create 3D Viewer.
62   bool initViewer();
63
64   //! Fill 3D Viewer with a DEMO items.
65   void initDemoScene();
66
67   //! Application event loop.
68   void mainloop();
69
70   //! Request view redrawing.
71   void updateView();
72
73   //! Flush events and redraw view.
74   void redrawView();
75
76   //! Handle view redraw.
77   virtual void handleViewRedraw (const Handle(AIS_InteractiveContext)& theCtx,
78                                  const Handle(V3d_View)& theView) override;
79
80   //! Dump WebGL context information.
81   void dumpGlInfo (bool theIsBasic);
82
83   //! Initialize pixel scale ratio.
84   void initPixelScaleRatio();
85
86   //! Return point from logical units to backing store.
87   Graphic3d_Vec2d convertPointToBacking (const Graphic3d_Vec2d& thePnt) const
88   {
89     return thePnt * myDevicePixelRatio;
90   }
91
92   //! Return point from logical units to backing store.
93   Graphic3d_Vec2i convertPointToBacking (const Graphic3d_Vec2i& thePnt) const
94   {
95     Graphic3d_Vec2d aPnt = Graphic3d_Vec2d (thePnt) * myDevicePixelRatio + Graphic3d_Vec2d (0.5);
96     return Graphic3d_Vec2i (aPnt);
97   }
98
99 //! @name Emscripten callbacks
100 private:
101   //! Window resize event.
102   EM_BOOL onResizeEvent (int theEventType, const EmscriptenUiEvent* theEvent);
103
104   //! Mouse event.
105   EM_BOOL onMouseEvent (int theEventType, const EmscriptenMouseEvent* theEvent);
106
107   //! Scroll event.
108   EM_BOOL onWheelEvent (int theEventType, const EmscriptenWheelEvent* theEvent);
109
110   //! Touch event.
111   EM_BOOL onTouchEvent (int theEventType, const EmscriptenTouchEvent* theEvent);
112
113   //! Key down event.
114   EM_BOOL onKeyDownEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent);
115
116   //! Key up event.
117   EM_BOOL onKeyUpEvent (int theEventType, const EmscriptenKeyboardEvent* theEvent);
118
119 //! @name Emscripten callbacks (static functions)
120 private:
121
122   static EM_BOOL onResizeCallback (int theEventType, const EmscriptenUiEvent* theEvent, void* theView)
123   { return ((WasmOcctView* )theView)->onResizeEvent (theEventType, theEvent); }
124
125   static void onRedrawView (void* theView)
126   { return ((WasmOcctView* )theView)->redrawView(); }
127
128   static EM_BOOL onMouseCallback (int theEventType, const EmscriptenMouseEvent* theEvent, void* theView)
129   { return ((WasmOcctView* )theView)->onMouseEvent (theEventType, theEvent); }
130
131   static EM_BOOL onWheelCallback (int theEventType, const EmscriptenWheelEvent* theEvent, void* theView)
132   { return ((WasmOcctView* )theView)->onWheelEvent (theEventType, theEvent); }
133
134   static EM_BOOL onTouchCallback (int theEventType, const EmscriptenTouchEvent* theEvent, void* theView)
135   { return ((WasmOcctView* )theView)->onTouchEvent (theEventType, theEvent); }
136
137   static EM_BOOL onKeyDownCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView)
138   { return ((WasmOcctView* )theView)->onKeyDownEvent (theEventType, theEvent); }
139
140   static EM_BOOL onKeyUpCallback (int theEventType, const EmscriptenKeyboardEvent* theEvent, void* theView)
141   { return ((WasmOcctView* )theView)->onKeyUpEvent (theEventType, theEvent); }
142
143 private:
144
145   Handle(AIS_InteractiveContext) myContext;          //!< interactive context
146   Handle(V3d_View)               myView;             //!< 3D view
147   Handle(Prs3d_TextAspect)       myTextStyle;        //!< text style for OSD elements
148   Handle(AIS_ViewCube)           myViewCube;         //!< view cube object
149   TCollection_AsciiString        myCanvasId;         //!< canvas element id on HTML page
150   Aspect_Touch                   myClickTouch;       //!< single touch position for handling clicks
151   OSD_Timer                      myDoubleTapTimer;   //!< timer for handling double tap
152   float                          myDevicePixelRatio; //!< device pixel ratio for handling high DPI displays
153   unsigned int                   myUpdateRequests;   //!< counter for unhandled update requests
154
155 };
156
157 #endif // _WasmOcctView_HeaderFile