5485d25d432b466bc2b054c3d20b49dc97d84520
[occt.git] / src / Wasm / Wasm_Window.hxx
1 // Created by: Kirill Gavrilov
2 // Copyright (c) 2021 OPEN CASCADE SAS
3 //
4 // This file is part of Open CASCADE Technology software library.
5 //
6 // This library is free software; you can redistribute it and/or modify it under
7 // the terms of the GNU Lesser General Public License version 2.1 as published
8 // by the Free Software Foundation, with special exception defined in the file
9 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
10 // distribution for complete text of the license and disclaimer of any warranty.
11 //
12 // Alternatively, this file may be used under the terms of Open CASCADE
13 // commercial license or contractual agreement.
14
15 #ifndef _Wasm_Window_HeaderFile
16 #define _Wasm_Window_HeaderFile
17
18 #include <Aspect_Window.hxx>
19
20 #include <Aspect_VKey.hxx>
21 #include <Aspect_Handle.hxx>
22 #include <Graphic3d_Vec2.hxx>
23
24 class Aspect_WindowInputListener;
25
26 struct EmscriptenMouseEvent;
27 struct EmscriptenWheelEvent;
28 struct EmscriptenTouchEvent;
29 struct EmscriptenKeyboardEvent;
30 struct EmscriptenUiEvent;
31
32 //! This class defines WebAssembly window (HTML5 canvas) intended for creation of OpenGL (WebGL) context.
33 //!
34 //! Note that canvas may define an independent dimensions for backing store (WebGL buffer to render)
35 //! and for CSS (logical units to present buffer onto screen).
36 //! These dimensions differ when browser is dragged into a high pixel density screen (HiDPI),
37 //! or when user scales page in the browser (in both cases window.devicePixelRatio JavaScript property becomes not equal to 1.0).
38 //!
39 //! By default, Wasm_Window::DoResize() will scale backing store of a canvas basing on DevicePixelRatio() scale factor
40 //! to ensure canvas content being rendered with the native resolution and not stretched by browser.
41 //! This, however, might have side effects:
42 //! - a slow GPU might experience performance issues on drawing into larger buffer (e.g. HiDPI);
43 //! - user interface displayed in 3D Viewer (e.g. AIS presentations) should be scaled proportionally to be accessible,
44 //!   which might require extra processing at application level.
45 //! Consider changing ToScaleBacking flag passed to Wasm_Window constructor in case of issues.
46 class Wasm_Window : public Aspect_Window
47 {
48   DEFINE_STANDARD_RTTIEXT(Wasm_Window, Aspect_Window)
49 public:
50
51   //! Convert Emscripten mouse buttons into Aspect_VKeyMouse.
52   Standard_EXPORT static Aspect_VKeyMouse MouseButtonsFromNative (unsigned short theButtons);
53
54   //! Convert DOM virtual key into Aspect_VKey.
55   Standard_EXPORT static Aspect_VKey VirtualKeyFromNative (Standard_Integer theKey);
56
57 public:
58
59   //! Wraps existing HTML5 canvas into window.
60   //! @param[in] theCanvasId target HTML element id defined in a querySelector() syntax
61   //! @param[in] theToScaleBacking when TRUE, window will automatically scale backing store of canvas
62   //!                              basing on DevicePixelRatio() scale factor within DoResize()
63   Standard_EXPORT Wasm_Window (const TCollection_AsciiString& theCanvasId,
64                                const bool theToScaleBacking = true);
65
66   //! Destroys the window.
67   Standard_EXPORT virtual ~Wasm_Window();
68
69   //! Return true if window is not hidden.
70   virtual Standard_Boolean IsMapped() const Standard_OVERRIDE { return myIsMapped; }
71
72   //! Change window mapped flag to TRUE.
73   virtual void Map()   const Standard_OVERRIDE { myIsMapped = Standard_True; }
74
75   //! Change window mapped flag to FALSE.
76   virtual void Unmap() const Standard_OVERRIDE { myIsMapped = Standard_False; }
77
78   //! Resize window.
79   //! In case of ToScaleBacking flag, this method will resize the backing store of canvas
80   //! basing on DevicePixelRatio() scale factor and CSS canvas size.
81   Standard_EXPORT virtual Aspect_TypeOfResize DoResize() Standard_OVERRIDE;
82
83   //! Apply the mapping change to the window.
84   virtual Standard_Boolean DoMapping() const Standard_OVERRIDE { return Standard_True; }
85
86   //! Returns window ratio equal to the physical width/height dimensions.
87   Standard_EXPORT virtual Standard_Real Ratio() const Standard_OVERRIDE;
88
89   //! Returns The Window POSITION in PIXEL
90   Standard_EXPORT virtual void Position (Standard_Integer& theX1,
91                                          Standard_Integer& theY1,
92                                          Standard_Integer& theX2,
93                                          Standard_Integer& theY2) const Standard_OVERRIDE;
94
95   //! Return the window size in pixels.
96   Standard_EXPORT virtual void Size (Standard_Integer& theWidth,
97                                      Standard_Integer& theHeight) const Standard_OVERRIDE;
98
99   //! Set new window size in logical (density-independent units).
100   //! Backing store will be resized basing on DevicePixelRatio().
101   Standard_EXPORT void SetSizeLogical (const Graphic3d_Vec2d& theSize);
102
103   //! Set new window size in pixels.
104   //! Logical size of the element will be resized basing on DevicePixelRatio().
105   Standard_EXPORT void SetSizeBacking (const Graphic3d_Vec2i& theSize);
106
107   //! Returns canvas id.
108   const TCollection_AsciiString& CanvasId() const { return myCanvasId; }
109
110   //! Current EGL implementation in Emscripten accepts only 0 for native window id.
111   virtual Aspect_Drawable NativeHandle() const Standard_OVERRIDE { return 0; }
112
113   //! Always returns 0 for this class.
114   virtual Aspect_Drawable NativeParentHandle() const Standard_OVERRIDE { return 0; }
115
116   //! Always returns 0 for this class.
117   virtual Aspect_FBConfig NativeFBConfig() const Standard_OVERRIDE { return 0; }
118
119   //! Return device pixel ratio (logical to backing store scale factor).
120   virtual Standard_Real DevicePixelRatio() const Standard_OVERRIDE { return myDevicePixelRatio; }
121
122   //! Invalidate entire window content through generation of Expose event.
123   Standard_EXPORT virtual void InvalidateContent (const Handle(Aspect_DisplayConnection)& theDisp) Standard_OVERRIDE;
124
125 public:
126
127   //! Process a single window message.
128   //! @param[in,out] theListener listener to redirect message
129   //! @param[in] theEventType message type to process
130   //! @param[in] theEvent message to process
131   //! @return TRUE if message has been processed
132   Standard_EXPORT virtual bool ProcessMessage (Aspect_WindowInputListener& theListener,
133                                                int theEventType, const void* theEvent);
134
135   //! Process a mouse input message.
136   //! @param[in,out] theListener listener to redirect message
137   //! @param[in] theEventType message type to process
138   //! @param[in] theEvent message to process
139   //! @return TRUE if message has been processed
140   Standard_EXPORT virtual bool ProcessMouseEvent (Aspect_WindowInputListener& theListener,
141                                                   int theEventType, const EmscriptenMouseEvent* theEvent);
142
143   //! Process a (mouse) wheel input message.
144   //! @param[in,out] theListener listener to redirect message
145   //! @param[in] theEventType message type to process
146   //! @param[in] theEvent message to process
147   //! @return TRUE if message has been processed
148   Standard_EXPORT virtual bool ProcessWheelEvent (Aspect_WindowInputListener& theListener,
149                                                   int theEventType, const EmscriptenWheelEvent* theEvent);
150
151   //! Process a mouse input message.
152   //! @param[in,out] theListener listener to redirect message
153   //! @param[in] theEventType message type to process
154   //! @param[in] theEvent message to process
155   //! @return TRUE if message has been processed
156   Standard_EXPORT virtual bool ProcessTouchEvent (Aspect_WindowInputListener& theListener,
157                                                   int theEventType, const EmscriptenTouchEvent* theEvent);
158
159   //! Process a keyboard input message.
160   //! @param[in,out] theListener listener to redirect message
161   //! @param[in] theEventType message type to process
162   //! @param[in] theEvent message to process
163   //! @return TRUE if message has been processed
164   Standard_EXPORT virtual bool ProcessKeyEvent (Aspect_WindowInputListener& theListener,
165                                                int theEventType, const EmscriptenKeyboardEvent* theEvent);
166
167   //! Process a UI input message (like window resize).
168   //! @param[in,out] theListener listener to redirect message
169   //! @param[in] theEventType message type to process
170   //! @param[in] theEvent message to process
171   //! @return TRUE if message has been processed
172   Standard_EXPORT virtual bool ProcessUiEvent (Aspect_WindowInputListener& theListener,
173                                                int theEventType, const EmscriptenUiEvent* theEvent);
174
175 protected:
176
177   TCollection_AsciiString  myCanvasId;
178   Graphic3d_Vec2i          mySize;
179   Standard_Real            myDevicePixelRatio;
180   Standard_Boolean         myToScaleBacking;
181   mutable Standard_Boolean myIsMapped;
182
183 };
184
185 #endif // _Wasm_Window_HeaderFile