0022819: Redesign of OpenGl driver
[occt.git] / src / OpenGl / OpenGl_attri.cxx
1 /***********************************************************************
2
3 FONCTION :
4 ----------
5 File OpenGl_attri :
6
7
8 REMARQUES:
9 ---------- 
10
11 ATTENTION: Actuellement les materiaux ont le Front et Back identiques.
12 (cf PRO6327). On met temporairement de cote le mode Distinguish.
13
14
15 HISTORIQUE DES MODIFICATIONS   :
16 --------------------------------
17 xx-xx-xx : xxx ; Creation.
18 06-03-96 : FMN ; Ajout OpenGl_tgl_tox.h pour call_thedisplay
19 01-04-96 : CAL ; Integration MINSK portage WNT
20 12-04-96 : CAL ; Travail sur les materiaux
21 07-05-96 : CAL ; Debug temporaire pour ROB, TelRobSetRGB ()
22 10-06-96 : CAL ; Transparence dans TsmSetAttri
23 13-06-96 : CAL ; Introduction de TsmPushAttriLight et TsmPopAttriLight
24 28-06-96 : FMN ; Amelioration des performances sur les materiaux
25 01-07-96 : FMN ; Correction + performance antialiasing;
26 03-07-96 : FMN ; Test sur ZBuffer avant appel a TelUpdateMaterial.
27 17-07-96 : FMN ; Suppression de HLHSRMode.
28 07-10-96 : FMN ; Suppression appel TelUpdateMaterial et define TELCO.
29 08-11-96 : FMN ; Suppression code CAL_OPTIM
30 21-11-96 : FMN ; Correction PRO6181 et PRO4138 Suppression (balise FMN)
31 05-12-96 : FMN ; PRO6327: Pas defaut on positionne les materiaux pour
32 le front et le back. 
33 15-02-97 : FMN ; Suppression OpenGl_gl_compat.h
34 25-02-97 : FMN ; Ajout print informations
35 30-06-97 : FMN ; Appel de la toolkit OpenGl_LightBox.
36 03-07-97 : PCT ; Modif material.
37 05-08-97 : PCT ; support texture mapping
38 21-08-97 : PCT ; ajout deuxieme passe pour les textures
39 08-12-97 : FMN ; Correction Flat/Gouraud
40 09-12-97 : FMN ; Correction Antialing + Textures + Transparence
41 22-12-97 : FMN ; Suppression DEBUG_TEMPO_FOR_ROB
42 Correction PRO10217 sur le mode Transient
43 23-12-97 : FMN ; Suppression TelBackInteriorStyle, TelBackInteriorStyleIndex
44 et TelBackInteriorShadingMethod
45 30-12-97 : FMN ; CTS18312: Correction back material
46 31-12-97 : FMN ; Optimisation gestion material
47 15-01-98 : FMN ; Ajout Hidden line
48 08-04-98 : FGU ; Ajout emission
49 30-06-98 : FMN ; Correction init des materiaux dans TelUpdateMateriaux.
50 08-07-98 : FMN ; PRO14399: Meilleure gestion de la matrice locale sur
51 une structure.
52 21-07-98 : FMN ; Correction init attri_default et du hatch
53 30-11-98 : FMN ; S4069 : Textes toujours visibles
54 05-01-99 : CAL ; Warning WNT
55 22-03-04 : SAN ; OCC4895 High-level interface for controlling polygon offsets
56
57 ************************************************************************/
58
59 #define BUC60577        /*GG_101099     Enable to compute correctly
60 //                      transparency with more than one object in the view.
61 */
62
63 #define IMP190100       /*GG     Push and Pop polyline type and width
64 //                      attributes correctly.
65 */
66
67 #define G003            /*EUG   degeneration mode management
68 */
69
70 #define GER61394        /*GG 26/05/00 Enable AntiAliasing also on polygons.*/
71
72 #define BUC60742        /*GG 18/09/00 Enable to use both animation and 
73 graphic structure transformation
74 */
75
76 #define IMP250401       /*GG    Sets always the current polyline colour 
77 used in immediat mode context.
78 */
79
80 /*OCC8568 changes made by GG rolled back due to regression*/
81 /*#define BUC60918*/        /*GG CADPAK_V2/RINA Enable transparency using Zbuffer
82                             */
83
84 /*----------------------------------------------------------------------*/
85 /*
86 * Constantes
87 */
88
89 #define NO_TRACE                   
90 #define NO_TRACE_UPMATERIAL   
91 #define NO_TRACE_MATERIAL          
92 #define NO_TRACE_LIGHT      
93 #define NO_TRACE_MATRIX     
94 #define NO_TRACE_TEXT       
95
96 /*----------------------------------------------------------------------*/
97 /*
98 * Includes
99 */
100
101 /* OCC22218 NOTE: project dependency on gl2ps is specified by macro */
102 #ifdef HAVE_GL2PS
103   #include <gl2ps.h>
104   /* OCC22216 NOTE: linker dependency can be switched off by undefining macro. 
105      Pragma comment for gl2ps.lib is defined only here. */ 
106   #ifdef _MSC_VER 
107   #pragma comment( lib, "gl2ps.lib" )
108   #endif
109 #endif
110
111 #include <OpenGl_tgl_all.hxx>
112
113 #include <stdio.h>
114 #include <string.h>
115
116 #include <GL/gl.h>
117
118 #include <OpenGl_cmn_varargs.hxx>
119 #include <OpenGl_telem_attri.hxx>
120 #include <OpenGl_telem_view.hxx>
121 #include <OpenGl_telem_depthcue.hxx>
122 #include <OpenGl_telem.hxx>
123 #include <OpenGl_telem_util.hxx>
124 #include <OpenGl_tsm.hxx>
125 #include <OpenGl_tsm_ws.hxx>
126 #include <OpenGl_tgl.hxx>
127 #include <OpenGl_tgl_util.hxx>
128 #include <OpenGl_tgl_tox.hxx>
129 #include <OpenGl_animation.hxx>
130
131 #include <OpenGl_trsf_stack.hxx>
132 #include <OpenGl_tgl_funcs.hxx>
133
134 #include <OpenGl_TextureBox.hxx>
135
136 /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
137 #include <Aspect_PolygonOffsetMode.hxx>
138 /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
139
140 /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
141 #include <OpenGl_transform_persistence.hxx>
142 /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
143
144 #include <OpenGl_Memory.hxx>
145
146 #include <OpenGl_TextRender.hxx>
147 #include <OSD_FontAspect.hxx> 
148
149                                                                           
150 /*----------------------------------------------------------------------*/
151 /*
152 * Definitions type
153 */
154
155 struct  TSM_ATTRI_BLK_STRUCT {
156   //struct          TSM_ATTRI_BLK_STRUCT  *next;
157   /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
158   /*Tint            TransPersFlag;*/
159   TEL_TRANSFORM_PERSISTENCE TransPers;
160   /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
161   TEL_COLOUR      PolylineColour;
162   Tfloat          PolylineWidth;
163   Tint            PolylineType;
164   TEL_COLOUR      EdgeColour;
165   Tfloat          EdgeWidth;
166   Tint            EdgeType;
167   Tint            AntiAliasing;
168   TEL_COLOUR      InteriorColour;
169   Tint            EdgeFlag;
170   Tint            InteriorStyle;
171   Tint            InteriorStyleIndex;
172   Tfloat          PolymarkerSize;
173   TEL_COLOUR      PolymarkerColour;
174   TEL_COLOUR      BackInteriorColour;
175   Tint            FaceDistinguishingMode;
176   TEL_COLOUR      TextColour;
177   TEL_COLOUR      TextColourSubTitle;
178   Tint            TextStyle;
179   Tint            TextDisplayType;
180   Tchar           *TextFont;
181   Tfloat          TextHeight;
182   Tfloat          CharacterSpacing;
183   Tfloat          CharacterExpansionFactor;
184   Tint            TextZoomable;
185   Tfloat          TextAngle; 
186   OSD_FontAspect  TextFontAspect;   
187   /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
188   TEL_ALIGN_DATA  TextAlign;
189   /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
190   Tint            PolymarkerType;
191   Tint            InteriorReflectanceEquation;
192   Tint            BackInteriorReflectanceEquation;
193   TEL_SURF_PROP   SurfaceAreaProperties;
194   TEL_SURF_PROP   BackSurfaceAreaProperties;
195   TelCullMode     FaceCullingMode;
196   Tint            DepthCueIndex;
197   Tint            InteriorShadingMethod;
198   Tint            ViewIndex;
199   Tint            HighlightIndex;
200   Tmatrix3        LocalTran3;
201   Tint            DoTextureMap;
202   Tint            TextureId;
203 #ifdef G003
204   Tint            DegenerationMode;
205 #endif  /* G003 */
206   /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
207   TEL_POFFSET_PARAM PolygonOffsetParams;
208   /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
209
210   IMPLEMENT_MEMORY_OPERATORS
211 };
212 typedef TSM_ATTRI_BLK_STRUCT  TSM_ATTRI_BLK;
213 typedef TSM_ATTRI_BLK_STRUCT* tsm_attri_blk;
214
215
216 /*----------------------------------------------------------------------*/
217 /*
218 * Variables statiques
219 */
220 typedef NCollection_Stack<tsm_attri_blk>  Attri_Stack;
221 static Attri_Stack attri_stk;
222
223 /* FSXXX */
224 static  Tint need_reset = 0;
225
226 /* Est-il necessaire de faire de la transparence ? */
227 static  Tint need_trans = 0;
228
229 static  TSM_ATTRI_BLK  attri_default =
230 {
231   {0 , 0.0F, 0.0F, 0.0F },
232     /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
233   {{ 1.0F, 1.0F, 1.0F }},   /* PolylineColour */
234   1.0F,                   /* PolylineWidth */
235   TEL_LS_SOLID,           /* PolylineType */
236   {{ 1.0F, 1.0F, 1.0F }},   /* EdgeColour */
237   1.0F,                   /* EdgeWidth */
238   0,                      /* EdgeType */
239   TOff,                   /* AntiAliasing */
240   {{ 1.0F, 1.0F, 1.0F }},   /* InteriorColour */
241   TOn,                    /* EdgeFlag */
242   TSM_SOLID,              /* InteriorStyle */
243   TEL_HS_SOLID,           /* InteriorStyleIndex */
244   1.0F,                   /* PolymarkerSize */
245   {{ 1.0F, 1.0F, 1.0F }},   /* PolymarkerColour */
246   {{ 1.0F, 1.0F, 1.0F }},   /* BackInteriorColour */
247   TOn,                    /* FaceDistinguishingMode */
248   {{ 1.0F, 1.0F, 1.0F }},   /* TextColour */
249   {{ 1.0F, 1.0F, 1.0F }},   /* TextColourSubTitle */
250   ASPECT_TOST_NORMAL,     /* TextStyle */
251   ASPECT_TODT_NORMAL,     /* TextDisplayType */
252   (Tchar*)"Courier",  /* TextFont */
253   16.0F,                  /* TextHeight */
254   0.3F,                   /* CharacterSpacing */
255   1.0F,                   /* CharacterExpansionFactor */ 
256   0,                      /*TextZoomable*/
257   0,                      /*TextAngle*/ 
258   OSD_FA_Regular,         /*TextFontAspect - OSD_FA_Regular*/
259   /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
260   { 0,                    /*Horizontal Text Alignment*/
261     0 },                  /*Vertical Text Alignment*/
262   /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
263   TEL_PM_PLUS,            /* PolymarkerType */
264   CALL_PHIGS_REFL_NONE,      /* InteriorReflectanceEquation */
265   CALL_PHIGS_REFL_NONE,      /* BackInteriorReflectanceEquation */
266   { 0.2F, 0.8F, 0.1F, 0.0F,  /* Coef d eclairage */
267   1.0F, 10.0F, 0.0F,  
268   1,  1,  1,  0, 0,          /* Etat des eclairage */
269   {{ 1.0F, 1.0F, 1.0F }},    /* ambient color */
270   {{ 1.0F, 1.0F, 1.0F }},    /* diffuse color */
271   {{ 1.0F, 1.0F, 1.0F }},    /* specular color */
272   {{ 1.0F, 1.0F, 1.0F }},    /* emissive color */
273   {{ 1.0F, 1.0F, 1.0F }}},   /* material color */       /* SurfaceAreaProperties */
274   { 0.2F, 0.8F, 0.1F, 0.0F,  /* Coef d eclairage */
275   1.0F, 10.0F, 0.0F,
276   1,  1,  1,  0, 0,          /* Etat des eclairage */
277   {{ 1.0F, 1.0F, 1.0F }},    /* ambient color */
278   {{ 1.0F, 1.0F, 1.0F }},    /* diffuse color */
279   {{ 1.0F, 1.0F, 1.0F }},    /* specular color */
280   {{ 1.0F, 1.0F, 1.0F }},    /* emissive color */
281   {{ 1.0F, 1.0F, 1.0F }}},   /* material color */      /* BackSurfaceAreaProperties */
282   TelCullNone,            /* FaceCullingMode */
283   0,                      /* DepthCueIndex */
284   TEL_SM_GOURAUD,         /* InteriorShadingMethod */
285   0,                      /* ViewIndex */
286   0,                      /* HighlightIndex */
287   {
288     { 1.0F, 0.0F, 0.0F, 0.0F },
289     { 0.0F, 1.0F, 0.0F, 0.0F },
290     { 0.0F, 0.0F, 1.0F, 0.0F },
291     { 0.0F, 0.0F, 0.0F, 1.0F }
292   },                     /* LocalTran3 */
293     TEL_SD_SHADING,
294     -1
295 #ifdef G003
296     , 0  /* DegenerationMode */
297 #endif  /* G003 */
298     /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
299     , { Aspect_POM_Fill, 1.0F, 0.0F }
300     /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
301 };
302
303 #ifdef G003
304 extern int g_nBackfacing;
305 #endif  /* G003 */
306
307 /*----------------------------------------------------------------------*/
308 /*
309 * Prototypes
310 */
311
312 static  void  TelUpdateFog( Tint, Tint, Tint ); /* ws, vid, dcid */
313 static  void  TelSetViewMatrix( Tmatrix3, Tint ); /* mat, vid */
314 static  void  call_util_transpose_mat (float tmat[16], float mat[4][4]);
315 static  void  TelUpdatePolygonOffsets( tel_poffset_param );
316
317 /*----------------------------------------------------------------------*/
318 /*
319 * Variables externes
320 */
321
322 extern tsm_trsf_stack cur_trsf_stack;
323
324 GLuint fontBase;
325 extern GLuint linestyleBase;
326 extern GLuint patternBase;
327
328 extern  Tint  ForbidSetTextureMapping; /* currently defined in tsm/tsm.c */
329 extern  Tint  SecondPassNeeded;     /* currently defined in tsm/tsm.c */
330 extern  Tint  SecondPassDo;         /* currently defined in tsm/tsm.c */
331
332 /*----------------------------------------------------------------------*/
333
334
335 TStatus
336 TsmPushAttri( void )
337 {
338   tsm_attri_blk node;
339
340   node = new TSM_ATTRI_BLK();
341
342   if( !attri_stk.IsEmpty() )
343   {
344     *node = *attri_stk.Top();
345 #ifdef TRACE
346     printf("TsmPushAttri %x\n",attri_tail);
347 #endif
348   }
349   else
350   {
351     *node = attri_default;
352 #ifdef TRACE
353     printf("TsmPushAttri attri_default %x\n",attri_tail);
354 #endif
355
356     /* Register all default attributes with gl */
357
358     glLineWidth( ( GLfloat )attri_default.PolylineWidth );
359 #ifdef HAVE_GL2PS
360     gl2psLineWidth( ( GLfloat )attri_default.PolylineWidth );
361 #endif
362
363     OpenGl_TextRender* textRender=OpenGl_TextRender::instance();
364     textRender->FindFont(node->TextFont, node->TextFontAspect, node->TextHeight,1,1);
365
366 #ifdef G003
367     if ( !g_nBackfacing ) 
368 #endif  /* G003 */
369       switch (node->FaceCullingMode) {
370 case TelCullNone:
371   glDisable (GL_CULL_FACE);
372   break;
373
374 case TelCullFront:
375   glCullFace (GL_FRONT);
376   glEnable (GL_CULL_FACE);
377   break;
378
379 case TelCullBack:
380   glCullFace (GL_BACK);
381   glEnable (GL_CULL_FACE);
382   break;
383       }
384       /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
385       transform_persistence_begin( 0, 0.0, 0.0, 0.0 );
386       /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
387
388   }
389   attri_stk.Push( node );
390   return TSuccess;
391 }
392
393 /*----------------------------------------------------------------------*/
394
395 TStatus
396 TsmPopAttri( void )
397 {
398   tsm_attri_blk  node;
399
400   if ( attri_stk.IsEmpty() )
401     return TFailure; /* Underflow */
402
403   node = attri_stk.ChangeTop();
404   attri_stk.Pop();
405
406 #ifdef TRACE
407   printf("TsmPopAttri %x\n",attri_tail);
408 #endif
409
410   if( !attri_stk.IsEmpty() )
411   {
412     tsm_attri_blk attri_tail = attri_stk.Top();
413
414     /* Reset the attributes */
415     Tint    i;
416     Tfloat  f;
417
418     f = attri_tail->PolylineWidth;
419     if( node->PolylineWidth != f ) {
420 #ifdef TRACE
421       printf("TsmPopAttri.linewidth %f\n",f);
422 #endif
423
424       glLineWidth( (GLfloat)f );
425 #ifdef HAVE_GL2PS
426       gl2psLineWidth( (GLfloat)f );
427 #endif
428     }
429
430     i = attri_tail->InteriorStyle;
431     if( node->InteriorStyle != i )
432     {
433       switch( i )
434       {
435       case TSM_SOLID:
436       case TSM_HIDDENLINE:
437         glPolygonMode(GL_FRONT_AND_BACK,  GL_FILL );
438         glDisable(GL_POLYGON_STIPPLE);
439         break;
440
441       case TSM_HOLLOW:
442         glPolygonMode(GL_FRONT_AND_BACK,  GL_LINE );
443         break;
444
445       case TSM_EMPTY:
446         glPolygonMode(GL_FRONT_AND_BACK,  GL_LINE );
447         break;
448
449       case TSM_HATCH:
450         glPolygonMode(GL_FRONT_AND_BACK,  GL_FILL );
451         if( node->InteriorStyleIndex ) {
452           glCallList( patternBase + node->InteriorStyleIndex );
453           glEnable(GL_POLYGON_STIPPLE);
454         } else
455           glDisable(GL_POLYGON_STIPPLE);
456         break;
457
458       case TSM_POINT:
459         glPolygonMode(GL_FRONT_AND_BACK,  GL_POINT );
460         break;
461       }
462     }
463
464     i = attri_tail->PolylineType;
465     if( node->PolylineType != i ) {
466 #ifdef TRACE
467       printf("TsmPopAttri.linetype %d\n",i);
468 #endif
469       if (i) {
470         glCallList( linestyleBase+i );
471
472         glEnable( GL_LINE_STIPPLE );
473 #ifdef HAVE_GL2PS
474         gl2psEnable( GL2PS_LINE_STIPPLE );
475 #endif
476       } else {
477
478         glDisable( GL_LINE_STIPPLE );
479 #ifdef HAVE_GL2PS
480         gl2psDisable( GL2PS_LINE_STIPPLE );
481 #endif
482       }
483     }
484
485     if( strcmp( (char*)attri_tail->TextFont, (char*)node->TextFont ) ||
486       ( attri_tail->TextHeight != node->TextHeight ) )
487     {
488
489       OpenGl_TextRender*  textRender =  OpenGl_TextRender::instance();
490       textRender->FindFont(attri_tail -> TextFont, attri_tail->TextFontAspect, attri_tail -> TextHeight);
491     }
492 #ifdef G003
493     if ( !g_nBackfacing )
494 #endif  /* G003 */
495     {
496       if( attri_tail->FaceCullingMode != node->FaceCullingMode )
497       {
498         switch( attri_tail->FaceCullingMode )
499         {
500         case  TelCullNone:
501           glDisable(GL_CULL_FACE);
502           break;
503
504         case  TelCullFront:
505           glCullFace(GL_FRONT) ;
506           glEnable(GL_CULL_FACE);
507           break;
508
509         case  TelCullBack:
510           glCullFace(GL_BACK);
511           glEnable(GL_CULL_FACE);
512           break;
513         }
514       }
515     }
516
517     /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
518     if( attri_tail->PolygonOffsetParams.mode   != node->PolygonOffsetParams.mode   ||
519         attri_tail->PolygonOffsetParams.factor != node->PolygonOffsetParams.factor ||
520         attri_tail->PolygonOffsetParams.units  != node->PolygonOffsetParams.units )
521     {
522       TelUpdatePolygonOffsets( &attri_tail->PolygonOffsetParams );
523     }
524     /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
525
526     /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
527     if( attri_tail->TransPers.mode != node->TransPers.mode ||
528         attri_tail->TransPers.pointX != node->TransPers.pointX ||
529         attri_tail->TransPers.pointY != node->TransPers.pointY ||
530         attri_tail->TransPers.pointZ != node->TransPers.pointZ )
531
532     {
533       transform_persistence_begin( attri_tail->TransPers.mode, 
534                                    attri_tail->TransPers.pointX, 
535                                    attri_tail->TransPers.pointY, 
536                                    attri_tail->TransPers.pointZ );
537     }
538     /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
539
540     if( attri_tail->ViewIndex != node->ViewIndex )
541     {
542       TelSetViewProjection( TglActiveWs, attri_tail->ViewIndex );
543 #ifdef TRACE_MATRIX
544       printf("TsmPopAttri::TelSetViewMatrix::attri_tail->ViewIndex != node->ViewIndex \n");
545 #endif
546       TelSetViewMatrix( attri_tail->LocalTran3, attri_tail->ViewIndex );
547       TelUpdateFog( TglActiveWs, attri_tail->ViewIndex, attri_tail->DepthCueIndex );
548     }
549     else
550     {
551       if( attri_tail->DepthCueIndex != node->DepthCueIndex )
552         TelUpdateFog( TglActiveWs, attri_tail->ViewIndex, attri_tail->DepthCueIndex );
553       if( memcmp( node->LocalTran3, attri_tail->LocalTran3, sizeof(Tmatrix3) ) )
554       {
555 #ifdef TRACE_MATRIX
556         printf("TsmPopAttri::TelSetViewMatrix::memcmp( node->LocalTran3, attri_tail->LocalTran3, sizeof(Tmatrix3) ) \n");
557 #endif
558         TelSetViewMatrix(attri_tail->LocalTran3,attri_tail->ViewIndex); 
559       }
560     }
561   }
562 #ifdef IMP190100        /* Reset default attribs at the top */
563   else {
564     Tint    i;
565     Tfloat  f;
566
567     f = attri_default.PolylineWidth;
568     if( node->PolylineWidth != f ) {
569
570
571       glLineWidth( (GLfloat)f );
572 #ifdef HAVE_GL2PS
573       gl2psLineWidth( (GLfloat)f );
574 #endif
575
576 #ifdef TRACE
577       printf("TsmPopAttri.defaultlinewidth %f\n",f);
578 #endif
579     }
580
581     i = attri_default.PolylineType;
582     if( node->PolylineType != i ) {
583       if (i) {
584         glCallList( linestyleBase+i );
585
586         glEnable( GL_LINE_STIPPLE );
587 #ifdef HAVE_GL2PS
588         gl2psEnable( GL2PS_LINE_STIPPLE );
589 #endif
590       } else {
591
592         glDisable( GL_LINE_STIPPLE );
593 #ifdef HAVE_GL2PS
594         gl2psDisable( GL2PS_LINE_STIPPLE );
595 #endif
596       }
597
598
599 #ifdef TRACE
600       printf("TsmPopAttri.defaultlinetype %d\n",i);
601 #endif
602     }
603     /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
604     TelUpdatePolygonOffsets( &attri_default.PolygonOffsetParams );
605     /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
606
607     /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
608     /*transform_persistence_begin( attri_default.TransPersFlag );*/
609     transform_persistence_begin( attri_default.TransPers.mode, 
610                                  attri_default.TransPers.pointX, 
611                                  attri_default.TransPers.pointY, 
612                                  attri_default.TransPers.pointZ );
613     /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
614   }
615 #endif  /*IMP190100*/
616
617   /* abd
618   cmn_stg_tbl_free( (void *) node );*/
619   delete node;
620
621   return TSuccess;
622 }
623
624 /*----------------------------------------------------------------------*/
625
626 TStatus
627 TsmSetAttri( Tint n, ... )
628 {
629   Tint      i;
630
631 #if defined (SOLARIS) || defined (IRIXO32)
632   cmn_key  *k;
633 #else
634   cmn_key  k[TMaxArgs];
635 #endif
636
637 #ifdef GER61394
638   static int antiAliasingMode = -1;
639   if( antiAliasingMode < 0 ) {
640     char string[64];
641     if (call_util_osd_getenv("CALL_OPENGL_ANTIALIASING_MODE", string, 64) ) {
642       int v;
643       if( sscanf(string,"%d",&v) > 0 ) antiAliasingMode = v;
644       printf(".OpenGl driver.AntiAliasing mode is %d\n",antiAliasingMode);
645     } else {
646       antiAliasingMode = 3;
647     }
648   } 
649 #endif
650
651   if (attri_stk.IsEmpty())
652     return TFailure;
653
654   tsm_attri_blk attri_tail = attri_stk.ChangeTop();
655
656   CMN_GET_STACK( n, k );
657   for( i = 0; i < n; i++ )
658   {
659     switch( k[i]->id )
660     {
661     case  TelTextureId:
662       attri_tail->TextureId = k[i]->data.ldata;
663
664       if (!ForbidSetTextureMapping) {
665         if (attri_tail->DoTextureMap)
666         {
667           DisableTexture();
668           SetCurrentTexture(attri_tail->TextureId);           
669           EnableTexture();
670         }
671         else
672           DisableTexture();
673       }
674       break;
675
676     case TelDoTextureMap:
677       attri_tail->DoTextureMap = k[i]->data.ldata;
678       break;
679
680     case TelTextStyle:
681       attri_tail->TextStyle = k[i]->data.ldata;
682       break;
683
684     case TelTextDisplayType:
685       attri_tail->TextDisplayType = k[i]->data.ldata;
686       break;
687
688     case  TelPolylineColour:
689       attri_tail->PolylineColour = *(tel_colour)(k[i]->data.pdata);
690 #ifdef IMP250401
691       glColor3f(attri_tail->PolylineColour.rgb[0],
692                 attri_tail->PolylineColour.rgb[1],
693                 attri_tail->PolylineColour.rgb[2]);
694 #endif
695       break;
696
697     case  TelPolylineWidth:
698       {
699         Tfloat  w;
700
701         w = k[i]->data.fdata;
702         if( attri_tail->PolylineWidth != w )
703         {
704 #ifdef TRACE
705           printf("TsmSetAttri.linewidth %f\n",w);
706 #endif
707           attri_tail->PolylineWidth = w;
708
709           glLineWidth( (GLfloat)w );
710 #ifdef HAVE_GL2PS
711           gl2psLineWidth( (GLfloat)w );
712 #endif
713         }
714         break;
715       }
716
717     case  TelPolylineType:
718       {
719         Tint  ls;
720
721         ls = k[i]->data.ldata;
722         if( attri_tail->PolylineType != ls )
723         {
724 #ifdef TRACE
725           printf("TsmSetAttri.linetype %d\n",ls);
726 #endif
727           attri_tail->PolylineType = ls;
728           if (ls) {
729             glCallList(linestyleBase+ls);
730
731             glEnable( GL_LINE_STIPPLE );
732 #ifdef HAVE_GL2PS
733             gl2psEnable( GL2PS_LINE_STIPPLE );
734 #endif
735           } else {
736
737             glDisable( GL_LINE_STIPPLE );
738 #ifdef HAVE_GL2PS
739             gl2psDisable( GL2PS_LINE_STIPPLE );
740 #endif
741           }
742         }
743         break;
744       }
745
746     case  TelEdgeType:
747       attri_tail->EdgeType = k[i]->data.ldata;
748       break;
749
750     case  TelEdgeWidth:
751       attri_tail->EdgeWidth = k[i]->data.fdata;
752       break;
753
754     case  TelEdgeColour:
755       attri_tail->EdgeColour = *(tel_colour)(k[i]->data.pdata);
756       break;
757
758     case  TelAntiAliasing:
759       {
760         attri_tail->AntiAliasing = k[i]->data.ldata;
761
762         if (!SecondPassNeeded)
763         {
764           if( attri_tail->AntiAliasing == TOff )
765           {
766             glDisable(GL_POINT_SMOOTH);
767             glDisable(GL_LINE_SMOOTH);
768 #ifdef GER61394
769             if( antiAliasingMode & 2 ) glDisable(GL_POLYGON_SMOOTH);
770 #endif
771             glBlendFunc (GL_ONE, GL_ZERO);
772             glDisable (GL_BLEND);
773           }
774           else /* TOn */
775           {
776             glEnable(GL_POINT_SMOOTH);
777             glEnable(GL_LINE_SMOOTH);
778 #ifdef GER61394
779             if( antiAliasingMode & 2 ) glEnable(GL_POLYGON_SMOOTH);
780 #endif
781             glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
782             glEnable (GL_BLEND);
783           }
784         }
785         break;
786       }
787
788     case  TelInteriorColour:
789       {
790         attri_tail->InteriorColour = *(tel_colour)(k[i]->data.pdata);
791         break;
792       }
793
794     case  TelEdgeFlag:
795       {
796         attri_tail->EdgeFlag = k[i]->data.ldata;
797         break;
798       }
799
800     case  TelInteriorStyle:
801       {
802         Tint  s;
803
804         s = k[i]->data.ldata;
805         if( attri_tail->InteriorStyle != s )
806         {
807           attri_tail->InteriorStyle = s;
808           switch( s )
809           {
810           case TSM_SOLID:
811           case TSM_HIDDENLINE:
812             glPolygonMode(GL_FRONT_AND_BACK,  GL_FILL );
813             glDisable(GL_POLYGON_STIPPLE);
814             break;
815
816           case TSM_HOLLOW:
817             glPolygonMode(GL_FRONT_AND_BACK,  GL_LINE );
818             break;
819
820           case TSM_EMPTY:
821             glPolygonMode(GL_FRONT_AND_BACK,  GL_LINE );
822             break;
823
824           case TSM_HATCH:
825             glPolygonMode(GL_FRONT_AND_BACK,  GL_FILL );
826             if( attri_tail->InteriorStyleIndex ) {
827               glCallList( patternBase + attri_tail->InteriorStyleIndex );
828               glEnable(GL_POLYGON_STIPPLE);
829             } else
830               glDisable(GL_POLYGON_STIPPLE);
831             break;
832
833           case TSM_POINT:
834             glPolygonMode(GL_FRONT_AND_BACK,  GL_POINT );
835             break;
836           }
837         }
838         break;
839       }
840
841     case  TelInteriorStyleIndex:
842       {
843         Tint  is = k[i]->data.ldata;
844         if( attri_tail->InteriorStyleIndex != is )
845         {
846           attri_tail->InteriorStyleIndex = is;
847           if( attri_tail->InteriorStyle == TSM_HATCH )
848           {
849             if (is)
850             {
851               glCallList( patternBase + is );
852               glEnable(GL_POLYGON_STIPPLE);
853             } else
854               glDisable(GL_POLYGON_STIPPLE);
855           }
856         }
857         break;
858       }
859
860     case  TelPolymarkerColour:
861       attri_tail->PolymarkerColour = *(tel_colour)(k[i]->data.pdata);
862       break;
863
864     case  TelPolymarkerSize:
865       attri_tail->PolymarkerSize = k[i]->data.fdata;
866       break;
867
868     case  TelLocalTran3:
869       {
870         tel_matrix3_data  d = ((tel_matrix3_data)(k[i]->data.pdata));
871         switch(d->mode)
872         {
873         case  TPreConcatenate: /* not used */
874           TelMultiplymat3( attri_tail->LocalTran3,
875             d->mat, attri_tail->LocalTran3 );
876           break;
877
878         case  TPostConcatenate: /* not used */
879           TelMultiplymat3( attri_tail->LocalTran3,
880             attri_tail->LocalTran3, d->mat );
881           break;
882
883         case  TReplace:
884 #ifdef BUC60742
885           matcpy( attri_tail->LocalTran3, d->mat );
886           TelTransposemat3( attri_tail->LocalTran3 );
887 #else
888           /*
889           * On multiplie la trsf courante par la trsf
890           * de la structure que l'on est en train de
891           * parcourir.
892           */
893           TelMultiplymat3( cur_trsf_stack->LocalTran3,
894             cur_trsf_stack->LocalTran3, d->mat );
895           /*
896           * On copie de resultat dans la queue d'attributs
897           * pour pouvoir changer l'orientation du reste
898           * du trace.
899           */
900           matcpy( attri_tail->LocalTran3,
901             cur_trsf_stack->LocalTran3 );
902           /*
903           * Transformation definie dans un repere direct
904           * a appliquer dans un repere indirect
905           */
906           TelTransposemat3( attri_tail->LocalTran3 );
907 #endif  /*BUC60742*/
908           break;
909         }
910 #ifdef TRACE_MATRIX
911         printf("TsmSetAttri::TelSetViewMatrix::TelLocalTran3 \n");
912 #endif
913         TelSetViewMatrix(attri_tail->LocalTran3,attri_tail->ViewIndex);
914         break;
915       }
916
917     case  TelBackInteriorColour:
918       {
919         attri_tail->BackInteriorColour = *(tel_colour)(k[i]->data.pdata);
920         break;
921       }
922
923     case  TelFaceDistinguishingMode:
924       {
925         attri_tail->FaceDistinguishingMode = (Tint) k[i]->data.ldata;
926         break;
927       }
928
929     case  TelTextColour:
930       attri_tail->TextColour = *(tel_colour)(k[i]->data.pdata);
931       break;
932
933     case  TelTextColourSubTitle:
934       attri_tail->TextColourSubTitle = *(tel_colour)(k[i]->data.pdata);
935       break;
936
937     case  TelTextFont:
938       {
939         Tchar *fn = (Tchar*)k[i]->data.pdata;
940 #ifdef TRACE_TEXT
941         printf ("TelTextFont:: %s %s \n", fn, attri_tail->TextFont);
942 #endif
943         if( strcmp( (char*)fn, (char*)attri_tail->TextFont ) )
944         {
945           OpenGl_TextRender* textRender = OpenGl_TextRender::instance();
946           textRender->FindFont ( fn, attri_tail->TextFontAspect, attri_tail -> TextHeight );
947           attri_tail->TextFont = fn;
948         }
949         break;
950       }
951
952     case  TelTextHeight:
953       {
954         Tfloat         h;
955
956         h = k[i]->data.fdata;
957 #ifdef TRACE_TEXT
958         printf ("TelTextHeight:: %f %f \n", h, attri_tail->TextHeight);
959 #endif
960         if( h != attri_tail->TextHeight )
961         {
962           OpenGl_TextRender* textRender = OpenGl_TextRender::instance();
963           textRender->FindFont (attri_tail->TextFont, attri_tail->TextFontAspect,h );
964           attri_tail->TextHeight = h;
965         }
966         break;
967       }
968
969     case  TelCharacterSpacing:
970       attri_tail->CharacterSpacing = k[i]->data.fdata;
971       break;
972
973     case  TelCharacterExpansionFactor:
974       {
975         attri_tail->CharacterExpansionFactor = k[i]->data.fdata;
976         break;
977       }
978
979     case TelTextZoomable:
980       attri_tail->TextZoomable = k[i]->data.ldata;  
981       break;
982     case TelTextAngle:
983       attri_tail->TextAngle = k[i]->data.ldata;
984       break;  
985     case TelTextFontAspect:
986       attri_tail->TextFontAspect = OSD_FontAspect(k[i]->data.ldata);
987       break;                   
988
989       /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
990     case TelTextAlign:
991       attri_tail->TextAlign = *(tel_align_data)k[i]->data.pdata;
992       break;
993       /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
994
995     case  TelPolymarkerType:
996       attri_tail->PolymarkerType = k[i]->data.ldata;
997       break;
998
999     case  TelInteriorReflectanceEquation:
1000       attri_tail->InteriorReflectanceEquation =
1001         (Tint) k[i]->data.ldata;
1002       break;
1003
1004     case  TelBackInteriorReflectanceEquation:
1005       attri_tail->BackInteriorReflectanceEquation =
1006         (Tint) k[i]->data.ldata;
1007       break;
1008
1009     case  TelSurfaceAreaProperties:
1010       attri_tail->SurfaceAreaProperties =
1011         *(tel_surf_prop)(k[i]->data.pdata);
1012 #ifdef TRACE_UPMATERIAL
1013       printf("TsmSetAttri::TelSurfaceAreaProperties:TelUpdateMaterial (TEL_FRONT_MATERIAL)\n");
1014 #endif
1015       TelUpdateMaterial( TEL_FRONT_MATERIAL );
1016       break;
1017
1018     case  TelBackSurfaceAreaProperties:
1019       attri_tail->BackSurfaceAreaProperties =
1020         *(tel_surf_prop)(k[i]->data.pdata);
1021 #ifdef TRACE_UPMATERIAL
1022       printf("TsmSetAttri::TelBackSurfaceAreaProperties:TelUpdateMaterial (TEL_BACK_MATERIAL)\n");
1023 #endif
1024       if (attri_tail->FaceDistinguishingMode == TOn)
1025         TelUpdateMaterial( TEL_BACK_MATERIAL ); 
1026       break;
1027
1028     case  TelFaceCullingMode:
1029 #ifdef G003
1030       if ( !g_nBackfacing )
1031 #endif  /* G003 */
1032       {
1033         TelCullMode mode = (TelCullMode) k[i]->data.ldata;
1034         if( mode != attri_tail->FaceCullingMode )
1035         {
1036           attri_tail->FaceCullingMode = mode;
1037           switch( mode )
1038           {
1039           case  TelCullNone:
1040             glDisable(GL_CULL_FACE);
1041             break;
1042
1043           case  TelCullFront:
1044             glCullFace(GL_FRONT);
1045             glEnable(GL_CULL_FACE);
1046             break;
1047
1048           case  TelCullBack:
1049             glCullFace(GL_BACK);
1050             glEnable(GL_CULL_FACE);
1051             break;
1052           }
1053         }
1054       }
1055       break;
1056
1057     case TelDepthCueIndex:
1058       {
1059         Tint dc;
1060
1061         dc = k[i]->data.ldata;
1062         if( dc != attri_tail->DepthCueIndex )
1063         {
1064           attri_tail->DepthCueIndex = dc;
1065           TelUpdateFog( TglActiveWs, attri_tail->ViewIndex, dc );
1066         }
1067         break;
1068       }
1069
1070     case  TelInteriorShadingMethod:
1071       {
1072         Tint  a;
1073
1074         a = k[i]->data.ldata;
1075         attri_tail->InteriorShadingMethod = a;
1076         a == TEL_SM_FLAT ? glShadeModel( GL_FLAT ) :
1077         glShadeModel( GL_SMOOTH );
1078         break;
1079       }
1080
1081     case  TelViewIndex:
1082       {
1083         Tint  vid = k[i]->data.ldata;
1084
1085         if( vid != attri_tail->ViewIndex )
1086         {
1087           attri_tail->ViewIndex = vid;
1088           TelUpdateFog( TglActiveWs, vid, attri_tail->DepthCueIndex );
1089         }
1090         break;
1091       }
1092
1093     case  TelHighlightIndex:
1094       attri_tail->HighlightIndex = k[i]->data.ldata;
1095       break;
1096 #ifdef G003
1097     case TelDegenerationMode:
1098       attri_tail -> DegenerationMode = k[ i ] -> data.ldata;
1099       break;
1100 #endif  /* G003 */
1101
1102       /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
1103     case TelPolygonOffset:
1104       {
1105         tel_poffset_param pdata = (tel_poffset_param)(k[i]->data.pdata);
1106         /* Aspect_POM_None means: do not change current settings */
1107         if ( ( pdata->mode & Aspect_POM_None ) == Aspect_POM_None )
1108           break;
1109         attri_tail->PolygonOffsetParams = *pdata;
1110         TelUpdatePolygonOffsets( pdata );
1111         break;
1112       }
1113       /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
1114
1115
1116     case TelTransformPersistence:
1117       {
1118         attri_tail->TransPers = *(tel_transform_persistence)(k[i]->data.pdata);
1119         transform_persistence_begin( attri_tail->TransPers.mode, 
1120           attri_tail->TransPers.pointX,
1121           attri_tail->TransPers.pointY,
1122           attri_tail->TransPers.pointZ );
1123
1124         break;
1125       }
1126       /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */
1127
1128     default:
1129       break;
1130     }
1131   }
1132   return TSuccess;
1133 }
1134
1135 /*----------------------------------------------------------------------*/
1136
1137 TStatus
1138 TsmGetAttri( Tint n, ... )
1139 {
1140   Tint      i;
1141 #if defined (SOLARIS) || defined (IRIXO32)
1142   cmn_key  *k;
1143 #else
1144   cmn_key  k[TMaxArgs];
1145 #endif
1146
1147   tsm_attri_blk attri_tail = NULL;
1148
1149   if (attri_stk.IsEmpty())  
1150   {
1151 #ifdef TRACE
1152     printf ("TsmGetAttri with attri_tail == NULL\n");
1153 #endif
1154     attri_tail = &attri_default;
1155   } else {
1156     attri_tail = attri_stk.Top();
1157   }
1158
1159   CMN_GET_STACK( n, k );
1160   for( i = 0; i < n; i++ )
1161   {
1162     switch( k[i]->id )
1163     {
1164     case  TelTextureId:
1165       k[i]->data.ldata = attri_tail->TextureId;
1166       break;
1167
1168     case  TelDoTextureMap:
1169       k[i]->data.ldata = attri_tail->DoTextureMap;
1170       break;
1171
1172     case  TelTextStyle:
1173       k[i]->data.ldata = attri_tail->TextStyle;
1174       break;
1175
1176     case  TelTextDisplayType:
1177       k[i]->data.ldata = attri_tail->TextDisplayType;
1178       break;
1179
1180     case  TelPolylineColour:
1181       *(tel_colour)(k[i]->data.pdata) = attri_tail->PolylineColour;
1182       break;
1183
1184     case  TelPolylineWidth:
1185       k[i]->data.fdata = attri_tail->PolylineWidth;   
1186       break;
1187
1188     case  TelPolylineType:
1189       k[i]->data.ldata = attri_tail->PolylineType;
1190       break;
1191
1192     case  TelEdgeType:
1193       k[i]->data.ldata = attri_tail->EdgeType;
1194       break;
1195
1196     case  TelEdgeWidth:
1197       k[i]->data.fdata = attri_tail->EdgeWidth;     
1198       break;
1199
1200     case  TelEdgeColour:
1201       *(tel_colour)(k[i]->data.pdata) = attri_tail->EdgeColour;
1202       break;
1203
1204     case  TelAntiAliasing:
1205       k[i]->data.ldata = attri_tail->AntiAliasing;
1206       break;
1207
1208     case  TelInteriorColour:
1209       *(tel_colour)(k[i]->data.pdata) = attri_tail->InteriorColour;
1210       break;
1211
1212     case  TelEdgeFlag:
1213       k[i]->data.ldata = attri_tail->EdgeFlag;
1214       break;
1215
1216     case  TelInteriorStyle:
1217       k[i]->data.ldata = attri_tail->InteriorStyle;
1218       break;
1219
1220     case  TelInteriorStyleIndex:
1221       k[i]->data.ldata = attri_tail->InteriorStyleIndex;
1222       break;
1223
1224     case  TelPolymarkerColour:
1225       *(tel_colour)(k[i]->data.pdata) = attri_tail->PolymarkerColour;
1226       break;
1227
1228     case  TelPolymarkerSize:
1229       k[i]->data.fdata = attri_tail->PolymarkerSize;   
1230       break;
1231
1232     case  TelLocalTran3:
1233       matcpy( k[i]->data.pdata, attri_tail->LocalTran3 );
1234       break;
1235
1236     case  TelBackInteriorColour:
1237       *(tel_colour)(k[i]->data.pdata) = attri_tail->BackInteriorColour;
1238       break;
1239
1240     case  TelFaceDistinguishingMode:
1241       k[i]->data.ldata = attri_tail->FaceDistinguishingMode;
1242       break;
1243
1244     case  TelTextColour:
1245       *(tel_colour)(k[i]->data.pdata) = attri_tail->TextColour;
1246       break;
1247
1248     case  TelTextColourSubTitle:
1249       *(tel_colour)(k[i]->data.pdata) = attri_tail->TextColourSubTitle;
1250       break;
1251
1252     case  TelTextFont:
1253       k[i]->data.pdata = attri_tail->TextFont;
1254       break;
1255
1256     case  TelTextHeight:
1257       k[i]->data.fdata = attri_tail->TextHeight;          
1258       break;
1259
1260     case  TelCharacterSpacing:
1261       k[i]->data.fdata = attri_tail->CharacterSpacing;   
1262       break;
1263
1264     case  TelCharacterExpansionFactor:
1265       k[i]->data.fdata = attri_tail->CharacterExpansionFactor;   
1266       break;
1267
1268     case TelTextZoomable:
1269       k[i]->data.ldata = attri_tail->TextZoomable;
1270       break;
1271     case TelTextAngle:
1272       k[i]->data.ldata = attri_tail->TextAngle;
1273       break;   
1274     case TelTextFontAspect:
1275       k[i]->data.ldata = attri_tail->TextFontAspect;
1276       break;    
1277       /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
1278     case TelTextAlign:
1279       *(tel_align_data)(k[i]->data.pdata) = attri_tail->TextAlign;
1280       break;
1281       /*OCC7456 abd 14.12.2004 Text alingnment attributes  */
1282     case  TelPolymarkerType:
1283       k[i]->data.ldata = attri_tail->PolymarkerType;
1284       break;
1285
1286     case  TelInteriorReflectanceEquation:
1287       k[i]->data.ldata = attri_tail->InteriorReflectanceEquation;
1288       break;
1289
1290     case  TelBackInteriorReflectanceEquation:
1291       k[i]->data.ldata = attri_tail->BackInteriorReflectanceEquation;
1292       break;
1293
1294     case  TelSurfaceAreaProperties:
1295       *(tel_surf_prop)(k[i]->data.pdata) =
1296         attri_tail->SurfaceAreaProperties;
1297       break;
1298
1299     case  TelBackSurfaceAreaProperties:
1300       *(tel_surf_prop)(k[i]->data.pdata) =
1301         attri_tail->BackSurfaceAreaProperties;
1302       break;
1303
1304     case  TelFaceCullingMode:
1305       k[i]->data.ldata = attri_tail->FaceCullingMode;
1306       break;
1307
1308     case TelDepthCueIndex:
1309       k[i]->data.ldata = attri_tail->DepthCueIndex;
1310       break;
1311
1312     case  TelInteriorShadingMethod:
1313       k[i]->data.ldata = attri_tail->InteriorShadingMethod;
1314       break;
1315
1316     case  TelViewIndex:
1317       k[i]->data.ldata = attri_tail->ViewIndex;
1318       break;
1319
1320     case  TelHighlightIndex:
1321       k[i]->data.ldata = attri_tail->HighlightIndex;
1322       break;
1323
1324 #ifdef G003
1325     case TelDegenerationMode:
1326       k[ i ] -> data.ldata = attri_tail -> DegenerationMode;
1327       break;
1328 #endif  /* G003 */
1329
1330       /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
1331     case TelPolygonOffset:
1332       *(tel_poffset_param)(k[i]->data.pdata) = attri_tail->PolygonOffsetParams;
1333       break;
1334       /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
1335
1336     case  TelTransformPersistence:
1337       *(tel_transform_persistence)(k[i]->data.pdata) = attri_tail->TransPers;
1338       break;
1339       /* ABD 29/10/04  Transform Persistence of Presentation( pan, zoom, rotate ) */             
1340
1341     default:
1342       break;
1343     }
1344   }
1345
1346   return TSuccess;
1347 }
1348
1349 /*----------------------------------------------------------------------*/
1350
1351 void TelUpdateMaterial( Tint flag )  
1352 {
1353   GLenum        face=0;
1354   tel_colour    col=NULL;
1355   tel_surf_prop prop=NULL;
1356   Tint rm=CALL_PHIGS_REFL_NONE;
1357   static float  mAmb[4];
1358   static float  mDiff[4];
1359   static float  mSpec[4];
1360   static float  mEmsv[4];
1361   static float  mShin;
1362   static float  r, g, b;
1363   static int    physic;
1364   CMN_KEY_DATA key;
1365   Tfloat *rgb;
1366   Tfloat newDiff3;
1367
1368   if (attri_stk.IsEmpty())
1369     return;
1370
1371   tsm_attri_blk attri_tail = attri_stk.ChangeTop();
1372
1373   /* Hors Hiddenline */
1374   if (attri_tail->InteriorStyle != TSM_HIDDENLINE)
1375   {
1376     if( flag == TEL_FRONT_MATERIAL ) {
1377       col  = &attri_tail->InteriorColour;
1378       rm   = attri_tail->InteriorReflectanceEquation;
1379       prop = &attri_tail->SurfaceAreaProperties;
1380       face = GL_FRONT_AND_BACK;       
1381     }
1382     if( flag == TEL_BACK_MATERIAL ) {
1383       col  = &attri_tail->BackInteriorColour;
1384       rm   = attri_tail->BackInteriorReflectanceEquation;
1385       prop = &attri_tail->BackSurfaceAreaProperties;
1386       face = GL_BACK;        
1387     }
1388   }
1389   /* Cas HiddenLine */
1390   else
1391   {
1392 #ifdef TRACE_UPMATERIAL
1393     printf("OpenGl_attri::TelUpdateMaterial HiddenLine\n");
1394 #endif
1395     TsmGetWSAttri (TglActiveWs, WSBackground, &key);
1396     rgb = (Tfloat*)key.pdata;
1397
1398     attri_tail->InteriorColour.rgb[0]=rgb[0];
1399     attri_tail->InteriorColour.rgb[1]=rgb[1];
1400     attri_tail->InteriorColour.rgb[2]=rgb[2];
1401     attri_tail->InteriorReflectanceEquation = CALL_PHIGS_REFL_NONE;
1402     attri_tail->BackInteriorReflectanceEquation = CALL_PHIGS_REFL_NONE;        
1403     return;  
1404   }
1405
1406   /* Type material */   
1407   physic = prop->isphysic;
1408
1409 #ifdef TRACE_UPMATERIAL
1410   if( flag == TEL_FRONT_MATERIAL ) printf("OpenGl_attri::TelUpdateMaterial TEL_FRONT_MATERIAL\n");
1411   else printf("OpenGl_attri::TelUpdateMaterial TEL_BACK_MATERIAL\n");
1412 #endif
1413 #ifdef TRACE_MATERIAL
1414   printf("    InteriorReflectanceEquation: %d\n", attri_tail->InteriorReflectanceEquation);
1415   printf(" controle mode rm == CALL_PHIGS_REFL_NONE : %d\n",  rm == CALL_PHIGS_REFL_NONE);
1416 #endif
1417
1418   if( rm == CALL_PHIGS_REFL_NONE ) return;
1419
1420   /* 
1421   * Gestion de la transparence 
1422   */
1423
1424   if (!SecondPassDo) {
1425     /* Passage en transparence */
1426     if (need_trans && prop->trans != 1.0F) {
1427       glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
1428       glEnable (GL_BLEND);
1429       glDepthMask (GL_FALSE);
1430     }
1431
1432     /* Passage en opaque */
1433 #ifdef BUC60577
1434     else 
1435 #else 
1436     if (need_trans && prop->trans == 1.0F)
1437 #endif
1438     {
1439       if( attri_tail->AntiAliasing == TOff )
1440       {
1441         glBlendFunc (GL_ONE, GL_ZERO);
1442         glDisable (GL_BLEND);
1443       }
1444       glDepthMask (GL_TRUE);
1445     }       
1446   }
1447
1448   /* 
1449   * Reset Material
1450   */
1451   if( need_reset ) 
1452   {   
1453     /* Composant ambient */
1454     if( rm & AMBIENT_MASK )
1455     {
1456       /* Type materiau */
1457       if( physic )
1458       {r=prop->ambcol.rgb[0];g=prop->ambcol.rgb[1];b=prop->ambcol.rgb[2];}
1459       else
1460       {r=col->rgb[0];g=col->rgb[1];b=col->rgb[2];}
1461
1462       mAmb[0] = prop->amb * r;
1463       mAmb[1] = prop->amb * g;
1464       mAmb[2] = prop->amb * b;
1465       mAmb[3] = 1.0F;
1466     }
1467     else
1468     {
1469       mAmb[0] = 0.0;
1470       mAmb[1] = 0.0;
1471       mAmb[2] = 0.0;
1472       mAmb[3] = 1.0F;
1473     }
1474
1475     /* Composant diffus */
1476     if( rm & DIFFUSE_MASK )
1477     {
1478       /* Type materiau */
1479       if( physic )
1480       {r=prop->difcol.rgb[0];g=prop->difcol.rgb[1];b=prop->difcol.rgb[2];}
1481       else
1482       {r=col->rgb[0];g=col->rgb[1];b=col->rgb[2];}
1483
1484       mDiff[0] = prop->diff * r;
1485       mDiff[1] = prop->diff * g;
1486       mDiff[2] = prop->diff * b;
1487       mDiff[3] = 1.0F;
1488     }
1489     else
1490     {
1491       mDiff[0] = 0.0;
1492       mDiff[1] = 0.0;
1493       mDiff[2] = 0.0;
1494       mDiff[3] = 1.0F;
1495     }
1496
1497     if (SecondPassDo)
1498     {
1499       mDiff[3] = prop->env_reflexion; 
1500     }
1501     else
1502     {
1503       if (need_trans) mDiff[3] = prop->trans;
1504       /* si le materiau reflechi la scene environnante,
1505       alors il faudra faire une seconde passe */
1506       if (prop->env_reflexion != 0.0) SecondPassNeeded = 1;
1507     }
1508
1509     /* Composant speculaire */
1510     if( rm & SPECULAR_MASK )
1511     {
1512       if( physic )
1513       {r=prop->speccol.rgb[0];g=prop->speccol.rgb[1];b=prop->speccol.rgb[2];}
1514       else
1515       {r=1.0;g=1.0;b=1.0;} /* cas des generiques */
1516
1517       mSpec[0] = prop->spec * r;
1518       mSpec[1] = prop->spec * g;
1519       mSpec[2] = prop->spec * b;
1520       mSpec[3] = 1.0F;
1521     } 
1522     else {
1523       mSpec[0] = 0.0F;
1524       mSpec[1] = 0.0F;
1525       mSpec[2] = 0.0F;
1526       mSpec[3] = 1.0F;
1527     }
1528
1529
1530     /* Composant emission */        
1531     if( rm & EMISSIVE_MASK )
1532     {         
1533       if( physic )
1534       {r=prop->emscol.rgb[0];g=prop->emscol.rgb[1];b=prop->emscol.rgb[2];}
1535       else
1536       {r=col->rgb[0];g=col->rgb[1];b=col->rgb[2];}
1537
1538       mEmsv[0] = prop->emsv * r;
1539       mEmsv[1] = prop->emsv * g;
1540       mEmsv[2] = prop->emsv * b;
1541       mEmsv[3] = 1.0F;
1542     }
1543     else {
1544       mEmsv[0] = 0.0F;
1545       mEmsv[1] = 0.0F;
1546       mEmsv[2] = 0.0F;
1547       mEmsv[3] = 1.0F;
1548     }
1549
1550     /* Coeficient de brillance */
1551     mShin = prop -> shine;
1552
1553     glMaterialfv(face, GL_AMBIENT, mAmb );
1554     glMaterialfv(face, GL_DIFFUSE, mDiff );
1555     glMaterialfv(face, GL_SPECULAR, mSpec);
1556     glMaterialfv(face, GL_EMISSION,  mEmsv);
1557     glMaterialf(face, GL_SHININESS, mShin);
1558
1559 #ifdef TRACE_MATERIAL
1560     printf(" Material Properties are need_reset:\n") ;
1561     printf("    Ambient color   is (%f, %f, %f)\n", mAmb[0], mAmb[1], mAmb[2]);
1562     printf("    Diffuse color   is (%f, %f, %f, %f)\n", mDiff[0], mDiff[1], mDiff[2], mDiff[3]);
1563     printf("    Specular color  is (%f, %f, %f)\n", mSpec[0], mSpec[1], mSpec[2]);
1564     printf("    Emission color  is (%f, %f, %f)\n", mEmsv[0], mEmsv[1], mEmsv[2]);
1565     printf("    Shininess: %f Transparency: %f EnvReflexion: %f \n", mShin, prop->trans, prop->env_reflexion);
1566     printf("    Prop Specular %f Prop Emissive %f \n", prop->spec, prop->emsv);
1567     printf("    materiel de type physic : %d\n",  prop->isphysic);
1568 #endif
1569
1570     need_reset = 0; 
1571   } 
1572
1573   /* 
1574   * Set Material Optimize
1575   */
1576
1577   else 
1578   {
1579     physic = prop->isphysic;
1580     /* Composant ambient */
1581     if( rm & AMBIENT_MASK )
1582     {
1583       /* Type materiau */
1584       if( physic )
1585       {r=prop->ambcol.rgb[0];g=prop->ambcol.rgb[1];b=prop->ambcol.rgb[2];}
1586       else
1587       {r=col->rgb[0];g=col->rgb[1];b=col->rgb[2];}
1588
1589       if (mAmb[0] != prop->amb * r ||
1590         mAmb[1] != prop->amb * g ||
1591         mAmb[2] != prop->amb * b )
1592       {
1593         mAmb[0] = prop->amb * r;
1594         mAmb[1] = prop->amb * g;
1595         mAmb[2] = prop->amb * b;
1596         mAmb[3] = 1.0F;
1597
1598         glMaterialfv(face, GL_AMBIENT, mAmb );
1599 #ifdef TRACE_MATERIAL
1600         printf("    Ambient color   is (%f, %f, %f)\n", mAmb[0], mAmb[1], mAmb[2]);
1601 #endif
1602       }
1603     }
1604     else
1605     {
1606       if (  mAmb[0] != 0.0 || mAmb[1] != 0.0 || mAmb[2] != 0.0 )
1607       {
1608         mAmb[0] = 0.0F;
1609         mAmb[1] = 0.0F;
1610         mAmb[2] = 0.0F;
1611         mAmb[3] = 1.0F;
1612
1613         glMaterialfv(face, GL_AMBIENT, mAmb);
1614 #ifdef TRACE_MATERIAL
1615         printf("    Ambient color  is (%f, %f, %f)\n", mAmb[0], mAmb[1], mAmb[2]);
1616 #endif
1617       }
1618     }
1619
1620     /* Composant diffus */
1621     if( rm & DIFFUSE_MASK )
1622     {
1623       /* Type materiau */
1624       if( physic )
1625       {r=prop->difcol.rgb[0];g=prop->difcol.rgb[1];b=prop->difcol.rgb[2];}
1626       else
1627       {r=col->rgb[0];g=col->rgb[1];b=col->rgb[2];}
1628
1629       if (mDiff[0] != prop->diff * r ||
1630           mDiff[1] != prop->diff * g ||
1631           mDiff[2] != prop->diff * b ||
1632 #ifdef BUC60577
1633           mDiff[3] != (SecondPassDo ? prop->env_reflexion :
1634       (need_trans ? prop->trans : 1.0F)) )
1635 #else
1636         mDiff[3] != (SecondPassDo ? prop->env_reflexion : 1.0F) )
1637 #endif
1638       {
1639         mDiff[0] = prop->diff * r;
1640         mDiff[1] = prop->diff * g;
1641         mDiff[2] = prop->diff * b;
1642         mDiff[3] = 1.0F;
1643
1644         if (SecondPassDo)
1645         {
1646           mDiff[3] = prop->env_reflexion; 
1647         }
1648         else
1649         {
1650           if (need_trans) mDiff[3] = prop->trans;
1651           /* si le materiau reflechi la scene environnante,
1652           alors il faudra faire une seconde passe */
1653           if (prop->env_reflexion != 0.0) SecondPassNeeded = 1;
1654         }
1655
1656         glMaterialfv(face, GL_DIFFUSE, mDiff );
1657 #ifdef TRACE_MATERIAL
1658         printf("    Diffuse color   is (%f, %f, %f, %f)\n", mDiff[0], mDiff[1], mDiff[2], mDiff[3]);
1659 #endif
1660       }
1661     }
1662     else
1663     {
1664       newDiff3 = 1.0F;
1665       if (SecondPassDo)
1666       {
1667         newDiff3 = prop->env_reflexion; 
1668       }
1669       else
1670       {
1671         if (need_trans) newDiff3 = prop->trans;
1672         /* si le materiau reflechi la scene environnante,
1673         alors il faudra faire une seconde passe */
1674         if (prop->env_reflexion != 0.0) SecondPassNeeded = 1;
1675       }
1676
1677       /* OCC19915: Even if diffuse reflectance is disabled,
1678       still trying to update the current transparency if it
1679       differs from the previous value  */
1680       if (  mDiff[0] != 0.0 || mDiff[1] != 0.0 || mDiff[2] != 0.0 
1681         || fabs(mDiff[3] - newDiff3) > 0.01 )
1682       {
1683         mDiff[0] = 0.0F;
1684         mDiff[1] = 0.0F;
1685         mDiff[2] = 0.0F;
1686         mDiff[3] = newDiff3;
1687
1688         glMaterialfv(face, GL_DIFFUSE, mDiff);
1689 #ifdef TRACE_MATERIAL
1690         printf("    Diffuse color  is (%f, %f, %f, %f)\n", mDiff[0], mDiff[1], mDiff[2], mDiff[3]);
1691 #endif
1692       }
1693     }
1694
1695     /* composant speculaire */
1696     if( rm & SPECULAR_MASK )
1697     {   
1698       /* Type materiau */
1699       if( physic )
1700       {r=prop->speccol.rgb[0];g=prop->speccol.rgb[1];b=prop->speccol.rgb[2];}
1701       else
1702       {r=1.0;g=1.0;b=1.0;} /* cas des generiques */          
1703
1704       if (mSpec[0] != prop->spec * r ||
1705         mSpec[1] != prop->spec * g ||
1706         mSpec[2] != prop->spec * b)
1707       {
1708         mSpec[0] = prop->spec * r;
1709         mSpec[1] = prop->spec * g;
1710         mSpec[2] = prop->spec * b;
1711         mSpec[3] = 1.0F;
1712         glMaterialfv(face, GL_SPECULAR, mSpec);
1713
1714 #ifdef TRACE_MATERIAL
1715         printf("    Specular color  is (%f, %f, %f)\n", mSpec[0], mSpec[1], mSpec[2]);
1716 #endif
1717       }
1718     }
1719     else
1720     {
1721       if (  mSpec[0] != 0.0 || mSpec[1] != 0.0 || mSpec[2] != 0.0 )
1722       {
1723         mSpec[0] = 0.0F;
1724         mSpec[1] = 0.0F;
1725         mSpec[2] = 0.0F;
1726         mSpec[3] = 1.0F;
1727
1728         glMaterialfv(face, GL_SPECULAR, mSpec);
1729 #ifdef TRACE_MATERIAL
1730         printf("    Specular color  is (%f, %f, %f)\n", mSpec[0], mSpec[1], mSpec[2]);
1731 #endif
1732       }
1733     }
1734
1735     /* Composant emission */        
1736     if( rm & EMISSIVE_MASK )
1737     {
1738       /* type materiau */
1739       if( physic )
1740       {r=prop->emscol.rgb[0];g=prop->emscol.rgb[1];b=prop->emscol.rgb[2];}
1741       else
1742       {r=col->rgb[0];g=col->rgb[1];b=col->rgb[2];}
1743
1744       if ( mEmsv[0] != prop->emsv * r ||
1745         mEmsv[1] != prop->emsv * g ||
1746         mEmsv[2] != prop->emsv * b )
1747       {
1748         mEmsv[0] = prop->emsv * r;
1749         mEmsv[1] = prop->emsv * g;
1750         mEmsv[2] = prop->emsv * b;
1751         mEmsv[3] = 1.0F;
1752         glMaterialfv(face, GL_EMISSION, mEmsv);
1753 #ifdef TRACE_MATERIAL
1754         printf("    Emissive color  is (%f, %f, %f)\n", mEmsv[0], mEmsv[1], mEmsv[2]);
1755 #endif
1756       }
1757     }
1758     else 
1759     { 
1760       if (  mEmsv[0] != 0.0 || mEmsv[1] != 0.0 || mEmsv[2] != 0.0 )
1761       {
1762         mEmsv[0] = 0.0F;
1763         mEmsv[1] = 0.0F;
1764         mEmsv[2] = 0.0F;
1765         mEmsv[3] = 1.0F;
1766
1767         glMaterialfv(face, GL_EMISSION, mEmsv);
1768 #ifdef TRACE_MATERIAL
1769         printf("    Emissive surface  is (%f, %f, %f)\n", mEmsv[0], mEmsv[1], mEmsv[2]);
1770 #endif
1771       }
1772     }           
1773
1774     /* coef de brillance */ 
1775     if( mShin != prop->shine )
1776     {
1777       mShin = prop->shine;
1778       glMaterialf(face, GL_SHININESS, mShin);
1779 #ifdef TRACE_MATERIAL
1780       printf("    Shininess factor is %f\n", mShin);
1781 #endif
1782     }
1783   } /* need_reset */
1784 }
1785
1786 /*----------------------------------------------------------------------*/
1787 void TelResetMaterial()  /* force material definition, called by TelClearViews */
1788 {
1789   need_reset = 1;
1790 }
1791
1792 /*----------------------------------------------------------------------*/
1793 void TelSetTransparency( Tint tag )
1794 /* force transparency managment, called by redraw_all_structs */
1795 {
1796   need_trans = tag;
1797 }
1798
1799 /*----------------------------------------------------------------------*/
1800
1801 static  void
1802 TelUpdateFog( Tint ws, Tint vid, Tint dcid )
1803 {
1804   TEL_GL_DEPTHCUE  dcrep;
1805   float  params[5];
1806
1807   if( TelGetGLDepthCue( ws, vid, dcid, &dcrep ) == TSuccess )
1808   {
1809     if( dcrep.dcrep.mode == TelDCAllowed )
1810     {
1811       params[0] = dcrep.dcrep.col.rgb[0],
1812       params[1] = dcrep.dcrep.col.rgb[1],
1813       params[2] = dcrep.dcrep.col.rgb[2];
1814       params[3] = 1.0F;
1815       glFogi(GL_FOG_MODE, GL_LINEAR);
1816       glFogf(GL_FOG_START, dcrep.dist[0]);
1817       glFogf(GL_FOG_END, dcrep.dist[1]);
1818       glFogfv(GL_FOG_COLOR, params);
1819       glEnable(GL_FOG);
1820 #ifdef TRACE
1821       printf(" *** TelUpdateFog START %f END %f\n",dcrep.dist[0],dcrep.dist[1]);
1822 #endif
1823       return;
1824     }
1825   }
1826   glDisable(GL_FOG);
1827   return;
1828 }
1829
1830 /*----------------------------------------------------------------------*/
1831
1832 static  void TelSetViewMatrix( Tmatrix3 mat, Tint vid )
1833 {
1834   TEL_VIEW_REP  vrep;
1835   Tmatrix3      rmat;
1836   float         mat16[16];
1837 #ifdef TRACE_MATRIX
1838   int           i, j;
1839   GLfloat       pmat[4][4];
1840 #endif
1841
1842   if( TelGetViewRepresentation( TglActiveWs, vid, &vrep ) == TSuccess )
1843   {
1844 #ifdef TRACE_MATRIX
1845     printf ("LocalTran3 :\n");
1846     for (i = 0; i < 4; i++) {
1847       printf ("\t");
1848       for (j = 0; j < 4; j++)
1849         printf ("%f ", mat[i][j]);
1850       printf ("\n");
1851     }
1852 #endif
1853     if ((!animationUseFlag) || (animationUseFlag && !animationFlag)) 
1854     {
1855 #ifdef TRACE_MATRIX
1856       printf ("vrep.orientation_matrix :\n");
1857       for (i = 0; i < 4; i++) {
1858         printf ("\t");
1859         for (j = 0; j < 4; j++)
1860           printf ("%f ", vrep.orientation_matrix[i][j]);
1861         printf ("\n");
1862       }
1863 #endif
1864       TelMultiplymat3( rmat, mat, vrep.orientation_matrix );
1865 #ifdef TRACE_MATRIX
1866       printf("OpenGl_attri.c::TelSetViewMatrix::glLoadMatrixf \n"); 
1867 #endif
1868       glMatrixMode(GL_MODELVIEW);
1869       glLoadMatrixf((GLfloat *) rmat);
1870 #ifdef TRACE_MATRIX
1871       printf ("GL_MODELVIEW_MATRIX set :\n");
1872       for (i = 0; i < 4; i++) {
1873         printf ("\t");
1874         for (j = 0; j < 4; j++)
1875           printf ("%f ", rmat[i][j]);
1876         printf ("\n");
1877       }
1878 #endif
1879     }
1880     else /* animationUseFlag */
1881     {
1882       call_util_transpose_mat (mat16, mat); 
1883       glMatrixMode (GL_MODELVIEW);
1884 #ifdef TRACE_MATRIX
1885       glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) pmat );
1886       printf ("GL_MODELVIEW_MATRIX :\n");
1887       for (i = 0; i < 4; i++) {
1888         printf ("\t");
1889         for (j = 0; j < 4; j++)
1890           printf ("%f ", pmat[i][j]);
1891         printf ("\n");
1892       }
1893 #endif
1894 #ifdef TRACE_MATRIX
1895       printf("OpenGl_attri.c::TelSetViewMatrix::glMultMatrixf \n"); 
1896 #endif
1897       glMultMatrixf ((GLfloat *)mat);
1898 #ifdef TRACE_MATRIX
1899       glGetFloatv( GL_MODELVIEW_MATRIX,(GLfloat *) pmat );
1900       printf ("GL_MODELVIEW_MATRIX set :\n");
1901       for (i = 0; i < 4; i++) {
1902         printf ("\t");
1903         for (j = 0; j < 4; j++)
1904           printf ("%f ", pmat[i][j]);
1905         printf ("\n");
1906       }
1907 #endif
1908     }
1909   }
1910   return;
1911 }
1912
1913 /*----------------------------------------------------------------------*/
1914
1915 TStatus
1916 TsmPushAttriLight( void )
1917 {
1918   tsm_attri_blk  node;
1919
1920   node = new TSM_ATTRI_BLK(); 
1921
1922   if( !attri_stk.IsEmpty() )
1923     *node = *attri_stk.Top();
1924   else
1925     *node = attri_default;
1926
1927   attri_stk.Push( node );
1928   return TSuccess;
1929 }
1930
1931 /*----------------------------------------------------------------------*/
1932
1933 TStatus
1934 TsmPopAttriLight( void )
1935 {
1936   tsm_attri_blk  node;
1937
1938   if ( attri_stk.IsEmpty() )
1939     return TFailure; /* Underflow */
1940
1941   node = attri_stk.ChangeTop();
1942   attri_stk.Pop();
1943   delete node;
1944
1945   return TSuccess;
1946 }
1947
1948 /*----------------------------------------------------------------------*/
1949
1950 static void call_util_transpose_mat (float tmat[16], float mat[4][4]) {
1951   int i, j;
1952
1953   for (i=0; i<4; i++)
1954     for (j=0; j<4; j++)
1955       tmat[j*4+i] = mat[i][j];
1956
1957 #ifdef TRACE
1958   printf ("Transposee :\n");
1959   for (i = 0; i < 4; i++) {
1960     printf ("\t");
1961     for (j = 0; j < 4; j++)
1962       printf ("%f ", tmat[i*4+j]);
1963     printf ("\n");
1964   }
1965 #endif
1966 }
1967 /*----------------------------------------------------------------------*/
1968
1969 /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */
1970 static void TelUpdatePolygonOffsets( tel_poffset_param pdata )
1971 {
1972 #ifdef TRACE
1973   printf(" *** TelUpdatePolygonOffsets: mode = %x, factor = %f, units = %f", 
1974     pdata->mode, pdata->factor, pdata->units );
1975 #endif
1976   if ( ( pdata->mode & Aspect_POM_Fill ) == Aspect_POM_Fill )
1977     glEnable ( GL_POLYGON_OFFSET_FILL );
1978   else 
1979     glDisable ( GL_POLYGON_OFFSET_FILL );
1980
1981   if ( ( pdata->mode & Aspect_POM_Line ) == Aspect_POM_Line )
1982     glEnable ( GL_POLYGON_OFFSET_LINE );
1983   else
1984     glDisable( GL_POLYGON_OFFSET_LINE );
1985
1986   if ( ( pdata->mode & Aspect_POM_Point ) == Aspect_POM_Point )
1987     glEnable ( GL_POLYGON_OFFSET_POINT );
1988   else
1989     glDisable( GL_POLYGON_OFFSET_POINT );
1990
1991   glPolygonOffset( pdata->factor, pdata->units );
1992 }
1993 /* OCC4895 SAN 22/03/04 High-level interface for controlling polygon offsets */