3 /***********************************************************************
13 Le culling et le backfacing ne marchent pas.
16 HISTORIQUE DES MODIFICATIONS :
17 --------------------------------
18 xx-xx-xx : xxx ; Creation.
19 11-03-96 : FMN ; Correction warning compilation
20 01-04-96 : CAL ; Integration MINSK portage WNT
21 22-04-96 : FMN ; Suppression prototype inutile.
22 09-08-96 : FMN ; Suppression appel glMatrixMode() avant glGetFloatv()
23 21-10-96 : FMN ; Suppression LMC_COLOR fait dans OpenGl_execstruct.c
24 30-06-97 : FMN ; Suppression OpenGl_telem_light.h
25 18-07-97 : FMN ; Ajout desactivation des lights suivant front_lighting_model
26 21-07-97 : FMN ; Amelioration des performances OPTIMISATION_FMN
27 - suppression calcul inutile sur les front faces
28 - utilisation de GL_LINE_LOOP
29 27-08-97 : FMN ; Correction affichage des edges
30 On n'affiche que les edges dans le mode IS_EMPTY
31 10-09-97 : FMN ; Amelioration des perfs liees aux lights.
32 15-09-97 : PCT ; Ajout coordonnees textures
33 24-09-97 : FMN ; Suppression OPTIMISATION_FMN.
34 08-12-97 : FMN ; Suppression appel TsmGetAttri inutile.
35 23-12-97 : FMN ; Suppression IsBackFace()
36 31-12-97 : FMN ; Simplification pour le highlight
37 15-01-98 : FMN ; Ajout Hidden line
38 16-02-00 : EUG ; Degeneration support
39 16-02-00 : EUG ; Bitmap drawing support
40 08-03-01 : GG ; BUC60823 Avoid crash in the normal computation method
43 ************************************************************************/
45 #define BUC60876 /* GG 5/4/2001 Disable local display list
46 // when animation is not required
49 /*----------------------------------------------------------------------*/
51 #define OCC4298 // SAN : 12/11/2003 : Memory beyond array bound read in TriangleMeshAdd()
56 #include <OpenGl_tgl_all.hxx>
63 #include <OpenGl_cmn_varargs.hxx>
64 #include <OpenGl_telem_attri.hxx>
65 #include <OpenGl_tsm.hxx>
66 #include <OpenGl_telem.hxx>
67 #include <OpenGl_telem_util.hxx>
68 #include <OpenGl_telem_highlight.hxx>
69 #include <OpenGl_telem_inquire.hxx>
70 #include <OpenGl_telem_view.hxx>
71 #include <OpenGl_tgl_funcs.hxx>
72 #include <OpenGl_LightBox.hxx>
73 #include <OpenGl_TextureBox.hxx>
74 #include <OpenGl_Memory.hxx>
76 /*----------------------------------------------------------------------*/
81 /*----------------------------------------------------------------------*/
86 extern Tint ForbidSetTextureMapping; /* currently defined in tsm/tsm.c */
90 # define DEF_DS_INTERNAL
91 # include <OpenGl_degeneration.hxx>
94 extern GLboolean g_fBitmap;
97 extern int g_nDegenerateModel;
98 extern float g_fSkipRatio;
99 extern GLboolean g_fAnimation;
103 /*----------------------------------------------------------------------*/
107 Tint num_facets; /* Number of facets */
108 Tint facet_flag; /* TEL_FA_NONE or TEL_FA_NORMAL */
109 Tint vertex_flag;/* TEL_VT_NONE or TEL_VT_NORMAL */
110 tel_point fnormals; /* length = num_facets */
111 tel_colour fcolours; /* length = num_facets */
112 tel_point vertices; /* length = num_facets + 2 */
113 tel_colour vcolours; /* length = num_facets + 2 */
114 tel_point vnormals; /* length = num_facets + 2 */
115 tel_texture_coord vtexturecoord; /* Texture coordinates */
119 } TEL_TMESH_DATA, *tel_tmesh_data;
121 static TStatus TriangleMeshDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
122 static TStatus TriangleMeshAdd( TSM_ELEM_DATA, Tint, cmn_key* );
123 static TStatus TriangleMeshDelete( TSM_ELEM_DATA, Tint, cmn_key* );
124 static TStatus TriangleMeshPrint( TSM_ELEM_DATA, Tint, cmn_key* );
125 static TStatus TriangleMeshInquire( TSM_ELEM_DATA, Tint, cmn_key* );
127 static void draw_tmesh( tel_tmesh_data,
128 Tint, /* highlight flag */
129 Tint, /* front_lighting_model, */
130 Tint, /* interior_style, */
131 tel_colour /* edge_colour, */
134 static void draw_edges( tel_tmesh_data, tel_colour, Tint);
136 static void draw_edges ( tel_tmesh_data, tel_colour, Tint, Tint );
137 void draw_degenerates_as_points ( PDS_INTERNAL, tel_point, Tint );
138 void draw_degenerates_as_bboxs ( PDS_INTERNAL, tel_point, Tint );
139 extern void set_drawable_items ( GLboolean*, int );
142 static void draw_line_loop ( tel_tmesh_data );
144 static TStatus ( *MtdTbl[] )( TSM_ELEM_DATA, Tint, cmn_key* ) = {
146 TriangleMeshDisplay, /* PickTraverse */
155 /*----------------------------------------------------------------------*/
157 MtblPtr TelTriangleMeshInitClass ( TelType* el ) {
159 *el = TelTriangleMesh;
163 } /* end TelTriangleMeshInitClass */
165 /*----------------------------------------------------------------------*/
167 TriangleMeshAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
173 VERTEX_COLOUR_VALS_ID
180 for( i = 0; i < n; i++ )
182 if( k[i]->id == NUM_FACETS_ID )
188 if( !(k[i]->data.ldata) )
191 data = new TEL_TMESH_DATA();
195 data->num_facets = k[i]->data.ldata;
196 data->vtexturecoord = 0;
198 for( i = 0; i < n; i++ )
204 data->facet_flag = TEL_FA_NORMAL;
205 data->fnormals = new TEL_POINT[data->num_facets];
206 memcpy( data->fnormals, k[i]->data.pdata, data->num_facets*sizeof(TEL_POINT) );
207 for( j = 0; j < data->num_facets; j++ )
208 vecnrm( data->fnormals[j].xyz );
211 case FACET_COLOUR_VALS_ID:
213 data->fcolours = new TEL_COLOUR[data->num_facets];
214 memcpy( data->fcolours,
216 data->num_facets*sizeof(TEL_COLOUR) );
221 data->vertices = new TEL_POINT[data->num_facets + 2];
222 memcpy( data->vertices, k[i]->data.pdata,
223 (data->num_facets+2)*sizeof(TEL_POINT) );
226 case VERTEX_COLOUR_VALS_ID:
228 data->vcolours = new TEL_COLOUR[data->num_facets];
229 memcpy( data->vcolours, k[i]->data.pdata,
230 (data->num_facets+2)*sizeof(TEL_COLOUR) );
236 data->vertex_flag = TEL_VT_NORMAL;
237 data->vnormals = new TEL_POINT[data->num_facets + 2];
238 memcpy( data->vnormals, k[i]->data.pdata,
239 (data->num_facets + 2)*sizeof(TEL_POINT) );
240 for( j = 0; j < (data->num_facets+2); j++ )
241 vecnrm( data->vnormals[j].xyz );
244 case VTEXTURECOORD_ID:
246 data->vtexturecoord = new TEL_TEXTURE_COORD[data->num_facets + 2];
247 memcpy( data->vtexturecoord,
249 (data->num_facets + 2)*sizeof(TEL_TEXTURE_COORD) );
260 if( data->facet_flag != TEL_FA_NORMAL )
262 /* calculate the normals and store */
264 data->fnormals = new TEL_POINT[data->num_facets];
265 for( i = 0; i < data->num_facets; i++ ) {
267 TelGetNormal( data->vertices[i].xyz, data->vertices[i+2].xyz,
268 data->vertices[i+1].xyz, data->fnormals[i].xyz );
270 TelGetNormal( data->vertices[i].xyz, data->vertices[i+1].xyz,
271 data->vertices[i+2].xyz, data->fnormals[i].xyz );
275 for( j = 0; j < data->num_facets; j++ )
276 vecnrm( data->fnormals[j].xyz );
279 if( data->vertex_flag != TEL_VT_NORMAL )
281 /* calculate the vertex normals */
282 data->vnormals = new TEL_POINT[data->num_facets + 2];
283 for( i = 2; i < data->num_facets; i++ )
285 data->vnormals[i].xyz[0] = ( data->fnormals[i-2].xyz[0] +
286 data->fnormals[i-1].xyz[0] +
287 data->fnormals[ i ].xyz[0] ) / ( float )3.0;
288 data->vnormals[i].xyz[1] = ( data->fnormals[i-2].xyz[1] +
289 data->fnormals[i-1].xyz[1] +
290 data->fnormals[ i ].xyz[1] ) / ( float )3.0;
291 data->vnormals[i].xyz[2] = ( data->fnormals[i-2].xyz[2] +
292 data->fnormals[i-1].xyz[2] +
293 data->fnormals[ i ].xyz[2] ) / ( float )3.0;
295 data->vnormals[0] = data->fnormals[0];
297 if( data->num_facets > 1 )
300 data->vnormals[1].xyz[0] = ( data->fnormals[0].xyz[0] +
301 data->fnormals[1].xyz[0] )/( float )2.0;
302 data->vnormals[1].xyz[1] = ( data->fnormals[0].xyz[1] +
303 data->fnormals[1].xyz[1] )/( float )2.0;
304 data->vnormals[1].xyz[2] = ( data->fnormals[0].xyz[2] +
305 data->fnormals[1].xyz[2] )/( float )2.0;
309 data->vnormals[1] = data->fnormals[0];
312 data->vnormals[data->num_facets+1] = data->fnormals[data->num_facets-1];
314 /* second last vertex */
316 if( data->num_facets > 1 )
319 data->vnormals[data->num_facets].xyz[0] =
320 ( data->fnormals[data->num_facets-1].xyz[0] +
321 data->fnormals[data->num_facets-2].xyz[0] ) / ( float )2.0;
322 data->vnormals[data->num_facets].xyz[1] =
323 ( data->fnormals[data->num_facets-1].xyz[1] +
324 data->fnormals[data->num_facets-2].xyz[1] ) / ( float )2.0;
325 data->vnormals[data->num_facets].xyz[2] =
326 ( data->fnormals[data->num_facets-1].xyz[2] +
327 data->fnormals[data->num_facets-2].xyz[2] ) / ( float )2.0;
335 data -> d.degMode = 0;
336 data -> d.model = -1;
337 data -> d.skipRatio = 0.0F;
338 data->d.bDraw = new unsigned char[data->num_facets + 2];
340 ((tsm_elem_data)(d.pdata))->pdata = data;
344 /*----------------------------------------------------------------------*/
347 TriangleMeshDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
349 CMN_KEY k11, k12, k17, k111, k114;
351 Tint front_lighting_model;
353 TEL_COLOUR interior_colour;
354 TEL_COLOUR edge_colour;
358 k12.id = TelInteriorReflectanceEquation;
359 k17.id = TelInteriorStyle;
360 k111.id = TelInteriorColour;
361 k111.data.pdata = &interior_colour;
362 k114.id = TelEdgeColour;
363 k114.data.pdata = &edge_colour;
365 TsmGetAttri( 4, &k12, &k17, &k111, &k114);
367 front_lighting_model = k12.data.ldata;
368 interior_style = k17.data.ldata;
371 printf("TriangleMeshDisplay \n");
375 * Use highlight colours
377 if( k[0]->id == TOn )
381 k11.id = TelHighlightIndex;
382 TsmGetAttri( 1, &k11 );
383 if( TelGetHighlightRep( TglActiveWs, k11.data.ldata, &hrep ) == TSuccess )
385 if( hrep.type == TelHLForcedColour )
387 edge_colour = interior_colour = hrep.col;
388 front_lighting_model = CALL_PHIGS_REFL_NONE;
390 else if( hrep.type == TelHLColour )
392 edge_colour = hrep.col;
398 TelGetHighlightRep( TglActiveWs, 0, &hrep );
399 if( hrep.type == TelHLForcedColour )
401 edge_colour = interior_colour = hrep.col;
402 front_lighting_model = CALL_PHIGS_REFL_NONE;
404 else if( hrep.type == TelHLColour )
406 edge_colour = hrep.col;
412 d = (tel_tmesh_data)data.pdata;
414 glColor3fv( interior_colour.rgb );
416 draw_tmesh( d, k[0]->id,
417 front_lighting_model,
425 /*----------------------------------------------------------------------*/
427 static void draw_tmesh (
430 Tint front_lighting_model,
432 tel_colour edge_colour
437 tel_point pv, pfn, pvn;
439 tel_texture_coord pvt;
446 pvt = p -> vtexturecoord;
448 if ( hflag ) pvc = pfc = 0;
450 if ( g_nDegenerateModel < 2 && interior_style != TSM_EMPTY ) {
452 if( interior_style != TSM_EMPTY ) {
454 if ( front_lighting_model == CALL_PHIGS_REFL_NONE )
462 goto doDraw; /* Disable object display list out of animation */
465 if ( g_fBitmap ) goto doDraw; /* display lists are NOT shared between */
466 /* window's context and bitmap's one */
468 if ( p -> d.model != front_lighting_model || !p -> d.list ||
469 p -> d.model == -1 ||
470 ( g_nDegenerateModel && p -> d.skipRatio != g_fSkipRatio )
473 p -> d.skipRatio = g_fSkipRatio;
474 p -> d.model = front_lighting_model;
475 p -> d.degMode = g_nDegenerateModel;
477 if ( g_fSkipRatio == 0.0 ) {
479 if ( !p -> d.list ) p -> d.list = glGenLists ( 1 );
481 glNewList ( p -> d.list, GL_COMPILE_AND_EXECUTE );
487 glBegin ( GL_TRIANGLE_STRIP );
489 if ( front_lighting_model == CALL_PHIGS_REFL_NONE ) {
493 for ( i = 0; i < p -> num_facets + 2; ++i ) {
495 glColor3fv ( pvc[ i ].rgb );
496 glVertex3fv ( pv [ i ].xyz );
502 glColor3fv ( pfc[ 0 ].rgb );
503 glVertex3fv ( pv [ 0 ].xyz );
504 glVertex3fv ( pv [ 1 ].xyz );
506 for ( i = 2; i < p -> num_facets + 2; ++i ) {
508 glColor3fv ( pfc[ i - 2 ].rgb );
509 glVertex3fv( pv [ i ].xyz );
513 } else for ( i = 0; i < p -> num_facets + 2; ++i ) glVertex3fv ( pv[ i ].xyz );
515 } else { /* front_lighting_model != TelLModelNone */
517 if ( pvt && !ForbidSetTextureMapping )
519 for ( i = 0; i < p -> num_facets + 2; ++i ) {
521 glNormal3fv ( pvn[ i ].xyz );
522 glTexCoord2fv ( pvt[ i ].xy );
523 glVertex3fv ( pv [ i ].xyz );
527 else for ( i = 0; i < p -> num_facets + 2; ++i ) {
529 glNormal3fv( pvn[ i ].xyz );
530 glVertex3fv( pv[ i ].xyz );
538 } else if ( g_fSkipRatio != 1.0 ) {
540 set_drawable_items ( p -> d.bDraw, p -> num_facets + 2 );
542 if ( !p -> d.dlist ) p -> d.dlist = glGenLists ( 1 );
544 glNewList ( p -> d.dlist, GL_COMPILE_AND_EXECUTE );
547 glBegin ( GL_TRIANGLES );
549 if ( front_lighting_model == CALL_PHIGS_REFL_NONE ) {
553 for ( i = 0; i < p -> num_facets; ++i ) {
555 if ( p -> d.bDraw[ i ] ) {
559 glColor3fv ( pvc[ i ].rgb );
560 glVertex3fv ( pv [ i ].xyz );
561 glColor3fv ( pvc[ i + 2 ].rgb );
562 glVertex3fv ( pv [ i + 2 ].xyz );
563 glColor3fv ( pvc[ i + 1 ].rgb );
564 glVertex3fv ( pv [ i + 1 ].xyz );
568 glColor3fv ( pvc[ i + 2 ].rgb );
569 glVertex3fv ( pv [ i + 2 ].xyz );
570 glColor3fv ( pvc[ i ].rgb );
571 glVertex3fv ( pv [ i ].xyz );
572 glColor3fv ( pvc[ i + 1 ].rgb );
573 glVertex3fv ( pv [ i + 1 ].xyz );
581 for ( i = 0; i < p -> num_facets; ++i ) {
583 if ( p -> d.bDraw[ i ] ) {
587 glColor3fv ( pfc[ i ].rgb );
588 glVertex3fv( pv [ i ].xyz );
589 glColor3fv ( pfc[ i + 2 ].rgb );
590 glVertex3fv( pv [ i + 2 ].xyz );
591 glColor3fv ( pfc[ i + 1 ].rgb );
592 glVertex3fv( pv [ i + 1 ].xyz );
596 glColor3fv ( pfc[ i + 2 ].rgb );
597 glVertex3fv( pv [ i + 2 ].xyz );
598 glColor3fv ( pfc[ i ].rgb );
599 glVertex3fv( pv [ i ].xyz );
600 glColor3fv ( pfc[ i + 1 ].rgb );
601 glVertex3fv( pv [ i + 1 ].xyz );
608 for ( i = 0; i < p -> num_facets; ++i ) {
610 if ( p -> d.bDraw[ i ] ) {
614 glVertex3fv ( pv[ i ].xyz );
615 glVertex3fv ( pv[ i + 2 ].xyz );
616 glVertex3fv ( pv[ i + 1 ].xyz );
620 glVertex3fv ( pv[ i + 2 ].xyz );
621 glVertex3fv ( pv[ i ].xyz );
622 glVertex3fv ( pv[ i + 1 ].xyz );
629 } else { /* front_lighting_model != TelLModelNone */
631 if ( pvt && !ForbidSetTextureMapping ) {
633 for ( i = 0; i < p -> num_facets; ++i ) {
635 if ( p -> d.bDraw[ i ] ) {
639 glNormal3fv ( pvn[ i ].xyz );
640 glTexCoord2fv ( pvt[ i ].xy );
641 glVertex3fv ( pv [ i ].xyz );
642 glNormal3fv ( pvn[ i + 2 ].xyz );
643 glTexCoord2fv ( pvt[ i + 2 ].xy );
644 glVertex3fv ( pv [ i + 2 ].xyz );
645 glNormal3fv ( pvn[ i + 1 ].xyz );
646 glTexCoord2fv ( pvt[ i + 1 ].xy );
647 glVertex3fv ( pv [ i + 1 ].xyz );
651 glNormal3fv ( pvn[ i + 2 ].xyz );
652 glTexCoord2fv ( pvt[ i + 2 ].xy );
653 glVertex3fv ( pv [ i + 2 ].xyz );
654 glNormal3fv ( pvn[ i ].xyz );
655 glTexCoord2fv ( pvt[ i ].xy );
656 glVertex3fv ( pv [ i ].xyz );
657 glNormal3fv ( pvn[ i + 1 ].xyz );
658 glTexCoord2fv ( pvt[ i + 1 ].xy );
659 glVertex3fv ( pv [ i + 1 ].xyz );
666 for ( i = 0; i < p -> num_facets; ++i ) {
668 if ( p -> d.bDraw[ i ] ) {
672 glNormal3fv( pvn[ i ].xyz );
673 glVertex3fv( pv[ i ].xyz );
674 glNormal3fv( pvn[ i + 2 ].xyz );
675 glVertex3fv( pv[ i + 2 ].xyz );
676 glNormal3fv( pvn[ i + 1 ].xyz );
677 glVertex3fv( pv[ i + 1 ].xyz );
681 glNormal3fv( pvn[ i + 2 ].xyz );
682 glVertex3fv( pv[ i + 2 ].xyz );
683 glNormal3fv( pvn[ i ].xyz );
684 glVertex3fv( pv[ i ].xyz );
685 glNormal3fv( pvn[ i + 1 ].xyz );
686 glVertex3fv( pv[ i + 1 ].xyz );
693 } /* end else front_lighting_model != TelLModelNone */
699 if ( !p -> d.dlist ) p -> d.dlist = glGenLists ( 1 );
701 glNewList ( p -> d.dlist, GL_COMPILE_AND_EXECUTE );
705 if ( newList ) glEndList ();
707 if ( g_nDegenerateModel ) return;
711 glCallList ( g_fSkipRatio == 0.0 ? p -> d.list : p -> d.dlist );
713 if ( g_nDegenerateModel ) return;
717 } /* end if ( interior_style != TSM_EMPTY ) */
721 /* OCC11904 -- Temporarily disable environment mapping */
722 glPushAttrib(GL_ENABLE_BIT);
723 glDisable(GL_TEXTURE_1D);
724 glDisable(GL_TEXTURE_2D);
726 switch ( g_nDegenerateModel ) {
731 case 2: /* XXX_TDM_WIREFRAME */
735 case 3: /* XXX_TDM_MARKER */
736 draw_degenerates_as_points ( &p -> d, p -> vertices, p -> num_facets + 2 );
740 case 4: /* XXX_TDM_BBOX */
741 draw_degenerates_as_bboxs ( &p -> d, p -> vertices, p -> num_facets + 2 );
747 draw_edges ( p, edge_colour, interior_style, i );
749 draw_edges ( p, edge_colour, interior_style );
753 } /* end draw_tmesh */
755 /*----------------------------------------------------------------------*/
757 TriangleMeshDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
761 p = (tel_tmesh_data)data.pdata;
763 delete[] p->fnormals;
765 delete[] p->fcolours;
767 delete[] p->vertices;
769 delete[] p->vcolours;
771 delete[] p->vnormals;
772 if (p->vtexturecoord)
773 delete[] p->vtexturecoord;
775 if ( GET_GL_CONTEXT() != NULL ) {
777 if ( p -> d.list ) glDeleteLists ( p -> d.list, 1 );
778 if ( p -> d.dlist ) glDeleteLists ( p -> d.dlist, 1 );
790 /*----------------------------------------------------------------------*/
792 TriangleMeshPrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
797 p = (tel_tmesh_data)data.pdata;
799 fprintf(stdout, "TelTriangleMesh. Number of Facets : %d\n", p->num_facets);
800 switch( p->facet_flag )
804 fprintf( stdout, "\t\tFacet Flag : COLOUR\n" );
806 fprintf( stdout, "\t\tFacet Flag : NONE\n" );
811 fprintf( stdout, "\t\tFacet Flag : COLOURNORMAL\n" );
813 fprintf( stdout, "\t\tFacet Flag : NORMAL\n" );
817 switch( p->vertex_flag )
821 fprintf( stdout, "\t\tVertex Flag : COLOUR\n" );
823 fprintf( stdout, "\t\tVertex Flag : NONE\n" );
828 fprintf( stdout, "\t\tVertex Flag : COLOURNORMAL\n" );
830 fprintf( stdout, "\t\tVertex Flag : NORMAL\n" );
835 fprintf( stdout, "\n\t\tFacet Normals : " );
836 for( i = 0; i < p->num_facets; i++ )
837 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
838 p->fnormals[i].xyz[0],
839 p->fnormals[i].xyz[1],
840 p->fnormals[i].xyz[2] );
843 fprintf( stdout, "\n\t\tFacet Normals not specified\n" );
847 fprintf( stdout, "\n\t\tFacet Colours : " );
848 for( i = 0; i < p->num_facets; i++ )
849 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
850 p->fcolours[i].rgb[0],
851 p->fcolours[i].rgb[1],
852 p->fcolours[i].rgb[2] ); }
854 fprintf( stdout, "\n\t\tFacet Colours not specified\n" );
857 fprintf( stdout, "\n\t\tVertices : " );
858 for( i = 0; i < p->num_facets+2; i++ )
859 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
860 p->vertices[i].xyz[0],
861 p->vertices[i].xyz[1],
862 p->vertices[i].xyz[2] ); }
864 fprintf( stdout, "\n" );
867 fprintf( stdout, "\n\t\tVertex Colours : " );
868 for( i = 0; i < p->num_facets+2; i++ )
869 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
870 p->vcolours[i].rgb[0],
871 p->vcolours[i].rgb[1],
872 p->vcolours[i].rgb[2] ); }
874 fprintf( stdout, "\n\t\tVertex Colours not specified\n" );
878 fprintf( stdout, "\n\t\tVertex Normals : " );
879 for( i = 0; i < p->num_facets+2; i++ )
880 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
881 p->vnormals[i].xyz[0],
882 p->vnormals[i].xyz[1],
883 p->vnormals[i].xyz[2] ); }
885 fprintf( stdout, "\n\t\tVertex Normals not specified\n" );
887 if (p->vtexturecoord)
889 fprintf(stdout, "\n\t\tTexture Coordinates : ");
890 for (i=0; i<p->num_facets+2; i++)
891 fprintf(stdout, "\n\t\t v[%d] = %g %g", i,
892 p->vtexturecoord[i].xy[0],
893 p->vtexturecoord[i].xy[1]);
896 fprintf( stdout, "\n\t\tTexture Coordinates not specified\n");
898 fprintf( stdout, "\n" );
903 /*----------------------------------------------------------------------*/
905 static void draw_edges ( tel_tmesh_data p, tel_colour edge_colour, Tint interior_style )
908 static void draw_edges (
910 tel_colour edge_colour,
916 CMN_KEY k, k1, k2, k3, k4;
917 Tint i, edge_type, line_type_preserve, newList = 0;
918 Tfloat edge_width, line_width_preserve;
919 GLboolean texture_on;
922 if ( interior_style != TSM_HIDDENLINE && !forceDraw ) {
924 if ( interior_style != TSM_HIDDENLINE ) {
928 TsmGetAttri ( 1, &k );
930 if ( k.data.ldata == TOff ) return;
937 texture_on = IsTextureEnabled ();
938 if ( texture_on ) DisableTexture ();
940 k1.id = TelPolylineWidth;
941 k2.id = TelPolylineType;
943 k4.id = TelEdgeWidth;
944 TsmGetAttri ( 4, &k1, &k2, &k3, &k4 );
946 line_width_preserve = k1.data.fdata;
947 line_type_preserve = k2.data.ldata;
948 edge_type = k3.data.ldata;
949 edge_width = k4.data.fdata;
951 if ( line_width_preserve != edge_width ) {
953 k.id = TelPolylineWidth;
954 k.data.fdata = edge_width;
955 TsmSetAttri ( 1, &k );
959 if ( line_type_preserve != edge_type ) {
961 k.id = TelPolylineType;
962 k.data.ldata = edge_type;
963 TsmSetAttri ( 1, &k );
967 glColor3fv ( edge_colour -> rgb );
971 draw_line_loop ( p );
976 goto doDraw; /* Disable object display list out of animation */
982 if ( p -> d.degMode != 2 || p -> d.skipRatio != g_fSkipRatio || !p -> d.dlist ) {
984 if ( !p -> d.dlist ) p -> d.dlist = glGenLists ( 1 );
987 p -> d.skipRatio = g_fSkipRatio;
988 glNewList ( p -> d.dlist, GL_COMPILE_AND_EXECUTE );
991 glPushAttrib ( GL_DEPTH_BUFFER_BIT );
992 glDisable ( GL_DEPTH_TEST );
994 if ( g_fSkipRatio == 0.0 )
996 draw_line_loop ( p );
998 else if ( g_fSkipRatio != 1.0 ) {
1000 set_drawable_items ( p -> d.bDraw, p -> num_facets + 2 );
1002 for ( i = 0; i < p -> num_facets; ++i )
1004 if ( p -> d.bDraw[ i ] ) {
1006 glBegin ( GL_LINE_LOOP );
1007 glVertex3fv ( pv[ i ].xyz );
1008 glVertex3fv ( pv[ i + 1 ].xyz );
1009 glVertex3fv ( pv[ i + 2 ].xyz );
1017 if ( newList ) glEndList ();
1019 } else glCallList ( p -> d.dlist );
1023 if ( line_width_preserve != edge_width ) {
1025 k.id = TelPolylineWidth;
1026 k.data.fdata = line_width_preserve;
1027 TsmSetAttri ( 1, &k );
1031 if ( line_type_preserve != edge_type ) {
1033 k.id = TelPolylineType;
1034 k.data.ldata = line_type_preserve;
1035 TsmSetAttri ( 1, &k );
1039 if ( texture_on ) EnableTexture ();
1041 } /* end draw_edges */
1043 void draw_degenerates_as_points ( PDS_INTERNAL pd, tel_point p, Tint n ) {
1049 if ( !g_fAnimation )
1050 goto doDraw; /* Disable object display list out of animation */
1056 if ( pd -> degMode != 3 || pd -> skipRatio != g_fSkipRatio || !pd -> dlist ) {
1058 if ( !pd -> dlist ) pd -> dlist = glGenLists ( 1 );
1061 pd -> skipRatio = g_fSkipRatio;
1062 glNewList ( pd -> dlist, GL_COMPILE_AND_EXECUTE );
1065 if ( g_fSkipRatio == 0.0 ) {
1069 glBegin ( GL_POINTS );
1071 for ( i = 0; i < n; ++i ) glVertex3fv ( p[ i ].xyz );
1075 } else if ( g_fSkipRatio != 1.0 ) {
1077 set_drawable_items ( pd -> bDraw, n );
1079 glBegin ( GL_POINTS );
1081 for ( i = 0; i < n; ++i )
1083 if ( pd -> bDraw[ i ] ) glVertex3fv ( p[ i ].xyz );
1088 if ( newList ) glEndList ();
1090 } else glCallList ( pd -> dlist );
1092 } /* end draw_degenerates_as_points */
1094 void draw_degenerates_as_bboxs ( PDS_INTERNAL pd, tel_point p, Tint n ) {
1097 GLfloat minp[ 3 ] = { FLT_MAX, FLT_MAX, FLT_MAX };
1098 GLfloat maxp[ 3 ] = { FLT_MIN, FLT_MIN, FLT_MIN };
1102 if ( !g_fAnimation )
1103 goto doDraw; /* Disable object display list out of animation */
1109 if ( pd -> degMode != 4 || !pd -> dlist ) {
1111 if ( !pd -> dlist ) pd -> dlist = glGenLists ( 1 );
1115 glNewList ( pd -> dlist, GL_COMPILE_AND_EXECUTE );
1120 for ( i = 0; i < n; ++i ) {
1122 TEL_POINT pt = p[ i ];
1124 if ( pt.xyz[ 0 ] < minp[ 0 ] )
1125 minp[ 0 ] = pt.xyz[ 0 ] ;
1126 if ( pt.xyz[ 1 ] < minp[ 1 ] )
1127 minp[ 1 ] = pt.xyz[ 1 ] ;
1128 if ( pt.xyz[ 2 ] < minp[ 2 ] )
1129 minp[ 2 ] = pt.xyz[ 2 ] ;
1131 if ( pt.xyz[ 0 ] > maxp[ 0 ] )
1132 maxp[ 0 ] = pt.xyz[ 0 ] ;
1133 if ( pt.xyz[ 1 ] > maxp[ 1 ] )
1134 maxp[ 1 ] = pt.xyz[ 1 ] ;
1135 if ( pt.xyz[ 2 ] > maxp[ 2 ] )
1136 maxp[ 2 ] = pt.xyz[ 2 ] ;
1140 glBegin ( GL_LINE_STRIP );
1142 glVertex3fv ( minp );
1143 glVertex3f ( minp[ 0 ], maxp[ 1 ], minp[ 2 ] );
1144 glVertex3f ( minp[ 0 ], maxp[ 1 ], maxp[ 2 ] );
1145 glVertex3f ( minp[ 0 ], minp[ 1 ], maxp[ 2 ] );
1146 glVertex3f ( minp[ 0 ], minp[ 1 ], minp[ 2 ] );
1148 glVertex3f ( maxp[ 0 ], minp[ 1 ], minp[ 2 ] );
1149 glVertex3f ( maxp[ 0 ], maxp[ 1 ], minp[ 2 ] );
1150 glVertex3f ( maxp[ 0 ], maxp[ 1 ], maxp[ 2 ] );
1151 glVertex3f ( maxp[ 0 ], minp[ 1 ], maxp[ 2 ] );
1152 glVertex3f ( maxp[ 0 ], minp[ 1 ], minp[ 2 ] );
1154 glVertex3f ( maxp[ 0 ], minp[ 1 ], maxp[ 2 ] );
1155 glVertex3f ( minp[ 0 ], minp[ 1 ], maxp[ 2 ] );
1156 glVertex3f ( minp[ 0 ], maxp[ 1 ], maxp[ 2 ] );
1157 glVertex3fv ( maxp );
1158 glVertex3f ( maxp[ 0 ], maxp[ 1 ], minp[ 2 ] );
1159 glVertex3f ( minp[ 0 ], maxp[ 1 ], minp[ 2 ] );
1162 if ( newList ) glEndList ();
1164 } else glCallList ( pd -> dlist );
1166 } /* end draw_degenerates_as_bboxs */
1169 static void draw_line_loop ( tel_tmesh_data p ) {
1173 for ( i = 0; i < p -> num_facets; ++i ) {
1175 glBegin ( GL_LINE_LOOP );
1176 glVertex3fv ( p -> vertices[ i ].xyz );
1177 glVertex3fv ( p -> vertices[ i + 1 ].xyz );
1178 glVertex3fv ( p -> vertices[ i + 2 ].xyz );
1183 } /* end draw_line_loop */
1185 /*----------------------------------------------------------------------*/
1187 TriangleMeshInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
1192 TStatus status = TSuccess;
1195 d = (tel_tmesh_data)data.pdata;
1198 size_reqd += ( d->num_facets * sizeof( TEL_COLOUR ) );
1200 if( d->facet_flag == TEL_FA_NORMAL )
1201 size_reqd += ( d->num_facets * sizeof( TEL_POINT ) );
1203 size_reqd += ( (d->num_facets+2) * sizeof( TEL_POINT ) );
1206 size_reqd += ( (d->num_facets+2) * sizeof( TEL_COLOUR ) );
1208 if( d->vertex_flag == TEL_VT_NORMAL )
1209 size_reqd += ( (d->num_facets+2) * sizeof( TEL_POINT ) );
1211 for( i = 0; i < n; i++ )
1215 case INQ_GET_SIZE_ID:
1217 k[i]->data.ldata = size_reqd;
1221 case INQ_GET_CONTENT_ID:
1226 c = (TEL_INQ_CONTENT*)k[i]->data.pdata;
1227 c->act_size = size_reqd;
1231 w->trianglestrip3data.num_facets = d->num_facets;
1233 if( c->size >= size_reqd )
1235 if( d->facet_flag == TEL_FA_NORMAL )
1239 w->trianglestrip3data.fctflag = TEL_FAFLAG_COLOURNORMAL;
1240 w->trianglestrip3data.gnormals = (tel_point)(c->buf);
1241 for( j = 0; j < d->num_facets; j++ )
1243 w->trianglestrip3data.gnormals[j] = d->fnormals[j];
1245 cur_ptr += ( d->num_facets * sizeof( TEL_POINT ) );
1247 w->trianglestrip3data.facet_colour_vals =
1248 (tel_colour)(cur_ptr);
1249 for( j = 0; j < d->num_facets; j++ )
1251 w->trianglestrip3data.facet_colour_vals[j] =
1254 cur_ptr += ( d->num_facets * sizeof( TEL_COLOUR ) );
1258 w->trianglestrip3data.fctflag = TEL_FAFLAG_NORMAL;
1259 w->trianglestrip3data.facet_colour_vals = 0;
1260 w->trianglestrip3data.gnormals = (tel_point)(c->buf);
1261 for( j = 0; j < d->num_facets; j++ )
1263 w->trianglestrip3data.gnormals[j] = d->fnormals[j];
1265 cur_ptr += ( d->num_facets * sizeof( TEL_POINT ) );
1270 w->trianglestrip3data.gnormals = 0;
1273 w->trianglestrip3data.fctflag = TEL_FAFLAG_COLOUR;
1274 w->trianglestrip3data.facet_colour_vals =
1275 (tel_colour)(c->buf );
1276 for( j = 0; j < d->num_facets; j++ )
1278 w->trianglestrip3data.facet_colour_vals[j] =
1281 cur_ptr += ( d->num_facets * sizeof( TEL_COLOUR ) );
1285 w->trianglestrip3data.fctflag = TEL_FAFLAG_NONE;
1286 w->trianglestrip3data.facet_colour_vals = 0;
1290 w->trianglestrip3data.points = (tel_point)cur_ptr;
1291 for( j = 0; j < (d->num_facets+2); j++ )
1293 w->trianglestrip3data.points[j] = d->vertices[j];
1295 cur_ptr += ( (d->num_facets+2) * sizeof( TEL_POINT ) );
1297 if( d->vertex_flag == TEL_VT_NORMAL )
1301 w->trianglestrip3data.vrtflag = TEL_VTFLAG_COLOURNORMAL;
1302 w->trianglestrip3data.vnormals = (tel_point)(cur_ptr);
1303 for( j = 0; j < (d->num_facets+2); j++ )
1305 w->trianglestrip3data.vnormals[j] = d->vnormals[i];
1307 cur_ptr += ( (d->num_facets+2) * sizeof( TEL_POINT ) );
1309 w->trianglestrip3data.colours = (tel_colour)(cur_ptr);
1311 for( j = 0; j < (d->num_facets+2); j++ )
1313 w->trianglestrip3data.colours[j] = d->vcolours[i];
1318 w->trianglestrip3data.vrtflag = TEL_VTFLAG_NORMAL;
1319 w->trianglestrip3data.colours = 0;
1320 w->trianglestrip3data.vnormals = (tel_point)(cur_ptr);
1322 for( j = 0; j < (d->num_facets+2); j++ )
1324 w->trianglestrip3data.vnormals[j] = d->vnormals[i];
1330 w->trianglestrip3data.vnormals = 0;
1333 w->trianglestrip3data.vrtflag = TEL_VTFLAG_COLOUR;
1334 w->trianglestrip3data.colours = (tel_colour)(cur_ptr);
1335 for( j = 0; j < (d->num_facets+2); j++ )
1337 w->trianglestrip3data.colours[j] = d->vcolours[i];
1342 w->trianglestrip3data.vrtflag = TEL_VTFLAG_NONE;
1343 w->trianglestrip3data.colours = 0;
1357 /*----------------------------------------------------------------------*/