1 /***********************************************************************
5 File OpenGl_polygonholes :
12 HISTORIQUE DES MODIFICATIONS :
13 --------------------------------
14 xx-xx-xx : xxx ; Creation.
15 11-03-96 : FMN ; Correction warning compilation
16 01-04-96 : CAL ; Integration MINSK portage WNT
17 09-08-96 : FMN ; Suppression appel glMatrixMode() avant glGetFloatv()
18 21-10-96 : FMN ; Suppression LMC_COLOR fait dans OpenGl_execstruct.c
19 23-12-97 : FMN ; Suppression TelSetFrontFaceAttri et TelSetBackFaceAttri
20 Suppression TelBackInteriorStyle, TelBackInteriorStyleIndex
21 et TelBackInteriorShadingMethod
22 03-03-98 : FMN ; Suppression variable externe TglWhetherPerspective
23 08-03-01 : GG ; BUC60823 Avoid crash in the normal computation method
26 ************************************************************************/
28 /*----------------------------------------------------------------------*/
34 #include <OpenGl_tgl_all.hxx>
40 #include <OpenGl_cmn_varargs.hxx>
41 #include <OpenGl_Extension.hxx>
42 #include <OpenGl_telem_attri.hxx>
43 #include <OpenGl_tsm.hxx>
44 #include <OpenGl_telem.hxx>
45 #include <OpenGl_telem_util.hxx>
46 #include <OpenGl_telem_highlight.hxx>
47 #include <OpenGl_telem_inquire.hxx>
48 #include <OpenGl_telem_view.hxx>
49 #include <OpenGl_tgl_funcs.hxx>
50 #include <OpenGl_Memory.hxx>
53 #if !defined(APIENTRY)
56 # define STATIC static
60 typedef double GLUcoord;
64 /*----------------------------------------------------------------------*/
69 static TStatus PolygonHolesDisplay( TSM_ELEM_DATA, Tint, cmn_key* );
70 static TStatus PolygonHolesAdd( TSM_ELEM_DATA, Tint, cmn_key* );
71 static TStatus PolygonHolesDelete( TSM_ELEM_DATA, Tint, cmn_key* );
72 static TStatus PolygonHolesPrint( TSM_ELEM_DATA, Tint, cmn_key* );
73 static TStatus PolygonHolesInquire( TSM_ELEM_DATA, Tint, cmn_key* );
75 #if !defined(GLU_VERSION_1_2)
76 #define GLUtesselator GLUtriangulatorObj
77 void gluTessBeginContour();
78 void gluTessBeginPolygon();
79 void gluTessEndPolygon();
80 void gluTessEndContour();
84 /*----------------------------------------------------------------------*/
93 IMPLEMENT_MEMORY_OPERATORS
95 typedef EXTRA_VERTEX* extra_vertex;
99 Tint ts_num, ts_alloc;
100 void **tmesh_sequence;
101 GLenum triangle_type; /* FSXXX OPTI */
102 IMPLEMENT_MEMORY_OPERATORS
110 IMPLEMENT_MEMORY_OPERATORS
113 struct TEL_POLYGON_HOLES_DATA
115 Tint num_vertices; /* Number of vertices */
116 Tint facet_flag; /* TEL_FA_NONE or TEL_FA_NORMAL */
117 Tint vertex_flag; /* TEL_VT_NONE or TEL_VT_NORMAL */
118 Tint shape_flag; /* TEL_SHAPE_UNKNOWN or TEL_SHAPE_COMPLEX or
119 TEL_SHAPE_CONVEX or TEL_SHAPE_CONCAVE */
120 TEL_POINT fnormal; /* Facet normal */
121 Tint *edgevis; /* edge visibility flags */
122 tel_colour fcolour; /* Facet colour */
123 Tint num_bounds; /* number of bounds */
124 Tint *bounds; /* Array of length num_bounds */
125 tel_point vertices; /* Vertices */
126 tel_colour vcolours; /* Vertex colour values */
127 tel_point vnormals; /* Vertex normals */
128 DISPLAY_ *display; /* FSXXX plus utilise ? */
129 GLuint triangle_dl1; /* triangle display list 1 */
130 GLuint triangle_dl2; /* triangle display list 2 */
131 GLuint triangle_dl3; /* triangle display list 3 */
133 typedef TEL_POLYGON_HOLES_DATA* tel_polygon_holes_data;
135 static TEL_POLYGON_HOLES_DATA polygon_holes_defaults =
137 0, /* num_vertices */
138 TEL_FA_NONE, /* facet_flag */
139 TEL_VT_NONE, /* vertex_flag */
140 TEL_SHAPE_UNKNOWN, /* shape_flag */
141 {{ ( float )0.0, ( float )0.0, ( float )0.0 }}, /* fnormal */
150 0, /* triangle_dl1 */
151 0, /* triangle_dl2 */
155 static void bgntriangulate( tel_polygon_holes_data, void (APIENTRY*)() );
156 static void endtriangulate(void);
157 STATIC void APIENTRY out_vertex1( void* );
158 STATIC void APIENTRY out_vertex2( void* );
159 STATIC void APIENTRY out_vertex3( void* );
160 static void draw_tmesh( tel_polygon_holes_data, Tint );
161 static void draw_polygon_holes( tel_polygon_holes_data, Tint,
163 static void draw_edges( tel_polygon_holes_data, Tmatrix3, tel_colour, Tint,
164 TelCullMode, Tint, Tint );
166 static TStatus (*MtdTbl[])( TSM_ELEM_DATA, Tint, cmn_key* ) =
168 PolygonHolesDisplay, /* PickTraverse */
178 TelPolygonHolesInitClass( TelType* el )
180 *el = TelPolygonHoles;
185 PolygonHolesAdd( TSM_ELEM_DATA d, Tint n, cmn_key *k )
188 tel_polygon_holes_data data;
190 for( i = 0; i < n; i++ )
192 if( k[i]->id == NUM_FACETS_ID )
198 if( !(k[i]->data.ldata) )
201 for( j = 0; j < n; j++ )
203 if( k[j]->id == BOUNDS_DATA_ID )
209 data = new TEL_POLYGON_HOLES_DATA();
214 memcpy( data, &polygon_holes_defaults, sizeof(TEL_POLYGON_HOLES_DATA) );
216 data->num_bounds = k[i]->data.ldata;
217 data->bounds = new Tint[data->num_bounds];
218 memcpy( data->bounds, k[j]->data.pdata, data->num_bounds*sizeof(Tint) );
220 for( m = 0, data->num_vertices = 0; m < data->num_bounds; m++ )
221 data->num_vertices += data->bounds[m];
223 for( i = 0; i < n; i++ )
225 if( k[i]->id == VERTICES_ID )
231 if( !(k[i]->data.ldata) )
234 data->vertices = new TEL_POINT[data->num_vertices];
235 memcpy( data->vertices, k[i]->data.pdata, data->num_vertices*sizeof(TEL_POINT) );
237 for( i = 0; i < n; i++ )
242 data->facet_flag = TEL_FA_NORMAL;
243 memcpy( &data->fnormal, k[i]->data.pdata, sizeof(TEL_POINT) );
244 vecnrm( data->fnormal.xyz );
247 case FACET_COLOUR_VALS_ID:
248 data->fcolour = new TEL_COLOUR();
249 memcpy( data->fcolour, k[i]->data.pdata, sizeof(TEL_COLOUR) );
253 data->edgevis = new Tint[data->num_vertices];
254 memcpy( data->edgevis, k[i]->data.pdata, sizeof(Tint) );
257 case VERTEX_COLOUR_VALS_ID:
258 data->vcolours = new TEL_COLOUR[data->num_vertices];
259 memcpy( data->vcolours, k[i]->data.pdata, data->num_vertices*sizeof(TEL_COLOUR) );
263 data->vertex_flag = TEL_VT_NORMAL;
264 data->vnormals = new TEL_POINT[data->num_vertices];
265 memcpy( data->vnormals, k[i]->data.pdata, data->num_vertices*sizeof(TEL_POINT) );
266 for( j = 0; j < data->num_vertices; j++ )
267 vecnrm( data->vnormals[j].xyz );
271 data->shape_flag = k[i]->data.ldata;
276 if( data->facet_flag != TEL_FA_NORMAL )
279 TelGetPolygonNormal( data->vertices, NULL,
280 data->num_vertices, data->fnormal.xyz );
282 TelGetNormal( data->vertices[0].xyz, data->vertices[1].xyz,
283 data->vertices[2].xyz, data->fnormal.xyz );
284 vecnrm( data->fnormal.xyz );
287 ((tsm_elem_data)(d.pdata))->pdata = data;
295 PolygonHolesDisplay( TSM_ELEM_DATA data, Tint n, cmn_key *k )
299 CMN_KEY k11, k12, k13, k14, k16, k17, k19, k111,
303 Tint front_lighting_model, back_lighting_model;
304 Tint front_lighting_model_preserve, back_lighting_model_preserve;
305 Tint front_shading_method;
308 TEL_COLOUR interior_colour, back_interior_colour;
309 TEL_COLOUR point_colour, edge_colour;
310 TelCullMode face_culling_mode;
311 Tint face_distinguishing_mode;
313 tel_polygon_holes_data d;
315 k11.id = TelFaceDistinguishingMode;
316 k12.id = TelInteriorReflectanceEquation;
317 k13.id = TelInteriorShadingMethod;
318 k14.id = TelBackInteriorReflectanceEquation;
319 k16.id = TelFaceCullingMode;
320 k17.id = TelInteriorStyle;
321 k19.id = TelInteriorStyleIndex;
322 k111.id = TelInteriorColour;
323 k111.data.pdata = &interior_colour;
324 k112.id = TelBackInteriorColour;
325 k112.data.pdata = &back_interior_colour;
326 k113.id = TelPolymarkerColour;
327 k113.data.pdata = &point_colour;
328 k117.id = TelEdgeColour;
329 k117.data.pdata = &edge_colour;
331 TsmGetAttri( 11, &k11, &k12, &k13, &k14, &k16, &k17,
332 &k19, &k111, &k112, &k113, &k117 );
334 face_distinguishing_mode = k11.data.ldata;
335 front_lighting_model = k12.data.ldata;
336 front_lighting_model_preserve = k12.data.ldata;
337 front_shading_method = k13.data.ldata;
338 back_lighting_model = k14.data.ldata;
339 back_lighting_model_preserve = k14.data.ldata;
340 face_culling_mode = (TelCullMode)k16.data.ldata;
341 interior_style = k17.data.ldata;
342 interior_index = k19.data.ldata;
344 if( k[0]->id == TOn )
345 { /* Use highlight colours */
349 k11.id = TelHighlightIndex;
350 TsmGetAttri( 1, &k11 );
351 if( TelGetHighlightRep( TglActiveWs, k11.data.ldata, &hrep )
354 if( hrep.type == TelHLForcedColour )
356 edge_colour = back_interior_colour = interior_colour = hrep.col;
357 front_lighting_model = back_lighting_model = CALL_PHIGS_REFL_NONE;
358 kkk.id = TelInteriorReflectanceEquation;
359 kkk.data.ldata = CALL_PHIGS_REFL_NONE;
360 kkl.id = TelBackInteriorReflectanceEquation;
361 kkl.data.ldata = CALL_PHIGS_REFL_NONE;
362 TsmSetAttri( 2, &kkk, &kkl );
367 edge_colour = hrep.col;
373 TelGetHighlightRep( TglActiveWs, 0, &hrep );
374 if( hrep.type == TelHLForcedColour )
376 back_interior_colour = interior_colour = hrep.col;
377 front_lighting_model = back_lighting_model = CALL_PHIGS_REFL_NONE;
378 kkk.id = TelInteriorReflectanceEquation;
379 kkk.data.ldata = CALL_PHIGS_REFL_NONE;
380 kkl.id = TelBackInteriorReflectanceEquation;
381 kkl.data.ldata = CALL_PHIGS_REFL_NONE;
382 TsmSetAttri( 2, &kkk, &kkl );
390 d = (tel_polygon_holes_data)data.pdata;
392 glGetFloatv(GL_MODELVIEW_MATRIX, (GLfloat *) mat);
394 if( face_distinguishing_mode == TOn )
396 if( ( face_culling_mode == TelCullBack && front_face ) ||
397 ( face_culling_mode == TelCullNone && front_face ) )
399 glColor3fv( interior_colour.rgb );
401 draw_polygon_holes(d, interior_style, front_lighting_model, k[0]->id);
403 else if( ( face_culling_mode == TelCullFront && !front_face ) ||
404 ( face_culling_mode == TelCullNone && !front_face ) )
407 glColor3fv( back_interior_colour.rgb );
409 draw_polygon_holes( d, interior_style,
410 back_lighting_model, k[0]->id);
415 if( ( face_culling_mode == TelCullBack && front_face ) ||
416 ( face_culling_mode == TelCullFront && !front_face ) ||
417 ( face_culling_mode == TelCullNone ) )
419 glColor3fv( interior_colour.rgb );
421 draw_polygon_holes(d, interior_style, front_lighting_model, k[0]->id);
426 /*A remplacer par le call-back GLU_EDGE_FLAG , A TESTER */
427 draw_edges( d, mat, &edge_colour, face_distinguishing_mode,
428 face_culling_mode, interior_style, interior_style );
434 kkk.id = TelInteriorReflectanceEquation;
435 kkk.data.ldata = front_lighting_model_preserve;
436 kkl.id = TelBackInteriorReflectanceEquation;
437 kkl.data.ldata = back_lighting_model_preserve;
438 TsmSetAttri( 2, &kkk, &kkl );
445 static GLUtesselator *tripak;
448 draw_polygon_holes( tel_polygon_holes_data d,
449 Tint style, Tint u, Tint hflag )
468 glColor3fv( pfc->rgb );
469 if( u != CALL_PHIGS_REFL_NONE )
470 glNormal3fv( d->fnormal.xyz );
472 if( d->display == 0 )
475 if( u == CALL_PHIGS_REFL_NONE )
479 bgntriangulate( d, (void (APIENTRY*)())out_vertex2 );
483 bgntriangulate( d, (void (APIENTRY*)())out_vertex1 );
490 bgntriangulate( d, (void (APIENTRY*)())out_vertex3 );
494 bgntriangulate( d, (void (APIENTRY*)())out_vertex1 );
497 gluTessBeginPolygon( tripak, NULL );
498 for( i = 0, m = 0; i < d->num_bounds; i++ )
500 gluTessBeginContour( tripak );
501 for( j = 0; j < d->bounds[i]; j++ )
503 xyz[0] = d->vertices[m].xyz[0];
504 xyz[1] = d->vertices[m].xyz[1];
505 xyz[2] = d->vertices[m].xyz[2];
507 gluTessVertex( tripak, xyz, (void *)m );
511 v[ 0 ] = d -> vertices[ m ].xyz[ 0 ];
512 v[ 1 ] = d -> vertices[ m ].xyz[ 1 ];
513 v[ 2 ] = d -> vertices[ m ].xyz[ 2 ];
515 gluTessVertex ( tripak, v, ( void* )m );
520 gluTessEndContour( tripak );
522 gluTessEndPolygon( tripak );
527 if( u == CALL_PHIGS_REFL_NONE )
547 draw_tmesh( tel_polygon_holes_data d, Tint v )
554 for( i = 0; i < dis->num_of_seq; i++ )
558 glBegin(s->triangle_type);
563 for( j = 0, k = 0; j < s->ts_num; j++ )
565 if ( s->tmesh_sequence[j] < (void *)0xffff ) {
566 glVertex3fv( d->vertices[ (long)s->tmesh_sequence[ j ] ].xyz );
569 extra_vertex b = (extra_vertex)s->tmesh_sequence[j];
570 glVertex3fv( b->vert );
577 for( j = 0, k = 0; j < s->ts_num; j++ )
579 if ( s->tmesh_sequence[j] < (void *)0xffff ) {
580 glColor3fv( d->vcolours[ (long) s->tmesh_sequence[ j ] ].rgb );
581 glVertex3fv( d->vertices[ (long) s->tmesh_sequence[ j ] ].xyz );
583 extra_vertex b = (extra_vertex)s->tmesh_sequence[j];
584 glColor3fv( d->vcolours[(b->ind)].rgb);
585 glVertex3fv( b->vert );
592 for( j = 0, k = 0; j < s->ts_num; j++ )
594 if ( s->tmesh_sequence[j] < (void *)0xffff) {
595 glNormal3fv( d->vnormals[ (long) s->tmesh_sequence[ j ] ].xyz );
596 glVertex3fv( d->vertices[ (long) s->tmesh_sequence[ j ] ].xyz );
598 extra_vertex b = (extra_vertex)s->tmesh_sequence[j];
599 glNormal3fv( d->vnormals[(b->ind)].xyz);
600 glVertex3fv( b->vert );
612 PolygonHolesDelete( TSM_ELEM_DATA data, Tint n, cmn_key *k )
614 tel_polygon_holes_data p = (tel_polygon_holes_data)data.pdata;
616 //cmn_freemem( p->fcolour );
619 //cmn_freemem( p->vertices );
620 delete[] p->vertices;
622 //cmn_freemem( p->vcolours );
623 delete[] p->vcolours;
625 //cmn_freemem( p->vnormals );
626 delete[] p->vnormals;
628 //cmn_freemem( p->bounds );
631 //cmn_freemem( p->edgevis );
637 for( i = 0; i < p->display->num_of_seq; i++ )
639 if( p->display->seq[i].tmesh_sequence ) {
640 for ( j = 0; j < p->display->seq[i].ts_num ; j++ ) {
641 if ( p->display->seq[i].tmesh_sequence[j] >= (void *)0xffff )
642 free(p->display->seq[i].tmesh_sequence[j]);
645 delete[] p->display->seq[i].tmesh_sequence;
647 delete[] p->display->seq;
659 PolygonHolesPrint( TSM_ELEM_DATA data, Tint n, cmn_key *k )
662 tel_polygon_holes_data p = (tel_polygon_holes_data)data.pdata;
664 fprintf( stdout, "TelPolygonHoles. Number of bounds: %d\n", p->num_bounds );
665 switch( p->shape_flag )
667 case TEL_SHAPE_UNKNOWN:
668 fprintf( stdout, "\t\tShape Flag : UNKNOWN\n" );
671 case TEL_SHAPE_COMPLEX:
672 fprintf( stdout, "\t\tShape Flag : COMPLEX\n" );
675 case TEL_SHAPE_CONCAVE:
676 fprintf( stdout, "\t\tShape Flag : CONCAVE\n" );
679 case TEL_SHAPE_CONVEX:
680 fprintf( stdout, "\t\tShape Flag : CONVEX\n" );
684 switch( p->facet_flag )
688 fprintf( stdout, "\t\tFacet Flag : COLOUR\n" );
690 fprintf( stdout, "\t\tFacet Flag : NONE\n" );
695 fprintf( stdout, "\t\tFacet Flag : COLOURNORMAL\n" );
697 fprintf( stdout, "\t\tFacet Flag : NORMAL\n" );
700 switch( p->vertex_flag )
704 fprintf( stdout, "\t\tVertex Flag : COLOUR\n" );
706 fprintf( stdout, "\t\tVertex Flag : NONE\n" );
711 fprintf( stdout, "\t\tVertex Flag : COLOURNORMAL\n" );
713 fprintf( stdout, "\t\tVertex Flag : NORMAL\n" );
716 fprintf( stdout, "\t\tFacet Normal : %g %g %g\n", p->fnormal.xyz[0],
720 fprintf( stdout, "\t\tFacet Colour : %g %g %g\n", p->fcolour->rgb[0],
722 p->fcolour->rgb[2] );
724 fprintf( stdout, "\n\t\tFacet Colour not specified\n" );
728 fprintf( stdout, "\t\tEdge Visibility Data :\n" );
729 for( i = 0; i < p->num_vertices; i++ )
730 fprintf( stdout, "\t\t%d ", p->edgevis[i] );
731 fprintf( stdout, "\n" );
736 fprintf( stdout, "\t\tBounds array :\n" );
737 for( i = 0; i < p->num_bounds; i++ )
738 fprintf( stdout, "\t\tb[%d] %d \n", i, p->bounds[i] );
743 fprintf( stdout, "\n\t\tVertices : " );
744 for( i = 0; i < p->num_vertices; i++ )
745 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
746 p->vertices[i].xyz[0],
747 p->vertices[i].xyz[1],
748 p->vertices[i].xyz[2] );
751 fprintf( stdout, "\n" );
754 fprintf( stdout, "\n\t\tVertex Colours : " );
755 for( i = 0; i < p->num_vertices; i++ )
756 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
757 p->vcolours[i].rgb[0],
758 p->vcolours[i].rgb[1],
759 p->vcolours[i].rgb[2] );
762 fprintf( stdout, "\n\t\tVertex Colours not specified\n" );
766 fprintf( stdout, "\n\t\tVertex Normals : " );
767 for( i = 0; i < p->num_vertices; i++ )
768 fprintf( stdout, "\n\t\t v[%d] = %g %g %g", i,
769 p->vnormals[i].xyz[0],
770 p->vnormals[i].xyz[1],
771 p->vnormals[i].xyz[2] );
774 fprintf( stdout, "\n\t\tVertex Normals not specified\n" );
775 fprintf( stdout, "\n" );
781 PolygonHolesInquire( TSM_ELEM_DATA data, Tint n, cmn_key *k )
785 TStatus status = TSuccess;
787 tel_polygon_holes_data d = (tel_polygon_holes_data)data.pdata;
790 size_reqd += sizeof( TEL_COLOUR );
792 if( d->facet_flag == TEL_FA_NORMAL )
793 size_reqd += sizeof( TEL_POINT );
796 size_reqd += ( d->num_vertices * sizeof( Tint ) );
798 size_reqd += ( d->num_bounds * sizeof( Tint ) );
800 size_reqd += ( d->num_vertices * sizeof( TEL_POINT ) );
803 size_reqd += ( d->num_vertices * sizeof( TEL_COLOUR ) );
805 if( d->vertex_flag == TEL_VT_NORMAL )
806 size_reqd += ( d->num_vertices * sizeof( TEL_POINT ) );
808 for( i = 0; i < n; i++ )
812 case INQ_GET_SIZE_ID:
814 k[i]->data.ldata = size_reqd;
818 case INQ_GET_CONTENT_ID:
823 c = (tel_inq_content)k[i]->data.pdata;
824 c->act_size = size_reqd;
828 w->fillareaset3data.num_bounds = d->num_bounds;
829 w->fillareaset3data.shpflag = d->shape_flag;
832 w->fillareaset3data.edgflag = TOn;
834 w->fillareaset3data.edgflag = TOff;
836 if( c->size >= size_reqd )
838 if( d->facet_flag == TEL_FA_NORMAL )
842 w->fillareaset3data.faflag = TEL_FAFLAG_COLOURNORMAL;
843 w->fillareaset3data.gnormal = (tel_point)(c->buf);
844 *(w->fillareaset3data.gnormal) = d->fnormal;
845 w->fillareaset3data.facet_colour_val =
846 (tel_colour)(c->buf + sizeof( TEL_POINT ) );
847 *(w->fillareaset3data.facet_colour_val) = *(d->fcolour);
848 cur_ptr = c->buf + sizeof( TEL_POINT ) +
849 sizeof( TEL_COLOUR );
853 w->fillareaset3data.faflag = TEL_FAFLAG_NORMAL;
854 w->fillareaset3data.facet_colour_val = 0;
855 w->fillareaset3data.gnormal = (tel_point)(c->buf);
856 *(w->fillareaset3data.gnormal) = d->fnormal;
857 cur_ptr = c->buf + sizeof( TEL_POINT );
862 w->fillareaset3data.gnormal = 0;
865 w->fillareaset3data.faflag = TEL_FAFLAG_COLOUR;
866 w->fillareaset3data.facet_colour_val = (tel_colour)(c->buf );
867 *(w->fillareaset3data.facet_colour_val) = *(d->fcolour);
868 cur_ptr = c->buf + sizeof( TEL_COLOUR );
872 w->fillareaset3data.faflag = TEL_FAFLAG_NONE;
873 w->fillareaset3data.facet_colour_val = 0;
877 w->fillareaset3data.points = (tel_point)cur_ptr;
878 for( j = 0; j < d->num_vertices; j++ )
880 w->fillareaset3data.points[j] = d->vertices[j];
882 cur_ptr += ( d->num_vertices * sizeof( TEL_POINT ) );
886 w->fillareaset3data.edgvis = (Tint *)(cur_ptr);
887 memcpy( w->fillareaset3data.edgvis, d->edgevis,
888 d->num_vertices*sizeof(Tint) );
889 cur_ptr += (d->num_vertices * sizeof( Tint ) );
892 w->fillareaset3data.bounds = (Tint *)cur_ptr;
893 memcpy( w->fillareaset3data.bounds, d->bounds,
894 d->num_bounds*sizeof(Tint) );
895 cur_ptr += ( d->num_bounds * sizeof( Tint ) );
897 if( d->vertex_flag == TEL_VT_NORMAL )
901 w->fillareaset3data.vrtflag = TEL_VTFLAG_COLOURNORMAL;
902 w->fillareaset3data.vnormals = (tel_point)(cur_ptr);
903 for( j = 0; j < d->num_vertices; j++ )
905 w->fillareaset3data.vnormals[j] = d->vnormals[i];
907 cur_ptr += ( d->num_vertices * sizeof( TEL_POINT ) );
909 w->fillareaset3data.colours = (tel_colour)(cur_ptr);
911 for( j = 0; j < d->num_vertices; j++ )
913 w->fillareaset3data.colours[j] = d->vcolours[i];
918 w->fillareaset3data.vrtflag = TEL_VTFLAG_NORMAL;
919 w->fillareaset3data.colours = 0;
920 w->fillareaset3data.vnormals = (tel_point)(cur_ptr);
922 for( j = 0; j < d->num_vertices; j++ )
924 w->fillareaset3data.vnormals[j] = d->vnormals[i];
930 w->fillareaset3data.vnormals = 0;
933 w->fillareaset3data.vrtflag = TEL_VTFLAG_COLOUR;
934 w->fillareaset3data.colours = (tel_colour)(cur_ptr);
935 for( j = 0; j < d->num_vertices; j++ )
937 w->fillareaset3data.colours[j] = d->vcolours[i];
942 w->fillareaset3data.vrtflag = TEL_VTFLAG_NONE;
943 w->fillareaset3data.colours = 0;
961 static tel_polygon_holes_data DaTa;
964 out_bgntmesh_1 ( GLenum triangle_type )
971 if( dis->num_alloc < dis->num_of_seq )
973 dis->num_alloc += INCREMENT;
977 dis->seq = new SEQ_[dis->num_alloc];
981 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
982 dis->seq = (SEQ_*)realloc( dis->seq, dis->num_alloc*sizeof(SEQ_) );
984 dis->seq = cmn_resizemem<SEQ_>( dis->seq, dis->num_alloc );
988 dis->seq[ dis->num_of_seq - 1 ].ts_num = 0;
989 dis->seq[ dis->num_of_seq - 1 ].ts_alloc = 0;
990 dis->seq[ dis->num_of_seq - 1 ].tmesh_sequence = 0;
991 dis->seq[ dis->num_of_seq - 1 ].triangle_type = triangle_type;
992 glBegin(triangle_type);
997 out_vertex1( void *data )
1001 s = &( DaTa->display->seq[ DaTa->display->num_of_seq - 1 ] );
1004 if( s->ts_alloc < s->ts_num )
1006 s->ts_alloc += INCREMENT;
1008 if( s->tmesh_sequence == 0 )
1010 s->tmesh_sequence = new void*[s->ts_alloc];
1014 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
1015 s->tmesh_sequence = (void**)realloc( s->tmesh_sequence,
1016 s->ts_alloc*sizeof(void*));
1018 s->tmesh_sequence = cmn_resizemem<void*>( s->tmesh_sequence,
1023 s->tmesh_sequence[ s->ts_num - 1 ] = data;
1025 if ( data < (void *)0xffff ) {
1026 long int a = (long int)data;
1028 glVertex3fv( DaTa->vertices[a].xyz );
1031 extra_vertex b = (extra_vertex)data;
1033 glVertex3fv(b->vert);
1037 STATIC void APIENTRY
1038 out_vertex2( void *data )
1042 s = &( DaTa->display->seq[ DaTa->display->num_of_seq - 1 ] );
1045 if( s->ts_alloc < s->ts_num )
1047 s->ts_alloc += INCREMENT;
1049 if( s->tmesh_sequence == 0 )
1051 s->tmesh_sequence = new void*[s->ts_alloc];
1055 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
1056 s->tmesh_sequence = (void**)realloc( s->tmesh_sequence,
1057 s->ts_alloc*sizeof(void*) );
1059 s->tmesh_sequence = cmn_resizemem<void*>( s->tmesh_sequence,
1064 s->tmesh_sequence[ s->ts_num - 1 ] = data;
1066 if ( data < (void *)0xffff ){
1067 long int a = (long int)data;
1069 glColor3fv( DaTa->vcolours[a].rgb );
1070 glVertex3fv( DaTa->vertices[a].xyz );
1073 extra_vertex b = (extra_vertex)data;
1075 glColor3fv(DaTa->vcolours[b->ind].rgb );
1076 glVertex3fv(b->vert);
1080 STATIC void APIENTRY
1081 out_vertex3( void *data )
1085 s = &( DaTa->display->seq[ DaTa->display->num_of_seq - 1 ] );
1088 if( s->ts_alloc < s->ts_num )
1090 s->ts_alloc += INCREMENT;
1092 if( s->tmesh_sequence == 0 )
1094 s->tmesh_sequence = new void*[s->ts_alloc];
1098 #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x530)
1099 s->tmesh_sequence = (void**)realloc( s->tmesh_sequence,
1100 s->ts_alloc*sizeof(void*) );
1102 s->tmesh_sequence = cmn_resizemem<void*>( s->tmesh_sequence,
1107 s->tmesh_sequence[ s->ts_num - 1 ] = data;
1109 if ( data < (void *)0xffff ) {
1110 long int a = (long int)data;
1112 glNormal3fv( DaTa->vnormals[a].xyz );
1113 glVertex3fv( DaTa->vertices[a].xyz );
1116 extra_vertex b = (extra_vertex) data;
1118 glNormal3fv( DaTa->vnormals[b->ind].xyz );
1119 glVertex3fv(b->vert);
1124 STATIC void APIENTRY
1125 out_combine( GLdouble coords[3], int *data,
1126 GLfloat w[4], void **dataout )
1128 extra_vertex new_vertex;
1130 new_vertex = (extra_vertex) malloc(sizeof(EXTRA_VERTEX));
1132 new_vertex->vert[0] = ( float )coords[0];
1133 new_vertex->vert[1] = ( float )coords[1];
1134 new_vertex->vert[2] = ( float )coords[2];
1135 new_vertex->ind = *data;
1136 *dataout = new_vertex;
1139 printf("mycombine3 %e %e %e\n",
1140 new_vertex->vert[0],
1141 new_vertex->vert[1],
1142 new_vertex->vert[2],
1151 STATIC void APIENTRY
1152 out_endtmesh_1( void )
1157 STATIC void APIENTRY
1158 out_error_1( GLenum error )
1160 printf( "%s\n", (char *) gluErrorString(error) );
1164 bgntriangulate( tel_polygon_holes_data d, void (APIENTRY*out_ver)() )
1167 if( !DaTa->display )
1168 DaTa->display = new DISPLAY_();
1170 tripak = gluNewTess();
1171 #if defined(linux) && !defined(NOGLUfuncptr)
1172 gluTessCallback(tripak, GLU_TESS_BEGIN, (_GLUfuncptr)(out_bgntmesh_1));
1173 gluTessCallback(tripak, GLU_TESS_VERTEX, out_ver);
1174 gluTessCallback(tripak, GLU_TESS_END, out_endtmesh_1);
1175 gluTessCallback(tripak, GLU_TESS_ERROR, (_GLUfuncptr)(out_error_1));
1176 gluTessCallback(tripak, GLU_TESS_COMBINE, (_GLUfuncptr)(out_combine));
1178 gluTessCallback(tripak, GLU_TESS_BEGIN, (void (APIENTRY*)())out_bgntmesh_1);
1179 gluTessCallback(tripak, GLU_TESS_VERTEX, (void (APIENTRY*)())out_ver);
1180 gluTessCallback(tripak, GLU_TESS_END, (void (APIENTRY*)())out_endtmesh_1);
1181 gluTessCallback(tripak, GLU_TESS_ERROR, (void (APIENTRY*)())out_error_1);
1182 gluTessCallback(tripak, GLU_TESS_COMBINE, (void (APIENTRY*)())out_combine);
1188 endtriangulate(void)
1191 gluDeleteTess(tripak);
1195 draw_edges( tel_polygon_holes_data p, Tmatrix3 mat, tel_colour edge_colour,
1196 Tint face_distinguishing_mode, TelCullMode face_culling_mode,
1197 Tint interior_style, Tint back_interior_style )
1199 CMN_KEY k, k1, k2, k3, k4;
1201 Tint edge_type, line_type_preserve;
1202 Tfloat edge_width, line_width_preserve;
1203 /* Following pointers have been provided for performance improvement */
1207 /* OCC11904 -- Temporarily disable environment mapping */
1208 glPushAttrib(GL_ENABLE_BIT);
1209 glDisable(GL_TEXTURE_1D);
1210 glDisable(GL_TEXTURE_2D);
1217 TsmGetAttri( 1, &k );
1220 if( k.data.ldata == TOff )
1226 k1.id = TelPolylineWidth;
1227 k2.id = TelPolylineType;
1228 k3.id = TelEdgeType;
1229 k4.id = TelEdgeWidth;
1231 TsmGetAttri( 4, &k1, &k2, &k3, &k4 );
1233 line_width_preserve = k1.data.fdata;
1234 line_type_preserve = k2.data.ldata;
1235 edge_type = k3.data.ldata;
1236 edge_width = k4.data.fdata;
1238 if( p->edgevis == 0 )
1240 if( face_distinguishing_mode == TOff )
1242 if( interior_style == TSM_SOLID || interior_style == TSM_HATCH )
1244 if( line_width_preserve != edge_width )
1246 k.id = TelPolylineWidth;
1247 k.data.fdata = edge_width;
1248 TsmSetAttri( 1, &k );
1250 if( line_type_preserve != edge_type )
1252 k.id = TelPolylineType;
1253 k.data.ldata = edge_type;
1254 TsmSetAttri( 1, &k );
1257 glColor3fv( edge_colour->rgb );
1258 if( face_culling_mode == TelCullBack )
1260 for( i = 0, a = 0; i < p->num_bounds; i++ )
1262 glBegin(GL_LINE_STRIP);
1263 for( clos=a, j = 0; j < bounds[i]; j++ )
1265 glVertex3fv( pv[ a++ ].xyz );
1267 glVertex3fv( pv[ clos ].xyz );
1271 else if( face_culling_mode == TelCullFront )
1273 for( i = 0, a = 0; i < p->num_bounds; i++ )
1275 glBegin(GL_LINE_STRIP);
1276 for( clos=a, j = 0; j < bounds[i]; j++ )
1278 glVertex3fv( pv[ a++ ].xyz );
1280 glVertex3fv( pv[ clos ].xyz );
1286 for( i = 0, a = 0; i < p->num_bounds; i++ )
1288 glBegin(GL_LINE_STRIP);
1289 for( clos=a, j = 0; j < bounds[i]; j++ )
1291 glVertex3fv( pv[ a++ ].xyz );
1293 glVertex3fv( pv[ clos ].xyz );
1297 if( line_width_preserve != edge_width )
1299 k.id = TelPolylineWidth;
1300 k.data.fdata = line_width_preserve;
1301 TsmSetAttri( 1, &k );
1303 if( line_type_preserve != edge_type )
1305 k.id = TelPolylineType;
1306 k.data.ldata = line_type_preserve;
1307 TsmSetAttri( 1, &k );
1313 if( ( interior_style == TSM_SOLID ||
1314 interior_style == TSM_HATCH ) ||
1315 ( back_interior_style == TSM_SOLID ||
1316 back_interior_style == TSM_HATCH ) )
1318 if( face_culling_mode == TelCullBack )
1320 if( interior_style == TSM_SOLID || interior_style == TSM_HATCH )
1322 if( line_width_preserve != edge_width )
1324 k.id = TelPolylineWidth;
1325 k.data.fdata = edge_width;
1326 TsmSetAttri( 1, &k );
1328 if( line_type_preserve != edge_type )
1330 k.id = TelPolylineType;
1331 k.data.ldata = edge_type;
1332 TsmSetAttri( 1, &k );
1334 glColor3fv( edge_colour->rgb );
1335 for( i = 0, a = 0; i < p->num_bounds; i++ )
1337 glBegin(GL_LINE_STRIP);
1338 for( clos=a, j = 0; j < bounds[i]; j++ )
1340 glVertex3fv( pv[ a++ ].xyz );
1342 glVertex3fv( pv[ clos ].xyz );
1345 if( line_width_preserve != edge_width )
1347 k.id = TelPolylineWidth;
1348 k.data.fdata = line_width_preserve;
1349 TsmSetAttri( 1, &k );
1351 if( line_type_preserve != edge_type )
1353 k.id = TelPolylineType;
1354 k.data.ldata = line_type_preserve;
1355 TsmSetAttri( 1, &k );
1359 else if( face_culling_mode == TelCullFront )
1361 if( back_interior_style == TSM_SOLID ||
1362 back_interior_style == TSM_HATCH )
1364 if( line_width_preserve != edge_width )
1366 k.id = TelPolylineWidth;
1367 k.data.fdata = edge_width;
1368 TsmSetAttri( 1, &k );
1370 if( line_type_preserve != edge_type )
1372 k.id = TelPolylineType;
1373 k.data.ldata = edge_type;
1374 TsmSetAttri( 1, &k );
1376 glColor3fv( edge_colour->rgb );
1377 for( i = 0, a = 0; i < p->num_bounds; i++ )
1379 glBegin(GL_LINE_STRIP);
1380 for( clos=a, j = 0; j < bounds[i]; j++ )
1382 glVertex3fv( pv[ a++ ].xyz );
1384 glVertex3fv( pv[ clos ].xyz );
1387 if( line_width_preserve != edge_width )
1389 k.id = TelPolylineWidth;
1390 k.data.fdata = line_width_preserve;
1391 TsmSetAttri( 1, &k );
1393 if( line_type_preserve != edge_type )
1395 k.id = TelPolylineType;
1396 k.data.ldata = line_type_preserve;
1397 TsmSetAttri( 1, &k );
1403 if( line_width_preserve != edge_width )
1405 k.id = TelPolylineWidth;
1406 k.data.fdata = edge_width;
1407 TsmSetAttri( 1, &k );
1409 if( line_type_preserve != edge_type )
1411 k.id = TelPolylineType;
1412 k.data.ldata = edge_type;
1413 TsmSetAttri( 1, &k );
1415 glColor3fv( edge_colour->rgb );
1416 for( i = 0, a = 0; i < p->num_bounds; i++ )
1418 glBegin(GL_LINE_STRIP);
1419 for( clos=a, j = 0; j < bounds[i]; j++ )
1421 glVertex3fv( pv[ a++ ].xyz );
1423 glVertex3fv( pv[ clos ].xyz );
1426 if( line_width_preserve != edge_width )
1428 k.id = TelPolylineWidth;
1429 k.data.fdata = line_width_preserve;
1430 TsmSetAttri( 1, &k );
1432 if( line_type_preserve != edge_type )
1434 k.id = TelPolylineType;
1435 k.data.ldata = line_type_preserve;
1436 TsmSetAttri( 1, &k );
1444 if( face_distinguishing_mode == TOff )
1446 if( interior_style == TSM_SOLID || interior_style == TSM_HATCH )
1448 if( line_width_preserve != edge_width )
1450 k.id = TelPolylineWidth;
1451 k.data.fdata = edge_width;
1452 TsmSetAttri( 1, &k );
1454 if( line_type_preserve != edge_type )
1456 k.id = TelPolylineType;
1457 k.data.ldata = edge_type;
1458 TsmSetAttri( 1, &k );
1461 glColor3fv( edge_colour->rgb );
1462 if( face_culling_mode == TelCullBack )
1465 for( i = 0, j = 0; i < p->num_bounds; i++ )
1467 for( a = 0; a < bounds[i]-1; a++ )
1469 if( p->edgevis[j+a] )
1471 glVertex3fv( pv[j+a].xyz );
1472 glVertex3fv( pv[j+a+1].xyz );
1475 if( p->edgevis[j+a] )
1477 glVertex3fv( pv[j+a].xyz );
1478 glVertex3fv( pv[j].xyz );
1484 else if( face_culling_mode == TelCullFront )
1487 for( i = 0, j = 0; i < p->num_bounds; i++ )
1489 for( a = 0; a < bounds[i]-1; a++ )
1491 if( p->edgevis[j+a] )
1493 glVertex3fv( pv[j+a].xyz );
1494 glVertex3fv( pv[j+a+1].xyz );
1497 if( p->edgevis[j+a] )
1499 glVertex3fv( pv[j+a].xyz );
1500 glVertex3fv( pv[j].xyz );
1509 for( i = 0, j = 0; i < p->num_bounds; i++ )
1511 for( a = 0; a < bounds[i]-1; a++ )
1513 if( p->edgevis[j+a] )
1515 glVertex3fv( pv[j+a].xyz );
1516 glVertex3fv( pv[j+a+1].xyz );
1519 if( p->edgevis[j+a] )
1521 glVertex3fv( pv[j+a].xyz );
1522 glVertex3fv( pv[j].xyz );
1528 if( line_width_preserve != edge_width )
1530 k.id = TelPolylineWidth;
1531 k.data.fdata = line_width_preserve;
1532 TsmSetAttri( 1, &k );
1534 if( line_type_preserve != edge_type )
1536 k.id = TelPolylineType;
1537 k.data.ldata = line_type_preserve;
1538 TsmSetAttri( 1, &k );
1544 if( ( interior_style == TSM_SOLID ||
1545 interior_style == TSM_HATCH ) ||
1546 ( back_interior_style == TSM_SOLID ||
1547 back_interior_style == TSM_HATCH ) )
1549 if( face_culling_mode == TelCullBack )
1551 if( interior_style == TSM_SOLID || interior_style == TSM_HATCH )
1553 if( line_width_preserve != edge_width )
1555 k.id = TelPolylineWidth;
1556 k.data.fdata = edge_width;
1557 TsmSetAttri( 1, &k );
1559 if( line_type_preserve != edge_type )
1561 k.id = TelPolylineType;
1562 k.data.ldata = edge_type;
1563 TsmSetAttri( 1, &k );
1565 glColor3fv( edge_colour->rgb );
1567 for( i = 0, j = 0; i < p->num_bounds; i++ )
1569 for( a = 0; a < bounds[i]-1; a++ )
1571 if( p->edgevis[j+a] )
1573 glVertex3fv( pv[j+a].xyz );
1574 glVertex3fv( pv[j+a+1].xyz );
1577 if( p->edgevis[j+a] )
1579 glVertex3fv( pv[j+a].xyz );
1580 glVertex3fv( pv[j].xyz );
1585 if( line_width_preserve != edge_width )
1587 k.id = TelPolylineWidth;
1588 k.data.fdata = line_width_preserve;
1589 TsmSetAttri( 1, &k );
1591 if( line_type_preserve != edge_type )
1593 k.id = TelPolylineType;
1594 k.data.ldata = line_type_preserve;
1595 TsmSetAttri( 1, &k );
1599 else if( face_culling_mode == TelCullFront )
1601 if( back_interior_style == TSM_SOLID ||
1602 back_interior_style == TSM_HATCH )
1604 if( line_width_preserve != edge_width )
1606 k.id = TelPolylineWidth;
1607 k.data.fdata = edge_width;
1608 TsmSetAttri( 1, &k );
1610 if( line_type_preserve != edge_type )
1612 k.id = TelPolylineType;
1613 k.data.ldata = edge_type;
1614 TsmSetAttri( 1, &k );
1616 glColor3fv( edge_colour->rgb );
1618 for( i = 0, j = 0; i < p->num_bounds; i++ )
1620 for( a = 0; a < bounds[i]-1; a++ )
1622 if( p->edgevis[j+a] )
1624 glVertex3fv( pv[j+a].xyz );
1625 glVertex3fv( pv[j+a+1].xyz );
1628 if( p->edgevis[j+a] )
1630 glVertex3fv( pv[j+a].xyz );
1631 glVertex3fv( pv[j].xyz );
1636 if( line_width_preserve != edge_width )
1638 k.id = TelPolylineWidth;
1639 k.data.fdata = line_width_preserve;
1640 TsmSetAttri( 1, &k );
1642 if( line_type_preserve != edge_type )
1644 k.id = TelPolylineType;
1645 k.data.ldata = line_type_preserve;
1646 TsmSetAttri( 1, &k );
1652 if( line_width_preserve != edge_width )
1654 k.id = TelPolylineWidth;
1655 k.data.fdata = edge_width;
1656 TsmSetAttri( 1, &k );
1658 if( line_type_preserve != edge_type )
1660 k.id = TelPolylineType;
1661 k.data.ldata = edge_type;
1662 TsmSetAttri( 1, &k );
1664 glColor3fv( edge_colour->rgb );
1665 for( i = 0, j = 0; i < p->num_bounds; i++ )
1668 for( a = 0; a < bounds[i]-1; a++ )
1670 if( p->edgevis[j+a] )
1672 glVertex3fv( pv[j+a].xyz );
1673 glVertex3fv( pv[j+a+1].xyz );
1676 if( p->edgevis[j+a] )
1678 glVertex3fv( pv[j+a].xyz );
1679 glVertex3fv( pv[j].xyz );
1685 if( line_width_preserve != edge_width )
1687 k.id = TelPolylineWidth;
1688 k.data.fdata = line_width_preserve;
1689 TsmSetAttri( 1, &k );
1691 if( line_type_preserve != edge_type )
1693 k.id = TelPolylineType;
1694 k.data.ldata = line_type_preserve;
1695 TsmSetAttri( 1, &k );