1 // File: OpenGl_Text.cxx
2 // Created: 13 July 2011
3 // Author: Sergey ZERCHANINOV
4 // Copyright: OPEN CASCADE 2011
6 #include <OpenGl_Text.hxx>
8 #if (!defined(_WIN32) && !defined(__WIN32__))
12 #include <OpenGl_tgl_all.hxx>
15 #include <OpenGl_Memory.hxx>
17 #include <OpenGl_AspectText.hxx>
18 #include <OpenGl_Structure.hxx>
20 /*----------------------------------------------------------------------*/
22 OpenGl_Text::OpenGl_Text (const TCollection_ExtendedString& AText,
23 const Graphic3d_Vertex& APoint,
24 const Standard_Real AHeight,
25 const Graphic3d_HorizontalTextAlignment AHta,
26 const Graphic3d_VerticalTextAlignment AVta)
29 const Techar *str = (const Techar *) AText.ToExtString();
31 //szv: instead of strlen + 1
32 int i = 0; while (str[i++]);
34 wchar_t *wstr = new wchar_t[i];
36 //szv: instead of memcpy
37 i = 0; while (wstr[i++] = (wchar_t)(*str++));
38 if (myString) delete[] myString;
41 Standard_Real X, Y, Z;
42 APoint.Coord(X, Y, Z);
43 myAttachPnt.xyz[0] = float (X);
44 myAttachPnt.xyz[1] = float (Y);
45 myAttachPnt.xyz[2] = float (Z);
47 myParam.Height = int (AHeight);
49 myParam.HAlign = AHta;
50 myParam.VAlign = AVta;
53 /*----------------------------------------------------------------------*/
55 OpenGl_Text::~OpenGl_Text ()
61 /*----------------------------------------------------------------------*/
63 void OpenGl_Text::Render (const Handle(OpenGl_Workspace) &AWorkspace) const
65 if ( AWorkspace->DegenerateModel > 0 && AWorkspace->SkipRatio >= 1.f )
68 const OpenGl_AspectText *aspect_text = AWorkspace->AspectText( Standard_True );
70 const TEL_COLOUR *tcolor, *scolor;
72 // Use highlight colours
73 if( AWorkspace->NamedStatus & OPENGL_NS_HIGHLIGHT )
75 tcolor = scolor = AWorkspace->HighlightColor;
79 tcolor = &aspect_text->Color();
80 scolor = &aspect_text->SubtitleColor();
83 // Handle annotation style
84 GLboolean flag_zbuffer = GL_FALSE;
85 if (aspect_text->StyleType() == Aspect_TOST_ANNOTATION)
87 flag_zbuffer = glIsEnabled(GL_DEPTH_TEST);
88 if (flag_zbuffer) glDisable(GL_DEPTH_TEST);
91 AWorkspace->SetTextParam(&myParam);
93 GLdouble modelMatrix[16], projMatrix[16];
95 GLdouble objrefX, objrefY, objrefZ;
96 GLdouble objX, objY, objZ;
97 GLdouble obj1X, obj1Y, obj1Z;
98 GLdouble obj2X, obj2Y, obj2Z;
99 GLdouble obj3X, obj3Y, obj3Z;
100 GLdouble winx1, winy1, winz1;
101 GLdouble winx, winy, winz;
104 /* display type of text */
105 if (aspect_text->DisplayType() != Aspect_TODT_NORMAL)
107 /* Optimisation: il faudrait ne faire le Get qu'une fois par Redraw */
108 glGetIntegerv (GL_VIEWPORT, viewport);
109 glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
110 glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
112 switch (aspect_text->DisplayType())
114 case Aspect_TODT_BLEND:
115 glEnable(GL_COLOR_LOGIC_OP);
118 case Aspect_TODT_SUBTITLE:
120 int sWidth, sAscent, sDescent;
121 AWorkspace->StringSize(myString, sWidth, sAscent, sDescent);
123 objrefX = (float)myAttachPnt.xyz[0];
124 objrefY = (float)myAttachPnt.xyz[1];
125 objrefZ = (float)myAttachPnt.xyz[2];
126 status = gluProject (objrefX, objrefY, objrefZ, modelMatrix, projMatrix, viewport,
127 &winx1, &winy1, &winz1);
130 winy = winy1-sDescent;
131 winz = winz1+0.00001;
132 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
133 &objX, &objY, &objZ);
135 winx = winx1 + sWidth;
136 winy = winy1-sDescent;
137 winz = winz1+0.00001; /* il vaut mieux F+B / 1000000 ? */
138 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
139 &obj1X, &obj1Y, &obj1Z);
141 winx = winx1 + sWidth;
142 winy = winy1 + sAscent;
143 winz = winz1+0.00001;
144 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
145 &obj2X, &obj2Y, &obj2Z);
148 winy = winy1+ sAscent;
149 winz = winz1+0.00001;
150 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
151 &obj3X, &obj3Y, &obj3Z);
153 glColor3fv( scolor->rgb );
155 glVertex3d(objX, objY, objZ);
156 glVertex3d(obj1X, obj1Y, obj1Z);
157 glVertex3d(obj2X, obj2Y, obj2Z);
158 glVertex3d(obj3X, obj3Y, obj3Z);
163 case Aspect_TODT_DEKALE:
164 objrefX = (float)myAttachPnt.xyz[0];
165 objrefY = (float)myAttachPnt.xyz[1];
166 objrefZ = (float)myAttachPnt.xyz[2];
167 status = gluProject (objrefX, objrefY, objrefZ, modelMatrix, projMatrix, viewport,
168 &winx1, &winy1, &winz1);
172 winz = winz1+0.00001;
173 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
174 &objX, &objY, &objZ);
176 glColor3fv( scolor->rgb );
177 AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
180 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
181 &objX, &objY, &objZ);
183 AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
186 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
187 &objX, &objY, &objZ);
189 AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
192 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
193 &objX, &objY, &objZ);
194 AWorkspace->RenderText( myString, 0, (float)objX, (float)objY,(float)objZ );
199 glColor3fv( tcolor->rgb );
200 AWorkspace->RenderText( myString, 0, (float)myAttachPnt.xyz[0], (float)myAttachPnt.xyz[1],(float)myAttachPnt.xyz[2] );
202 if (flag_zbuffer) glEnable(GL_DEPTH_TEST);
203 if (aspect_text->DisplayType() == Aspect_TODT_BLEND)
205 glDisable(GL_COLOR_LOGIC_OP);
209 /*----------------------------------------------------------------------*/