1 /***********************************************************************
12 HISTORIQUE DES MODIFICATIONS :
13 --------------------------------
14 xx-xx-xx : xxx ; Creation.
15 05-03-96 : FMN ; Suppression code inutile:
16 01-04-96 : CAL ; Integration MINSK portage WNT
17 29-04-96 : FMN ; correction warning de compilation.
18 21-10-96 : FMN ; Suppression LMC_COLOR fait dans OpenGl_execstruct.c
19 30-11-98 : FMN ; S4069 : Textes toujours visibles
20 02.14.100 : JR : Warnings on WNT truncations from double to float
21 21.06.03 : SAN : Suppress text display while in animation mode (TEXT_DEGENER)
22 22.01.04 : SAN : Implement texture mapped fonts on WNT only (OCC2934)
24 ************************************************************************/
26 /*----------------------------------------------------------------------*/
34 #include <OpenGl_tgl_all.hxx>
42 #include <OpenGl_cmn_varargs.hxx>
43 #include <OpenGl_telem_attri.hxx>
44 #include <OpenGl_tsm.hxx>
45 #include <OpenGl_telem.hxx>
46 #include <OpenGl_telem_highlight.hxx>
47 #include <OpenGl_telem_inquire.hxx>
48 #include <OpenGl_tgl_funcs.hxx>
49 #include <OpenGl_Extension.hxx>
50 #include <OpenGl_Memory.hxx>
53 #include <OpenGl_TextRender.hxx>
55 /*----------------------------------------------------------------------*/
60 static TStatus TextDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
61 static TStatus TextAdd( TSM_ELEM_DATA, Tint, cmn_key* );
62 static TStatus TextDelete( TSM_ELEM_DATA, Tint, cmn_key* );
63 static TStatus TextPrint( TSM_ELEM_DATA, Tint, cmn_key* );
64 static TStatus TextInquire( TSM_ELEM_DATA, Tint, cmn_key* );
66 #if defined(__sun) || defined (__osf__) || defined (__hp) || defined (__sgi)
68 PFNGLBLENDEQUATIONEXTPROC glBlendEquationOp = (PFNGLBLENDEQUATIONEXTPROC) INVALID_EXT_FUNCTION_PTR;
70 /*----------------------------------------------------------------------*/
75 #if defined(__osf__) || defined (__sun) || defined (__sgi) || defined(__hp9000s700) || defined(WNT)
76 #undef GL_EXT_blend_logic_op
79 /*----------------------------------------------------------------------*/
84 /*static GLboolean lighting_mode;*/
86 static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) =
96 extern GLuint fontBase;
97 extern GLuint printerFontBase;
102 extern int g_nDegenerateModel;
103 extern float g_fSkipRatio;
106 void putText( Tchar* data, Tfloat x, Tfloat y, Tfloat z )
108 OpenGl_TextRender* textRender=OpenGl_TextRender::instance();
109 textRender->RenderText ( (char*)data, fontBase, 0, x, y, z );
112 /*----------------------------------------------------------------------*/
115 TelTextInitClass( TelType* el )
121 /*----------------------------------------------------------------------*/
124 TextAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
127 TEL_POINT def_pt = {{ ( float )0.0, ( float )0.0, ( float )0.0 }};
128 tel_point pt = &def_pt;
132 for( i = 0; i < n; i++ )
136 case TEXT_ATTACH_PT_ID:
137 pt = (tel_point)k[i]->data.pdata;
140 str = (Tchar*)k[i]->data.pdata;
145 i = strlen((char*)str) + 1;
147 data = new TEL_TEXT_DATA();
150 data->data = new Tchar[i];
154 data->attach_pt = *pt;
156 memcpy( data->data, str, i );
158 ((tsm_elem_data)(d.pdata))->pdata = data;
163 /*----------------------------------------------------------------------*/
166 TextDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
170 TEL_COLOUR colour, colours;
171 int style, display_type;
172 GLboolean flag_zbuffer = GL_FALSE;
173 GLboolean blend_state = GL_FALSE;
174 GLint sWidth, sAscent, sDescent;
175 GLdouble modelMatrix[16], projMatrix[16];
177 GLdouble objrefX, objrefY, objrefZ;
178 GLdouble objX, objY, objZ;
179 GLdouble obj1X, obj1Y, obj1Z;
180 GLdouble obj2X, obj2Y, obj2Z;
181 GLdouble obj3X, obj3Y, obj3Z;
182 GLdouble winx1, winy1, winz1;
183 GLdouble winx, winy, winz;
187 if ( g_nDegenerateModel > 0 && g_fSkipRatio == 1. )
191 d = (tel_text_data)data.pdata;
193 if( k[0]->id == TOn )
194 { /* Use highlight colours */
197 key.id = TelHighlightIndex;
198 TsmGetAttri( 1, &key );
199 if( TelGetHighlightRep( TglActiveWs, key.data.ldata, &hrep )
204 TelGetHighlightRep( TglActiveWs, 0, &hrep );
210 key.id = TelTextColour;
211 key.data.pdata = &colour;
212 TsmGetAttri( 1, &key );
215 key.id = TelTextStyle;
216 key1.id = TelTextDisplayType;
217 TsmGetAttri( 2, &key, &key1 );
218 style = key.data.ldata;
219 display_type = key1.data.ldata;
221 /* style annotation */
222 if (style == ASPECT_TOST_ANNOTATION)
224 flag_zbuffer = glIsEnabled(GL_DEPTH_TEST);
225 if (flag_zbuffer) glDisable(GL_DEPTH_TEST);
228 /* display type of text */
229 if (display_type != ASPECT_TODT_NORMAL)
231 key.id = TelTextColourSubTitle;
232 key.data.pdata = &colours;
233 TsmGetAttri( 1, &key );
235 /* Optimisation: il faudrait ne faire le Get qu'une fois par Redraw */
236 glGetIntegerv (GL_VIEWPORT, viewport);
237 glGetDoublev (GL_MODELVIEW_MATRIX, modelMatrix);
238 glGetDoublev (GL_PROJECTION_MATRIX, projMatrix);
240 OpenGl_TextRender* textRender=OpenGl_TextRender::instance();
241 switch (display_type)
243 case ASPECT_TODT_BLEND:
245 #if defined(GL_EXT_blend_logic_op)
246 if ( (PFNGLBLENDEQUATIONEXTPROC)glBlendEquationOp == (PFNGLBLENDEQUATIONEXTPROC)INVALID_EXT_FUNCTION_PTR )
248 if(QueryExtension("GL_EXT_blend_logic_op")) {
250 glBlendEquationOp = (PFNGLBLENDEQUATIONEXTPROC)wglGetProcAddress("glBlendEquationOp");
252 glBlendEquationOp = (PFNGLBLENDEQUATIONEXTPROC)glXGetProcAddress((GLubyte*)"glBlendEquationOp");
255 glBlendEquationOp = NULL;
258 if ( glBlendEquationOp )
260 blend_state = glIsEnabled(GL_BLEND);
261 if (!blend_state) glEnable(GL_BLEND);
262 glBlendEquationOp(GL_LOGIC_OP);
267 blend_state = glIsEnabled(GL_BLEND);
268 if (!blend_state) glEnable(GL_BLEND);
269 glEnable(GL_COLOR_LOGIC_OP);
274 case ASPECT_TODT_SUBTITLE:
275 textRender->StringSize((char *)d->data, &sWidth, &sAscent, &sDescent);
276 objrefX = (float)d->attach_pt.xyz[0];
277 objrefY = (float)d->attach_pt.xyz[1];
278 objrefZ = (float)d->attach_pt.xyz[2];
279 status = gluProject (objrefX, objrefY, objrefZ, modelMatrix, projMatrix, viewport,
280 &winx1, &winy1, &winz1);
283 winy = winy1-sDescent;
284 winz = winz1+0.00001;
285 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
286 &objX, &objY, &objZ);
288 winx = winx1 + sWidth;
289 winy = winy1-sDescent;
290 winz = winz1+0.00001; /* il vaut mieux F+B / 1000000 ? */
291 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
292 &obj1X, &obj1Y, &obj1Z);
294 winx = winx1 + sWidth;
295 winy = winy1 + sAscent;
296 winz = winz1+0.00001;
297 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
298 &obj2X, &obj2Y, &obj2Z);
301 winy = winy1+ sAscent;
302 winz = winz1+0.00001;
303 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
304 &obj3X, &obj3Y, &obj3Z);
306 glColor3fv( colours.rgb );
308 glVertex3d(objX, objY, objZ);
309 glVertex3d(obj1X, obj1Y, obj1Z);
310 glVertex3d(obj2X, obj2Y, obj2Z);
311 glVertex3d(obj3X, obj3Y, obj3Z);
315 case ASPECT_TODT_DEKALE:
316 objrefX = (float)d->attach_pt.xyz[0];
317 objrefY = (float)d->attach_pt.xyz[1];
318 objrefZ = (float)d->attach_pt.xyz[2];
319 status = gluProject (objrefX, objrefY, objrefZ, modelMatrix, projMatrix, viewport,
320 &winx1, &winy1, &winz1);
324 winz = winz1+0.00001;
325 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
326 &objX, &objY, &objZ);
328 glColor3fv( colours.rgb );
329 putText( d->data, (float)objX, (float)objY,(float)objZ );
332 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
333 &objX, &objY, &objZ);
335 putText( d->data, (float)objX, (float)objY,(float)objZ );
338 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
339 &objX, &objY, &objZ);
341 putText( d->data, (float)objX, (float)objY,(float)objZ );
344 status = gluUnProject (winx, winy, winz, modelMatrix, projMatrix, viewport,
345 &objX, &objY, &objZ);
346 putText( d->data, (float)objX, (float)objY,(float)objZ );
351 glColor3fv( colour.rgb );
352 putText( d->data, (float)d->attach_pt.xyz[0], (float)d->attach_pt.xyz[1],(float)d->attach_pt.xyz[2] );
354 if (flag_zbuffer) glEnable(GL_DEPTH_TEST);
355 if (display_type == ASPECT_TODT_BLEND)
357 #if defined(GL_EXT_blend_logic_op)
358 if ((!blend_state) && (QueryExtension("GL_EXT_blend_logic_op"))) glDisable(GL_BLEND);
360 if (!blend_state) glDisable(GL_BLEND);
361 glDisable(GL_COLOR_LOGIC_OP);
368 /*----------------------------------------------------------------------*/
371 TextDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
378 /*----------------------------------------------------------------------*/
381 TextPrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
385 p = (tel_text_data)data.pdata;
387 fprintf( stdout, "TelText.\n" );
388 fprintf( stdout, "\t\tString : %s\n", p->data );
389 fprintf( stdout, "\t\tAttach Point : %f %f %f\n", p->attach_pt.xyz[0],
391 p->attach_pt.xyz[2] );
392 fprintf( stdout, "\n" );
397 /*----------------------------------------------------------------------*/
400 TextInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
405 TStatus status = TSuccess;
407 d = (tel_text_data)data.pdata;
409 size_reqd = d->length;
411 for( i = 0; i < n; i++ )
415 case INQ_GET_SIZE_ID:
417 k[i]->data.ldata = size_reqd;
421 case INQ_GET_CONTENT_ID:
426 c = (tel_inq_content)k[i]->data.pdata;
427 c->act_size = size_reqd;
430 if( c->size >= size_reqd )
432 w->atext3.string = c->buf;
433 w->atext3.ref_pt = d->attach_pt;
434 w->atext3.anno.xyz[0] = ( float )0.0;
435 w->atext3.anno.xyz[1] = ( float )0.0;
436 w->atext3.anno.xyz[2] = ( float )0.0;
437 strcpy( (char*)w->atext3.string, (char*)d->data );
449 /*----------------------------------------------------------------------*/