Merging OCC22105, OCC22354, OCC22150 , OCC22199 , OCC22391 and OCC22108
[occt.git] / src / OpenGl / OpenGl_execstruct.cxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File OpenGl_execstruct :
6
7
8REMARQUES:
9----------
10
11
12HISTORIQUE DES MODIFICATIONS :
13--------------------------------
14xx-xx-xx : xxx ; Creation.
1511-03-96 : FMN ; Correction warning compilation
1601-04-96 : CAL ; Integration MINSK portage WNT
1722-04-96 : FMN ; Suppression prototype inutile.
1830-06-97 : FMN ; Appel de la toolkit OpenGl_LightBox.
1918-07-97 : FMN ; Meilleure gestion de la desactivation des lights
2010-09-97 : FMN ; Meilleure gestion de la desactivation des lights
2105-08-97 : PCT ; ajout descativation texture sur line etc...
2219-08-97 : PCT ; ajout pourcentage de reflexion des objets avec textues environnante
2322-12-97 : FMN ; Correction PRO10217 sur le mode Transient
2413-03-98 : FMN ; Suppression variable externe TglUpdateView0
2517-03-98 : FMN ; Ajout mode animation
26- deplacement TelSetViewIndex vers OpenGl_execstruct.c.
27- gestion du mode animation.
2816-06-2000 : ATS,GG : G005 : Some conditions for execution of PARRAY primitives
29
30************************************************************************/
31#ifdef DEBUG
32#define TRACE
33#define TRACE_EXEC
34#endif
35
36#define G003 /* EUG 16-09-99 G003 ZBufferAuto treatment
37*/
38
39#define BUC60742 /* GG 18/09/00 Enable to use both animation and
40graphic structure transformation
41*/
42
43#define G005 /* ATS,GG 11/01/00 Using arrays of primitives
44*/
45
46#define IMP051001 /* GG Enable/Disable polygon offset for
47highlighted graphic structures
48*/
49
50/*----------------------------------------------------------------------*/
51/*
52* Includes
53*/
54
55#include <OpenGl_tgl_all.hxx>
56
57#include <OpenGl_tgl_subrvis.hxx>
58
59#include <stddef.h>
60#include <stdio.h>
61#include <stdlib.h>
62
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 */
74
75#include <OpenGl_tsm_ws.hxx>
76#include <OpenGl_cmn_varargs.hxx>
77#include <OpenGl_TextureBox.hxx>
78
79#include <OpenGl_trsf_stack.hxx>
80
81#ifdef G003
82# include <OpenGl_degeneration.hxx>
83#endif /* G003 */
84#ifdef G005
85#include <InterfaceGraphic_PrimitiveArray.hxx>
86#endif
87
88/*----------------------------------------------------------------------*/
89/*
90* Variables externes
91*/
92
93extern tsm_trsf_stack cur_trsf_stack;
94#ifdef G003
95#define D_MODE( d ) ( int )( ( ( PDEGENERATION )( d.data.pdata ) ) -> mode )
96#define S_RATIO( d ) ( float )( ( ( PDEGENERATION )( d.data.pdata ) ) -> skipRatio )
97extern GLboolean g_fAnimation;
98extern GLboolean g_fDegeneration;
99int g_nDegenerateModel;
100float g_fSkipRatio;
101#endif /* G003 */
102
103/*----------------------------------------------------------------------*/
104/*
105* Constantes
106*/
107
108static TEL_PACKED_NAME pn;
109
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()
114
115#define NO_TRACE_LIGHT
116#define NO_TRACE_EXEC
117
118/*----------------------------------------------------------------------*/
119/*
120* Prototypes fonctions
121*/
122
123static TStatus ExecuteStructurePick( TSM_ELEM_DATA, Tint, cmn_key* );
124static TStatus ExecuteStructureDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
125static TStatus ExecuteStructureAdd( TSM_ELEM_DATA, Tint, cmn_key* );
126static TStatus ExecuteStructurePrint( TSM_ELEM_DATA, Tint, cmn_key* );
127static TStatus ExecuteStructureInquire( TSM_ELEM_DATA, Tint, cmn_key* );
128
129/*----------------------------------------------------------------------*/
130/*
131* Variables locales
132*/
133
134static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) =
135{
136 ExecuteStructurePick,
137 ExecuteStructureDisplay,
138 ExecuteStructureAdd,
139 0, /* Delete : may be provided for deleting structure
140 network */
141 ExecuteStructurePrint,
142 ExecuteStructureInquire
143};
144
145/*----------------------------------------------------------------------*/
146
147MtblPtr
148TelExecuteStructureInitClass( TelType *el )
149{
150 *el = TelExecuteStructure;
151 return MtdTbl;
152}
153
154/*----------------------------------------------------------------------*/
155
156static TStatus
157ExecuteStructureAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
158{
159 ((tsm_elem_data)(d.pdata))->ldata = k[0]->data.ldata;
160
161 return TSuccess;
162}
163
164/*----------------------------------------------------------------------*/
165
166static TStatus
167ExecuteStructurePick( TSM_ELEM_DATA data, Tint n, cmn_key *k )
168{
169 Tint i, num;
170 tsm_node node;
171 register Tint display = 1;
172 register Tint pickfl = 0;
173 register TelType elem;
174 Tint vp;
175 Tint view = 0;
176 CMN_KEY key;
177
178 if( TsmGetStructure( data.ldata, &num, &node ) == TFailure )
179 return TFailure;
180
181 if( !num )
182 return TSuccess;
183
184 PUSHNAME( data.ldata ); /* Struct id */
185 PUSHNAME( -1 ); /* Pick id; dummy */
186 PUSHNAME( -1 ); /* Elem no.; dummy */
187
188 TsmPushAttri(); /* save previous graphics context */
189 TglNamesetPush();
190 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
191 display = 0;
192 if( TglFilterNameset( k[0]->id, PickFilter ) == TSuccess )
193 pickfl = 1;
194 key.id = TelViewIndex;
195 TsmGetAttri( 1, &key );
196 vp = key.data.ldata;
197 if( TglVpBeingPicked == vp )
198 view = 1;
199 for( i = 0; i < num; i++, node = node->next )
200 {
201 elem = node->elem.el;
202 switch( elem )
203 {
204 case TelAddNameset:
205 case TelRemoveNameset:
206 {
207 TsmSendMessage( elem, PickTraverse, node->elem.data, 0 );
208 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
209 display = 0;
210 else
211 display = 1;
212 if( TglFilterNameset( k[0]->id, PickFilter ) == TSuccess )
213 pickfl = 1;
214 else
215 pickfl = 0;
216 break;
217 }
218 case TelExecuteStructure:
219 {
220 LOADNAME( i+1 ); /* Elem no. */
221 TsmSendMessage( elem, PickTraverse, node->elem.data, -1, k );
222 break;
223 }
224 case TelPickId:
225 {
226 POPNAME(); /* Elem no. */
227 LOADNAME( node->elem.data.ldata ); /* Pick id */
228 PUSHNAME( -1 ); /* Elem no.; dummy */
229 break;
230 }
231 case TelViewIndex:
232 {
233 vp = node->elem.data.ldata;
234 if( vp == TglVpBeingPicked )
235 {
236 view = 1;
237 key.id = TOn;
238 }
239 else
240 {
241 view = 0;
242 key.id = TOff;
243 }
244 TsmSendMessage( elem, PickTraverse, node->elem.data, 1, &key );
245 break;
246 }
247 case TelCurve:
248 case TelPolygon:
249 case TelPolygonSet:
250 case TelPolygonHoles:
251 case TelPolygonIndices:
252 case TelQuadrangle:
253 case TelPolyline:
254 case TelMarker:
255 case TelMarkerSet:
256 case TelText:
257 case TelTriangleMesh:
258#ifdef G005
259 case TelParray:
260 /* do not send Pick message to */
261 { /* primitives if they are not pickable */
262 if( pickfl && view && display )
263 {
264 key.id = TOff; /* dummy key for highlight flag */
265 LOADNAME( i+1 ); /* Elem no. */
266 TsmSendMessage( elem, PickTraverse, node->elem.data, 1, &key );
267 }
268 break;
269 }
270#endif
271
272 default:
273 {
274 TsmSendMessage( elem, PickTraverse, node->elem.data, 0 );
275 break;
276 }
277 }
278 }
279 TglNamesetPop();
280 TsmPopAttri(); /* restore previous graphics context */
281
282 POPNAME(); /* Elem no. */
283 POPNAME(); /* Pick id */
284 POPNAME(); /* Struct id */
285
286 return TSuccess;
287}
288
289/*----------------------------------------------------------------------*/
290
291static TStatus
292ExecuteStructureDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
293{
294 Tint i, num;
295 tsm_node node;
296 register Tint display = 1;
297 register Tint highl = TOff;
298 register TelType elem;
299 Tint vp;
300 CMN_KEY key;
301#ifdef G003
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;
308#else
309 int save_texture_state;
310#endif
311
312 if( TsmGetStructure( data.ldata, &num, &node ) == TFailure )
313#ifdef G003
314 { retVal = TFailure; goto ret; }
315#else
316 return TFailure;
317#endif
318
319 if( !num )
320#ifdef G003
321 goto ret;
322#else
323 return TSuccess;
324#endif
325
326#ifdef G003
327 ++s_depth;
328#ifdef TRACE
329 printf(" .. ExecuteStructureDisplay.s_depth = %d\n",s_depth);
330#endif
331#endif /*G003*/
332
333 TsmPushAttri(); /* save previous graphics context */
334 TglNamesetPush();
335 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
336 display = 0;
337 if( TglFilterNameset( k[0]->id, HighlFilter ) == TSuccess )
338 highl = TOn;
339 key.id = TelViewIndex;
340 TsmGetAttri( 1, &key );
341#ifdef G003
342 if ( s_depth == 1 ) {
343 glPushAttrib ( GL_DEPTH_BUFFER_BIT );
344 s_kLineWidth.id = TelPolylineWidth;
345 s_kPolyType.id = TelPolylineType;
346#ifdef BUG
347 TsmGetAttri ( 1, &s_kLineWidth, &s_kPolyType );
348#else
349 TsmGetAttri ( 2, &s_kLineWidth, &s_kPolyType );
350#endif
351 g_nDegenerateModel = 0;
352 g_fSkipRatio = 0.0F;
353 } /* end if */
354#endif /* G003 */
355
356 vp = key.data.ldata;
357 for( i = 0; i < num; i++, node = node->next )
358 {
359 elem = node->elem.el;
360#ifdef TRACE_EXEC
361#include <OpenGl_traces.hxx>
362#endif
363 switch( elem )
364 {
365#ifdef G003
366 case TelDegenerationMode:
367
368 if ( g_fDegeneration )
369
370 switch ( g_nDegenerateModel = D_MODE( node->elem ) )
371 {
372
373 case 0:
374
375 break;
376
377 default:
378
379 glLineWidth ( 1.0 );
380 glDisable ( GL_LINE_STIPPLE );
381
382 case 1:
383
384 g_fSkipRatio = S_RATIO( node->elem );
385
386 } /* end switch */
387
388 break;
389#endif /* G003 */
390 case TelAddNameset:
391 case TelRemoveNameset:
392 {
393 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 0 );
394 if( TglFilterNameset( k[0]->id, InvisFilter ) == TSuccess )
395 display = 0;
396 else
397 display = 1;
398 if( TglFilterNameset( k[0]->id, HighlFilter ) == TSuccess )
399 highl = TOn;
400 else
401 highl = TOff;
402 break;
403 }
404 case TelExecuteStructure:
405 {
406 tsm_trsf_stack new_trsf_stack = NULL;
407
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;
414
415#ifdef TRACE
416 printf(" .. ExecuteStructureDisplay.TelExecuteStructure.s_depth = %d\n",s_depth);
417#endif
418#ifdef BUC60742
419 glMatrixMode (GL_MODELVIEW);
420 glPushMatrix();
421#endif
422 TsmSendMessage( elem, DisplayTraverse, node->elem.data, -1, k );
423#ifdef BUC60742
424 glMatrixMode (GL_MODELVIEW);
425 glPopMatrix();
426#endif
427 cur_trsf_stack = new_trsf_stack->prev;
428 cur_trsf_stack->next = NULL;
429 free (new_trsf_stack);
430 break;
431 }
432 case TelViewIndex:
433 {
434 break;
435 }
436
437 case TelPolyline:
438 case TelMarker:
439 case TelMarkerSet:
440 case TelText:
441 { /* primitives if they are invisible */
442 if( display )
443 {
444 LightOff();
445#ifdef G003
446 if ( g_fAnimation && !s_fWire && g_nDegenerateModel ) {
447 glDisable ( GL_DEPTH_TEST );
448#endif /* G003 */
449 save_texture_state = IsTextureEnabled();
450 if( save_texture_state ) DisableTexture();
451#ifdef G003
452 s_fWire = GL_TRUE;
453 } /* end if */
454#endif /* G003 */
455
456 key.id = highl;
457 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
458 if (save_texture_state) EnableTexture();
459 }
460 break;
461 }
462 case TelCurve:
463 case TelPolygon:
464 case TelPolygonSet:
465 case TelPolygonIndices:
466 case TelQuadrangle:
467 case TelTriangleMesh:
468 case TelPolygonHoles: /* do not send Display message to */
469 { /* primitives if they are invisible */
470 if( display )
471 {
472#ifdef G003
473 if ( g_fAnimation && s_fWire && g_nDegenerateModel < 2 ) {
474 if ( save_texture_state ) EnableTexture ();
475 glEnable ( GL_DEPTH_TEST );
476 s_fWire = GL_FALSE;
477 } /* end if */
478#endif /* G003 */
479#ifdef IMP051001
480 if( highl )
481 call_subr_disable_polygon_offset();
482#endif
483 key.id = highl;
484 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
485#ifdef IMP051001
486 if( highl )
487 call_subr_enable_polygon_offset();
488#endif
489 }
490 break;
491 }
492#ifdef G005
493 case TelParray:
494 if( display ) {
495 CALL_DEF_PARRAY *pa = (CALL_DEF_PARRAY *)node->elem.data.pdata;
496 switch ( pa->type )
497 {
498 case TelPointsArrayType:
499 case TelPolylinesArrayType:
500 case TelSegmentsArrayType:
501 LightOff();
502#ifdef G003
503 if ( g_fAnimation && !s_fWire && g_nDegenerateModel ) {
504 glDisable ( GL_DEPTH_TEST );
505#endif /* G003 */
506 save_texture_state = IsTextureEnabled();
507 if( save_texture_state ) DisableTexture();
508#ifdef G003
509 s_fWire = GL_TRUE;
510 } /* end if */
511#endif /* G003 */
512
513 key.id = highl;
514 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
515 if (save_texture_state) EnableTexture();
516 break;
517 case TelPolygonsArrayType:
518 case TelTrianglesArrayType:
519 case TelQuadranglesArrayType:
520 case TelTriangleStripsArrayType:
521 case TelTriangleFansArrayType:
522 case TelQuadrangleStripsArrayType:
523#ifdef G003
524 if ( g_fAnimation && s_fWire && g_nDegenerateModel < 2 ) {
525 if ( save_texture_state ) EnableTexture ();
526 glEnable ( GL_DEPTH_TEST );
527 s_fWire = GL_FALSE;
528 } /* end if */
529#endif /* G003 */
530 key.id = highl;
531 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
532 break;
533 default:
534 break;
535 }
536 }
537 break;
538#endif /*G005*/
539 /* ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */
540 case TelTransformPersistence:
541 {
542 /*CALL_DEF_TRANSFORM_PERSISTENCE*/
543 TEL_TRANSFORM_PERSISTENCE *tp
544 = (tel_transform_persistence)node->elem.data.pdata;
545 if( tp->mode != 0 )
546 TsmSendMessage (elem, DisplayTraverse, node->elem.data, 1, &key);
547 break;
548 }
549 /*ABD 29/10/04 Transform Persistence of Presentation( pan, zoom, rotate ) */
550 case TelUserdraw:
551 {
552 if( display )
553 {
554 key.id = highl;
555 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 1, &key );
556 }
557 break;
558 }
559 default:
560 {
561 TsmSendMessage( elem, DisplayTraverse, node->elem.data, 0 );
562 break;
563 }
564 }
565 }
566 TglNamesetPop();
567 TsmPopAttri(); /* restore previous graphics context; before update lights */
568#ifdef G003
569ret:
570 if ( s_depth == 1 ) {
571 s_fWire = GL_FALSE;
572
573 if ( g_nDegenerateModel > 1 ) {
574 glLineWidth ( s_kLineWidth.data.fdata );
575 if ( s_kPolyType.data.ldata != TEL_LS_SOLID ) glEnable ( GL_LINE_STIPPLE );
576 } /* end if */
577
578 glPopAttrib ();
579 } /* end if */
580
581 --s_depth;
582 return retVal;
583#else
584 return TSuccess;
585#endif
586}
587
588/*----------------------------------------------------------------------*/
589
590static TStatus
591ExecuteStructurePrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
592{
593 fprintf( stdout, "TelExecuteStructure. Value = %d\n", data.ldata);
594 fprintf( stdout, "\n" );
595
596 return TSuccess;
597}
598
599/*----------------------------------------------------------------------*/
600
601static TStatus
602ExecuteStructureInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
603{
604 Tint i;
605
606 for( i = 0; i < n; i++ )
607 {
608 switch( k[i]->id )
609 {
610 case INQ_GET_SIZE_ID:
611 {
612 k[i]->data.ldata = sizeof( Tint );
613 break;
614 }
615 case INQ_GET_CONTENT_ID:
616 {
617 TEL_INQ_CONTENT *c;
618 Teldata *w;
619
620 c = (tel_inq_content)k[i]->data.pdata;
621 w = c->data;
622 c->act_size = 0;
623 w->idata = data.ldata;
624 break;
625 }
626 }
627 }
628
629 return TSuccess;
630}
631
632/*----------------------------------------------------------------------*/