1 /***********************************************************************
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 26-04-96 : FMN ; Correction warning compilation
18 10-06-96 : CAL ; Transparence dans call_subr_set_refl_props
19 17-07-96 : CAL ; Suppression de CALL_PHIGS_ELEM_HLHSR_ID
20 07-10-96 : FMN ; Suppression code inutile
21 21-08-97 : PCT ; ajout deuxieme passe pour les textures
22 23-12-97 : FMN ; Suppression TelBackInteriorStyle, TelBackInteriorStyleIndex
23 29-12-97 : FMN ; Ajout cas 4 pour call_subr_polygon_indices()
24 30-12-97 : FMN ; CTS18312: Correction back material
25 08-04-98 : FGU ; Ajout emission
26 30-11-98 : FMN ; S3819 : Textes toujours visibles
27 16-06-2000 : ATS,GG : G005 : Group of functions: call_subr_parray
29 ************************************************************************/
31 #define IMP190602 /* GG Avoid memory leaks after creating a polyline
32 // with vertex colors primitive.
33 // Thanks to Ivan Fontaine (SAMTECH) for this improvment
36 /*----------------------------------------------------------------------*/
42 #include <OpenGl_tgl_all.hxx>
48 #include <InterfaceGraphic_Graphic3d.hxx>
50 #include <OpenGl_cmn_varargs.hxx>
51 #include <OpenGl_tsm.hxx>
52 #include <OpenGl_tsm_ws.hxx>
53 #include <OpenGl_telem.hxx>
54 #include <OpenGl_tgl_funcs.hxx>
55 #include <OpenGl_tgl_subrs.hxx>
56 #include <OpenGl_telem_inquire.hxx>
57 #include <OpenGl_telem_view.hxx>
58 #include <OpenGl_tgl_elems.hxx>
59 #include <OpenGl_Memory.hxx>
62 call_subr_set_line_colr( Tfloat r, Tfloat g, Tfloat b )
70 key.data.pdata = &col;
71 TsmAddToStructure( TelPolylineColour, 1, &key );
78 call_subr_polyline( CALL_DEF_LISTPOINTS * alpoints )
83 kp[0] = &key[0], kp[1] = &key[1], kp[2] = &key[2], kp[3] = &key[3];
84 key[0].id = NUM_LINES_ID;
85 key[0].data.ldata = 1;
86 key[1].id = VERTICES_ID;
87 key[1].data.pdata = alpoints->UPoints.Points;
88 key[2].id = BOUNDS_DATA_ID;
89 key[2].data.pdata = &alpoints->NbPoints;
90 key[3].id = NUM_VERTICES_ID;
91 key[3].data.ldata = alpoints->NbPoints;
92 TsmAddToStructure( TelPolyline, -4, kp );
99 call_subr_polyline_data( CALL_DEF_LISTPOINTS * alpoints )
107 if( alpoints->TypePoints != 3 )
108 return; /* Coordinates and Vertex Colour not Specified */
110 points = new TEL_POINT[alpoints->NbPoints];
114 col = new TEL_COLOUR[alpoints->NbPoints];
121 for( i = 0; i < alpoints->NbPoints; i++ )
123 points[i].xyz[0] = alpoints->UPoints.PointsC[i].Point.x;
124 points[i].xyz[1] = alpoints->UPoints.PointsC[i].Point.y;
125 points[i].xyz[2] = alpoints->UPoints.PointsC[i].Point.z;
126 col[i].rgb[0] = alpoints->UPoints.PointsC[i].Color.r;
127 col[i].rgb[1] = alpoints->UPoints.PointsC[i].Color.g;
128 col[i].rgb[2] = alpoints->UPoints.PointsC[i].Color.b;
131 key[0].id = NUM_LINES_ID;
132 key[0].data.ldata = 1;
133 key[1].id = VERTEX_COLOUR_VALS_ID;
134 key[1].data.pdata = col;
135 key[2].id = VERTICES_ID;
136 key[2].data.pdata = points;
137 key[3].id = BOUNDS_DATA_ID;
138 key[3].data.pdata = &alpoints->NbPoints;
139 key[4].id = NUM_VERTICES_ID;
140 key[4].data.ldata = alpoints->NbPoints;
142 for( i = 0; i < 5; i++ )
145 TsmAddToStructure( TelPolyline, -5, kp );
158 call_subr_remnameset( Tint num, Tint *ns )
164 TsmAddToStructure( TelRemoveNameset, 1, &key );
171 call_subr_addnameset( Tint num, Tint *ns )
177 TsmAddToStructure( TelAddNameset, 1, &key );
183 call_subr_set_back_int_colr( Tfloat r, Tfloat g, Tfloat b, Tfloat a )
191 key.data.pdata = &col;
192 TsmAddToStructure( TelBackInteriorColour, 1, &key );
200 call_subr_set_int_colr( Tfloat r, Tfloat g, Tfloat b, Tfloat a )
208 key.data.pdata = &col;
209 TsmAddToStructure( TelInteriorColour, 1, &key );
215 call_subr_set_edge_colr( Tfloat r, Tfloat g, Tfloat b )
223 key.data.pdata = &col;
224 TsmAddToStructure( TelEdgeColour, 1, &key );
231 call_subr_set_refl_props( CALL_DEF_MATERIAL * material, Tint tag )
234 TEL_SURF_PROP surface;
236 /* Par defaut tout a 0 */
237 surface.amb = ( float )0.0;
238 surface.diff = ( float )0.0;
239 surface.spec = ( float )0.0;
240 surface.emsv = ( float )0.0;
241 surface.isamb = (int)0;
242 surface.isdiff = (int)0;
243 surface.isspec = (int)0;
244 surface.isemsv = (int)0;
245 surface.isphysic = (int)0;
247 /* Cas par cas pour l evaluation */
248 if( material->IsAmbient )
250 surface.amb = material->Ambient;
253 if( material->IsDiffuse )
255 surface.diff = material->Diffuse;
258 if( material->IsSpecular )
260 surface.spec = material->Specular;
263 if( material->IsEmission )
265 surface.emsv = material->Emission;
269 /* type de materiel */
270 if( material->IsPhysic )
271 surface.isphysic = 1;
273 /* Couleur du materiel */
275 /* Couleur eclairage ambient */
276 surface.ambcol.rgb[0] = material->ColorAmb.r;
277 surface.ambcol.rgb[1] = material->ColorAmb.g;
278 surface.ambcol.rgb[2] = material->ColorAmb.b;
280 /* Couleur eclairage diffus */
281 surface.difcol.rgb[0] = material->ColorDif.r;
282 surface.difcol.rgb[1] = material->ColorDif.g;
283 surface.difcol.rgb[2] = material->ColorDif.b;
285 /* Couleur eclairage speculaire */
286 surface.speccol.rgb[0] = material->ColorSpec.r;
287 surface.speccol.rgb[1] = material->ColorSpec.g;
288 surface.speccol.rgb[2] = material->ColorSpec.b;
290 /* Couleur d emission */
291 surface.emscol.rgb[0] = material->ColorEms.r;
292 surface.emscol.rgb[1] = material->ColorEms.g;
293 surface.emscol.rgb[2] = material->ColorEms.b;
295 surface.shine = ( float )128 * material->Shininess;
296 surface.env_reflexion = material->EnvReflexion;
298 /* Dans la couche C++ :
299 * prop->trans = 0. => opaque
300 * prop->trans = 1. => transparent
301 * en OpenGl c'est le contraire.
303 surface.trans = 1.0F - material->Transparency;
305 key.data.pdata = &surface;
306 TsmAddToStructure( tag ? TelBackSurfaceAreaProperties :
307 TelSurfaceAreaProperties, 1, &key );
312 call_subr_set_marker_colr( Tfloat r, Tfloat g, Tfloat b )
320 key.data.pdata = &col;
321 TsmAddToStructure( TelPolymarkerColour, 1, &key );
328 call_subr_get_exec_struct( Tint afather, Tint ason, Tint *ind )
333 if( TsmGetStructure( afather, &num, &node ) == TSuccess )
335 for( i = 0; i < num; i++, node = node->next )
337 if( node->elem.el == TelExecuteStructure )
338 if( node->elem.data.ldata == ason )
350 call_subr_marker( CALL_DEF_MARKER * amarker )
356 pt.xyz[0] = amarker->x,
357 pt.xyz[1] = amarker->y,
358 pt.xyz[2] = amarker->z;
359 key.data.pdata = &pt;
360 TsmAddToStructure( TelMarkerSet, 1, &key );
367 call_subr_marker_set( CALL_DEF_LISTMARKERS * almarkers )
371 key.id = almarkers->NbMarkers;
372 key.data.pdata = almarkers->Markers;
373 TsmAddToStructure( TelMarkerSet, 1, &key );
380 call_subr_polygon( CALL_DEF_FACET * afacet )
384 k[0].id = NUM_VERTICES_ID;
385 k[0].data.ldata = afacet->NbPoints;
387 k[1].id = SHAPE_FLAG_ID;
388 k[1].data.ldata = TEL_SHAPE_UNKNOWN;
390 switch (afacet->TypeFacet) {
391 case 0 : /* TOP_UNKNOWN */
392 k[1].data.ldata = TEL_SHAPE_UNKNOWN;
394 case 1 : /* TOP_COMPLEX */
395 k[1].data.ldata = TEL_SHAPE_COMPLEX;
397 case 2 : /* TOP_CONCAVE */
398 k[1].data.ldata = TEL_SHAPE_CONCAVE;
400 case 3 : /* TOP_CONVEX */
401 k[1].data.ldata = TEL_SHAPE_CONVEX;
405 #if defined(__sgi) || defined(IRIX)
406 /* Pb avec le tesselator sgi */
407 k[1].data.ldata = TEL_SHAPE_CONVEX;
410 k[2].id = VERTICES_ID;
411 k[2].data.pdata = afacet->UPoints.Points;
413 TsmAddToStructure( TelPolygon, 3, &k[0], &k[1], &k[2] );
420 call_subr_polygon_data( CALL_DEF_FACET * afacet )
427 TEL_POINT *pts=0, *ptn=0;
428 TEL_TEXTURE_COORD *ptt=0;
430 k[nk].id = NUM_VERTICES_ID;
431 k[nk].data.ldata = afacet->NbPoints;
434 if( afacet->ColorIsDefined )
436 col.rgb[0] = afacet->Color.r;
437 col.rgb[1] = afacet->Color.g;
438 col.rgb[2] = afacet->Color.b;
440 k[nk].id = FACET_COLOUR_VALS_ID;
441 k[nk].data.pdata = &col;
445 if( afacet->NormalIsDefined )
447 npt = &afacet->Normal;
448 k[nk].id = FNORMALS_ID;
449 k[nk].data.pdata = npt;
453 switch (afacet->TypePoints)
457 k[nk].id = SHAPE_FLAG_ID;
458 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
459 switch (afacet->TypeFacet) {
460 case 0 : /* TOP_UNKNOWN */
461 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
463 case 1 : /* TOP_COMPLEX */
464 k[nk].data.ldata = TEL_SHAPE_COMPLEX;
466 case 2 : /* TOP_CONCAVE */
467 k[nk].data.ldata = TEL_SHAPE_CONCAVE;
469 case 3 : /* TOP_CONVEX */
470 k[nk].data.ldata = TEL_SHAPE_CONVEX;
473 #if defined(__sgi) || defined(IRIX)
474 /* Pb avec le tesselator sgi */
475 k[nk].data.ldata = TEL_SHAPE_CONVEX;
478 k[nk].id = VERTICES_ID;
479 k[nk].data.pdata = afacet->UPoints.Points;
487 k[nk].id = SHAPE_FLAG_ID;
488 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
489 switch (afacet->TypeFacet) {
490 case 0 : /* TOP_UNKNOWN */
491 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
493 case 1 : /* TOP_COMPLEX */
494 k[nk].data.ldata = TEL_SHAPE_COMPLEX;
496 case 2 : /* TOP_CONCAVE */
497 k[nk].data.ldata = TEL_SHAPE_CONCAVE;
499 case 3 : /* TOP_CONVEX */
500 k[nk].data.ldata = TEL_SHAPE_CONVEX;
503 #if defined(__sgi) || defined(IRIX)
504 /* Pb avec le tesselator sgi */
505 k[nk].data.ldata = TEL_SHAPE_CONVEX;
508 //cmn_memreserve( pts, afacet->NbPoints, 0 );
509 pts = new TEL_POINT[afacet->NbPoints];
510 k[nk].id = VERTICES_ID;
511 k[nk].data.pdata = pts;
513 //cmn_memreserve( ptn, afacet->NbPoints, 0 );
514 ptn = new TEL_POINT[afacet->NbPoints];
515 k[nk].id = VNORMALS_ID;
516 k[nk].data.pdata = ptn;
518 for( i = 0; i < afacet->NbPoints; i++ )
520 pts[i].xyz[0] = afacet->UPoints.PointsN[i].Point.x;
521 pts[i].xyz[1] = afacet->UPoints.PointsN[i].Point.y;
522 pts[i].xyz[2] = afacet->UPoints.PointsN[i].Point.z;
524 ptn[i].xyz[0] = afacet->UPoints.PointsN[i].Normal.dx;
525 ptn[i].xyz[1] = afacet->UPoints.PointsN[i].Normal.dy;
526 ptn[i].xyz[2] = afacet->UPoints.PointsN[i].Normal.dz;
534 k[nk].id = SHAPE_FLAG_ID;
535 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
536 switch (afacet->TypeFacet) {
537 case 0 : /* TOP_UNKNOWN */
538 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
540 case 1 : /* TOP_COMPLEX */
541 k[nk].data.ldata = TEL_SHAPE_COMPLEX;
543 case 2 : /* TOP_CONCAVE */
544 k[nk].data.ldata = TEL_SHAPE_CONCAVE;
546 case 3 : /* TOP_CONVEX */
547 k[nk].data.ldata = TEL_SHAPE_CONVEX;
550 #if defined(__sgi) || defined(IRIX)
551 /* Pb avec le tesselator sgi */
552 k[nk].data.ldata = TEL_SHAPE_CONVEX;
555 //cmn_memreserve( pts, afacet->NbPoints, 0 );
556 pts = new TEL_POINT[afacet->NbPoints];
557 k[nk].id = VERTICES_ID;
558 k[nk].data.pdata = pts;
560 //cmn_memreserve( ptn, afacet->NbPoints, 0 );
561 ptn = new TEL_POINT[afacet->NbPoints];
562 k[nk].id = VNORMALS_ID;
563 k[nk].data.pdata = ptn;
565 //cmn_memreserve( ptt, afacet->NbPoints, 0 );
566 ptt = new TEL_TEXTURE_COORD[afacet->NbPoints];
567 k[nk].id = VTEXTURECOORD_ID;
568 k[nk].data.pdata = ptt;
570 for( i = 0; i < afacet->NbPoints; i++ )
572 pts[i].xyz[0] = afacet->UPoints.PointsNT[i].Point.x;
573 pts[i].xyz[1] = afacet->UPoints.PointsNT[i].Point.y;
574 pts[i].xyz[2] = afacet->UPoints.PointsNT[i].Point.z;
576 ptn[i].xyz[0] = afacet->UPoints.PointsNT[i].Normal.dx;
577 ptn[i].xyz[1] = afacet->UPoints.PointsNT[i].Normal.dy;
578 ptn[i].xyz[2] = afacet->UPoints.PointsNT[i].Normal.dz;
580 ptt[i].xy[0] = afacet->UPoints.PointsNT[i].TextureCoord.tx;
581 ptt[i].xy[1] = afacet->UPoints.PointsNT[i].TextureCoord.ty;
587 for( i = 0; i < nk; i++ )
590 TsmAddToStructure( TelPolygon, -nk, kp );
594 //cmn_freemem( pts );
596 //cmn_freemem( ptn );
598 //cmn_freemem( ptt );
607 call_subr_polygon_indices( CALL_DEF_LISTPOINTS * alpoints,
608 CALL_DEF_LISTEDGES * aledges,
609 CALL_DEF_LISTINTEGERS * albounds )
617 tel_texture_coord tarr=0;
618 Tint *edgvis=NULL, *bounds, *indices;
621 k[nk].id = NUM_VERTICES_ID;
622 k[nk].data.ldata = alpoints->NbPoints;
625 k[nk].id = NUM_FACETS_ID;
626 k[nk].data.ldata = albounds->NbIntegers;
629 k[nk].id = SHAPE_FLAG_ID;
630 k[nk].data.ldata = TEL_SHAPE_UNKNOWN;
633 if( aledges->NbEdges )
635 //cmn_memreserve( edgvis, aledges->NbEdges, 0 );
636 edgvis = new Tint[aledges->NbEdges];
639 for( i = 0; i < aledges->NbEdges; i++ )
640 edgvis[i] = aledges->Edges[i].Type ? CALL_PHIGS_EDGE_OFF :
642 k[nk].id = EDGE_DATA_ID;
643 k[nk].data.pdata = edgvis;
647 bounds = new Tint[albounds->NbIntegers];
653 for( i = 0, num_indices = 0; i < albounds->NbIntegers; i++ )
655 bounds[i] = albounds->Integers[i];
656 num_indices += bounds[i];
658 k[nk].id = BOUNDS_DATA_ID;
659 k[nk].data.pdata = bounds;
662 indices = new Tint[num_indices];
669 for( i = 0; i < num_indices; i++ )
670 indices[i] = aledges->Edges[i].Index1;
671 k[nk].id = CONNECTIVITY_ID;
672 k[nk].data.pdata = indices;
675 switch( alpoints->TypePoints )
677 case 1 : /* Vertex Coordinates Specified */
678 varr = new TEL_POINT[alpoints->NbPoints];
686 for( i = 0; i < alpoints->NbPoints; i++ )
687 varr[i].xyz[0] = alpoints->UPoints.Points[i].x,
688 varr[i].xyz[1] = alpoints->UPoints.Points[i].y,
689 varr[i].xyz[2] = alpoints->UPoints.Points[i].z;
690 k[nk].id = VERTICES_ID;
691 k[nk].data.pdata = varr;
695 case 2 : /* Coordinates and Vertex Normal Specified */
696 varr = new TEL_POINT[alpoints->NbPoints];
704 narr = new TEL_POINT[alpoints->NbPoints];
713 for( i = 0; i < alpoints->NbPoints; i++ )
715 varr[i].xyz[0] = alpoints->UPoints.PointsN[i].Point.x,
716 varr[i].xyz[1] = alpoints->UPoints.PointsN[i].Point.y,
717 varr[i].xyz[2] = alpoints->UPoints.PointsN[i].Point.z;
719 narr[i].xyz[0] = alpoints->UPoints.PointsN[i].Normal.dx,
720 narr[i].xyz[1] = alpoints->UPoints.PointsN[i].Normal.dy,
721 narr[i].xyz[2] = alpoints->UPoints.PointsN[i].Normal.dz;
723 k[nk].id = VERTICES_ID;
724 k[nk].data.pdata = varr;
726 k[nk].id = VNORMALS_ID;
727 k[nk].data.pdata = narr;
731 case 3 : /* Coordinates and Vertex Colour Specified */
732 varr = new TEL_POINT[alpoints->NbPoints];
740 carr = new TEL_COLOUR[alpoints->NbPoints];
749 for( i = 0; i < alpoints->NbPoints; i++ )
751 varr[i].xyz[0] = alpoints->UPoints.PointsC[i].Point.x,
752 varr[i].xyz[1] = alpoints->UPoints.PointsC[i].Point.y,
753 varr[i].xyz[2] = alpoints->UPoints.PointsC[i].Point.z;
755 carr[i].rgb[0] = alpoints->UPoints.PointsC[i].Color.r,
756 carr[i].rgb[1] = alpoints->UPoints.PointsC[i].Color.g,
757 carr[i].rgb[2] = alpoints->UPoints.PointsC[i].Color.b;
759 k[nk].id = VERTICES_ID;
760 k[nk].data.pdata = varr;
762 k[nk].id = VERTEX_COLOUR_VALS_ID;
763 k[nk].data.pdata = carr;
767 case 4 : /* Coordinates and Vertex Colour and Vertex Normal Specified */
768 varr = new TEL_POINT[alpoints->NbPoints];
776 carr = new TEL_COLOUR[alpoints->NbPoints];
785 narr = new TEL_POINT[alpoints->NbPoints];
795 for( i = 0; i < alpoints->NbPoints; i++ )
797 varr[i].xyz[0] = alpoints->UPoints.PointsNC[i].Point.x,
798 varr[i].xyz[1] = alpoints->UPoints.PointsNC[i].Point.y,
799 varr[i].xyz[2] = alpoints->UPoints.PointsNC[i].Point.z;
801 carr[i].rgb[0] = alpoints->UPoints.PointsNC[i].Color.r,
802 carr[i].rgb[1] = alpoints->UPoints.PointsNC[i].Color.g,
803 carr[i].rgb[2] = alpoints->UPoints.PointsNC[i].Color.b;
805 narr[i].xyz[0] = alpoints->UPoints.PointsNC[i].Normal.dx,
806 narr[i].xyz[1] = alpoints->UPoints.PointsNC[i].Normal.dy,
807 narr[i].xyz[2] = alpoints->UPoints.PointsNC[i].Normal.dz;
809 k[nk].id = VERTICES_ID;
810 k[nk].data.pdata = varr;
812 k[nk].id = VERTEX_COLOUR_VALS_ID;
813 k[nk].data.pdata = carr;
815 k[nk].id = VNORMALS_ID;
816 k[nk].data.pdata = narr;
820 case 5 : /* Coordinates and Vertex Normal and Texture Coordinates specified */
821 varr = new TEL_POINT[alpoints->NbPoints];
829 narr = new TEL_POINT[alpoints->NbPoints];
838 tarr = new TEL_TEXTURE_COORD[alpoints->NbPoints];
849 for( i = 0; i < alpoints->NbPoints; i++ )
851 varr[i].xyz[0] = alpoints->UPoints.PointsNT[i].Point.x,
852 varr[i].xyz[1] = alpoints->UPoints.PointsNT[i].Point.y,
853 varr[i].xyz[2] = alpoints->UPoints.PointsNT[i].Point.z;
855 narr[i].xyz[0] = alpoints->UPoints.PointsNT[i].Normal.dx,
856 narr[i].xyz[1] = alpoints->UPoints.PointsNT[i].Normal.dy,
857 narr[i].xyz[2] = alpoints->UPoints.PointsNT[i].Normal.dz;
859 tarr[i].xy[0] = alpoints->UPoints.PointsNT[i].TextureCoord.tx,
860 tarr[i].xy[1] = alpoints->UPoints.PointsNT[i].TextureCoord.ty;
862 k[nk].id = VERTICES_ID;
863 k[nk].data.pdata = varr;
865 k[nk].id = VNORMALS_ID;
866 k[nk].data.pdata = narr;
868 k[nk].id = VTEXTURECOORD_ID;
869 k[nk].data.pdata = tarr;
874 for( i = 0; i < nk; i++ )
878 TsmAddToStructure( TelPolygonIndices, -nk, kp );
896 call_subr_polygon_set( CALL_DEF_LISTFACETS * alfacets )
899 register Tint i, j, k;
901 Tint num_bounds, *bounds;
904 num_bounds = alfacets->NbFacets;
905 bounds = new Tint[num_bounds];
909 for( i = 0, j = 0; i < num_bounds; i++ )
910 j += alfacets->LFacets[i].NbPoints;
912 points = new TEL_POINT[j];
919 for( i = 0, k = 0; i < num_bounds; i++ )
920 for( j = 0; j < alfacets->LFacets[i].NbPoints; j++ )
922 points[k].xyz[0] = alfacets->LFacets[i].UPoints.Points[j].x;
923 points[k].xyz[1] = alfacets->LFacets[i].UPoints.Points[j].y;
924 points[k].xyz[2] = alfacets->LFacets[i].UPoints.Points[j].z;
928 key[0].id = NUM_FACETS_ID;
929 key[0].data.ldata = num_bounds;
930 key[1].id = BOUNDS_DATA_ID;
931 key[1].data.pdata = bounds;
932 key[2].id = VERTICES_ID;
933 key[2].data.pdata = points;
934 TsmAddToStructure( TelPolygonSet, 3, &key[0], &key[1], &key[2] );
944 call_subr_quadrangle( CALL_DEF_QUAD * aquad )
949 tel_point vertices, vnormals=0;
950 tel_texture_coord vtexturecoord=0;
952 /* key[nk].id = NUM_ROWS_ID; */
953 key[nk].id = NUM_COLUMNS_ID;
954 key[nk].data.ldata = aquad->SizeRow - 1;
956 /* key[nk].id = NUM_COLUMNS_ID; */
957 key[nk].id = NUM_ROWS_ID;
958 key[nk].data.ldata = aquad->SizeCol - 1;
961 //cmn_memreserve( vertices, aquad->NbPoints, 0 );
962 vertices = new TEL_POINT[aquad->NbPoints];
966 switch( aquad->TypePoints )
968 case 1: /* Vertex Coordinates Specified */
969 for( i = 0; i < aquad->NbPoints; i++ )
971 vertices[i].xyz[0] = aquad->UPoints.Points[i].x;
972 vertices[i].xyz[1] = aquad->UPoints.Points[i].y;
973 vertices[i].xyz[2] = aquad->UPoints.Points[i].z;
977 case 2: /* Coordinates and Vertex Normal Specified */
978 //cmn_memreserve( vnormals, aquad->NbPoints, 0 );
979 vnormals = new TEL_POINT[aquad->NbPoints];
982 //cmn_freemem( vertices );
986 for( i = 0; i < aquad->NbPoints; i++ )
988 vertices[i].xyz[0] = aquad->UPoints.PointsN[i].Point.x;
989 vertices[i].xyz[1] = aquad->UPoints.PointsN[i].Point.y;
990 vertices[i].xyz[2] = aquad->UPoints.PointsN[i].Point.z;
991 vnormals[i].xyz[0] = aquad->UPoints.PointsN[i].Normal.dx;
992 vnormals[i].xyz[1] = aquad->UPoints.PointsN[i].Normal.dy;
993 vnormals[i].xyz[2] = aquad->UPoints.PointsN[i].Normal.dz;
995 key[nk].id = VNORMALS_ID;
996 key[nk].data.pdata = vnormals;
1000 case 5: /* Coordinates and Vertex Normal and Texture Coordinate Specified */
1001 vnormals = new TEL_POINT[aquad->NbPoints];
1007 vtexturecoord = new TEL_TEXTURE_COORD[aquad->NbPoints];
1013 for( i = 0; i < aquad->NbPoints; i++ )
1015 vertices[i].xyz[0] = aquad->UPoints.PointsNT[i].Point.x;
1016 vertices[i].xyz[1] = aquad->UPoints.PointsNT[i].Point.y;
1017 vertices[i].xyz[2] = aquad->UPoints.PointsNT[i].Point.z;
1018 vnormals[i].xyz[0] = aquad->UPoints.PointsNT[i].Normal.dx;
1019 vnormals[i].xyz[1] = aquad->UPoints.PointsNT[i].Normal.dy;
1020 vnormals[i].xyz[2] = aquad->UPoints.PointsNT[i].Normal.dz;
1021 vtexturecoord[i].xy[0] = aquad->UPoints.PointsNT[i].TextureCoord.tx;
1022 vtexturecoord[i].xy[1] = aquad->UPoints.PointsNT[i].TextureCoord.ty;
1024 key[nk].id = VNORMALS_ID;
1025 key[nk].data.pdata = vnormals;
1027 key[nk].id = VTEXTURECOORD_ID;
1028 key[nk].data.pdata = vtexturecoord;
1033 key[nk].id = VERTICES_ID;
1034 key[nk].data.pdata = vertices;
1037 for( i = 0; i < nk; i++ )
1040 TsmAddToStructure( TelQuadrangle, -nk, kp );
1044 delete[] vtexturecoord;
1052 call_subr_set_text_colr( Tfloat r, Tfloat g, Tfloat b )
1060 key.data.pdata = &col;
1061 TsmAddToStructure( TelTextColour, 1, &key );
1067 call_subr_set_text_colr_subtitle( Tfloat r, Tfloat g, Tfloat b )
1075 key.data.pdata = &col;
1076 TsmAddToStructure( TelTextColourSubTitle, 1, &key );
1083 call_subr_triangle( CALL_DEF_TRIKE * atrike )
1086 tel_point vertices, vnormals=0;
1087 tel_texture_coord vtexturecoord=0;
1092 vertices = new TEL_POINT[atrike->NbPoints];
1096 switch( atrike->TypePoints )
1098 case 1: /* Vertex Coordinates Specified */
1099 for( i = 0; i < atrike->NbPoints; i++ )
1101 vertices[i].xyz[0] = atrike->UPoints.Points[i].x;
1102 vertices[i].xyz[1] = atrike->UPoints.Points[i].y;
1103 vertices[i].xyz[2] = atrike->UPoints.Points[i].z;
1107 case 2: /* Coordinates and Vertex Normal Specified */
1108 vnormals = new TEL_POINT[atrike->NbPoints];
1114 for( i = 0; i < atrike->NbPoints; i++ )
1116 vertices[i].xyz[0] = atrike->UPoints.PointsN[i].Point.x;
1117 vertices[i].xyz[1] = atrike->UPoints.PointsN[i].Point.y;
1118 vertices[i].xyz[2] = atrike->UPoints.PointsN[i].Point.z;
1119 vnormals[i].xyz[0] = atrike->UPoints.PointsN[i].Normal.dx;
1120 vnormals[i].xyz[1] = atrike->UPoints.PointsN[i].Normal.dy;
1121 vnormals[i].xyz[2] = atrike->UPoints.PointsN[i].Normal.dz;
1123 key[nk].id = VNORMALS_ID;
1124 key[nk].data.pdata = vnormals;
1127 case 5: /* Coordinates and Vertex Normal and Texture Coordinates Specified */
1128 vnormals = new TEL_POINT[atrike->NbPoints];
1134 vtexturecoord = new TEL_TEXTURE_COORD[atrike->NbPoints];
1140 for( i = 0; i < atrike->NbPoints; i++ )
1142 vertices[i].xyz[0] = atrike->UPoints.PointsNT[i].Point.x;
1143 vertices[i].xyz[1] = atrike->UPoints.PointsNT[i].Point.y;
1144 vertices[i].xyz[2] = atrike->UPoints.PointsNT[i].Point.z;
1145 vnormals[i].xyz[0] = atrike->UPoints.PointsNT[i].Normal.dx;
1146 vnormals[i].xyz[1] = atrike->UPoints.PointsNT[i].Normal.dy;
1147 vnormals[i].xyz[2] = atrike->UPoints.PointsNT[i].Normal.dz;
1148 vtexturecoord[i].xy[0] = atrike->UPoints.PointsNT[i].TextureCoord.tx;
1149 vtexturecoord[i].xy[1] = atrike->UPoints.PointsNT[i].TextureCoord.ty;
1151 key[nk].id = VNORMALS_ID;
1152 key[nk].data.pdata = vnormals;
1154 key[nk].id = VTEXTURECOORD_ID;
1155 key[nk].data.pdata = vtexturecoord;
1160 key[nk].id = NUM_FACETS_ID;
1161 key[nk].data.ldata = atrike->NbPoints-2;
1164 key[nk].id = VERTICES_ID;
1165 key[nk].data.pdata = vertices;
1168 for( i = 0; i < nk; i++ )
1171 TsmAddToStructure( TelTriangleMesh, -nk, kp );
1182 call_subr_set_highl_rep( Tint ind )
1186 key.data.ldata = ind;
1187 TsmAddToStructure( TelHighlightIndex, 1, &key );
1196 call_subr_structure_exploration( Tint Id,
1202 CALL_DEF_NORMAL *npt,
1203 CALL_DEF_COLOR *cpt,
1204 CALL_DEF_NORMAL *nfa )
1206 #define CALL_MAX_ELEMS_PRINT 1000000
1207 Tfloat r=0, g=0, b=0;
1208 Tfloat x=0, y=0, z=0;
1209 Tfloat nx=0, ny=0, nz=0;
1210 Tfloat dx=0, dy=0, dz=0;
1212 static Tint Initialisation = 1;
1215 Tint actual_size; /* OUT content size */
1216 Tint err=0; /* OUT error indicator */
1217 TelType type; /* OUT element type */
1218 Tint size; /* OUT element size */
1219 Tint ws; /* OUT workstation */
1221 Tint index; /* element pointer value */
1222 Tint cur_index; /* OUT element pointer value */
1223 Teldata data; /* OUT data record */
1229 static Tint idata, jdata, kdata;
1231 Tint printall; /* print all structure elements or not */
1232 Tint dump; /* print or not */
1234 static Tint IdCur; /* current structure id
1235 (for exploration step by step) */
1236 static Tint ElCur; /* current structure element number
1237 (for exploration step by step) */
1238 static Tint IndCur; /* current index point in the structure element
1239 (for exploration step by step) */
1240 static Tint JndCur; /* current index element in the structure element
1241 (for exploration step by step) */
1242 static Tint EndExplo;/* flag when the exploration of the current
1244 (for exploration step by step) */
1246 if( Initialisation )
1257 MAXPOINTS = CALL_MAX_ELEMS_PRINT;
1258 MAXAREAS = CALL_MAX_ELEMS_PRINT;
1260 if( (LabelBegin == 0) && (LabelEnd == 0) )
1272 npt->dx = npt->dy = npt->dz = nx = ny = nz = ( float )0.0;
1273 nfa->dx = nfa->dy = nfa->dz = dx = dy = dz = ( float )0.0;
1274 pt->x = pt->y = pt->z = x = y = z = ( float )0.0;
1275 cpt->r = cpt->g = cpt->b = r = g = b = ( float )0.0;
1277 if ( (Id != IdCur) || (ElCur != elem_num) || EndExplo )
1298 call_func_open_struct (Id);
1302 call_func_set_elem_ptr( index );
1303 if( call_func_inq_elem_ptr( &cur_index ) == TFailure )
1309 if( ( index != cur_index ) || err )
1314 if( TelInqCurElemTypeSize( &type, &size ) == TFailure )
1319 if( err || (type == CALL_PHIGS_ELEM_NIL) )
1331 if( type == CALL_PHIGS_ELEM_LABEL )
1333 buffer = (Tchar *)malloc( CALL_ );
1334 TelInqCurElemContent( CALL_, buffer, &actual_size, &data );
1336 if( data.idata == LabelBegin )
1338 if( ( LabelBegin == 0 ) && ( LabelEnd == 0 ) )
1350 x = ( float )data.idata;
1357 printf( "\tELEM_LABEL\n" );
1358 printf( "\t\tLABEL %d\n", data.idata );
1362 if( data.idata == LabelEnd )
1372 case CALL_PHIGS_ELEM_NIL :
1382 x = y = z = ( float )0.0;
1387 printf("\tELEM_NIL\n");
1388 printf("\t\tNo data involved\n");
1392 case CALL_PHIGS_ELEM_POLYMARKER3 :
1395 buffer = new Tchar[i];
1396 TelInqCurElemContent( i, buffer, &actual_size, &data );
1397 idata = size/sizeof( TEL_POINT );
1400 if( (IndCur > -1) && (IndCur < idata) )
1403 x = data.pts3[i].xyz[0];
1404 y = data.pts3[i].xyz[1];
1405 z = data.pts3[i].xyz[2];
1407 if (IndCur >= idata)
1412 printf("\tELEM_POLYMARKER3\n");
1413 printf("\t\tPOLYMARKER 3 nb pts %d\n", idata);
1416 for (i=0; i<idata && i<MAXPOINTS; i++)
1417 printf( "\t\tpoint %d : %f %f %f\n", i,
1418 data.pts3[i].xyz[0],
1419 data.pts3[i].xyz[1],
1420 data.pts3[i].xyz[2] );
1425 printf( "\t\tfirst point %d : %f %f %f\n", i,
1426 data.pts3[i].xyz[0],
1427 data.pts3[i].xyz[1],
1428 data.pts3[i].xyz[2] );
1430 printf("\t\tlast point %d : %f %f %f\n", i,
1431 data.pts3[i].xyz[0],
1432 data.pts3[i].xyz[1],
1433 data.pts3[i].xyz[2]);
1439 case CALL_PHIGS_ELEM_FILL_AREA_SET3 :
1442 buffer = new Tchar[i];
1443 TelInqCurElemContent( i, buffer, &actual_size, &data );
1444 jdata = data.fillareaset3data.num_bounds;
1447 if ((IndCur == 0) && (JndCur == 0))
1449 if (JndCur >= jdata)
1455 idata = data.fillareaset3data.bounds[JndCur];
1459 if ((IndCur > -1) && (IndCur < idata))
1462 data.fillareaset3data.points[kdata+IndCur].xyz[0];
1464 data.fillareaset3data.points[kdata+IndCur].xyz[1];
1466 data.fillareaset3data.points[kdata+IndCur].xyz[2];
1468 if(data.fillareaset3data.vrtflag ==
1469 CALL_PHIGS_VERT_COORD_NORMAL)
1471 nx = data.fillareaset3data.vnormals[IndCur].xyz[0];
1472 ny = data.fillareaset3data.vnormals[IndCur].xyz[1];
1473 nz = data.fillareaset3data.vnormals[IndCur].xyz[2];
1475 if(data.fillareaset3data.vrtflag ==
1476 CALL_PHIGS_VERT_COORD_COLOUR)
1479 data.fillareaset3data.colours[kdata+IndCur].rgb[0];
1481 data.fillareaset3data.colours[kdata+IndCur].rgb[1];
1483 data.fillareaset3data.colours[kdata+IndCur].rgb[2];
1485 if (data.fillareaset3data.vrtflag ==
1486 CALL_PHIGS_VERT_COORD_COLOUR_NORMAL)
1488 nx = data.fillareaset3data.vnormals[IndCur].xyz[0];
1489 ny = data.fillareaset3data.vnormals[IndCur].xyz[1];
1490 nz = data.fillareaset3data.vnormals[IndCur].xyz[2];
1492 data.fillareaset3data.colours[kdata+IndCur].rgb[0];
1494 data.fillareaset3data.colours[kdata+IndCur].rgb[1];
1496 data.fillareaset3data.colours[kdata+IndCur].rgb[2];
1500 if (IndCur >= idata)
1502 kdata += data.fillareaset3data.bounds[JndCur];
1510 printf("\tELEM_FILL_AREA_SET3_DATA\n");
1511 printf("\t\tSET OF FILL AREA SET 3 WITH DATA\n");
1513 printf("\t\tnb of faces %d\n", jdata);
1514 printf("\t\tfflag %d eflag %d vflag %d colr model RGB\n",
1515 data.fillareaset3data.faflag,
1516 data.fillareaset3data.edgflag,
1517 data.fillareaset3data.vrtflag );
1519 for (j=0; j<jdata && j<MAXAREAS; j++)
1521 idata = data.fillareaset3data.bounds[j];
1522 printf("\t\tface %d : %d vertices\n", j, idata);
1523 if (data.fillareaset3data.faflag ==
1524 CALL_PHIGS_FACET_NORMAL)
1525 printf("\t\t\tface normal %f %f %f\n",
1526 data.fillareaset3data.gnormal[j].xyz[0],
1527 data.fillareaset3data.gnormal[j].xyz[1],
1528 data.fillareaset3data.gnormal[j].xyz[2]);
1529 if (data.fillareaset3data.faflag ==
1530 CALL_PHIGS_FACET_COLOUR_NORMAL)
1531 printf("\t\t\tnormal %f %f %f\n",
1532 data.fillareaset3data.gnormal[j].xyz[0],
1533 data.fillareaset3data.gnormal[j].xyz[1],
1534 data.fillareaset3data.gnormal[j].xyz[2]);
1536 for (i=0; i<idata && i<MAXPOINTS; i++)
1537 printf("\t\t\tvertex %d : %f %f %f\n", i,
1538 data.fillareaset3data.points[kdata+i].xyz[0],
1539 data.fillareaset3data.points[kdata+i].xyz[1],
1540 data.fillareaset3data.points[kdata+i].xyz[2]);
1544 printf("\t\tfirst vertex %d : %f %f %f\n", i,
1545 data.fillareaset3data.points[kdata+i].xyz[0],
1546 data.fillareaset3data.points[kdata+i].xyz[1],
1547 data.fillareaset3data.points[kdata+i].xyz[2]);
1550 printf("\t\tlast vertex %d : %f %f %f\n", i,
1551 data.fillareaset3data.points[kdata+i].xyz[0],
1552 data.fillareaset3data.points[kdata+i].xyz[1],
1553 data.fillareaset3data.points[kdata+i].xyz[2]);
1555 kdata += data.fillareaset3data.bounds[j];
1561 case CALL_PHIGS_ELEM_FILL_AREA3 :
1564 buffer = new Tchar[i];
1565 TelInqCurElemContent( i, buffer, &actual_size, &data );
1566 idata = data.fillarea3data.num_points;
1570 if( (IndCur > -1) && (IndCur < idata) )
1573 x = data.fillarea3data.points[i].xyz[0];
1574 y = data.fillarea3data.points[i].xyz[1];
1575 z = data.fillarea3data.points[i].xyz[2];
1577 if( IndCur >= idata )
1582 printf( "\tELEM_FILL_AREA3\n" );
1583 printf( "\t\tFILL AREA 3 nb pts %d\n", idata );
1586 for( i=0; i<idata && i<MAXPOINTS; i++ )
1587 printf( "\t\tpoint %d : %f %f %f\n", i,
1588 data.fillarea3data.points[i].xyz[0],
1589 data.fillarea3data.points[i].xyz[1],
1590 data.fillarea3data.points[i].xyz[2] );
1595 printf("\t\tfirst point %d : %f %f %f\n", i,
1596 data.fillarea3data.points[i].xyz[0],
1597 data.fillarea3data.points[i].xyz[1],
1598 data.fillarea3data.points[i].xyz[2] );
1600 printf("\t\tlast point %d : %f %f %f\n", i,
1601 data.fillarea3data.points[i].xyz[0],
1602 data.fillarea3data.points[i].xyz[1],
1603 data.fillarea3data.points[i].xyz[2] );
1609 case CALL_PHIGS_ELEM_ANNO_TEXT_REL3 :
1611 buffer = new Tchar[size];
1612 TelInqCurElemContent( size, buffer, &actual_size, &data );
1618 x = data.atext3.ref_pt.xyz[0];
1619 y = data.atext3.ref_pt.xyz[1];
1620 z = data.atext3.ref_pt.xyz[2];
1624 x = data.atext3.anno.xyz[0];
1625 y = data.atext3.anno.xyz[1];
1626 z = data.atext3.anno.xyz[2];
1633 printf( "\tELEM_ANNO_TEXT_REL3\n" );
1634 printf( "\t\tANNOTATION TEXT RELATIVE 3 %S\n",
1635 data.atext3.string );
1636 printf( "\t\treference point %f %f %f\n",
1637 data.atext3.ref_pt.xyz[0],
1638 data.atext3.ref_pt.xyz[1],
1639 data.atext3.ref_pt.xyz[2] );
1640 printf( "\t\toffset %f %f %f\n",
1641 data.atext3.anno.xyz[0],
1642 data.atext3.anno.xyz[1],
1643 data.atext3.anno.xyz[2] );
1648 case CALL_PHIGS_ELEM_LINETYPE :
1650 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1657 x = ( float )data.idata;
1663 printf("\tELEM_LINETYPE\n");
1664 printf("\t\tLINETYPE %d\n", data.idata);
1668 case CALL_PHIGS_ELEM_LINEWIDTH :
1670 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1684 printf( "\tELEM_LINEWIDTH\n" );
1685 printf( "\t\tLINEWIDTH SCALE FACTOR %f\n", data.fdata);
1689 case CALL_PHIGS_ELEM_MARKER_TYPE :
1691 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1698 x = ( float )data.idata;
1705 printf("\tELEM_MARKER_TYPE\n");
1706 printf("\t\tMARKER TYPE %d\n", data.idata);
1710 case CALL_PHIGS_ELEM_MARKER_SIZE :
1712 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1726 printf("\tELEM_MARKER_SIZE\n");
1727 printf("\t\tMARKER SIZE SCALE FACTOR %f\n", data.fdata);
1732 case CALL_PHIGS_ELEM_TEXT_FONT : /* DECPHIGS */
1733 buffer = new Tchar[CALL_];
1734 TelInqCurElemContent (CALL_, buffer, &actual_size, &data);
1744 printf("\tELEM_TEXT_FONT\n");
1745 printf("\t\tTEXT FONT %d\n", data.idata);
1750 case CALL_PHIGS_ELEM_CHAR_EXPAN :
1752 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1766 printf("\tELEM_CHAR_EXPAN\n");
1767 printf("\t\tCHARACTER EXPANSION FACTOR %f\n",data.fdata);
1771 case CALL_PHIGS_ELEM_CHAR_SPACE :
1773 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1787 printf("\tELEM_CHAR_SPACE\n");
1788 printf("\t\tCHARACTER SPACING %f\n", data.fdata);
1792 case CALL_PHIGS_ELEM_ANNO_CHAR_HT :
1794 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1808 printf("\tELEM_ANNO_CHAR_HT\n");
1809 printf("\t\tANNOTATION TEXT CHARACTER HEIGHT %f\n",
1814 case CALL_PHIGS_ELEM_INT_STYLE :
1816 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1823 x = ( float )data.interior_style;
1830 printf("\tELEM_INT_STYLE\n");
1831 printf("\t\tINTERIOR STYLE %d\n", data.interior_style);
1835 case CALL_PHIGS_ELEM_INT_STYLE_IND :
1837 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1844 x = ( float )data.idata;
1851 printf("\tELEM_INT_STYLE_IND\n");
1852 printf("\t\tINTERIOR STYLE INDEX %d\n", data.idata);
1856 case CALL_PHIGS_ELEM_EDGE_FLAG :
1858 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1865 x = ( float )data.edge_flag;
1872 printf("\tELEM_EDGE_FLAG\n");
1873 printf("\t\tEDGE FLAG %d\n", data.edge_flag);
1877 case CALL_PHIGS_ELEM_EDGETYPE :
1879 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1886 x = ( float )data.idata;
1893 printf("\tELEM_EDGETYPE\n");
1894 printf("\t\tEDGETYPE %d\n", data.idata);
1898 case CALL_PHIGS_ELEM_EDGEWIDTH :
1900 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1914 printf("\tELEM_EDGEWIDTH\n");
1915 printf("\t\tEDGEWIDTH SCALE FACTOR %f\n", data.fdata);
1919 case CALL_PHIGS_ELEM_ADD_NAMES_SET :
1921 buffer = new Tchar[size];
1922 TelInqCurElemContent( size, buffer, &actual_size, &data );
1923 idata = data.name_set.number;
1926 if( (IndCur > -1) && (IndCur < idata) )
1929 x = ( float )data.name_set.integers[i];
1933 if( IndCur >= idata )
1938 printf("\tELEM_ADD_NAMES_SET\n");
1939 printf("\t\tADD NAMES TO SET\n");
1940 for( i=0; i<idata; i++ )
1941 printf("\t\tnames %d : %d\n",
1942 i, data.name_set.integers[i]);
1947 case CALL_PHIGS_ELEM_REMOVE_NAMES_SET :
1949 buffer = new Tchar[size];
1950 TelInqCurElemContent( size, buffer, &actual_size, &data );
1951 idata = data.name_set.number;
1954 if( (IndCur > -1) && (IndCur < idata) )
1957 x = ( float )data.name_set.integers[i];
1961 if (IndCur >= idata)
1966 printf("\tELEM_REMOVE_NAMES_SET\n");
1967 printf("\t\tREMOVE NAMES FROM SET\n");
1968 for( i=0; i<idata; i++ )
1969 printf("\t\tnames %d : %d\n",
1970 i, data.name_set.integers[i]);
1975 case CALL_PHIGS_ELEM_LOCAL_MODEL_TRAN3 :
1977 TelInqCurElemContent( 0, buffer, &actual_size, &data );
1984 x = y = z = ( float )0.0;
1989 printf("\tELEM_LOCAL_MODEL_TRAN3\n");
1990 printf("\t\tLOCAL MODELLING TRANSFORMATION 3 comp %d\n",
1991 data.local_xform_3.compose_type);
1992 for( i=0; i<4; i++ )
1995 for( j=0; j<4; j++ )
1996 printf(" %f", data.local_xform_3.mat3[i][j]);
2002 case CALL_PHIGS_ELEM_VIEW_IND :
2004 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2011 x = ( float )data.idata;
2018 printf("\tELEM_VIEW_IND\n");
2019 printf("\t\tVIEW INDEX %d\n", data.idata);
2021 if(! call_subr_inquirews (Id, &ws))
2022 printf("\t\tERROR : no view definition\n");
2025 printf("\t\tview structure in %d workstation\n", ws);
2026 printf("\t\t**********************\n");
2027 printf("\t\tdefinition in the ws %d\n", ws);
2028 printf("\t\t**********************\n");
2029 TelPrintViewRepresentation( ws, Id );
2034 case CALL_PHIGS_ELEM_EXEC_STRUCT :
2036 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2043 x = ( float )data.idata;
2050 printf("\tELEM_EXEC_STRUCT\n");
2051 printf("\t\tEXECUTE STRUCTURE %d\n", data.idata);
2055 case CALL_PHIGS_ELEM_APPL_DATA :
2057 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2064 x = y = z = ( float )0.0;
2069 printf("\tELEM_APPL_DATA\n");
2070 printf("\t\tcontent not exploited\n");
2074 case CALL_PHIGS_ELEM_PICK_ID :
2076 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2083 x = ( float )data.idata;
2090 printf("\tELEM_PICK_ID\n");
2091 printf("\t\tPICK ID %d\n", data.idata);
2095 case CALL_PHIGS_ELEM_POLYLINE_SET3_DATA : /* DECPHIGS */
2097 buffer = new Tchar[size];
2098 TelInqCurElemContent( size, buffer, &actual_size, &data);
2099 jdata = data.lineset3data.num_bounds;
2103 if( ( IndCur == -1 ) && ( JndCur == 0 ) )
2106 if( JndCur >= jdata )
2112 idata = data.lineset3data.bounds[JndCur];
2116 if ( ( IndCur > -1 ) && ( IndCur < idata ) )
2118 x = data.lineset3data.points[kdata+IndCur].xyz[0];
2119 y = data.lineset3data.points[kdata+IndCur].xyz[1];
2120 z = data.lineset3data.points[kdata+IndCur].xyz[2];
2122 if( data.lineset3data.colours )
2125 data.lineset3data.colours[kdata+IndCur].rgb[0];
2127 data.lineset3data.colours[kdata+IndCur].rgb[1];
2129 data.lineset3data.colours[kdata+IndCur].rgb[2];
2133 if( IndCur >= idata )
2135 kdata += data.lineset3data.bounds[JndCur];
2144 printf( "\tELEM_POLYLINE_SET3_DATA\n" );
2146 printf( "\t\tPOLYLINE SET 3 WITH DATA\n" );
2147 printf( "\t\tnb of lines %d\n", jdata );
2148 printf( "\t\tvflag %d colr model RGB\n",
2149 data.lineset3data.vrtflag );
2150 for( j = 0; j < jdata && j < MAXAREAS; j++ )
2152 idata = data.lineset3data.bounds[j];
2153 printf( "\t\tface %d : %d vertices\n", j, idata );
2156 for( i = 0; i < idata && i < MAXPOINTS; i++ )
2157 printf( "\t\t\tvertex %d : %f %f %f\n", i,
2158 data.lineset3data.points[kdata+i].xyz[0],
2159 data.lineset3data.points[kdata+i].xyz[1],
2160 data.lineset3data.points[kdata+i].xyz[2] );
2165 printf( "\t\tfirst vertex %d : %f %f %f\n", i,
2166 data.lineset3data.points[kdata+i].xyz[0],
2167 data.lineset3data.points[kdata+i].xyz[1],
2168 data.lineset3data.points[kdata+i].xyz[2] );
2171 printf( "\t\tlast vertex %d : %f %f %f\n", i,
2172 data.lineset3data.points[kdata+i].xyz[0],
2173 data.lineset3data.points[kdata+i].xyz[1],
2174 data.lineset3data.points[kdata+i].xyz[2] );
2176 kdata += data.lineset3data.bounds[j];
2182 case CALL_PHIGS_ELEM_TRI_STRIP3_DATA :
2184 buffer = new Tchar[size];
2185 TelInqCurElemContent( size, buffer, &actual_size, &data );
2186 idata = data.trianglestrip3data.num_facets + 2;
2190 if (IndCur >= idata)
2194 x = data.trianglestrip3data.points[IndCur].xyz[0];
2195 y = data.trianglestrip3data.points[IndCur].xyz[1];
2196 z = data.trianglestrip3data.points[IndCur].xyz[2];
2198 if( data.trianglestrip3data.vrtflag ==
2199 CALL_PHIGS_VERT_COORD_COLOUR )
2201 r = data.trianglestrip3data.colours[IndCur].rgb[0];
2202 g = data.trianglestrip3data.colours[IndCur].rgb[1];
2203 b = data.trianglestrip3data.colours[IndCur].rgb[2];
2205 else if( data.trianglestrip3data.vrtflag ==
2206 CALL_PHIGS_VERT_COORD_NORMAL )
2209 data.trianglestrip3data.vnormals[IndCur].xyz[0];
2211 data.trianglestrip3data.vnormals[IndCur].xyz[1];
2213 data.trianglestrip3data.vnormals[IndCur].xyz[2];
2215 else if( data.trianglestrip3data.vrtflag ==
2216 CALL_PHIGS_VERT_COORD_COLOUR_NORMAL )
2219 data.trianglestrip3data.vnormals[IndCur].xyz[0];
2221 data.trianglestrip3data.vnormals[IndCur].xyz[1];
2223 data.trianglestrip3data.vnormals[IndCur].xyz[2];
2224 r = data.trianglestrip3data.colours[IndCur].rgb[0];
2225 g = data.trianglestrip3data.colours[IndCur].rgb[1];
2226 b = data.trianglestrip3data.colours[IndCur].rgb[2];
2232 printf("\tELEM_TRI_STRIP3_DATA\n");
2233 printf("\t\tTRIANGLE STRIP 3 WITH DATA\n");
2234 printf("\t\tnb of vertices %d\n", idata);
2235 printf("\t\tfflag %d vflag %d colr model RGB\n",
2236 data.trianglestrip3data.fctflag,
2237 data.trianglestrip3data.vrtflag);
2239 for( i=0; i<idata && i<MAXPOINTS; i++ )
2240 printf("\t\t\tvertex %d : %f %f %f\n", i,
2241 data.trianglestrip3data.points[i].xyz[0],
2242 data.trianglestrip3data.points[i].xyz[1],
2243 data.trianglestrip3data.points[i].xyz[2] );
2247 printf("\t\tfirst vertex %d : %f %f %f\n", i,
2248 data.trianglestrip3data.points[i].xyz[0],
2249 data.trianglestrip3data.points[i].xyz[1],
2250 data.trianglestrip3data.points[i].xyz[2]);
2253 printf("\t\tlast vertex %d : %f %f %f\n", i,
2254 data.trianglestrip3data.points[i].xyz[0],
2255 data.trianglestrip3data.points[i].xyz[1],
2256 data.trianglestrip3data.points[i].xyz[2]);
2262 case CALL_PHIGS_ELEM_QUAD_MESH3_DATA :
2264 buffer = new Tchar[size];
2265 TelInqCurElemContent( size, buffer, &actual_size, &data);
2266 idata = (data.quadmesh3data.dim.x_dim+1) *
2267 (data.quadmesh3data.dim.y_dim+1);
2271 if (IndCur >= idata)
2275 x = data.quadmesh3data.points[IndCur].xyz[0];
2276 y = data.quadmesh3data.points[IndCur].xyz[1];
2277 z = data.quadmesh3data.points[IndCur].xyz[2];
2279 if( data.quadmesh3data.vrtflag ==
2280 CALL_PHIGS_VERT_COORD_COLOUR )
2282 r = data.quadmesh3data.colours[IndCur].rgb[0];
2283 g = data.quadmesh3data.colours[IndCur].rgb[1];
2284 b = data.quadmesh3data.colours[IndCur].rgb[2];
2286 else if( data.quadmesh3data.vrtflag ==
2287 CALL_PHIGS_VERT_COORD_NORMAL )
2289 nx = data.quadmesh3data.vnormals[IndCur].xyz[0];
2290 ny = data.quadmesh3data.vnormals[IndCur].xyz[1];
2291 nz = data.quadmesh3data.vnormals[IndCur].xyz[2];
2293 else if( data.quadmesh3data.vrtflag ==
2294 CALL_PHIGS_VERT_COORD_COLOUR_NORMAL )
2296 nx = data.quadmesh3data.vnormals[IndCur].xyz[0];
2297 ny = data.quadmesh3data.vnormals[IndCur].xyz[1];
2298 nz = data.quadmesh3data.vnormals[IndCur].xyz[2];
2299 r = data.quadmesh3data.colours[IndCur].rgb[0];
2300 g = data.quadmesh3data.colours[IndCur].rgb[1];
2301 b = data.quadmesh3data.colours[IndCur].rgb[2];
2307 printf("\tELEM_QUAD_MESH3_DATA\n");
2308 printf("\t\tQUADRILATERAL MESH 3 WITH DATA\n");
2309 printf("\t\tdimensions %d %d\n",
2310 data.quadmesh3data.dim.x_dim,
2311 data.quadmesh3data.dim.y_dim);
2312 printf("\t\tnb of vertices %d\n", idata);
2313 printf("\t\tfflag %d vflag %d colr model RGB\n",
2314 data.quadmesh3data.fctflag,
2315 data.quadmesh3data.vrtflag);
2318 for( i=0; i<idata && i<MAXPOINTS; i++ )
2319 printf("\t\t\tvertex %d : %f %f %f\n", i,
2320 data.quadmesh3data.points[i].xyz[0],
2321 data.quadmesh3data.points[i].xyz[1],
2322 data.quadmesh3data.points[i].xyz[2]);
2327 printf("\t\tfirst vertex %d : %f %f %f\n", i,
2328 data.quadmesh3data.points[i].xyz[0],
2329 data.quadmesh3data.points[i].xyz[1],
2330 data.quadmesh3data.points[i].xyz[2]);
2333 printf("\t\tlast vertex %d : %f %f %f\n", i,
2334 data.quadmesh3data.points[i].xyz[0],
2335 data.quadmesh3data.points[i].xyz[1],
2336 data.quadmesh3data.points[i].xyz[2]);
2342 case CALL_PHIGS_ELEM_TEXT_COLR :
2344 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2351 x = data.gnl_colour.rgb[0];
2352 y = data.gnl_colour.rgb[1];
2353 z = data.gnl_colour.rgb[2];
2358 printf("\tELEM_TEXT_COLR\n");
2359 printf("\t\tTEXT COLOUR r %f g %f b %f\n",
2360 data.gnl_colour.rgb[0],
2361 data.gnl_colour.rgb[1],
2362 data.gnl_colour.rgb[2] );
2366 case CALL_PHIGS_ELEM_MARKER_COLR :
2368 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2375 x = data.gnl_colour.rgb[0];
2376 y = data.gnl_colour.rgb[1];
2377 z = data.gnl_colour.rgb[2];
2382 printf("\tELEM_MARKER_COLR\n");
2383 printf("\t\tPOLYMARKER COLOUR r %f g %f b %f\n",
2384 data.gnl_colour.rgb[0],
2385 data.gnl_colour.rgb[1],
2386 data.gnl_colour.rgb[2] );
2390 case CALL_PHIGS_ELEM_EDGE_COLR :
2392 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2399 x = data.gnl_colour.rgb[0];
2400 y = data.gnl_colour.rgb[1];
2401 z = data.gnl_colour.rgb[2];
2406 printf("\tELEM_EDGE_COLR\n");
2407 printf("\t\tEDGE COLOUR r %f g %f b %f\n",
2408 data.gnl_colour.rgb[0],
2409 data.gnl_colour.rgb[1],
2410 data.gnl_colour.rgb[2]);
2414 case CALL_PHIGS_ELEM_LINE_COLR :
2416 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2423 x = data.gnl_colour.rgb[0];
2424 y = data.gnl_colour.rgb[1];
2425 z = data.gnl_colour.rgb[2];
2430 printf("\tELEM_LINE_COLR\n");
2431 printf("\t\tPOLYLINE COLOUR r %f g %f b %f\n",
2432 data.gnl_colour.rgb[0],
2433 data.gnl_colour.rgb[1],
2434 data.gnl_colour.rgb[2]);
2438 case CALL_PHIGS_ELEM_INT_COLR :
2440 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2447 x = data.gnl_colour.rgb[0];
2448 y = data.gnl_colour.rgb[1];
2449 z = data.gnl_colour.rgb[2];
2454 printf("\tELEM_INT_COLR\n");
2455 printf("\t\tINTERIOR COLOUR r %f g %f b %f\n",
2456 data.gnl_colour.rgb[0],
2457 data.gnl_colour.rgb[1],
2458 data.gnl_colour.rgb[2]);
2462 case CALL_PHIGS_ELEM_BACK_INT_COLR :
2464 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2471 x = data.gnl_colour.rgb[0];
2472 y = data.gnl_colour.rgb[1];
2473 z = data.gnl_colour.rgb[2];
2478 printf("\tELEM_BACK_INT_COLR\n");
2479 printf("\t\tBACK INTERIOR COLOUR r %f g %f b %f\n",
2480 data.gnl_colour.rgb[0],
2481 data.gnl_colour.rgb[1],
2482 data.gnl_colour.rgb[2]);
2486 case CALL_PHIGS_ELEM_REFL_PROPS :
2488 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2493 x = data.surf_prop.amb;
2494 y = data.surf_prop.diff;
2495 z = data.surf_prop.trans;
2499 x = data.surf_prop.speccol.rgb[0];
2500 y = data.surf_prop.speccol.rgb[1];
2501 z = data.surf_prop.speccol.rgb[2];
2505 x = data.surf_prop.spec;
2506 y = data.surf_prop.shine;
2514 printf("\tELEM_REFL_PROPS\n");
2515 printf("\t\tREFLECTANCE PROPERTIES\n");
2516 printf("\t\tamb coef %f diff coef %f trans coef %f\n",
2518 data.surf_prop.diff,
2519 data.surf_prop.trans);
2520 printf("\t\tspecular color r %f g %f b %f\n",
2521 data.surf_prop.speccol.rgb[0],
2522 data.surf_prop.speccol.rgb[1],
2523 data.surf_prop.speccol.rgb[2]);
2524 printf("\t\tspecular coef %f exp %f\n",
2525 data.surf_prop.spec,
2526 data.surf_prop.shine);
2530 case CALL_PHIGS_ELEM_BACK_REFL_PROPS :
2532 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2536 x = data.surf_prop.amb;
2537 y = data.surf_prop.diff;
2538 z = data.surf_prop.trans;
2541 x = data.surf_prop.speccol.rgb[0];
2542 y = data.surf_prop.speccol.rgb[1];
2543 z = data.surf_prop.speccol.rgb[2];
2546 x = data.surf_prop.spec;
2547 y = data.surf_prop.shine;
2555 printf("\tELEM_BACK_REFL_PROPS\n");
2556 printf("\t\tBACK REFLECTANCE PROPERTIES\n");
2557 printf("\t\tamb coef %f diff coef %f trans coef %f\n",
2559 data.surf_prop.diff,
2560 data.surf_prop.trans);
2561 printf("\t\tspecular color r %f g %f b %f\n",
2562 data.surf_prop.speccol.rgb[0],
2563 data.surf_prop.speccol.rgb[1],
2564 data.surf_prop.speccol.rgb[2]);
2565 printf("\t\tspecular coef %f exp %f\n",
2566 data.surf_prop.spec,
2567 data.surf_prop.shine);
2571 case CALL_PHIGS_ELEM_INT_SHAD_METH :
2573 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2580 x = ( float )data.idata;
2587 printf("\tELEM_INT_SHAD_METH\n");
2588 printf("\t\tINTERIOR SHADING METHOD %d\n", data.idata);
2592 case CALL_PHIGS_ELEM_INT_REFL_EQN :
2594 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2601 x = ( float )data.idata;
2608 printf("\tELEM_INT_REFL_EQN\n");
2609 printf("\t\tREFLECTANCE EQUATION %d\n", data.idata);
2613 case CALL_PHIGS_ELEM_BACK_INT_REFL_EQN :
2615 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2622 x = ( float )data.idata;
2629 printf("\tELEM_BACK_INT_REFL_EQN\n");
2630 printf("\t\tBACK INTERIOR REFLECTANCE EQUATION %d\n",
2635 case CALL_PHIGS_ELEM_FACE_DISTING_MODE :
2637 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2644 x = ( float )data.idata;
2651 printf("\tELEM_FACE_DISTING_MODE\n");
2652 printf("\t\tFACE DISTINGUISHING MODE %d\n", data.idata);
2656 case CALL_PHIGS_ELEM_FACE_CULL_MODE :
2658 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2665 x = ( float )data.idata;
2672 printf("\tELEM_FACE_CULL_MODE\n");
2673 printf("\t\tFACE CULLING MODE %d\n", data.idata);
2677 case CALL_PHIGS_ELEM_LIGHT_SRC_STATE :
2679 buffer = new Tchar[size];
2680 TelInqCurElemContent( size, buffer, &actual_size, &data );
2681 idata = data.light_source_state.on.number;
2682 jdata = data.light_source_state.off.number;
2685 if ( (IndCur >= idata) && (IndCur >= jdata) )
2690 x = ( float )data.light_source_state.on.integers[IndCur];
2692 nx = ( float )data.light_source_state.off.integers[IndCur];
2697 printf("\tELEM_LIGHT_SRC_STATE\n");
2698 for (i=0; i<idata; i++)
2699 printf("\t\tactive light %d\n",
2700 data.light_source_state.on.integers[i]);
2701 for (j=0; j<jdata; j++)
2702 printf("\t\tinactive light %d\n",
2703 data.light_source_state.off.integers[j]);
2708 case CALL_PHIGS_ELEM_DCUE_IND :
2710 TelInqCurElemContent( 0, buffer, &actual_size, &data );
2717 x = ( float )data.idata;
2724 printf("\tELEM_DCUE_IND\n");
2725 printf("\t\tDEPTH CUE INDEX %d\n", data.idata);
2755 } /* while (index) */
2757 call_func_close_struct ();
2761 call_subr_inquirews( Tint struct_id, Tint *ws_id )
2765 TsmGetWSPosted( struct_id, 1, ws_id, &act_size );
2775 call_subr_polygon_holes( CALL_DEF_LISTFACETS * alfacets )
2777 register int i, j, k;
2784 bounds = new Tint[alfacets->NbFacets];
2787 for( i=0; i<alfacets->NbFacets; i++ )
2788 j += alfacets->LFacets[i].NbPoints;
2790 points = new TEL_POINT[j];
2792 for( i = 0; i < alfacets->NbFacets; i++ )
2793 bounds[i] = alfacets->LFacets[i].NbPoints;
2796 for (i=0; i<alfacets->NbFacets; i++)
2798 for (j=0; j<alfacets->LFacets[i].NbPoints; j++)
2800 points[k].xyz[0] = alfacets->LFacets[i].UPoints.Points[j].x;
2801 points[k].xyz[1] = alfacets->LFacets[i].UPoints.Points[j].y;
2802 points[k].xyz[2] = alfacets->LFacets[i].UPoints.Points[j].z;
2815 k1.id = NUM_FACETS_ID;
2816 k1.data.ldata = alfacets->NbFacets;
2817 k2.id = BOUNDS_DATA_ID;
2818 k2.data.pdata = bounds;
2819 k3.id = VERTICES_ID;
2820 k3.data.pdata = points;
2822 TsmAddToStructure( TelPolygonHoles, 3, &k1, &k2, &k3 );
2832 call_subr_polygon_holes_data( CALL_DEF_LISTFACETS * alfacets )
2834 register Tint i, j, k, count=0;
2839 Tint num_bounds, *bounds = 0;
2840 TEL_POINT *vertices = 0;
2841 TEL_POINT *vnormals = 0;
2843 for( i = 0; i < 10; i++ )
2846 key[count].id = SHAPE_FLAG_ID;
2847 key[count].data.ldata = TEL_SHAPE_UNKNOWN;
2850 key[count].id = NUM_FACETS_ID;
2851 key[count].data.ldata = alfacets->NbFacets;
2854 num_bounds = alfacets->NbFacets;
2855 bounds = new Tint[num_bounds];
2857 key[count].id = BOUNDS_DATA_ID;
2858 key[count].data.pdata = bounds;
2862 for( i=0; i<num_bounds; i++ )
2863 num_vertices += alfacets->LFacets[i].NbPoints;
2866 for( i=0; i<num_bounds; i++ )
2868 bounds[i] = alfacets->LFacets[i].NbPoints;
2870 switch( alfacets->LFacets[i].TypePoints )
2872 case 1 : /* Coordinates Specified */
2876 vertices = new TEL_POINT[num_vertices];
2878 key[count].id = VERTICES_ID;
2879 key[count].data.pdata = vertices;
2883 for( j=0; j<alfacets->LFacets[i].NbPoints; j++ )
2885 vertices[k].xyz[0] = alfacets->LFacets[i].UPoints.Points[j].x;
2886 vertices[k].xyz[1] = alfacets->LFacets[i].UPoints.Points[j].y;
2887 vertices[k].xyz[2] = alfacets->LFacets[i].UPoints.Points[j].z;
2894 case 2 : /* Coordinates and Vertex Normal Specified */
2898 vertices = new TEL_POINT[num_vertices];
2900 key[count].id = VERTICES_ID;
2901 key[count].data.pdata = vertices;
2904 vnormals = new TEL_POINT[num_vertices];
2905 key[count].id = VNORMALS_ID;
2906 key[count].data.pdata = vnormals;
2910 for( j=0; j<alfacets->LFacets[i].NbPoints; j++ )
2912 vertices[k].xyz[0] =
2913 alfacets->LFacets[i].UPoints.PointsN[j].Point.x;
2914 vertices[k].xyz[1] =
2915 alfacets->LFacets[i].UPoints.PointsN[j].Point.y;
2916 vertices[k].xyz[2] =
2917 alfacets->LFacets[i].UPoints.PointsN[j].Point.z;
2918 vnormals[k].xyz[0] =
2919 alfacets->LFacets[i].UPoints.PointsN[j].Normal.dx;
2920 vnormals[k].xyz[1] =
2921 alfacets->LFacets[i].UPoints.PointsN[j].Normal.dy;
2922 vnormals[k].xyz[2] =
2923 alfacets->LFacets[i].UPoints.PointsN[j].Normal.dz;
2942 TsmAddToStructure( TelPolygonHoles, -count, kk );
2955 call_subr_curve( CALL_DEF_LISTPOINTS * alpoints )
2960 kp[0] = &key[0], kp[1] = &key[1], kp[2] = &key[2];
2962 key[0].id = CURVE_TYPE_ID;
2963 key[0].data.ldata = TelBezierCurve;
2965 key[1].id = CURVE_NUM_POINTS_ID;
2966 key[1].data.ldata = 20;
2968 key[2].id = CURVE_VERTICES_ID;
2969 key[2].data.pdata = alpoints->UPoints.Points;
2971 TsmAddToStructure( TelCurve, -3, kp );
2976 /* *** PARRAY functions *** */
2978 void call_subr_parray( CALL_DEF_PARRAY *parray )
2982 key.data.pdata = (void *) parray;
2984 TsmAddToStructure( TelParray, 1, &key );
2987 void call_subr_userdraw( CALL_DEF_USERDRAW *anobject )
2992 key.data.pdata = anobject;
2994 TsmAddToStructure( TelUserdraw, 1, &key );