1 /***********************************************************************
5 File OpenGl_execstruct :
12 HISTORIQUE DES MODIFICATIONS :
13 --------------------------------
14 xx-xx-xx : xxx ; Creation.
15 11-03-96 : FMN ; Correction warning compilation
16 01-04-96 : CAL ; Integration MINSK portage WNT
17 22-04-96 : FMN ; Suppression prototype inutile.
18 30-06-97 : FMN ; Appel de la toolkit OpenGl_LightBox.
19 18-07-97 : FMN ; Meilleure gestion de la desactivation des lights
20 10-09-97 : FMN ; Meilleure gestion de la desactivation des lights
21 05-08-97 : PCT ; ajout descativation texture sur line etc...
22 19-08-97 : PCT ; ajout pourcentage de reflexion des objets avec textues environnante
23 22-12-97 : FMN ; Correction PRO10217 sur le mode Transient
24 13-03-98 : FMN ; Suppression variable externe TglUpdateView0
25 17-03-98 : FMN ; Ajout mode animation
26 - deplacement TelSetViewIndex vers OpenGl_execstruct.c.
27 - gestion du mode animation.
28 16-06-2000 : ATS,GG : G005 : Some conditions for execution of PARRAY primitives
30 ************************************************************************/
36 #define G003 /* EUG 16-09-99 G003 ZBufferAuto treatment
39 #define BUC60742 /* GG 18/09/00 Enable to use both animation and
40 graphic structure transformation
43 #define G005 /* ATS,GG 11/01/00 Using arrays of primitives
46 #define IMP051001 /* GG Enable/Disable polygon offset for
47 highlighted graphic structures
50 /*----------------------------------------------------------------------*/
55 #include <OpenGl_tgl_all.hxx>
57 #include <OpenGl_tgl_subrvis.hxx>
63 #include <OpenGl_cmn_varargs.hxx>
64 #include <OpenGl_telem_attri.hxx>
65 #include <OpenGl_telem_filters.hxx>
66 #include <OpenGl_tsm.hxx>
67 #include <OpenGl_telem.hxx>
68 #include <OpenGl_LightBox.hxx>
69 #include <OpenGl_TextureBox.hxx>
70 #include <OpenGl_telem_view.hxx>
71 #include <OpenGl_telem_pick.hxx>
72 #include <OpenGl_telem_inquire.hxx>
73 #include <OpenGl_telem_util.hxx> /* for matcpy */
75 #include <OpenGl_tsm_ws.hxx>
76 #include <OpenGl_cmn_varargs.hxx>
77 #include <OpenGl_TextureBox.hxx>
79 #include <OpenGl_trsf_stack.hxx>
82 # include <OpenGl_degeneration.hxx>
85 #include <InterfaceGraphic_PrimitiveArray.hxx>
88 /*----------------------------------------------------------------------*/
93 extern tsm_trsf_stack cur_trsf_stack;
95 #define D_MODE( d ) ( int )( ( ( PDEGENERATION )( d.data.pdata ) ) -> mode )
96 #define S_RATIO( d ) ( float )( ( ( PDEGENERATION )( d.data.pdata ) ) -> skipRatio )
97 extern GLboolean g_fAnimation;
98 extern GLboolean g_fDegeneration;
99 int g_nDegenerateModel;
103 /*----------------------------------------------------------------------*/
108 static TEL_PACKED_NAME pn;
110 #define PUSHNAME( a ) pn.i = a, glPushName( pn.s[0] ), glPushName( pn.s[1] )
111 #define LOADNAME( a ) pn.i = a, glPopName(), glLoadName( pn.s[0] ), \
112 glPushName( pn.s[1] )
113 #define POPNAME() glPopName(), glPopName()
115 #define NO_TRACE_LIGHT
116 #define NO_TRACE_EXEC
118 /*----------------------------------------------------------------------*/
120 * Prototypes fonctions
123 static TStatus ExecuteStructurePick( TSM_ELEM_DATA, Tint, cmn_key* );
124 static TStatus ExecuteStructureDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
125 static TStatus ExecuteStructureAdd( TSM_ELEM_DATA, Tint, cmn_key* );
126 static TStatus ExecuteStructurePrint( TSM_ELEM_DATA, Tint, cmn_key* );
127 static TStatus ExecuteStructureInquire( TSM_ELEM_DATA, Tint, cmn_key* );
129 /*----------------------------------------------------------------------*/
134 static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) =
136 ExecuteStructurePick,
137 ExecuteStructureDisplay,
139 0, /* Delete : may be provided for deleting structure
141 ExecuteStructurePrint,
142 ExecuteStructureInquire
145 /*----------------------------------------------------------------------*/
148 TelExecuteStructureInitClass( TelType *el )
150 *el = TelExecuteStructure;
154 /*----------------------------------------------------------------------*/
157 ExecuteStructureAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
159 ((tsm_elem_data)(d.pdata))->ldata = k[0]->data.ldata;
164 /*----------------------------------------------------------------------*/
167 ExecuteStructurePick( TSM_ELEM_DATA data, Tint n, cmn_key *k )
171 register Tint display = 1;
172 register Tint pickfl = 0;
173 register TelType elem;
178 if( TsmGetStructure( data.ldata, &num, &node ) == TFailure )
184 PUSHNAME( data.ldata ); /* Struct id */
185 PUSHNAME( -1 ); /* Pick id; dummy */
186 PUSHNAME( -1 ); /* Elem no.; dummy */
188 TsmPushAttri(); /* save previous graphics context */
190 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
192 if( TglFilterNameset( k[0]->id, PickFilter ) == TSuccess )
194 key.id = TelViewIndex;
195 TsmGetAttri( 1, &key );
197 if( TglVpBeingPicked == vp )
199 for( i = 0; i < num; i++, node = node->next )
201 elem = node->elem.el;
205 case TelRemoveNameset:
207 TsmSendMessage( elem, PickTraverse, node->elem.data, 0 );
208 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
212 if( TglFilterNameset( k[0]->id, PickFilter ) == TSuccess )
218 case TelExecuteStructure:
220 LOADNAME( i+1 ); /* Elem no. */
221 TsmSendMessage( elem, PickTraverse, node->elem.data, -1, k );
226 POPNAME(); /* Elem no. */
227 LOADNAME( node->elem.data.ldata ); /* Pick id */
228 PUSHNAME( -1 ); /* Elem no.; dummy */
233 vp = node->elem.data.ldata;
234 if( vp == TglVpBeingPicked )
244 TsmSendMessage( elem, PickTraverse, node->elem.data, 1, &key );
250 case TelPolygonHoles:
251 case TelPolygonIndices:
257 case TelTriangleMesh:
260 /* do not send Pick message to */
261 { /* primitives if they are not pickable */
262 if( pickfl && view && display )
264 key.id = TOff; /* dummy key for highlight flag */
265 LOADNAME( i+1 ); /* Elem no. */
266 TsmSendMessage( elem, PickTraverse, node->elem.data, 1, &key );
274 TsmSendMessage( elem, PickTraverse, node->elem.data, 0 );
280 TsmPopAttri(); /* restore previous graphics context */
282 POPNAME(); /* Elem no. */
283 POPNAME(); /* Pick id */
284 POPNAME(); /* Struct id */
289 /*----------------------------------------------------------------------*/
292 ExecuteStructureDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
296 register Tint display = 1;
297 register Tint highl = TOff;
298 register TelType elem;
302 static GLboolean s_fWire = GL_FALSE;
303 static Tint s_depth = 0;
304 static Tint save_texture_state = 0;
305 static CMN_KEY s_kLineWidth;
306 static CMN_KEY s_kPolyType;
307 TStatus retVal = TSuccess;
309 int save_texture_state;
312 if( TsmGetStructure( data.ldata, &num, &node ) == TFailure )
314 { retVal = TFailure; goto ret; }
329 printf(" .. ExecuteStructureDisplay.s_depth = %d\n",s_depth);
333 TsmPushAttri(); /* save previous graphics context */
335 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
337 if( TglFilterNameset( k[0]->id, HighlFilter ) == TSuccess )
339 key.id = TelViewIndex;
340 TsmGetAttri( 1, &key );
342 if ( s_depth == 1 ) {
343 glPushAttrib ( GL_DEPTH_BUFFER_BIT );
344 s_kLineWidth.id = TelPolylineWidth;
345 s_kPolyType.id = TelPolylineType;
347 TsmGetAttri ( 1, &s_kLineWidth, &s_kPolyType );
349 TsmGetAttri ( 2, &s_kLineWidth, &s_kPolyType );
351 g_nDegenerateModel = 0;
357 for( i = 0; i < num; i++, node = node->next )
359 elem = node->elem.el;
361 #include <OpenGl_traces.hxx>
366 case TelDegenerationMode:
368 if ( g_fDegeneration )
370 switch ( g_nDegenerateModel = D_MODE( node->elem ) )
380 glDisable ( GL_LINE_STIPPLE );
384 g_fSkipRatio = S_RATIO( node->elem );
391 case TelRemoveNameset:
393 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 0 );
394 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
398 if( TglFilterNameset( k[0]->id, HighlFilter ) == TSuccess )
404 case TelExecuteStructure:
406 tsm_trsf_stack new_trsf_stack = NULL;
408 new_trsf_stack = (tsm_trsf_stack) malloc (sizeof (TSM_TRSF_STACK));
409 cur_trsf_stack->next = new_trsf_stack;
410 new_trsf_stack->prev = cur_trsf_stack;
411 new_trsf_stack->next = NULL;
412 matcpy(new_trsf_stack->LocalTran3, cur_trsf_stack->LocalTran3);
413 cur_trsf_stack = new_trsf_stack;
416 printf(" .. ExecuteStructureDisplay.TelExecuteStructure.s_depth = %d\n",s_depth);
419 glMatrixMode (GL_MODELVIEW);
422 TsmSendMessage( elem, DisplayTraverse, node->elem.data, -1, k );
424 glMatrixMode (GL_MODELVIEW);
427 cur_trsf_stack = new_trsf_stack->prev;
428 cur_trsf_stack->next = NULL;
429 free (new_trsf_stack);
441 { /* primitives if they are invisible */
446 if ( g_fAnimation && !s_fWire && g_nDegenerateModel ) {
447 glDisable ( GL_DEPTH_TEST );
449 save_texture_state = IsTextureEnabled();
450 if( save_texture_state ) DisableTexture();
457 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
458 if (save_texture_state) EnableTexture();
465 case TelPolygonIndices:
467 case TelTriangleMesh:
468 case TelPolygonHoles: /* do not send Display message to */
469 { /* primitives if they are invisible */
473 if ( g_fAnimation && s_fWire && g_nDegenerateModel < 2 ) {
474 if ( save_texture_state ) EnableTexture ();
475 glEnable ( GL_DEPTH_TEST );
481 call_subr_disable_polygon_offset();
484 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
487 call_subr_enable_polygon_offset();
495 CALL_DEF_PARRAY *pa = (CALL_DEF_PARRAY *)node->elem.data.pdata;
498 case TelPointsArrayType:
499 case TelPolylinesArrayType:
500 case TelSegmentsArrayType:
503 if ( g_fAnimation && !s_fWire && g_nDegenerateModel ) {
504 glDisable ( GL_DEPTH_TEST );
506 save_texture_state = IsTextureEnabled();
507 if( save_texture_state ) DisableTexture();
514 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
515 if (save_texture_state) EnableTexture();
517 case TelPolygonsArrayType:
518 case TelTrianglesArrayType:
519 case TelQuadranglesArrayType:
520 case TelTriangleStripsArrayType:
521 case TelTriangleFansArrayType:
522 case TelQuadrangleStripsArrayType:
524 if ( g_fAnimation && s_fWire && g_nDegenerateModel < 2 ) {
525 if ( save_texture_state ) EnableTexture ();
526 glEnable ( GL_DEPTH_TEST );
531 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
539 /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */
540 case TelTransformPersistence:
542 /*CALL_DEF_TRANSFORM_PERSISTENCE*/
543 TEL_TRANSFORM_PERSISTENCE *tp
544 = (tel_transform_persistence)node->elem.data.pdata;
546 TsmSendMessage (elem, DisplayTraverse, node->elem.data, 1, &key);
549 /*ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */
555 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
561 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 0 );
567 TsmPopAttri(); /* restore previous graphics context; before update lights */
570 if ( s_depth == 1 ) {
573 if ( g_nDegenerateModel > 1 ) {
574 glLineWidth ( s_kLineWidth.data.fdata );
575 if ( s_kPolyType.data.ldata != TEL_LS_SOLID ) glEnable ( GL_LINE_STIPPLE );
588 /*----------------------------------------------------------------------*/
591 ExecuteStructurePrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
593 fprintf( stdout, "TelExecuteStructure. Value = %d\n", data.ldata);
594 fprintf( stdout, "\n" );
599 /*----------------------------------------------------------------------*/
602 ExecuteStructureInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
606 for( i = 0; i < n; i++ )
610 case INQ_GET_SIZE_ID:
612 k[i]->data.ldata = sizeof( Tint );
615 case INQ_GET_CONTENT_ID:
620 c = (tel_inq_content)k[i]->data.pdata;
623 w->idata = data.ldata;
632 /*----------------------------------------------------------------------*/