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