0025611: Displaying 'zbufftrihedron' interferes with 'graduatedtrihedron':
[occt.git] / src / OpenGl / OpenGl_GraduatedTrihedron.hxx
CommitLineData
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 29class Visual3d_View;
2166f0fa
SK
30class OpenGl_View;
31
a79f67f8 32static 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
41class OpenGl_GraduatedTrihedron : public OpenGl_Element
42{
a174a3c5 43public:
2166f0fa 44
a79f67f8 45 DEFINE_STANDARD_ALLOC
2166f0fa 46
a174a3c5 47public:
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 60protected:
2166f0fa 61
a174a3c5 62 virtual ~OpenGl_GraduatedTrihedron();
2166f0fa 63
a79f67f8 64private:
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
106private:
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
134private:
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
210protected: //! @name Scene bounding box values
211
212 OpenGl_Vec3 myMin;
213 OpenGl_Vec3 myMax;
214
a174a3c5 215protected:
216
a79f67f8 217 Axis myAxes[3]; //!< Axes for trihedron
218
219 Graphic3d_GraduatedTrihedron myData;
220
221 OpenGl_AspectLine myGridLineAspect; //!< Color grid properties
222
223protected: //! @name Labels properties
224
a174a3c5 225 mutable OpenGl_Text myLabelValues;
226 mutable OpenGl_AspectText myAspectLabels;
227 mutable OpenGl_AspectText myAspectValues;
a174a3c5 228
a79f67f8 229private:
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