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