0029570: Visualization, Graphic3d_Aspect - merge Graphic3d_Group aspects
[occt.git] / src / OpenGl / OpenGl_Text.hxx
1 // Created on: 2011-07-13
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_Text_Header
17 #define OpenGl_Text_Header
18
19 #include <OpenGl_Element.hxx>
20
21 #include <OpenGl_Aspects.hxx>
22 #include <OpenGl_TextParam.hxx>
23 #include <OpenGl_TextBuilder.hxx>
24
25 #include <TCollection_ExtendedString.hxx>
26 #include <Graphic3d_Vertex.hxx>
27 #include <Graphic3d_HorizontalTextAlignment.hxx>
28 #include <Graphic3d_RenderingParams.hxx>
29 #include <Graphic3d_VerticalTextAlignment.hxx>
30
31 #include <gp_Ax2.hxx>
32
33 //! Text rendering
34 class OpenGl_Text : public OpenGl_Element
35 {
36
37 public:
38
39   //! Main constructor
40   Standard_EXPORT OpenGl_Text (const Standard_Utf8Char* theText,
41                                const OpenGl_Vec3&       thePoint,
42                                const OpenGl_TextParam&  theParams);
43
44   //! Creates new text in 3D space.
45   Standard_EXPORT OpenGl_Text (const Standard_Utf8Char* theText,
46                                const gp_Ax2&            theOrientation,
47                                const OpenGl_TextParam&  theParams,
48                                const bool               theHasOwnAnchor = true);
49
50   //! Destructor
51   Standard_EXPORT virtual ~OpenGl_Text();
52
53   //! Setup new string and position
54   Standard_EXPORT void Init (const Handle(OpenGl_Context)& theCtx,
55                              const Standard_Utf8Char*      theText,
56                              const OpenGl_Vec3&            thePoint);
57
58   //! Setup new string and parameters
59   Standard_EXPORT void Init (const Handle(OpenGl_Context)& theCtx,
60                              const Standard_Utf8Char*      theText,
61                              const OpenGl_Vec3&            thePoint,
62                              const OpenGl_TextParam&       theParams);
63
64   //! Setup new position
65   Standard_EXPORT void SetPosition (const OpenGl_Vec3& thePoint);
66
67   //! Setup new font size
68   Standard_EXPORT void SetFontSize (const Handle(OpenGl_Context)& theContext,
69                                     const Standard_Integer        theFontSize);
70
71   Standard_EXPORT virtual void Render  (const Handle(OpenGl_Workspace)& theWorkspace) const;
72   Standard_EXPORT virtual void Release (OpenGl_Context* theContext);
73
74   //! Return defined text.
75   const NCollection_String& Text() const { return myString; }
76
77   //! Return text formatting parameters.
78   const OpenGl_TextParam& FormatParams() const { return myParams; }
79
80 public: //! @name methods for compatibility with layers
81
82   //! Empty constructor
83   Standard_EXPORT OpenGl_Text();
84
85   //! Create key for shared resource
86   Standard_EXPORT static TCollection_AsciiString FontKey (const OpenGl_Aspects& theAspect,
87                                                           Standard_Integer theHeight,
88                                                           unsigned int theResolution);
89
90   //! Find shared resource for specified font or initialize new one
91   Standard_EXPORT static Handle(OpenGl_Font) FindFont (const Handle(OpenGl_Context)& theCtx,
92                                                        const OpenGl_Aspects& theAspect,
93                                                        Standard_Integer theHeight,
94                                                        unsigned int theResolution,
95                                                        const TCollection_AsciiString& theKey);
96
97   //! Compute text width
98   Standard_EXPORT static void StringSize (const Handle(OpenGl_Context)& theCtx,
99                                           const NCollection_String&     theText,
100                                           const OpenGl_Aspects&         theTextAspect,
101                                           const OpenGl_TextParam&       theParams,
102                                           const unsigned int            theResolution,
103                                           Standard_ShortReal&           theWidth,
104                                           Standard_ShortReal&           theAscent,
105                                           Standard_ShortReal&           theDescent);
106
107   //! Setup new string and parameters
108   Standard_EXPORT void Init (const Handle(OpenGl_Context)&     theCtx,
109                              const TCollection_ExtendedString& theText,
110                              const OpenGl_Vec2&                thePoint,
111                              const OpenGl_TextParam&           theParams);
112
113   //! Perform rendering
114   Standard_EXPORT void Render (const Handle(OpenGl_Context)& theCtx,
115                                const OpenGl_Aspects& theTextAspect,
116                                unsigned int theResolution = Graphic3d_RenderingParams::THE_DEFAULT_RESOLUTION) const;
117
118 protected:
119
120   friend class OpenGl_Trihedron;
121   friend class OpenGl_GraduatedTrihedron;
122
123   //! Release cached VBO resources
124   Standard_EXPORT void releaseVbos (OpenGl_Context* theCtx);
125
126 private:
127
128   //! Setup matrix.
129   void setupMatrix (const Handle(OpenGl_Context)& theCtx,
130                     const OpenGl_Aspects& theTextAspect,
131                     const OpenGl_Vec3& theDVec) const;
132
133   //! Draw arrays of vertices.
134   void drawText (const Handle(OpenGl_Context)& theCtx,
135                  const OpenGl_Aspects& theTextAspect) const;
136
137   //! Draw rectangle from bounding text box.
138   void drawRect (const Handle(OpenGl_Context)& theCtx,
139                  const OpenGl_Aspects& theTextAspect,
140                  const OpenGl_Vec4& theColorSubs) const;
141
142   //! Main rendering code
143   void render (const Handle(OpenGl_Context)& theCtx,
144                const OpenGl_Aspects& theTextAspect,
145                const OpenGl_Vec4& theColorText,
146                const OpenGl_Vec4& theColorSubs,
147                unsigned int theResolution) const;
148
149 protected:
150
151   mutable Handle(OpenGl_Font)                             myFont;
152   mutable NCollection_Vector<GLuint>                      myTextures;   //!< textures' IDs
153   mutable NCollection_Vector<Handle(OpenGl_VertexBuffer)> myVertsVbo;   //!< VBOs of vertices
154   mutable NCollection_Vector<Handle(OpenGl_VertexBuffer)> myTCrdsVbo;   //!< VBOs of texture coordinates
155   mutable Handle(OpenGl_VertexBuffer)                     myBndVertsVbo;//!< VBOs of vertices for bounding box
156   mutable Font_Rect                                       myBndBox;
157
158 protected:
159
160   mutable OpenGl_Mat4d myProjMatrix;
161   mutable OpenGl_Mat4d myModelMatrix;
162   mutable OpenGl_Mat4d myOrientationMatrix;
163   mutable GLdouble myWinX;
164   mutable GLdouble myWinY;
165   mutable GLdouble myWinZ;
166   mutable GLdouble myScaleHeight;
167   mutable GLdouble myExportHeight;
168
169 protected:
170
171   OpenGl_TextParam   myParams;
172   NCollection_String myString;
173   OpenGl_Vec3        myPoint;
174   bool               myIs2d;
175   gp_Ax2             myOrientation; //!< Text orientation in 3D space.
176   bool               myHasPlane;    //!< Check if text have orientation in 3D space.
177   bool               myHasAnchorPoint; //!< Shows if it has own attach point
178
179 public:
180
181   DEFINE_STANDARD_ALLOC
182
183 };
184
185 #endif //OpenGl_Text_Header