0033661: Data Exchange, Step Import - Tessellated GDTs are not imported
[occt.git] / src / OpenGl / OpenGl_GraduatedTrihedron.hxx
1 // Created on: 2011-09-20
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2013 OPEN CASCADE SAS
4 //
5 // This file is part of Open CASCADE Technology software library.
6 //
7 // This library is free software; you can redistribute it and/or modify it under
8 // the terms of the GNU Lesser General Public License version 2.1 as published
9 // by the Free Software Foundation, with special exception defined in the file
10 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
11 // distribution for complete text of the license and disclaimer of any warranty.
12 //
13 // Alternatively, this file may be used under the terms of Open CASCADE
14 // commercial license or contractual agreement.
15
16 #ifndef OpenGl_GraduatedTrihedron_HeaderFile
17 #define OpenGl_GraduatedTrihedron_HeaderFile
18
19 #include <Graphic3d_GraduatedTrihedron.hxx>
20 #include <gp_Ax1.hxx>
21 #include <gp_Pnt.hxx>
22 #include <gp_Dir.hxx>
23 #include <NCollection_Array1.hxx>
24 #include <OpenGl_Aspects.hxx>
25 #include <OpenGl_Element.hxx>
26 #include <OpenGl_PrimitiveArray.hxx>
27 #include <OpenGl_Text.hxx>
28
29
30 //! This class allows to render Graduated Trihedron, i.e. trihedron with grid.
31 //! it is based on Graphic3d_GraduatedTrihedron parameters and support its customization
32 //! on construction level only.
33 //! @sa Graphic3d_GraduatedTrihedron
34 class OpenGl_GraduatedTrihedron : public OpenGl_Element
35 {
36 public:
37
38   DEFINE_STANDARD_ALLOC
39
40 public:
41
42   //! Default constructor.
43   Standard_EXPORT OpenGl_GraduatedTrihedron();
44
45   //! Destructor.
46   Standard_EXPORT virtual ~OpenGl_GraduatedTrihedron();
47
48   //! Draw the element.
49   Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const Standard_OVERRIDE;
50
51   //! Release OpenGL resources.
52   Standard_EXPORT virtual void Release (OpenGl_Context* theCtx) Standard_OVERRIDE;
53
54   //! Setup configuration.
55   Standard_EXPORT void SetValues (const Graphic3d_GraduatedTrihedron& theData);
56
57   //! Sets up-to-date values of scene bounding box.
58   //! Can be used in callback mechanism to get up-to-date values.
59   //! @sa Graphic3d_GraduatedTrihedron::CubicAxesCallback
60   Standard_EXPORT void SetMinMax (const OpenGl_Vec3& theMin,
61                                   const OpenGl_Vec3& theMax);
62
63   //! Dumps the content of me into the stream
64   Standard_EXPORT virtual void DumpJson (Standard_OStream& theOStream, Standard_Integer theDepth = -1) const Standard_OVERRIDE;
65
66 private:
67
68   //! Axis of trihedron. It incapsulates geometry and style.
69   class Axis
70   {
71   public:
72
73     OpenGl_Vec3         Direction;
74     Quantity_Color      NameColor;
75     OpenGl_Aspects      LineAspect;
76     mutable OpenGl_Text Label;
77     mutable OpenGl_PrimitiveArray Tickmark;
78     mutable OpenGl_PrimitiveArray Line;
79     mutable OpenGl_PrimitiveArray Arrow;
80
81   public:
82
83     Axis (const Graphic3d_GraduatedTrihedron::AxisAspect& theAspect =
84                 Graphic3d_GraduatedTrihedron::AxisAspect(),
85           const OpenGl_Vec3& theDirection = OpenGl_Vec3 (1.0f, 0.0f, 0.0f));
86
87     ~Axis();
88
89     Axis& operator= (const Axis& theOther);
90
91     void InitArrow (const Handle(OpenGl_Context)& theContext,
92                     const Standard_ShortReal theLength,
93                     const OpenGl_Vec3& theNormal) const;
94
95     void InitTickmark (const Handle(OpenGl_Context)& theContext,
96                        const OpenGl_Vec3& theDir) const;
97
98     void InitLine (const Handle(OpenGl_Context)& theContext,
99                    const OpenGl_Vec3& theDir) const;
100
101     void Release (OpenGl_Context* theCtx);
102
103   };
104
105 private:
106
107   //! Struct for triple of orthonormal vectors
108   //! and origin point, and axes for tickmarks.
109   //! It may be not a right or left coordinate system.
110   struct GridAxes
111   {
112   public:
113     GridAxes()
114     : Origin (0, 0, 0)
115     {
116       Axes[0] = OpenGl_Vec3 (1.0f, 0.0f, 0.0f);
117       Axes[1] = OpenGl_Vec3 (0.0f, 1.0f, 0.0f);
118       Axes[2] = OpenGl_Vec3 (0.0f, 0.0f, 1.0f);
119
120       Ticks[0] = OpenGl_Vec3 (0.0f, 0.0f, 0.0f);
121       Ticks[1] = OpenGl_Vec3 (0.0f, 0.0f, 0.0f);
122       Ticks[2] = OpenGl_Vec3 (0.0f, 0.0f, 0.0f);
123     }
124
125   public: //! @name Main grid directions
126     OpenGl_Vec3 Origin;
127     OpenGl_Vec3 Axes[3];
128
129   public: //! @name Directions for tickmarks
130     OpenGl_Vec3 Ticks[3];
131   };
132
133 private:
134
135   //! Initialize or update GL resources for rendering trihedron.
136   //! @param theContext [in] the GL context.
137   void initGlResources (const Handle(OpenGl_Context)& theContext) const;
138
139   //! Gets normal of the view out of user.
140   //! @param theContext [in] OpenGL Context
141   //! @param theNormal [out] normal of the view out of user
142   //! @return distance corresponding to 1 pixel
143   Standard_ShortReal getNormal (const Handle(OpenGl_Context)& theContext,
144                                 OpenGl_Vec3& theNormal) const;
145
146   //! Gets distance to point (theX, theY, theZ) of bounding box along the normal
147   //! @param theNormal [in] normal of the view out of user
148   //! @param theCenter [in] geometry center of bounding box
149   //! @param theX [in] x of target point
150   //! @param theY [in] y of target point
151   //! @param theZ [in] z of terget point
152   Standard_ShortReal getDistanceToCorner (const OpenGl_Vec3& theNormal,
153                                           const OpenGl_Vec3& theCenter,
154                                           const Standard_ShortReal theX,
155                                           const Standard_ShortReal theY,
156                                           const Standard_ShortReal theZ) const;
157
158   //! Gets axes of grid
159   //! @param theCorners [in] the corners of grid
160   //! @param theGridAxes [out] grid axes, the base of graduated trihedron grid.
161   Standard_ExtCharacter getGridAxes (const Standard_ShortReal theCorners[8],
162                                      GridAxes& theGridAxes) const;
163
164   //! Render line from the transformed primitive array myLine
165   //! @param theWorkspace [in] the OpenGl Workspace
166   //! @param theMat [in] theMat that contains base transformation and is used for applying
167   //!        translation and rotation
168   //! @param thaTx the X for vector of translation
169   //! @param thaTy the Y for vector of translation
170   //! @param thaTz the Z for vector of translation
171   void renderLine (const OpenGl_PrimitiveArray&    theLine,
172                    const Handle(OpenGl_Workspace)& theWorkspace,
173                    const OpenGl_Mat4&              theMat,
174                    const Standard_ShortReal        theXt,
175                    const Standard_ShortReal        theYt,
176                    const Standard_ShortReal        theZt) const;
177
178   //! Render grid lines perpendecular the axis of input index
179   //! @param theWorkspace [in] the OpenGl Workspace
180   //! @param theIndex [in] index of axis
181   //! @param theGridAxes [in] grid axes
182   //! @param theMat [in] theMat that contains base transformation and is used for applying
183   //!        translation and rotation
184   void renderGridPlane (const Handle(OpenGl_Workspace)& theWorkspace,
185                         const Standard_Integer& theIndex,
186                         const GridAxes& theGridAxes,
187                         OpenGl_Mat4& theMat) const;
188
189
190   //! Render the axis of input index
191   //! @param theWorkspace [in] the OpenGl Workspace
192   //! @param theIndex [in] index of axis
193   //! @param theMat [in] theMat that contains base transformation and is used for applying
194   //!        translation and rotation
195   void renderAxis (const Handle(OpenGl_Workspace)& theWorkspace,
196                    const Standard_Integer& theIndex,
197                    const OpenGl_Mat4& theMat) const;
198
199   //! Render grid labels, tickmark lines and labels
200   //! @param theWorkspace [in] the OpenGl Workspace
201   //! @param theMat [in] theMat that contains base transformation and is used for applying
202   //!        translation and rotation
203   //! @param theIndex [in] index of axis
204   //! @param theGridAxes [in] grid axes
205   //! @param theDpix [in] distance corresponding to 1 pixel
206   void renderTickmarkLabels (const Handle(OpenGl_Workspace)& theWorkspace,
207                              const OpenGl_Mat4& theMat,
208                              const Standard_Integer theIndex,
209                              const GridAxes& theGridAxes,
210                              const Standard_ShortReal theDpix) const;
211
212 protected: //! @name Scene bounding box values
213
214   OpenGl_Vec3 myMin;
215   OpenGl_Vec3 myMax;
216
217 protected:
218
219   mutable Axis myAxes[3]; //!< Axes for trihedron
220   mutable Graphic3d_GraduatedTrihedron myData;
221   mutable OpenGl_Aspects   myGridLineAspect; //!< Color grid properties
222
223 protected: //! @name Labels properties
224
225   mutable OpenGl_Text    myLabelValues;
226   mutable OpenGl_Aspects myAspectLabels;
227   mutable OpenGl_Aspects myAspectValues;
228
229 private:
230
231   mutable Standard_Boolean myIsInitialized;
232
233   enum AxisFlags
234   {
235     XOO_XYO = 1 << 1,
236     XOO_XOZ = 1 << 2,
237     OYO_OYZ = 1 << 3,
238     OYO_XYO = 1 << 4,
239     OOZ_XOZ = 1 << 5,
240     OOZ_OYZ = 1 << 6,
241     OYZ_XYZ = 1 << 7,
242     XOZ_XYZ = 1 << 8,
243     XYO_XYZ = 1 << 9
244   };
245 };
246
247 #endif //_OpenGl_GraduatedTrihedron_Header