OCC22108 Cutting plane unpredictable behaviour in V3d_View
[occt.git] / src / OpenGl / OpenGl_subrvis.cxx
CommitLineData
7fd59977 1/***********************************************************************
2
3FONCTION :
4----------
5File OpenGl_subrvis :
6
7TEST :
8------
9
10Le main TestOfDesktop.c permet de tester cette classe.
11
12
13REMARQUES:
14----------
15
16
17HISTORIQUE DES MODIFICATIONS :
18--------------------------------
19xx-xx-xx : xxx ; Creation.
2007-02-96 : FMN ; Suppression code inutile:
21- TxglLink() et TxglUnlink()
2219-03-96 : CAL ; Ajout de la fonction subr_resize.
23appele par togl_ratio_window
2421-03-96 : CAL ; Dans subr_doublebuffer et subr_open_ws
25retrait des lignes qui donnaient un background
26noir a la fenetre.
2701-04-96 : CAL ; Integration MINSK portage WNT
2802-07-96 : FMN ; Suppression WSWSHeight, WSWSWidth et WSType
2917-07-96 : FMN ; Modification de call_subr_hlhsr().
3018-07-96 : FMN ; Ajout appel TxglWinset() pour le Resize.
3101-08-96 : FMN ; Ajout appel reaffichage dans le resize.
3225-11-96 : FMN ; PRO6577: Ajout WSUpdateState pour call_subr_set_background.
3329-01-97 : FMN ; Suppression de call_subr_doublebuffer().
3405-02-97 : FMN ; Suppression variables inutiles.
3512-02-97 : FMN ; Suppression de call_facilities_list.DepthCueing
3614-02-97 : FMN ; Ajout WSUpdateState pour call_subr_transparency.
3730-06-97 : FMN ; Appel de la toolkit OpenGl_LightBox.
3802-07-97 : FMN ; Ajout init generale par contexte.
39(GL_POLYGON_OFFSET_EXT, glLightModelf, glHint).
4003-07-97 : FMN ; Test Headlight.
4108-09-97 : CAL ; subr_open_ws retourne 0 si pb. (gere par togl_view)
4207-10-97 : FMN ; Simplification WNT
4303-10-97 : FMN ; Meilleure gestion des EXT, ajout QueryExtension
4417-11-97 : FMN ; Suppression redraw sur le resize.
4505-12-97 : FMN ; Double gestion du glPolygonOffsetEXT
4617-12-97 : FMN ; Probleme compilation SGI
4703-03-98 : FMN ; Simplification gestion du glPolygonOffsetEXT
4815-03-98 : FMN ; Suppression variable WSNeedsClear
4917-03-98 : FMN ; Ajout mode animation
5008-07-98 : FMN ; Changement du nom de la primitive call_togl_erase_immediat_mode()
51-> call_togl_erase_animation_mode.
5222-10-98 : FMN ; Amelioration des perfs: glHint utilise GL_FASTEST.
5314-12-98 : BGN; Developpement (S3989, Phase "triedre")
5429-03-01 : GG; glPolygonOffsetEXT is no more available
55since OGL 1.2
5620-08-01 : GG ; Add functions call_subr_enable_polygon_offset ()
57and call_subr_disable_polygon_offset ()
58
59************************************************************************/
60
61#ifdef WNT
62#define BUC60579 /*GG_240999 Under WNT,resets the ws attributes for each
63// created view-manager and not only for the first
64*/
65#endif
66
67#define IMP190100 /*GG Reverse the front & back depth cueing planes
68// position.
69*/
70
71#define RIC120302 /*GG Use TxglSetWindow instead TxglCreateWindow
72// when a GLXContext is given
73// Add call_subr_displayCB function
74*/
75
76#define BUC61044 /* 25/10/01 SAV ; added functionality to control gl depth testing
77from higher API */
78#define BUC61045 /* 25/10/01 SAV ; added functionality to control gl lighting
79from higher API */
80
81#define OCC1188 /*SAV added control of the background image*/
82
83/*----------------------------------------------------------------------*/
84/*
85* Includes
86*/
87
88#include <stdio.h>
89
90#include <OpenGl_tgl_all.hxx>
91
92
93#include <InterfaceGraphic.hxx>
94#include <InterfaceGraphic_Labels.hxx>
95#include <InterfaceGraphic_Graphic3d.hxx>
96#include <InterfaceGraphic_Visual3d.hxx>
97
98#include <OpenGl_inquire.hxx>
99
100#include <OpenGl_Extension.hxx>
101
102#include <OpenGl_cmn_varargs.hxx>
103#include <OpenGl_tsm.hxx>
104#include <OpenGl_tsm_ws.hxx>
105#include <OpenGl_telem_view.hxx>
106#include <OpenGl_telem_util.hxx>
107#include <OpenGl_telem_pick.hxx>
108#include <OpenGl_LightBox.hxx>
109#include <OpenGl_telem_highlight.hxx>
110#include <OpenGl_telem_depthcue.hxx>
111#include <OpenGl_txgl.hxx>
112#include <OpenGl_tgl_subrvis.hxx>
113#include <OpenGl_tgl_pick.hxx>
114#include <OpenGl_tgl_funcs.hxx>
115#include <OpenGl_telem_filters.hxx>
116#include <OpenGl_tgl_tox.hxx>
117#include <OpenGl_tgl.hxx>
118#include <OpenGl_animation.hxx>
119#include <OpenGl_triedron.hxx>
120#include <OpenGl_tgl_util.hxx>
121#include <OpenGl_Memory.hxx>
122#include <OpenGl_graduatedtrihedron.hxx>
123
124/*----------------------------------------------------------------------*/
125/*
126* Constantes
127*/
128
129static Tint attri_init = 0;
130
131/*----------------------------------------------------------------------*/
132
133#ifndef WNT
134static Bool WaitForNotify(Display *d, XEvent *e, char *arg) {
135 return (e->type == MapNotify) && (e->xmap.window == (Window)arg);
136}
137#endif
138
139/*----------------------------------------------------------------------*/
140
141static int offsetStatus=0;
142#ifdef GL_EXT_polygon_offset
143static GLfloat offsetFactor=1.0,offsetUnits=0.0;
144#elif GL_POLYGON_OFFSET_EXT
145static GLfloat offsetFactor=0.5,offsetUnits=0.0005;
146#endif
147void call_subr_enable_polygon_offset( )
148{
149 if( offsetStatus < 0 ) return;
150
151#ifdef GL_EXT_polygon_offset
152 if( offsetStatus == 0 ) {
153 if (QueryExtension("GL_EXT_polygon_offset")) {
154 char svalue[64];
155 if( call_util_osd_getenv ("CALL_OPENGL_POLYGON_OFFSET",
156 svalue,sizeof(svalue)) ) {
157 float v1,v2;
158 int n = sscanf(svalue,"%f %f",&v1,&v2);
159 if( n > 0 ) offsetFactor = v1;
160 if( n > 1 ) offsetUnits = v2;
161 printf(" $$$ CALL_OPENGL_POLYGON_OFFSET %f %f\n",
162 offsetFactor,offsetUnits);
163 }
164 offsetStatus = 1;
165 } else {
166 offsetStatus = -1;
167 }
168 }
169
170 if( offsetStatus > 0 ) {
171#ifdef GL_POLYGON_OFFSET_FILL
172 glPolygonOffset(offsetFactor,offsetUnits);
173 glEnable(GL_POLYGON_OFFSET_FILL);
174#elif GL_POLYGON_OFFSET_EXT
175 glPolygonOffsetEXT(offsetFactor,offsetUnits);
176 glEnable(GL_POLYGON_OFFSET_EXT);
177#endif
178 }
179#else
180 offsetStatus = -1;
181#endif /* GL_EXT_polygon_offset */
182}
183
184void
185call_subr_disable_polygon_offset( )
186{
187 if( offsetStatus > 0 ) {
188#ifdef GL_POLYGON_OFFSET_FILL
189 glDisable(GL_POLYGON_OFFSET_FILL);
190#elif GL_POLYGON_OFFSET_EXT
191 glDisable(GL_POLYGON_OFFSET_EXT);
192#endif
193 }
194}
195
196/*----------------------------------------------------------------------*/
197
198int
199call_subr_open_ws( CALL_DEF_VIEW * aview )
200{
201 CMN_KEY_DATA data;
202 WINDOW win;
203 TEL_HIGHLIGHT hrep = { TelHLForcedColour, {{ ( float )1.0, ( float )1.0, ( float )1.0 }} };
204 TEL_DEPTHCUE dcrep = { TelDCSuppressed, {( float )0.0, ( float )1.0}, {( float )1.0, ( float )0.0}, {{( float )0.0, ( float )0.0, ( float )0.0}} };
205 Tint width, height;
206 Tfloat bgcolr, bgcolg, bgcolb; /* background color */
207#ifdef OCC1188
208 TSM_BG_TEXTURE bgTexture;
209#endif
210
211#ifndef WNT
212 XEvent event;
213 Window root;
214 int newx, newy;
215 unsigned int newwidth, newheight, newbw, newdepth;
216#else
217 RECT cr;
218#endif /* WNT */
219
220 width = ( Tint )aview->DefWindow.dx;
221 height = ( Tint )aview->DefWindow.dy;
222
223 /* background color */
224 bgcolr = aview->DefWindow.Background.r,
225 bgcolg = aview->DefWindow.Background.g,
226 bgcolb = aview->DefWindow.Background.b;
227
228#ifdef RIC120302
229 if( aview->GContext )
230 win = TxglSetWindow( call_thedisplay, /*(HWND)*/(WINDOW)aview->DefWindow.XWindow,
231 /*(HGLRC)*/(GLCONTEXT)aview->GContext );
232 else
233#endif /*RIC120302*/
234 win = TxglCreateWindow( call_thedisplay, /*(HWND)*/(WINDOW)aview->DefWindow.XWindow,
235 0, 0, width, height, 0, bgcolr, bgcolg, bgcolb );
236#ifndef WNT
237 if( win != aview->DefWindow.XWindow ) {
238 XMapWindow( call_thedisplay, win );
239 XIfEvent(call_thedisplay, &event, WaitForNotify, (char *) win);
240 }
241#endif /* WNT */
242
243 if( TxglWinset( call_thedisplay, (WINDOW) win ) == TFailure )
244 return 0;
245 else {
246 TsmRegisterWsid( aview->WsId );
247 data.ldata = (Tint) win;
248 TsmSetWSAttri( aview->WsId, WSWindow, &data );
249#ifndef WNT
250 XGetGeometry (
251 call_thedisplay, win, &root,
252 &newx, &newy,&newwidth, &newheight, &newbw, &newdepth
253 );
254 width = newwidth;
255 height = newheight;
256#else
257 GetClientRect ( win, &cr );
258 width = cr.right;
259 height = cr.bottom;
260#endif /* WNT */
261#ifdef OCC1188
262 bgTexture.texId = 0;
263 data.pdata = &bgTexture;
264 TsmSetWSAttri( aview->WsId, WSBgTexture, &data );
265#endif
266 data.ldata = width;
267 TsmSetWSAttri( aview->WsId, WSWidth, &data );
268 data.ldata = height;
269 TsmSetWSAttri( aview->WsId, WSHeight, &data );
270 data.ldata = -1;
271 TsmSetWSAttri( aview->WsId, WSViewStid, &data );
272 data.ldata = TOn;
273 TsmSetWSAttri( aview->WsId, WSDbuff, &data );
274 data.ldata = TNotDone;
275 TsmSetWSAttri( aview->WsId, WSUpdateState, &data );
276 data.ldata = TOff;
277 TsmSetWSAttri( aview->WsId, WSTransparency, &data );
278 TelSetHighlightRep( aview->WsId, 0, &hrep );
279 TelSetDepthCueRep( aview->WsId, 0, &dcrep );
280 TelInitWS( aview->WsId, width, height, bgcolr, bgcolg, bgcolb );
281
282#ifdef BUC61044
283 /* 24/10/01 : SAV ; setting OGL depth testing enabled by default */
284 data.ldata = TOn;
285 TsmSetWSAttri( aview->WsId, WSDepthTest, &data );
286#endif
287#ifdef BUC61045
288 /* 24/10/01 : SAV ; setting flag to control GL_LIGHTING (used in triedron) */
289 data.ldata = TOn;
290 TsmSetWSAttri( aview->WsId, WSGLLight, &data );
291#endif
292
293#ifdef BUC60579
294 TsmInitAttributes();
295#else
296 if( !attri_init ) {
297 TsmInitAttributes();
298 attri_init = 1;
299 }
300#endif
301
302 /*
303 * Init generale du contexte
304 */
305
306 /* Eviter d'avoir les faces mal orientees en noir. */
307 /* Pourrait etre utiliser pour detecter les problemes d'orientation */
308 glLightModeli((GLenum)GL_LIGHT_MODEL_TWO_SIDE, GL_TRUE);
309
310 /* Optimisation pour le Fog et l'antialiasing */
311 glHint( GL_FOG_HINT, GL_FASTEST );
312 glHint( GL_POINT_SMOOTH_HINT, GL_FASTEST );
313 glHint( GL_LINE_SMOOTH_HINT, GL_FASTEST );
314 glHint( GL_POLYGON_SMOOTH_HINT, GL_FASTEST );
315
316 /* Polygon Offset */
317 call_subr_enable_polygon_offset();
318
319 return 1;
320
321 } /* TxglWinset */
322}
323
324/*----------------------------------------------------------------------*/
325
326void
327call_subr_resize (CALL_DEF_VIEW * aview)
328{
329 CMN_KEY_DATA data;
330 WINDOW win;
331 Tint width, height;
332 Tfloat bgcolr, bgcolg, bgcolb;
333 Tint wswidth, wsheight;
334 Tint wsviewstid;
335 /* Tint swap = 1;*/ /* swap buffers ? yes */
336
337#ifndef WNT
338 /* XEvent event;*/
339 Window root;
340 int newx, newy;
341 unsigned int newwidth, newheight, newbw, newdepth;
342#else
343 RECT cr;
344#endif /* WNT */
345
346#ifdef TRACE
347 printf("call_subr_resize \n");
348#endif
349 /* Recuperation de la definition precedente de la ws */
350 TsmGetWSAttri (aview->WsId, WSWidth, &data);
351 wswidth = data.ldata;
352 TsmGetWSAttri (aview->WsId, WSHeight, &data);
353 wsheight = data.ldata;
354 TsmGetWSAttri (aview->WsId, WSViewStid, &data);
355 wsviewstid = data.ldata;
356
357 /* S'il s'agit du togl_ratio_window initial alors on ne fait rien */
358 if (wsviewstid == -1) return;
359
360 /*
361 * Si l'on resize une fenetre qui a la meme taille que la taille
362 * precedente alors on ne fait rien
363 */
364 if ((wswidth == (Tint) aview->DefWindow.dx) &&
365 (wsheight == (Tint) aview->DefWindow.dy)) return;
366
367#ifndef WNT
368 TsmGetWSAttri (aview->WsId, WSWindow, &data);
369 win = data.ldata;
370
371 XResizeWindow (call_thedisplay, win,
372 (unsigned int) aview->DefWindow.dx,
373 (unsigned int) aview->DefWindow.dy);
374
375 XSync (call_thedisplay, False);
376
377 /* Mettre a jour ses attributs */
378 XGetGeometry (call_thedisplay, win, &root,
379 &newx, &newy,&newwidth, &newheight, &newbw, &newdepth);
380 width = newwidth;
381 height = newheight;
382
383 /* background color */
384 bgcolr = aview->DefWindow.Background.r,
385 bgcolg = aview->DefWindow.Background.g,
386 bgcolb = aview->DefWindow.Background.b;
387
388 /* Rendre courant le Drawable et le Context */
389 if (TxglWinset (call_thedisplay, (Window) win) == TSuccess) {
390
391 data.ldata = width;
392 TsmSetWSAttri (aview->WsId, WSWidth, &data);
393 data.ldata = height;
394 TsmSetWSAttri (aview->WsId, WSHeight, &data);
395 TelInitWS (aview->WsId, width, height, bgcolr, bgcolg, bgcolb);
396 }
397
398#else
399
400 /* On detruit l'ancienne sous-fenetre de la window graphique */
401 TsmGetWSAttri (aview->WsId, WSWindow, &data);
402 win = (WINDOW) data.ldata;
403 /*
404 * On recree une nouvelle sous-fenetre de la window graphique
405 * avec la nouvelle dimension
406 */
407 /* background color */
408 bgcolr = aview->DefWindow.Background.r,
409 bgcolg = aview->DefWindow.Background.g,
410 bgcolb = aview->DefWindow.Background.b;
411 /* Rendre courant le Drawable et le Context */
412 if (TxglWinset (call_thedisplay, win) == TSuccess) {
413 //if (TxglWinset (call_thedisplay, GET_GL_CONTEXT()) == TSuccess) {
414 /* Mettre a jour la sous-fenetre associee */
415 /* Mettre a jour ses attributs */
416 GetClientRect ( win, &cr );
417 width = cr.right;
418 height = cr.bottom;
419 data.ldata = width;
420 TsmSetWSAttri (aview->WsId, WSWidth, &data);
421 data.ldata = height;
422 TsmSetWSAttri (aview->WsId, WSHeight, &data);
423 TelInitWS (aview->WsId, width, height, bgcolr, bgcolg, bgcolb);
424 }
425#endif /* WNT */
426
427 return;
428}
429
430/*----------------------------------------------------------------------*/
431
432void
433call_subr_antialiasing( CALL_DEF_VIEW * aview, Tint tag )
434{
435 CMN_KEY k;
436 Tint fl = tag ? TOn : TOff;
437
438 call_func_set_edit_mode( TEditReplace );
439 call_func_open_struct( aview->ViewId );
440 call_func_set_elem_ptr(0);
441 call_func_set_elem_ptr_label(View_LABAliasing);
442 call_func_offset_elem_ptr(1);
443 k.data.ldata = fl;
444 TsmAddToStructure( TelAntiAliasing, 1, &k );
445 call_func_close_struct();
446 return;
447}
448
449/*----------------------------------------------------------------------*/
450
451void
452call_subr_hlhsr( CALL_DEF_VIEW * aview, int tag )
453{
454 CMN_KEY_DATA data;
455
456 data.ldata = (tag ? TOn : TOff);
457 TsmSetWSAttri( aview->WsId, WSZbuffer, &data );
458 return;
459}
460
461
462/*----------------------------------------------------------------------*/
463
464void
465call_subr_depthcueing( CALL_DEF_VIEW * aview, Tint tag )
466{
467 TEL_DEPTHCUE rep;
468# define CALL_DEF_DEPTH_CUEING_INDEX 1
469
470 if( !tag )
471 {
472 call_func_set_edit_mode(CALL_PHIGS_EDIT_REPLACE);
473 call_func_open_struct(aview->ViewId);
474 call_func_set_elem_ptr(0);
475 call_func_set_elem_ptr_label(View_LABDepthCueing);
476 call_func_offset_elem_ptr(1);
477 call_func_appl_data(0);
478 call_func_close_struct();
479 }
480 else
481 {
482 rep.mode = CALL_PHIGS_ALLOWED;
483 rep.planes[0] = aview->Context.DepthBackPlane;
484 rep.planes[1] = aview->Context.DepthFrontPlane;
485#ifdef TRACE
486 printf(" $$$ DepthFrontPlane %f DepthBackPlane %f FrontPlaneDistance %f BackPlaneDistance %f\n",aview->Context.DepthFrontPlane,aview->Context.DepthBackPlane,aview->Mapping.FrontPlaneDistance,aview->Mapping.BackPlaneDistance);
487#endif
488 rep.planes[0] =
489#ifdef IMP190100
490 (aview->Context.DepthFrontPlane -
491 aview->Mapping.BackPlaneDistance) /
492#else
493 (aview->Mapping.FrontPlaneDistance -
494 aview->Context.DepthFrontPlane) /
495#endif
496 (aview->Mapping.FrontPlaneDistance -
497 aview->Mapping.BackPlaneDistance);
498
499 rep.planes[1] =
500#ifdef IMP190100
501 (aview->Context.DepthBackPlane -
502 aview->Mapping.BackPlaneDistance) /
503#else
504 (aview->Mapping.FrontPlaneDistance -
505 aview->Context.DepthBackPlane) /
506#endif
507 (aview->Mapping.FrontPlaneDistance -
508 aview->Mapping.BackPlaneDistance);
509
510 if(rep.planes[0] < 0.)
511 rep.planes[0] = ( float )0.0;
512 else if(rep.planes[0] > 1.)
513 rep.planes[0] = ( float )1.0;
514 if(rep.planes[1] < 0.)
515 rep.planes[1] = ( float )0.0;
516 else if(rep.planes[1] > 1.)
517 rep.planes[1] = ( float )1.0;
518#ifdef IMP190100
519 if(rep.planes[1] > rep.planes[0])
520 {
521 rep.planes[1] = ( float )0.0;
522 rep.planes[0] = ( float )1.0;
523 }
524#else
525 if(rep.planes[0] > rep.planes[1])
526 {
527 rep.planes[0] = ( float )0.0;
528 rep.planes[1] = ( float )1.0;
529 }
530#endif
531
532#ifdef TRACE
533 printf(" plane[0] %f plane[1] %f\n",rep.planes[0],rep.planes[1]);
534#endif
535 rep.scales[0] = ( float )1.;
536 rep.scales[1] = ( float )0.;
537 rep.col.rgb[0] = aview->DefWindow.Background.r;
538 rep.col.rgb[1] = aview->DefWindow.Background.g;
539 rep.col.rgb[2] = aview->DefWindow.Background.b;
540 TelSetDepthCueRep(aview->WsId, CALL_DEF_DEPTH_CUEING_INDEX, &rep);
541
542 call_func_set_edit_mode(CALL_PHIGS_EDIT_REPLACE);
543 call_func_open_struct(aview->ViewId);
544 call_func_set_elem_ptr(0);
545 call_func_set_elem_ptr_label(View_LABDepthCueing);
546 call_func_offset_elem_ptr(1);
547 call_func_dcue_ind(CALL_DEF_DEPTH_CUEING_INDEX);
548 call_func_close_struct();
549 }
550 return;
551}
552
553/*----------------------------------------------------------------------*/
554
555TStatus
556call_subr_get_view_index( Tint stid, Tint *ind )
557{
558 tsm_node node;
559 Tint i, num;
560
561 if( TsmGetStructure( stid, &num, &node ) == TSuccess )
562 {
563 for( i = 0; i < num; i++ )
564 {
565 if( node->elem.el == TelViewIndex )
566 {
567 *ind = node->elem.data.ldata;
568 return TSuccess;
569 }
570 }
571 }
572 return TFailure;
573}
574
575/*----------------------------------------------------------------------*/
576
577void
578call_subr_pick( CALL_DEF_PICK *apick )
579{
580 Tint depth;
581 TPickOrder order;
582 TStatus stat;
583
584 static int *listid, *listelem, *listpickid;
585
586 TEL_PICK_PATH path_list[CALL_MAX_DEPTH_LENGTH];
587 TEL_PICK_REPORT rep;
588
589 Tint i;
590
591 if( listid )
592 {
593 //cmn_freemem( listid );
594 delete[] listid;
595 //cmn_freemem( listelem );
596 delete[] listelem;
597 //cmn_freemem( listpickid );
598 delete[] listpickid;
599 listid = listelem = listpickid = 0;
600 }
601
602 order = apick->Context.order == 0 ? PTOP_FIRST : PBOTTOM_FIRST;
603
604 depth = apick->Context.depth < CALL_MAX_DEPTH_LENGTH ?
605 apick->Context.depth : CALL_MAX_DEPTH_LENGTH ;
606
607 rep.pick_path = path_list;
608
609 stat = TPick( apick->WsId, apick->x, apick->y, apick->Context.aperture,
610 apick->Context.aperture, order, depth, &rep );
611
612 if( stat == TSuccess )
613 {
614 apick->Pick.depth = rep.depth;
615
616#ifdef TRACE
617 printf( "\n\n\tPICK REPORT FOLLOWS" );
618 printf( "\n\t*******************\n" );
619 printf( "\ndepth = %d\torder = %s\n", rep.depth,
620 order == PTOP_FIRST ? "TopFirst" : "BottomFirst" );
621#endif
622
623 //cmn_memreserve( listid, rep.depth, 0 );
624 listid = new int[rep.depth];
625 //cmn_memreserve( listelem, rep.depth, 0 );
626 listelem = new int[rep.depth];
627 //cmn_memreserve( listpickid, rep.depth, 0 );
628 listpickid = new int[rep.depth];
629 if( !listid || !listelem || !listpickid )
630 return;
631 apick->Pick.listid = listid;
632 apick->Pick.listelem = listelem;
633 apick->Pick.listpickid = listpickid;
634
635 for( i = 0; i < rep.depth; i++ )
636 {
637 listelem[i] = path_list[i].el_num;
638 listpickid[i] = path_list[i].pick_id;
639 listid[i] = path_list[i].struct_id;
640#ifdef TRACE
641 printf( "\n\tSTRUCTURE ID [%d] = %ld", i, listid[i] );
642 printf( "\n\tPICK ID [%d] = %ld", i, listpickid[i] );
643 printf( "\n\tELEMENT ID [%d] = %ld", i, listelem[i] );
644#endif
645 }
646#ifdef TRACE
647 printf("\n");
648#endif
649 }
650
651 return;
652}
653
654
655/*----------------------------------------------------------------------*/
656
657void
658call_subr_set_light_src_rep( CALL_DEF_LIGHT * alight )
659{
660 TEL_LIGHT rep;
661
662 switch( alight->LightType )
663 {
664 case 0 : /* TOLS_AMBIENT */
665 rep.type = CALL_PHIGS_LIGHT_AMBIENT;
666 rep.col.rgb[0] = alight->Color.r;
667 rep.col.rgb[1] = alight->Color.g;
668 rep.col.rgb[2] = alight->Color.b;
669 break;
670
671 case 1 : /* TOLS_DIRECTIONAL */
672 rep.type = CALL_PHIGS_LIGHT_DIRECTIONAL;
673 rep.col.rgb[0] = alight->Color.r;
674 rep.col.rgb[1] = alight->Color.g;
675 rep.col.rgb[2] = alight->Color.b;
676 rep.dir[0] = alight->Direction.x;
677 rep.dir[1] = alight->Direction.y;
678 rep.dir[2] = alight->Direction.z;
679 break;
680
681 case 2 : /* TOLS_POSITIONAL */
682 rep.type = CALL_PHIGS_LIGHT_POSITIONAL;
683 rep.col.rgb[0] = alight->Color.r;
684 rep.col.rgb[1] = alight->Color.g;
685 rep.col.rgb[2] = alight->Color.b;
686 rep.pos[0] = alight->Position.x;
687 rep.pos[1] = alight->Position.y;
688 rep.pos[2] = alight->Position.z;
689 rep.atten[0] = alight->Attenuation[0];
690 rep.atten[1] = alight->Attenuation[1];
691 break;
692
693 case 3 : /* TOLS_SPOT */
694 rep.type = CALL_PHIGS_LIGHT_SPOT;
695 rep.col.rgb[0] = alight->Color.r;
696 rep.col.rgb[1] = alight->Color.g;
697 rep.col.rgb[2] = alight->Color.b;
698 rep.pos[0] = alight->Position.x;
699 rep.pos[1] = alight->Position.y;
700 rep.pos[2] = alight->Position.z;
701 rep.dir[0] = alight->Direction.x;
702 rep.dir[1] = alight->Direction.y;
703 rep.dir[2] = alight->Direction.z;
704 rep.shine = alight->Concentration;
705 rep.atten[0] = alight->Attenuation[0];
706 rep.atten[1] = alight->Attenuation[1];
707 rep.angle = alight->Angle;
708 break;
709 }
710
711 rep.HeadLight = alight->Headlight;
712 AddLight( alight->WsId, alight->LightId, &rep );
713
714 return;
715}
716
717/*----------------------------------------------------------------------*/
718
719void
720call_subr_set_background( Tint ws, tel_colour rgb )
721{
722 CMN_KEY_DATA data;
723 CMN_KEY_DATA key;
724
725 /* Mise a jour de l'update_mode */
726 key.ldata = TNotDone;
727 TsmSetWSAttri( ws, WSUpdateState, &key );
728
729 data.pdata = rgb->rgb;
730 TsmSetWSAttri( ws, WSBackground, &data );
731 return;
732}
733
734/*----------------------------------------------------------------------*/
735
736void
737call_subr_set_gradient_background( Tint ws, Tint type, tel_colour color1, tel_colour color2 )
738{
739 CMN_KEY_DATA data;
740 CMN_KEY_DATA key;
741 TSM_BG_GRADIENT bgGradient;
742
743 /* Mise a jour de l'update_mode */
744 key.ldata = TNotDone;
745 TsmSetWSAttri( ws, WSUpdateState, &key );
746
747 bgGradient.type = (TSM_GradientType)type;
748 bgGradient.color1 = *color1;
749 bgGradient.color2 = *color2;
750 data.pdata = &bgGradient;
751 TsmSetWSAttri( ws, WSBgGradient, &data );
752 return;
753}
754
755
756/*----------------------------------------------------------------------*/
757
758void
759call_subr_close_ws( CALL_DEF_VIEW * aview )
760{
761 CMN_KEY_DATA key;
762#ifdef OCC1188
763 tsm_bg_texture texture;
764
765 TsmGetWSAttri( aview->WsId, WSBgTexture, &key );
766 texture = (tsm_bg_texture)key.pdata;
767
768 if( texture == 0 )
769 return;
770
771 if ( texture->texId != 0 )
772 glDeleteTextures( 1,(GLuint *)&(texture->texId) );
773#endif
774
775 TsmGetWSAttri( aview->WsId, WSWindow, &key );
776#ifdef RIC120302
777 if( !aview->GContext )
778#endif
779 TxglDestroyWindow( call_thedisplay, (WINDOW) key.ldata );
780
781 TglDeleteFiltersForWS( aview->WsId );
782 RemoveWksLight( aview->WsId );
783 call_triedron_erase (aview); /* BGN 09-12-98 */
784 call_graduatedtrihedron_erase( aview->WsId );
785 TelDeleteViewsForWS( aview->WsId );
786 TelDeleteHighlightsForWS( aview->WsId );
787 TelDeleteDepthCuesForWS( aview->WsId );
788
789 TsmUnregisterWsid( aview->WsId );
790 return;
791}
792
793/*----------------------------------------------------------------------*/
794
795void
796call_subr_transparency (int wsid, int viewid, int tag)
797{
798 CMN_KEY_DATA data;
799 CMN_KEY_DATA key;
800
801 /* Est-il necessaire de faire de la transparence ? */
802 TsmGetWSAttri( wsid, WSTransparency, &data );
803 if (data.ldata != tag)
804 {
805 data.ldata = (tag ? TOn : TOff);
806 TsmSetWSAttri( wsid, WSTransparency, &data );
807
808 /* Mise a jour de l'update_mode */
809 key.ldata = TNotDone;
810 TsmSetWSAttri( wsid, WSUpdateState, &key );
811 (void) call_togl_erase_animation_mode();
812 }
813}
814
815#ifdef RIC120302
816/*----------------------------------------------------------------------*/
817int
818call_subr_displayCB( CALL_DEF_VIEW * aview, int reason )
819{
820 int status = 0;
821 if( aview->GDisplayCB ) {
822 Aspect_GraphicCallbackStruct callData;
823 CMN_KEY_DATA data;
824 WINDOW win;
825
826 TsmGetWSAttri (aview->WsId, WSWindow, &data);
827 win = (WINDOW) data.ldata;
828
829 callData.reason = reason;
830 callData.display = call_thedisplay;
831 callData.window = win;
832 callData.wsID = aview->WsId;
833 callData.viewID = aview->ViewId;
834 callData.gcontext = TxglGetContext(win);
835
836 status = (*aview->GDisplayCB)
837 ( aview->DefWindow.XWindow, aview->GClientData, &callData );
838 }
839
840 return status;
841}
842#endif