0023634: Eliminate Polyline and Polygon usage in drawers
[occt.git] / src / OpenGl / OpenGl_Text.cxx
1 // Created on: 2011-07-13
2 // Created by: Sergey ZERCHANINOV
3 // Copyright (c) 2011-2012 OPEN CASCADE SAS
4 //
5 // The content of this file is subject to the Open CASCADE Technology Public
6 // License Version 6.5 (the "License"). You may not use the content of this file
7 // except in compliance with the License. Please obtain a copy of the License
8 // at http://www.opencascade.org and read it completely before using this file.
9 //
10 // The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
11 // main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
12 //
13 // The Original Code and all software distributed under the License is
14 // distributed on an "AS IS" basis, without warranty of any kind, and the
15 // Initial Developer hereby disclaims all such warranties, including without
16 // limitation, any warranties of merchantability, fitness for a particular
17 // purpose or non-infringement. Please see the License for the specific terms
18 // and conditions governing the rights and limitations under the License.
19
20 #include <OpenGl_GlCore11.hxx>
21 #include <OpenGl_Text.hxx>
22 #include <OpenGl_AspectText.hxx>
23 #include <OpenGl_Structure.hxx>
24 #include <OpenGl_Workspace.hxx>
25
26 #include <GL/glu.h> // gluUnProject()
27
28 /*----------------------------------------------------------------------*/
29
30 OpenGl_Text::OpenGl_Text (const TCollection_ExtendedString& AText,
31                         const Graphic3d_Vertex& APoint,
32                         const Standard_Real AHeight,
33                         const Graphic3d_HorizontalTextAlignment AHta,
34                         const Graphic3d_VerticalTextAlignment AVta)
35 : myString(NULL)
36 {
37   const Techar *str = (const Techar *) AText.ToExtString();
38
39   //szv: instead of strlen + 1
40   int i = 0; while (str[i++]);
41
42   wchar_t *wstr = new wchar_t[i];
43
44   //szv: instead of memcpy
45   i = 0; while (wstr[i++] = (wchar_t)(*str++));
46   if (myString) delete[] myString;
47   myString = wstr;
48
49   myAttachPnt.xyz[0] = APoint.X();
50   myAttachPnt.xyz[1] = APoint.Y();
51   myAttachPnt.xyz[2] = APoint.Z();
52
53   myParam.Height = int (AHeight);
54
55   myParam.HAlign = AHta;
56   myParam.VAlign = AVta;
57 }
58
59 /*----------------------------------------------------------------------*/
60
61 OpenGl_Text::~OpenGl_Text ()
62 {
63   if (myString)
64     delete[] myString;
65 }
66
67 /*----------------------------------------------------------------------*/
68
69 void OpenGl_Text::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
70 {
71   if ( AWorkspace->DegenerateModel > 0 && AWorkspace->SkipRatio >= 1.f )
72     return;
73
74   const OpenGl_AspectText *aspect_text = AWorkspace->AspectText( Standard_True );
75
76   const TEL_COLOUR *tcolor, *scolor;
77
78   // Use highlight colours
79   if( AWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT )
80   {
81     tcolor = scolor = AWorkspace->HighlightColor;
82   }
83   else
84   {
85     tcolor = &aspect_text->Color();
86     scolor = &aspect_text->SubtitleColor();
87   }
88
89   // Handle annotation style
90   GLboolean flag_zbuffer = GL_FALSE;
91   if (aspect_text->StyleType() == Aspect_TOST_ANNOTATION)
92   {
93     flag_zbuffer = glIsEnabled(GL_DEPTH_TEST);
94     if (flag_zbuffer) glDisable(GL_DEPTH_TEST);
95   }
96
97   AWorkspace->SetTextParam(&myParam);
98
99   GLdouble        modelMatrix[16], projMatrix[16];
100   GLint           viewport[4];
101   GLdouble        objrefX, objrefY, objrefZ;
102   GLdouble        objX, objY, objZ;
103   GLdouble        obj1X, obj1Y, obj1Z;
104   GLdouble        obj2X, obj2Y, obj2Z;
105   GLdouble        obj3X, obj3Y, obj3Z;
106   GLdouble        winx1, winy1, winz1;
107   GLdouble        winx, winy, winz;
108   GLint           status;
109
110   /* display type of text */
111   if (aspect_text->DisplayType() != Aspect_TODT_NORMAL)
112   {
113     /* Optimisation: il faudrait ne faire le Get qu'une fois par Redraw */
114     glGetIntegerv (GL_VIEWPORT, viewport);
115     glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
116     glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
117
118     switch (aspect_text->DisplayType())
119     {
120     case Aspect_TODT_BLEND:
121       glEnable(GL_COLOR_LOGIC_OP);
122       glLogicOp(GL_XOR);
123       break;
124     case Aspect_TODT_SUBTITLE:
125     {
126       int sWidth, sAscent, sDescent;
127       AWorkspace->StringSize(myString, sWidth, sAscent, sDescent);
128
129       objrefX = (float)myAttachPnt.xyz[0];
130       objrefY = (float)myAttachPnt.xyz[1];
131       objrefZ = (float)myAttachPnt.xyz[2];
132       status = gluProject (objrefX, objrefY, objrefZ, modelMatrix, projMatrix, viewport,
133         &winx1, &winy1, &winz1);
134
135       winx = winx1;
136       winy = winy1-sDescent;
137       winz = winz1+0.00001;
138       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
139         &objX, &objY, &objZ);
140
141       winx = winx1 + sWidth;
142       winy = winy1-sDescent;
143       winz = winz1+0.00001; /* il vaut mieux F+B / 1000000 ? */
144       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
145         &obj1X, &obj1Y, &obj1Z);
146
147       winx = winx1 + sWidth;
148       winy = winy1 + sAscent;
149       winz = winz1+0.00001;
150       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
151         &obj2X, &obj2Y, &obj2Z);
152
153       winx = winx1;
154       winy = winy1+ sAscent;
155       winz = winz1+0.00001;
156       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
157         &obj3X, &obj3Y, &obj3Z);
158
159       glColor3fv( scolor->rgb );
160       glBegin(GL_POLYGON);
161       glVertex3d(objX, objY, objZ);
162       glVertex3d(obj1X, obj1Y, obj1Z);
163       glVertex3d(obj2X, obj2Y, obj2Z);
164       glVertex3d(obj3X, obj3Y, obj3Z);
165       glEnd();
166       break;
167     }
168
169     case Aspect_TODT_DEKALE:
170       objrefX = (float)myAttachPnt.xyz[0];
171       objrefY = (float)myAttachPnt.xyz[1];
172       objrefZ = (float)myAttachPnt.xyz[2];
173       status = gluProject (objrefX, objrefY, objrefZ, modelMatrix, projMatrix, viewport,
174         &winx1, &winy1, &winz1);
175
176       winx = winx1+1;
177       winy = winy1+1;
178       winz = winz1+0.00001;
179       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
180         &objX, &objY, &objZ);
181
182       glColor3fv( scolor->rgb );
183       AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
184       winx = winx1-1;
185       winy = winy1-1;
186       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
187         &objX, &objY, &objZ);
188
189       AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
190       winx = winx1-1;
191       winy = winy1+1;
192       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
193         &objX, &objY, &objZ);
194
195       AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
196       winx = winx1+1;
197       winy = winy1-1;
198       status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
199         &objX, &objY, &objZ);
200       AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
201       break;
202     }
203   }
204
205   glColor3fv( tcolor->rgb );
206   AWorkspace->RenderText( myString, 0, (float)myAttachPnt.xyz[0], (float)myAttachPnt.xyz[1],(float)myAttachPnt.xyz[2] );
207   /* maj attributs */
208   if (flag_zbuffer) glEnable(GL_DEPTH_TEST);
209   if (aspect_text->DisplayType() == Aspect_TODT_BLEND)
210   {
211     glDisable(GL_COLOR_LOGIC_OP);
212   }
213 }
214
215 void OpenGl_Text::Release (const Handle(OpenGl_Context)& theContext)
216 {
217   //
218 }