0030429: Samples - add simple glfw 3D Viewer sample
[occt.git] / samples / glfw / GlfwOcctView.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 _GlfwOcctView_Header
23 #define _GlfwOcctView_Header
24
25 #include "GlfwOcctWindow.h"
26
27 #include <AIS_InteractiveContext.hxx>
28 #include <V3d_View.hxx>
29
30 //! Sample class creating 3D Viewer within GLFW window.
31 class GlfwOcctView
32 {
33 public:
34   enum CurAction3d
35   {
36     CurAction3d_Nothing,
37     CurAction3d_DynamicZooming,
38     CurAction3d_DynamicPanning,
39     CurAction3d_DynamicRoation
40   };
41
42 public:
43   //! Default constructor.
44         GlfwOcctView();
45
46   //! Destructor.
47         ~GlfwOcctView();
48
49   //! Main application entry point.
50   void run();
51
52 private:
53
54   //! Create GLFW window.
55   void initWindow (int theWidth, int theHeight, const char* theTitle);
56
57   //! Create 3D Viewer.
58   void initViewer();
59
60   //! Fill 3D Viewer with a DEMO items.
61   void initDemoScene();
62
63   //! Application event loop.
64   void mainloop();
65
66   //! Clean up before .
67   void cleanup();
68
69 //! @name GLWF callbacks
70 private:
71   //! Window resize event.
72   void onResize (int theWidth, int theHeight);
73
74   //! Mouse scroll event.
75   void onMouseScroll (double theOffsetX, double theOffsetY);
76
77   //! Mouse click event.
78   void onMouseButton (int theButton, int theAction, int theMods);
79
80   //! Mouse move event.
81   void onMouseMove (int thePosX, int thePosY);
82
83 //! @name GLWF callbacks (static functions)
84 private:
85
86   //! GLFW callback redirecting messages into Message::DefaultMessenger().
87   static void errorCallback (int theError, const char* theDescription);
88
89   //! Wrapper for glfwGetWindowUserPointer() returning this class instance.
90   static GlfwOcctView* toView (GLFWwindow* theWin);
91
92   //! Window resize callback.
93   static void onResizeCallback (GLFWwindow* theWin, int theWidth, int theHeight)
94   { toView(theWin)->onResize (theWidth, theHeight); }
95
96   //! Frame-buffer resize callback.
97   static void onFBResizeCallback (GLFWwindow* theWin, int theWidth, int theHeight)
98   { toView(theWin)->onResize (theWidth, theHeight); }
99
100   //! Mouse scroll callback.
101   static void onMouseScrollCallback (GLFWwindow* theWin, double theOffsetX, double theOffsetY)
102   { toView(theWin)->onMouseScroll (theOffsetX, theOffsetY); }
103
104   //! Mouse click callback.
105   static void onMouseButtonCallback (GLFWwindow* theWin, int theButton, int theAction, int theMods)
106   { toView(theWin)->onMouseButton (theButton, theAction, theMods); }
107
108   //! Mouse move callback.
109   static void onMouseMoveCallback (GLFWwindow* theWin, double thePosX, double thePosY)
110   { toView(theWin)->onMouseMove ((int )thePosX, (int )thePosY); }
111
112 private:
113
114   Handle(GlfwOcctWindow) myOcctWindow;
115   Handle(V3d_View) myView;
116   Handle(AIS_InteractiveContext) myContext;
117
118   CurAction3d myCurAction3d;
119   Graphic3d_Vec2i myMouseMin;
120   Graphic3d_Vec2i myMouseMax;
121   bool myToRedraw;
122
123 };
124
125 #endif // _GlfwOcctView_Header