3 /***********************************************************************
14 HISTORIQUE DES MODIFICATIONS :
15 --------------------------------
16 xx-xx-xx : xxx ; Creation.
17 11-03-96 : FMN ; Correction warning compilation
18 01-04-96 : CAL ; Integration MINSK portage WNT
19 22-04-96 : FMN ; Suppression prototype inutile.
20 09-08-96 : FMN ; Suppression appel glMatrixMode() avant glGetFloatv()
21 21-10-96 : FMN ; Suppression LMC_COLOR fait dans OpenGl_execstruct.c
22 30-06-97 : FMN ; Suppression OpenGl_telem_light.h
23 18-07-97 : FMN ; Ajout desactivation des lights suivant front_lighting_model
24 21-07-97 : FMN ; Amelioration des performances OPTIMISATION_FMN
25 - suppression calcul inutile sur les front faces
26 27-08-97 : FMN ; Correction affichage des edges
27 On n'affiche que les edges dans le mode IS_EMPTY
28 10-09-97 : FMN ; Amelioration des perfs liees aux lights.
29 15-09-97 : PCT ; Ajout coordonnees textures
30 24-09-97 : FMN ; Suppression OPTIMISATION_FMN.
31 08-12-97 : FMN ; Suppression appel TsmGetAttri inutile.
32 31-12-97 : FMN ; Simplification pour le highlight
33 15-01-98 : FMN ; Ajout Hidden line
34 17-02-00 : EUG ; Degeneration support
35 17-02-00 : EUG ; Bitmap drawing support
36 08-03-01 : GG ; BUC60823 Avoid crash in the normal computation method
39 ************************************************************************/
41 #define BUC60876 /* GG 5/4/2001 Disable local display list
42 // when animation is not required
45 /*----------------------------------------------------------------------*/
51 #include <OpenGl_tgl_all.hxx>
59 #include <OpenGl_cmn_varargs.hxx>
60 #include <OpenGl_telem_attri.hxx>
61 #include <OpenGl_tsm.hxx>
62 #include <OpenGl_telem.hxx>
63 #include <OpenGl_telem_util.hxx>
64 #include <OpenGl_telem_highlight.hxx>
65 #include <OpenGl_telem_inquire.hxx>
66 #include <OpenGl_telem_view.hxx>
67 #include <OpenGl_tgl_funcs.hxx>
68 #include <OpenGl_LightBox.hxx>
69 #include <OpenGl_TextureBox.hxx>
70 #include <OpenGl_Memory.hxx>
72 /*----------------------------------------------------------------------*/
77 /*----------------------------------------------------------------------*/
82 extern Tint ForbidSetTextureMapping; /* currently defined in tsm/tsm.c */
86 # define DEF_DS_INTERNAL
87 # include <OpenGl_degeneration.hxx>
90 extern GLboolean g_fBitmap;
93 # define OPENGL_RAND() ( ( unsigned )( s_Rand = s_Rand * 214013L + 2531011L ))
95 extern int g_nDegenerateModel;
96 extern float g_fSkipRatio;
97 extern GLboolean g_fAnimation;
101 /*----------------------------------------------------------------------*/
103 struct TEL_QSTRIP_DATA
105 Tint shape_flag; /* TEL_SHAPE_UNKNOWN or TEL_SHAPE_COMPLEX or
106 TEL_SHAPE_CONVEX or TEL_SHAPE_CONCAVE */
107 Tint facet_flag; /* TEL_FA_NONE or TEL_FA_NORMAL */
108 Tint vertex_flag; /* TEL_VT_NONE or TEL_VT_NORMAL */
110 num_columns; /* Number of rows and columns */
111 tel_point fnormals; /* Facet normals */
112 tel_colour fcolours; /* Facet colours */
113 tel_point vertices; /* Vertices */
114 tel_colour vcolours; /* Vertex colour values */
115 tel_point vnormals; /* Vertex normals */
116 tel_texture_coord vtexturecoord; /* Texture coordinates */
120 IMPLEMENT_MEMORY_OPERATORS
122 typedef TEL_QSTRIP_DATA* tel_qstrip_data;
124 static TStatus QuadrangleDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
125 static TStatus QuadrangleAdd( TSM_ELEM_DATA, Tint, cmn_key* );
126 static TStatus QuadrangleDelete( TSM_ELEM_DATA, Tint, cmn_key* );
127 static TStatus QuadranglePrint( TSM_ELEM_DATA, Tint, cmn_key* );
128 static TStatus QuadrangleInquire( TSM_ELEM_DATA, Tint, cmn_key* );
131 draw_qstrip( tel_qstrip_data,
132 Tint, /* highlight flag */
133 Tint, /* front_lighting_model, */
134 Tint, /* interior_style, */
135 tel_colour /* edge_colour, */
139 static void draw_edges ( tel_qstrip_data, tel_colour, Tint, Tint );
140 extern void draw_degenerates_as_points ( PDS_INTERNAL, tel_point, Tint );
141 extern void draw_degenerates_as_bboxs ( PDS_INTERNAL, tel_point, Tint );
142 extern void set_drawable_items ( GLboolean*, int );
144 static void draw_edges ( tel_qstrip_data, tel_colour, Tint );
147 static void draw_line_strip ( tel_qstrip_data, tel_colour, Tint, Tint );
149 static TEL_QSTRIP_DATA qstrip_defaults = {
151 TEL_SHAPE_UNKNOWN, /* shape_flag */
152 TEL_FA_NONE, /* facet_flag */
153 TEL_VT_NONE /* vertex_flag */
157 static TStatus ( *MtdTbl[] ) ( TSM_ELEM_DATA, Tint, cmn_key* ) = {
159 QuadrangleDisplay, /* PickTraverse */
168 /*----------------------------------------------------------------------*/
170 MtblPtr TelQuadrangleInitClass ( TelType* el ) {
176 } /* end TelQuadrangleInitClass */
179 QuadrangleAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
184 tel_qstrip_data data;
186 for( i = 0; i < n; i++ )
188 if( k[i]->id == NUM_ROWS_ID )
194 if( !(k[i]->data.ldata) )
197 for( j = 0; j < n; j++ )
199 if( k[j]->id == NUM_COLUMNS_ID )
205 if( !(k[j]->data.ldata) )
208 data = new TEL_QSTRIP_DATA();
213 *data = qstrip_defaults;
215 data->num_rows = k[i]->data.ldata;
216 data->num_columns = k[j]->data.ldata;
217 nf = data->num_rows * data->num_columns;
218 nv = ( data->num_rows+1 ) * ( data->num_columns+1 );
220 data->vtexturecoord = 0;
222 for( i = 0; i < n; i++ )
228 data->shape_flag = k[i]->data.ldata;
233 data->facet_flag = TEL_FA_NORMAL;
234 data->fnormals = new TEL_POINT[nf];
235 memcpy( data->fnormals, k[i]->data.pdata, nf*sizeof(TEL_POINT) );
236 for( j = 0; j < nf; j++ )
237 vecnrm( data->fnormals[j].xyz );
240 case FACET_COLOUR_VALS_ID:
242 data->fcolours = new TEL_COLOUR[nf];
243 memcpy( data->fcolours, k[i]->data.pdata, nf*sizeof(TEL_COLOUR) );
248 data->vertices = new TEL_POINT[nv];
249 memcpy( data->vertices, k[i]->data.pdata, nv*sizeof(TEL_POINT) );
252 case VERTEX_COLOUR_VALS_ID:
254 data->vcolours = new TEL_COLOUR[nv];
255 memcpy( data->vcolours, k[i]->data.pdata, nv*sizeof(TEL_COLOUR) );
260 data->vertex_flag = TEL_VT_NORMAL;
261 data->vnormals = new TEL_POINT[nv];
262 memcpy( data->vnormals, k[i]->data.pdata, nv*sizeof(TEL_POINT) );
263 for( j = 0; j < nv; j++ )
264 vecnrm( data->vnormals[j].xyz );
267 case VTEXTURECOORD_ID:
269 data->vtexturecoord = new TEL_TEXTURE_COORD[nv];
270 memcpy( data->vtexturecoord, k[i]->data.pdata, nv*sizeof(TEL_TEXTURE_COORD) );
280 if( data->facet_flag != TEL_FA_NORMAL )
282 /* calculate the normals and store */
283 data->fnormals = new TEL_POINT[nf];
284 for( i = 0; i < nf; i++ )
286 TEL_POINT p1, p2, p3, p4;
289 r = i/data->num_columns;
290 c = i%data->num_columns;
292 id = r*(data->num_columns+1) + c;
293 p1 = data->vertices[id];
294 p2 = data->vertices[id+data->num_columns+1];
295 p3 = data->vertices[id+data->num_columns+2];
296 p4 = data->vertices[id+1];
298 p4.xyz[0] -= p2.xyz[0];
299 p4.xyz[1] -= p2.xyz[1];
300 p4.xyz[2] -= p2.xyz[2];
302 p4.xyz[0] += p1.xyz[0];
303 p4.xyz[1] += p1.xyz[1];
304 p4.xyz[2] += p1.xyz[2];
306 TelGetNormal( p4.xyz, p1.xyz, p3.xyz, data->fnormals[i].xyz );
309 for( j = 0; j < nf; j++ )
310 vecnrm( data->fnormals[j].xyz );
313 if( data->vertex_flag != TEL_VT_NORMAL )
316 /* calculate the vertex normals */
317 data->vnormals = new TEL_POINT[nv];
318 for( i = 0; i < nv; i++ )
321 data->vnormals[i] = data->fnormals[i];
322 else if( i == (nv-1) )
323 data->vnormals[i] = data->fnormals[nf-1];
324 else if( i == (nv-data->num_columns-1) )
325 data->vnormals[i] = data->fnormals[nf-data->num_columns];
326 else if( i == data->num_columns )
327 data->vnormals[i] = data->fnormals[i-1];
328 else if( i%(data->num_columns+1) == 0 )
330 r = i/(data->num_columns+1);
331 data->vnormals[i].xyz[0] =
332 ( data->fnormals[(r-1)*data->num_columns].xyz[0] +
333 data->fnormals[r*data->num_columns].xyz[0] ) / ( float )2.0;
334 data->vnormals[i].xyz[1] =
335 ( data->fnormals[(r-1)*data->num_columns].xyz[1] +
336 data->fnormals[r*data->num_columns].xyz[1] ) / ( float )2.0;
337 data->vnormals[i].xyz[2] =
338 ( data->fnormals[(r-1)*data->num_columns].xyz[2] +
339 data->fnormals[r*data->num_columns].xyz[2] ) / ( float )2.0;
341 else if( i <= data->num_columns )
343 data->vnormals[i].xyz[0] = ( data->fnormals[i-1].xyz[0] +
344 data->fnormals[i].xyz[0] ) / ( float )2.0;
345 data->vnormals[i].xyz[1] = ( data->fnormals[i-1].xyz[1] +
346 data->fnormals[i].xyz[1] ) / ( float )2.0;
347 data->vnormals[i].xyz[2] = ( data->fnormals[i-1].xyz[2] +
348 data->fnormals[i].xyz[2] ) / ( float )2.0;
350 else if( i >= (nv-data->num_columns-1 ) )
352 c = i%(data->num_columns+1);
353 id = nf-data->num_columns+c;
355 data->vnormals[i].xyz[0] = ( data->fnormals[id-1].xyz[0] +
356 data->fnormals[id].xyz[0] ) / ( float )2.0;
357 data->vnormals[i].xyz[1] = ( data->fnormals[id-1].xyz[1] +
358 data->fnormals[id].xyz[1] ) / ( float )2.0;
359 data->vnormals[i].xyz[2] = ( data->fnormals[id-1].xyz[2] +
360 data->fnormals[id].xyz[2] ) / ( float )2.0;
362 else if( (i+1)%(data->num_columns+1) == 0 )
364 r = (i+1)/(data->num_columns+1);
365 data->vnormals[i].xyz[0] =
366 ( data->fnormals[(r-1)*data->num_columns-1].xyz[0] +
367 data->fnormals[r*data->num_columns-1].xyz[0] ) / ( float )2.0;
368 data->vnormals[i].xyz[1] =
369 ( data->fnormals[(r-1)*data->num_columns-1].xyz[1] +
370 data->fnormals[r*data->num_columns-1].xyz[1] ) / ( float )2.0;
371 data->vnormals[i].xyz[2] =
372 ( data->fnormals[(r-1)*data->num_columns-1].xyz[2] +
373 data->fnormals[r*data->num_columns-1].xyz[2] ) / ( float )2.0;
377 r = i/(data->num_columns+1);
378 c = i%(data->num_columns+1);
380 id = r*data->num_columns+c;
382 data->vnormals[i].xyz[0] =
383 ( data->fnormals[id].xyz[0] +
384 data->fnormals[id-data->num_columns].xyz[0] +
385 data->fnormals[id-1].xyz[0] +
386 data->fnormals[id-data->num_columns-1].xyz[0] ) / ( float )4.0;
387 data->vnormals[i].xyz[1] =
388 ( data->fnormals[id].xyz[1] +
389 data->fnormals[id-data->num_columns].xyz[1] +
390 data->fnormals[id-1].xyz[1] +
391 data->fnormals[id-data->num_columns-1].xyz[1] ) / ( float )4.0;
392 data->vnormals[i].xyz[2] =
393 ( data->fnormals[id].xyz[2] +
394 data->fnormals[id-data->num_columns].xyz[2] +
395 data->fnormals[id-1].xyz[2] +
396 data->fnormals[id-data->num_columns-1].xyz[2] ) / ( float )4.0;
403 data -> d.degMode = 0;
404 data -> d.model = -1;
405 data -> d.skipRatio = 0.0F;
406 data->d.bDraw = new unsigned char[nv];
408 ((tsm_elem_data)(d.pdata))->pdata = data;
412 /*----------------------------------------------------------------------*/
415 QuadrangleDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
417 CMN_KEY k11, k12, k17, k111, k114;
419 Tint front_lighting_model;
421 TEL_COLOUR interior_colour;
422 TEL_COLOUR edge_colour;
426 k12.id = TelInteriorReflectanceEquation;
427 k17.id = TelInteriorStyle;
428 k111.id = TelInteriorColour;
429 k111.data.pdata = &interior_colour;
430 k114.id = TelEdgeColour;
431 k114.data.pdata = &edge_colour;
433 TsmGetAttri( 4, &k12, &k17, &k111, &k114);
435 front_lighting_model = k12.data.ldata;
436 interior_style = k17.data.ldata;
439 printf("QuadrangleDisplay \n");
443 * Use highlight colours
446 if( k[0]->id == TOn )
450 k11.id = TelHighlightIndex;
451 TsmGetAttri( 1, &k11 );
452 if( TelGetHighlightRep( TglActiveWs, k11.data.ldata, &hrep )
455 if( hrep.type == TelHLForcedColour )
457 edge_colour = interior_colour = hrep.col;
458 front_lighting_model = CALL_PHIGS_REFL_NONE;
460 else if( hrep.type == TelHLColour )
462 edge_colour = hrep.col;
468 TelGetHighlightRep( TglActiveWs, 0, &hrep );
469 if( hrep.type == TelHLForcedColour )
471 edge_colour = interior_colour = hrep.col;
472 front_lighting_model = CALL_PHIGS_REFL_NONE;
474 else if( hrep.type == TelHLColour )
476 edge_colour = hrep.col;
482 d = (tel_qstrip_data)data.pdata;
484 glColor3fv( interior_colour.rgb );
488 front_lighting_model,
495 /*----------------------------------------------------------------------*/
497 static void draw_qstrip (
500 Tint front_lighting_model,
502 tel_colour edge_colour
506 Tint i, m, newList = 0;
509 tel_point pv, pfn, pvn;
511 tel_texture_coord pvt;
518 pvt = p -> vtexturecoord;
520 if ( hflag == TOn ) {
528 if ( g_nDegenerateModel < 2 && interior_style != TSM_EMPTY ) {
530 if ( interior_style != TSM_EMPTY ) {
532 if ( front_lighting_model == CALL_PHIGS_REFL_NONE )
538 lighting_model = front_lighting_model;
540 nc = p -> num_columns;
542 nv = ( nr + 1 ) * ( nc + 1 );
546 goto doDraw; /* Disable object display list out of animation */
550 goto doDraw; /* display lists are NOT shared between */
551 /* window's context and bitmap's one */
553 if ( p -> d.model != front_lighting_model || !p -> d.list ||
554 p -> d.model == -1 ||
555 ( g_nDegenerateModel && p -> d.skipRatio != g_fSkipRatio )
558 p -> d.skipRatio = g_fSkipRatio;
559 p -> d.model = front_lighting_model;
560 p -> d.degMode = g_nDegenerateModel;
562 if ( g_fSkipRatio == 0.0 ) {
564 if ( !p -> d.list ) p -> d.list = glGenLists ( 1 );
566 glNewList ( p -> d.list, GL_COMPILE_AND_EXECUTE );
572 if ( lighting_model == CALL_PHIGS_REFL_NONE ) {
576 for ( m = 0; m < nr; ++m ) {
578 glBegin ( GL_QUAD_STRIP );
579 glColor3fv ( pvc[ m * ( nc + 1 ) ].rgb );
580 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
581 glColor3fv ( pvc[ ( m + 1 ) * ( nc + 1 ) ].rgb );
582 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
584 for ( i = 1; i < nc + 1; ++i ) {
586 glColor3fv ( pvc[ i + m * ( nc + 1 ) ].rgb );
587 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
588 glColor3fv ( pvc[ i + ( m + 1 ) * ( nc + 1 ) ].rgb );
589 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
599 glColor3fv ( pfc[ 0 ].rgb );
601 for ( m = 0; m < nr; ++m ) {
603 glBegin ( GL_QUAD_STRIP );
604 glColor3fv ( pfc[ m * nc ].rgb );
605 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
606 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
608 for ( i = 1; i < nc + 1; ++i ) {
610 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
611 glColor3fv ( pfc[ i - 1 + m * nc ].rgb );
612 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
622 for ( m = 0; m < nr; ++m ) {
624 glBegin ( GL_QUAD_STRIP );
625 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
626 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
628 for ( i = 1; i < nc + 1; ++i ) {
630 glVertex3fv( pv[ i + m * ( nc + 1 ) ].xyz );
631 glVertex3fv( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
641 } else { /* lighting_model != TelLModelNone */
643 if ( pvt && !ForbidSetTextureMapping )
645 for ( m = 0; m < nr; ++m ) {
647 glBegin ( GL_QUAD_STRIP );
648 glNormal3fv ( pvn[ m * ( nc + 1 ) ].xyz );
649 glTexCoord2fv ( pvt[ m * ( nc + 1 ) ].xy );
650 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
651 glNormal3fv ( pvn[ ( m + 1 ) * ( nc + 1 ) ].xyz );
652 glTexCoord2fv ( pvt[ ( m + 1 ) * ( nc + 1 ) ].xy );
653 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
655 for ( i = 1; i < nc + 1; ++i ) {
657 glNormal3fv ( pvn[ i + m * ( nc + 1 ) ].xyz );
658 glTexCoord2fv ( pvt[ i + m * ( nc + 1 ) ].xy );
659 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
660 glNormal3fv ( pvn[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
661 glTexCoord2fv ( pvt[ i + ( m + 1 ) * ( nc + 1 ) ].xy );
662 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
672 for ( m = 0; m < nr; ++m ) {
674 glBegin ( GL_QUAD_STRIP );
675 glNormal3fv ( pvn[ m * ( nc + 1 ) ].xyz );
676 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
677 glNormal3fv ( pvn[ ( m + 1 ) * ( nc + 1 ) ].xyz );
678 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
680 for ( i = 1; i < nc + 1; ++i ) {
682 glNormal3fv ( pvn[ i + m * ( nc + 1 ) ].xyz );
683 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
684 glNormal3fv ( pvn[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
685 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
695 } else if ( g_fSkipRatio != 1.0 ) {
697 set_drawable_items ( p -> d.bDraw, nr );
699 if ( !p -> d.dlist ) p -> d.dlist = glGenLists ( 1 );
701 glNewList ( p -> d.dlist, GL_COMPILE_AND_EXECUTE );
704 if ( lighting_model == CALL_PHIGS_REFL_NONE ) {
708 for ( m = 0; m < nr; ++m )
710 if ( p -> d.bDraw[ m ] ) {
712 glBegin ( GL_QUAD_STRIP );
713 glColor3fv ( pvc[ m * ( nc + 1 ) ].rgb );
714 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
715 glColor3fv ( pvc[ ( m + 1 ) * ( nc + 1 ) ].rgb );
716 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
718 for ( i = 1; i < nc + 1; ++i ) {
720 glColor3fv ( pvc[ i + ( m + 1 ) * ( nc + 1 ) ].rgb );
721 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
722 glColor3fv ( pvc[ i + m * ( nc + 1 ) ].rgb );
723 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
733 glColor3fv ( pfc[ 0 ].rgb );
735 for ( m = 0; m < nr; ++m )
737 if ( p -> d.bDraw[ m ] ) {
739 glBegin ( GL_QUADS );
740 glColor3fv ( pfc[ m * nc ].rgb );
741 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
742 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
744 for ( i = 1; i < nc + 1; ++i ) {
746 glColor3fv ( pfc[ i - 1 + m * nc ].rgb );
747 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
748 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
758 for ( m = 0; m < nr; ++m )
760 if ( p -> d.bDraw[ m ] ) {
762 glBegin ( GL_QUADS );
763 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
764 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
766 for ( i = 1; i < nc + 1; ++i ) {
768 glVertex3fv( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
769 glVertex3fv( pv[ i + m * ( nc + 1 ) ].xyz );
779 } else { /* lighting_model != TelLModelNone */
781 if ( pvt && !ForbidSetTextureMapping ) {
783 for ( m = 0; m < nr; ++m )
785 if ( p -> d.bDraw[ m ] ) {
787 glBegin ( GL_QUADS );
788 glNormal3fv ( pvn[ m * ( nc + 1 ) ].xyz );
789 glTexCoord2fv ( pvt[ m * ( nc + 1 ) ].xy );
790 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
791 glNormal3fv ( pvn[ ( m + 1 ) * ( nc + 1 ) ].xyz );
792 glTexCoord2fv ( pvt[ ( m + 1 ) * ( nc + 1 ) ].xy );
793 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
795 for ( i = 1; i < nc + 1; ++i ) {
797 glNormal3fv ( pvn[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
798 glTexCoord2fv ( pvt[ i + ( m + 1 ) * ( nc + 1 ) ].xy );
799 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
800 glNormal3fv ( pvn[ i + m * ( nc + 1 ) ].xyz );
801 glTexCoord2fv ( pvt[ i + m * ( nc + 1 ) ].xy );
802 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
812 for ( m = 0; m < nr; ++m )
814 if ( p -> d.bDraw[ m ] ) {
816 glBegin ( GL_QUADS );
817 glNormal3fv ( pvn[ m * ( nc + 1 ) ].xyz );
818 glVertex3fv ( pv[ m * ( nc + 1 ) ].xyz );
819 glNormal3fv ( pvn[ ( m + 1 ) * ( nc + 1 ) ].xyz );
820 glVertex3fv ( pv[ ( m + 1 ) * ( nc + 1 ) ].xyz );
822 for ( i = 1; i < nc + 1; ++i ) {
824 glNormal3fv ( pvn[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
825 glVertex3fv ( pv[ i + ( m + 1 ) * ( nc + 1 ) ].xyz );
826 glNormal3fv ( pvn[ i + m * ( nc + 1 ) ].xyz );
827 glVertex3fv ( pv[ i + m * ( nc + 1 ) ].xyz );
839 if ( !p -> d.dlist ) p -> d.dlist = glGenLists ( 1 );
841 glNewList ( p -> d.dlist, GL_COMPILE_AND_EXECUTE );
845 if ( newList ) glEndList ();
847 if ( g_nDegenerateModel ) return;
851 glCallList ( g_fSkipRatio == 0.0 ? p -> d.list : p -> d.dlist );
853 if ( g_nDegenerateModel ) return;
857 } /* end if ( interior_style != TSM_EMPTY ) */
861 /* OCC11904 -- Temporarily disable environment mapping */
862 glPushAttrib(GL_ENABLE_BIT);
863 glDisable(GL_TEXTURE_1D);
864 glDisable(GL_TEXTURE_2D);
866 switch ( g_nDegenerateModel ) {
871 case 2: /* XXX_TDM_WIREFRAME */
875 case 3: /* XXX_TDM_MARKER */
876 draw_degenerates_as_points (
877 &p -> d, p -> vertices, ( p -> num_rows + 1 ) * ( p -> num_columns + 1 )
884 case 4: /* XXX_TDM_BBOX */
885 draw_degenerates_as_bboxs (
886 &p -> d, p -> vertices, ( p -> num_rows + 1 ) * ( p -> num_columns + 1 )
895 draw_edges ( p, edge_colour, interior_style, i );
897 draw_edges ( p, edge_colour, interior_style );
901 } /* end draw_qstrip */
902 /*----------------------------------------------------------------------*/
904 QuadrangleDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
908 p = (tel_qstrip_data)data.pdata;
909 if( p->fnormals ) //cmn_freemem( p->fnormals );
910 delete[] p->fnormals;
911 if( p->fcolours ) //cmn_freemem( p->fcolours );
912 delete[] p->fcolours;
913 if( p->vertices ) //cmn_freemem( p->vertices );
914 delete[] p->vertices;
915 if( p->vcolours ) //cmn_freemem( p->vcolours );
916 delete[] p->vcolours;
917 if( p->vnormals ) //cmn_freemem( p->vnormals );
918 delete[] p->vnormals;
919 if (p->vtexturecoord) //cmn_freemem(p->vtexturecoord);
920 delete[] p->vtexturecoord;
928 /*----------------------------------------------------------------------*/
930 QuadranglePrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
933 tel_qstrip_data p = (tel_qstrip_data)data.pdata;
935 fprintf(stdout, "TelQuadrangle. ");
936 fprintf(stdout, "\n\tNumber of Rows : %d\n", p->num_rows);
937 fprintf(stdout, "\n\tNumber of Columns : %d\n", p->num_columns);
938 switch( p->shape_flag )
940 case TEL_SHAPE_UNKNOWN:
941 fprintf( stdout, "\t\tShape Flag : UNKNOWN\n" );
944 case TEL_SHAPE_COMPLEX:
945 fprintf( stdout, "\t\tShape Flag : COMPLEX\n" );
948 case TEL_SHAPE_CONCAVE:
949 fprintf( stdout, "\t\tShape Flag : CONCAVE\n" );
952 case TEL_SHAPE_CONVEX:
953 fprintf( stdout, "\t\tShape Flag : CONVEX\n" );
957 switch( p->facet_flag )
961 fprintf( stdout, "\t\tFacet Flag : COLOUR\n" );
963 fprintf( stdout, "\t\tFacet Flag : NONE\n" );
968 fprintf( stdout, "\t\tFacet Flag : COLOURNORMAL\n" );
970 fprintf( stdout, "\t\tFacet Flag : NORMAL\n" );
974 switch( p->vertex_flag )
978 fprintf( stdout, "\t\tVertex Flag : COLOUR\n" );
980 fprintf( stdout, "\t\tVertex Flag : NONE\n" );
985 fprintf( stdout, "\t\tVertex Flag : COLOURNORMAL\n" );
987 fprintf( stdout, "\t\tVertex Flag : NORMAL\n" );
992 fprintf( stdout, "\n\t\tFacet Normals : " );
993 for( i = 0; i < (p->num_rows * p->num_columns); i++ )
994 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
995 p->fnormals[i].xyz[0],
996 p->fnormals[i].xyz[1],
997 p->fnormals[i].xyz[2] );
1000 fprintf( stdout, "\n\t\tFacet Normals not specified\n" );
1004 fprintf( stdout, "\n\t\tFacet Colours : " );
1005 for( i = 0; i < (p->num_rows * p->num_columns+1); i++ )
1006 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
1007 p->fcolours[i].rgb[0],
1008 p->fcolours[i].rgb[1],
1009 p->fcolours[i].rgb[2] ); }
1011 fprintf( stdout, "\n\t\tFacet Colours not specified\n" );
1014 fprintf( stdout, "\n\t\tVertices : " );
1015 for( i = 0; i < (p->num_rows+1)*(p->num_columns+1); i++ )
1016 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
1017 p->vertices[i].xyz[0],
1018 p->vertices[i].xyz[1],
1019 p->vertices[i].xyz[2] ); }
1021 fprintf( stdout, "\n" );
1024 fprintf( stdout, "\n\t\tVertex Colours : " );
1025 for( i = 0; i < (p->num_rows+1)*(p->num_columns+1); i++ )
1026 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
1027 p->vcolours[i].rgb[0],
1028 p->vcolours[i].rgb[1],
1029 p->vcolours[i].rgb[2] ); }
1031 fprintf( stdout, "\n\t\tVertex Colours not specified\n" );
1035 fprintf( stdout, "\n\t\tVertex Normals : " );
1036 for( i = 0; i < (p->num_rows+1)*(p->num_columns+1); i++ )
1037 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
1038 p->vnormals[i].xyz[0],
1039 p->vnormals[i].xyz[1],
1040 p->vnormals[i].xyz[2] ); }
1042 fprintf( stdout, "\n\t\tVertex Normals not specified\n" );
1044 if (p->vtexturecoord)
1046 fprintf(stdout, "\n\t\tTexture Coordinates : ");
1047 for (i=0; i<(p->num_rows+1)*(p->num_columns+1); i++)
1048 fprintf(stdout, "\n\t\t v[%d] = %g %g", i,
1049 p->vtexturecoord[i].xy[0],
1050 p->vtexturecoord[i].xy[1]);
1053 fprintf( stdout, "\n\t\tTexture Coordinates not specified\n");
1055 fprintf( stdout, "\n" );
1060 /*----------------------------------------------------------------------*/
1062 static void draw_edges (
1064 tel_colour edge_colour,
1065 Tint interior_style,
1070 static void draw_edges (
1072 tel_colour edge_colour,
1077 CMN_KEY k, k1, k2, k3, k4;
1078 Tint nf, nc, newList = 0;
1079 Tint edge_type, line_type_preserve;
1080 Tfloat edge_width, line_width_preserve;
1081 GLboolean texture_on;
1084 if ( interior_style != TSM_HIDDENLINE && !forceDraw )
1087 if ( interior_style != TSM_HIDDENLINE )
1091 TsmGetAttri ( 1, &k );
1093 if ( k.data.ldata == TOff ) return;
1100 texture_on = IsTextureEnabled ();
1102 if ( texture_on ) DisableTexture ();
1104 k1.id = TelPolylineWidth;
1105 k2.id = TelPolylineType;
1106 k3.id = TelEdgeType;
1107 k4.id = TelEdgeWidth;
1108 TsmGetAttri ( 4, &k1, &k2, &k3, &k4 );
1110 line_width_preserve = k1.data.fdata;
1111 line_type_preserve = k2.data.ldata;
1112 edge_type = k3.data.ldata;
1113 edge_width = k4.data.fdata;
1115 nc = p -> num_columns;
1116 nf = p -> num_rows * p->num_columns;
1118 if ( line_width_preserve != edge_width ) {
1120 k.id = TelPolylineWidth;
1121 k.data.fdata = edge_width;
1122 TsmSetAttri ( 1, &k );
1126 if ( line_type_preserve != edge_type ) {
1128 k.id = TelPolylineType;
1129 k.data.ldata = edge_type;
1130 TsmSetAttri ( 1, &k );
1136 draw_line_strip ( p, edge_colour, nf, nc );
1140 if ( !g_fAnimation )
1141 goto doDraw; /* Disable object display list out of animation */
1147 if ( p -> d.degMode != 2 || p -> d.skipRatio != g_fSkipRatio || !p -> d.dlist ) {
1149 if ( !p -> d.dlist ) p -> d.dlist = glGenLists ( 1 );
1152 p -> d.skipRatio = g_fSkipRatio;
1153 glNewList ( p -> d.dlist, GL_COMPILE_AND_EXECUTE );
1156 glPushAttrib ( GL_DEPTH_BUFFER_BIT );
1157 glDisable ( GL_DEPTH_TEST );
1159 if ( g_fSkipRatio == 0.0 )
1161 draw_line_strip ( p, edge_colour, nf, nc );
1163 else if ( g_fSkipRatio != 1.0 ) {
1165 int i, m1, m2, n1, n2, n3, n4;
1167 set_drawable_items ( p -> d.bDraw, nf );
1169 glColor3fv ( edge_colour -> rgb );
1171 for ( i = 0; i < nf; ++i )
1173 if ( p -> d.bDraw[ i ] ) {
1175 glBegin ( GL_LINE_STRIP );
1178 n1 = m1 * ( nc + 1 ) + m2;
1183 glVertex3fv ( p -> vertices[ n1 ].xyz );
1184 glVertex3fv ( p -> vertices[ n2 ].xyz );
1185 glVertex3fv ( p -> vertices[ n3 ].xyz );
1186 glVertex3fv ( p -> vertices[ n4 ].xyz );
1187 glVertex3fv ( p -> vertices[ n1 ].xyz );
1195 if ( newList ) glEndList ();
1197 } else glCallList ( p -> d.dlist );
1201 if ( line_width_preserve != edge_width ) {
1203 k.id = TelPolylineWidth;
1204 k.data.fdata = line_width_preserve;
1205 TsmSetAttri ( 1, &k );
1209 if ( line_type_preserve != edge_type ) {
1211 k.id = TelPolylineType;
1212 k.data.ldata = line_type_preserve;
1213 TsmSetAttri ( 1, &k );
1217 if ( texture_on ) EnableTexture ();
1219 } /* end draw_edges */
1221 static void draw_line_strip ( tel_qstrip_data p, tel_colour c, Tint nf, Tint nc ) {
1223 int i, m1, m2, n1, n2, n3, n4;
1225 glColor3fv ( c -> rgb );
1227 for ( i = 0; i < nf; ++i ) {
1229 glBegin ( GL_LINE_STRIP );
1232 n1 = m1 * ( nc + 1 ) + m2;
1237 glVertex3fv ( p -> vertices[ n1 ].xyz );
1238 glVertex3fv ( p -> vertices[ n2 ].xyz );
1239 glVertex3fv ( p -> vertices[ n3 ].xyz );
1240 glVertex3fv ( p -> vertices[ n4 ].xyz );
1241 glVertex3fv ( p -> vertices[ n1 ].xyz );
1246 } /* end draw_line_strip */
1247 /*----------------------------------------------------------------------*/
1250 QuadrangleInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
1255 TStatus status = TSuccess;
1259 d = (tel_qstrip_data)data.pdata;
1260 nf = d->num_rows * d->num_columns;
1261 nv = ( d->num_rows + 1 ) * ( d->num_columns + 1 );
1264 size_reqd += ( nf * sizeof( TEL_COLOUR ) );
1266 if( d->facet_flag == TEL_FA_NORMAL )
1267 size_reqd += ( nf * sizeof( TEL_POINT ) );
1269 size_reqd += ( nv * sizeof( TEL_POINT ) );
1272 size_reqd += ( nv * sizeof( TEL_COLOUR ) );
1274 if( d->vertex_flag == TEL_VT_NORMAL )
1275 size_reqd += ( nv * sizeof( TEL_POINT ) );
1277 for( i = 0; i < n; i++ )
1281 case INQ_GET_SIZE_ID:
1283 k[i]->data.ldata = size_reqd;
1287 case INQ_GET_CONTENT_ID:
1292 c = (tel_inq_content)k[i]->data.pdata;
1293 c->act_size = size_reqd;
1297 w->quadmesh3data.shpflag = d->shape_flag;
1298 w->quadmesh3data.dim.x_dim = d->num_rows;
1299 w->quadmesh3data.dim.y_dim = d->num_columns;
1301 if( c->size >= size_reqd )
1303 if( d->facet_flag == TEL_FA_NORMAL )
1307 w->quadmesh3data.fctflag = TEL_FAFLAG_COLOURNORMAL;
1308 w->quadmesh3data.gnormals = (tel_point)(c->buf);
1309 for( j = 0; j < nf; j++ )
1311 w->quadmesh3data.gnormals[j] = d->fnormals[j];
1313 cur_ptr += ( nf * sizeof( TEL_POINT ) );
1315 w->quadmesh3data.facet_colour_vals =
1316 (tel_colour)(cur_ptr);
1317 for( j = 0; j < nf; j++ )
1319 w->quadmesh3data.facet_colour_vals[j] =
1322 cur_ptr += ( nf * sizeof( TEL_COLOUR ) );
1326 w->quadmesh3data.fctflag = TEL_FAFLAG_NORMAL;
1327 w->quadmesh3data.facet_colour_vals = 0;
1328 w->quadmesh3data.gnormals = (tel_point)(c->buf);
1329 for( j = 0; j < nf; j++ )
1331 w->quadmesh3data.gnormals[j] = d->fnormals[j];
1333 cur_ptr += ( nf * sizeof( TEL_POINT ) );
1338 w->quadmesh3data.gnormals = 0;
1341 w->quadmesh3data.fctflag = TEL_FAFLAG_COLOUR;
1342 w->quadmesh3data.facet_colour_vals =
1343 (tel_colour)(c->buf );
1344 for( j = 0; j < nf; j++ )
1346 w->quadmesh3data.facet_colour_vals[j] =
1349 cur_ptr += ( nf * sizeof( TEL_COLOUR ) );
1353 w->quadmesh3data.fctflag = TEL_FAFLAG_NONE;
1354 w->quadmesh3data.facet_colour_vals = 0;
1358 w->quadmesh3data.points = (tel_point)cur_ptr;
1359 for( j = 0; j < nv; j++ )
1361 w->quadmesh3data.points[j] = d->vertices[j];
1363 cur_ptr += ( nv * sizeof( TEL_POINT ) );
1365 if( d->vertex_flag == TEL_VT_NORMAL )
1369 w->quadmesh3data.vrtflag = TEL_VTFLAG_COLOURNORMAL;
1370 w->quadmesh3data.vnormals = (tel_point)(cur_ptr);
1371 for( j = 0; j < nv; j++ )
1373 w->quadmesh3data.vnormals[j] = d->vnormals[i];
1375 cur_ptr += ( nv * sizeof( TEL_POINT ) );
1377 w->quadmesh3data.colours = (tel_colour)(cur_ptr);
1379 for( j = 0; j < nv; j++ )
1381 w->quadmesh3data.colours[j] = d->vcolours[i];
1386 w->quadmesh3data.vrtflag = TEL_VTFLAG_NORMAL;
1387 w->quadmesh3data.colours = 0;
1388 w->quadmesh3data.vnormals = (tel_point)(cur_ptr);
1390 for( j = 0; j < nv; j++ )
1392 w->quadmesh3data.vnormals[j] = d->vnormals[i];
1398 w->quadmesh3data.vnormals = 0;
1401 w->quadmesh3data.vrtflag = TEL_VTFLAG_COLOUR;
1402 w->quadmesh3data.colours = (tel_colour)(cur_ptr);
1403 for( j = 0; j < nv; j++ )
1405 w->quadmesh3data.colours[j] = d->vcolours[i];
1410 w->quadmesh3data.vrtflag = TEL_VTFLAG_NONE;
1411 w->quadmesh3data.colours = 0;
1426 /*----------------------------------------------------------------------*/