home *** CD-ROM | disk | FTP | other *** search
/ ftp.hitl.washington.edu / ftp.hitl.washington.edu.tar / ftp.hitl.washington.edu / pub / people / habib / kodak / Draw_Vrml_new.cc~ < prev    next >
Text File  |  2000-04-18  |  61KB  |  1,848 lines

  1.     /*===========================================================================*/
  2.     /* Includes.                                                                 */
  3.     /*===========================================================================*/
  4. //    #include <windows.h> //WinUnix
  5.     #include <GL/gl.h>
  6.     #include <stdio.h>
  7.     #include <iostream.h>
  8.     #include <stdlib.h>
  9.     #include <math.h>
  10.  
  11. #include "trackball.h"
  12. static unsigned int test[10];
  13.     struct point {float x,y,z;};
  14.     #include "f-gen.h"
  15. #define PI 3.14159265
  16.  
  17. int Counter_Id=0;
  18.  
  19. // Flags
  20. int ADJUST_TO_ZERO = 0; // Flattenes out the city to zero
  21. float TransX, TransY, TransZ; // Global Transformation.
  22. //    #include <malloc.h>
  23.  
  24. #define DimX 400 // Change them in interface.h.
  25. #define DimY 150
  26. #define DimZ 400
  27.  
  28. double curquat_vrml[4];
  29. double lastquat_vrml[4];
  30. double m_vrml[4][4];
  31.  
  32. struct Virtual_Espace{
  33.     char  FULL;
  34.     //struct point *N;
  35. } espace[DimX][DimY][DimZ];
  36. float VoxelX,VoxelY, VoxelZ; //It's the dimension of a voxel in real space.
  37. struct espace_indice{
  38.     float Xmin, Xmax, Ymin, Ymax, Zmin, Zmax;
  39.     int   Imin, Imax, Jmin, Jmax, Kmin, Kmax;
  40. } EI;
  41.     typedef enum { p_Transform, p_children, p_Material, p_ImageTexture, p_IndexedFaceSet, p_Coordinate, p_point,
  42.         p_TextureCoordinate, p_coordIndex, p_TimeSensor, p_texCoordIndex, p_Appearance,p_texCoord,p_Shape,
  43.     p_nothing} 
  44.     Type_AccTag;
  45.     Type_AccTag AccTag;
  46. struct Type_Pipe { int pipe[1000];
  47.     int indice; } Acc; // Keeps track of which accolade has just been closed when going into the vrml structure.
  48.  
  49. #define SFNode  struct
  50. #define SFBool char
  51.  
  52. extern "C" unsigned char * read_JPEG_file (char *, char *, unsigned char *, int *, int *);
  53.  
  54. typedef enum { EmptyDracula,machi, Top_Scene ,n_rotation, n_Transform, n_Shape, n_AccO, n_AccF, n_translation, n_scale,
  55.        n_children, n_Appearance, n_Material, n_shininess, n_transparency, n_diffuseColor, n_specularColor,
  56.        n_geometry, n_point, n_coordIndex, f_solid, f_colorIndex, f_color, f_texCoordIndex,
  57.        f_TextureCoordinate, f_texCoord, f_Coordinate, f_texture, nothing, n_material,nappearance,f_coord,
  58. n_USE, n_DEF, n_IndexedFaceSet, nccw, n_solid, n_TRUE, n_FALSE,n_CroO, n_CroF, n_appearance,n_ccw,
  59. n_TimeSensor, n_normal, n_nonexist} Node_type;
  60. Node_type node_type, previous_node_type;
  61.  
  62. FILE *file;
  63. int nbr_vertex = 0;
  64.  
  65. // Everything in those defenition is conform to the VRML2 notation aside :
  66. //    1 Hab_...
  67. //    2    _ins which stands for instance 
  68. //  3 SFNode have been abolished.
  69.  
  70. double XmaxVrmlCity, YmaxVrmlCity, ZmaxVrmlCity;
  71. double XminVrmlCity, YminVrmlCity, ZminVrmlCity;
  72.  
  73. typedef GLfloat SFFloat;
  74. typedef int SFInt32 ;
  75. typedef struct
  76. {
  77.     SFFloat    *pElements;
  78.     int        NumElements;
  79. } MFFloat;
  80.  
  81. typedef struct
  82. {
  83.     SFInt32    *pElements;
  84.     int        num_el;
  85. } MFInt32;
  86.  
  87. #define  SFVec3f struct point 
  88.  
  89. typedef struct Hab_MFVec3f { SFVec3f *pt;
  90.                              int     num_el;
  91. } MFVec3f;
  92.  
  93. typedef struct TypeRotation {    float x;
  94.                                 float y;
  95.                                 float z;
  96.                                 float teta; 
  97. } Type_Rotation;
  98.  
  99. typedef struct Hab_SFColor {    float r;
  100.                                 float g;
  101.                                 float b;
  102. } SFColor;
  103.  
  104. typedef struct Hab_MFColor {SFColor *pt;
  105.                             int     col_el;
  106. } MFColor;
  107.  
  108.  
  109. typedef struct TypeMaterial {
  110.   /*exposedField*/ SFFloat ambientIntensity;  //0.2         // #á[0,1]
  111.   /*exposedField*/ SFColor diffuseColor;      //0.8 0.8 0.8 #á[0,1]
  112.   /*exposedField*/ SFColor emissiveColor;     //0 0 0       #á[0,1]
  113.   /*exposedField*/ float     shininess;       //0.2         #á[0,1]
  114.   /*exposedField*/ SFColor specularColor;     //0 0 0       #á[0,1]
  115.   /*exposedField*/ SFFloat transparency;      //0           #á[0,1]
  116. } Material;
  117.  
  118. typedef struct TypeTexture {
  119.     unsigned char *image;
  120.     int im_width[1];
  121.     int im_height[1];
  122.     unsigned int tex_name[10];
  123.     char tex_blk[40];
  124. } Type_Texture;
  125.  
  126. typedef struct TypeAppearance { Material material;
  127.                             
  128.                                 //TextrueTransform textureTransform;
  129. } Type_Appearance;
  130.                             
  131. typedef struct Hab_Pixel {
  132.     float x,y;
  133. } Pixel;
  134.  
  135.  
  136. typedef struct TypeIndexedFaceSet { 
  137.   /*exposedField*/  MFColor     color;             
  138.   /*eventIn*/       MFInt32     colorIndex;
  139.  
  140.   /*exposedField*/  MFVec3f     coord;             //NULL
  141.   /*eventIn*/       MFInt32     coordIndex;
  142.  
  143.   /*exposedField*/  Pixel       *texCoord;          //NULL
  144.   /*eventIn*/       MFInt32     texCoordIndex;
  145.  
  146.                     MFVec3f     normal;
  147.                     MFInt32     normalIndex;
  148.  
  149.   /*field*/         SFBool      ccw;               //TRUE
  150.   /*field*/         SFBool      solid;             //TRUE
  151.  
  152.                     int         num_el;
  153. } Type_IndexedFaceSet;
  154.  
  155. typedef struct TypeGeometry {
  156.     Type_IndexedFaceSet IndexedFaceSet;
  157. } Type_Geometry;
  158.  
  159. typedef struct TypeShape {
  160.     //Type_Transform *FatherTransform;
  161.     Type_Appearance Appearance;
  162.     Type_Texture    Texture;
  163.     Type_Geometry   Geometry;
  164.     int Acc;
  165.     int Cro;
  166.     int Id;
  167. } Type_Shape;
  168. Type_Shape *CNS;
  169. typedef struct TypeTransform { 
  170.  
  171.     SFVec3f translation;
  172.     SFVec3f scale;
  173.     int FlagScale; // says if we have a scale or not.
  174.     Type_Rotation rotation;
  175.  
  176.     struct TypeTransform *FatherTransform;
  177.  
  178.     struct TypeTransform **ChildrenTransform;
  179.     int    numChildTrans; // this is the total number of sons.
  180.     int    indChildTrans; // this is the actual indice of sons.
  181.  
  182.     Type_Shape     **ChildrenShape;
  183.     int    numChildShape; // this is the total number of sons.
  184.     int    indChildShape; // this is the actual indice of sons.
  185.     int    FlagChildren;
  186.  
  187.     Type_Shape      *Shape;
  188.     int ShapeLeave;      // To say if This node has a Shape Leave or not.
  189.  
  190.     Node_type node_type;
  191.     int Acc;
  192.     int Cro;
  193.                 } Type_Transform;
  194.  
  195. Type_Transform *CN, *old_node, *CNV, *CNC, *CNSe, *CNVo[6][6],*CNSphere;
  196.                                            // CNC is for the city CNV is for the Vehicle. CN is Current Node.
  197.                                            // CNSe for the green Sensors.
  198. struct point ScaleNormals;
  199.  
  200. struct USE_DEF_HASH_TAB
  201. {
  202.     char blk_name[100];
  203.     char tex_blk_name[100];
  204.     MFVec3f coord;
  205.     Pixel  *texCoord;
  206.     int index;
  207.     int texIndex;
  208. } UseDef[5000],iz;
  209.  
  210. inline void wordd_to_node(char *wordd)
  211. {
  212.     node_type = nothing;
  213.     if (strcmp (wordd ,"Transform") ==0)            node_type = n_Transform    ; else
  214.     if (strcmp (wordd , "Shape") ==0)               node_type = n_Shape        ; else
  215.     if (strcmp (wordd , "{")==0)                    node_type = n_AccO   ; else
  216.     if (strcmp (wordd , "}")==0)                    node_type = n_AccF    ; else
  217.     if (strcmp (wordd , "[")==0)                    node_type = n_CroO   ; else
  218.     if (strcmp (wordd , "]")==0)                    node_type = n_CroF    ; else
  219.     if (strcmp (wordd , "translation")==0)          node_type = n_translation  ; else
  220.     if (strcmp (wordd , "scale")==0)                node_type = n_scale  ; else
  221.     if (strcmp (wordd , "children")==0)             node_type = n_children     ; else
  222.     if (strcmp (wordd , "Appearance")==0)           node_type = n_Appearance   ; else
  223.     if (strcmp (wordd , "appearance")==0)           node_type = n_appearance   ; else
  224.     if (strcmp (wordd , "Material"  )==0)           node_type = n_Material     ; else
  225.     if (strcmp (wordd , "material"  )==0)           node_type = n_material     ; else
  226.     if (strcmp (wordd , "shininess" )==0)           node_type = n_shininess    ; else
  227.     if (strcmp (wordd , "transparency" )==0)        node_type = n_transparency ; else
  228.     if (strcmp (wordd , "diffuseColor" )==0)        node_type = n_diffuseColor    ; else
  229.     if (strcmp (wordd , "specularColor" )==0)       node_type = n_specularColor    ; else
  230.     if (strcmp (wordd , "geometry" )==0)            node_type = n_geometry         ; else
  231.     if (strcmp (wordd , "point" ) ==0)              node_type = n_point            ; else
  232.     if (strcmp (wordd , "normal" ) ==0)             node_type = n_normal           ; else
  233.     if (strcmp (wordd , "coordIndex" )==0)          node_type = n_coordIndex       ; else
  234.     if (strcmp (wordd , "texCoordIndex" )==0)       node_type = f_texCoordIndex    ; else
  235.     if (strcmp (wordd , "solid" )==0)               node_type = f_solid            ; else
  236.     if (strcmp (wordd , "colorIndex" )==0)          node_type = f_colorIndex       ; else
  237.     if (strcmp (wordd , "color" )==0)               node_type = f_color            ; else
  238.     if (strcmp (wordd , "Coordinate" )==0)          node_type = f_Coordinate       ; else
  239.     if (strcmp (wordd , "coord" )==0)               node_type = f_coord            ; else
  240.     if (strcmp (wordd , "TimeSensor" )==0)          node_type = n_TimeSensor       ; else
  241.     if (strcmp (wordd , "texCoord"   )==0)          node_type = f_texCoord         ; else
  242.     if (strcmp (wordd , "texture"    )==0)          node_type = f_texture          ; else
  243.     if (strcmp (wordd , "rotation"    )==0)          node_type =n_rotation         ; else
  244.     if (strcmp (wordd , "TextureCoordinate" )==0)   node_type = f_TextureCoordinate; else
  245.     if (strcmp (wordd , "USE" )==0)   node_type = n_USE; else
  246.     if (strcmp (wordd , "DEF" )==0)   node_type = n_DEF; else
  247.     if (strcmp (wordd , "USE" )==0)   node_type = n_USE; else
  248.     if (strcmp (wordd , "IndexedFaceSet" )==0)   node_type = n_IndexedFaceSet; else
  249.     if (strcmp (wordd , "ccw" )==0)   node_type = n_ccw; else
  250.     if (strcmp (wordd , "solid" )==0)   node_type = n_solid; else
  251.     if (strcmp (wordd , "TRUE" )==0)   node_type = n_TRUE; else
  252.     if (strcmp (wordd , "FALSE" )==0)   node_type = n_FALSE; 
  253.  
  254.     
  255. }
  256.  
  257. // reads next float from wrl Ascii file
  258. float LisFlWrl()
  259. {
  260.     float f;
  261.     fscanf (file,"%f",&f);
  262.     return f;
  263. }
  264. // reads next int from wrl Ascii file
  265. int LisIntWrl()
  266. {
  267.     int f;
  268.     fscanf (file,"%d",&f);
  269.     return f;
  270. }
  271.  
  272. void initialize_Transform_node()
  273. {
  274.   CN->node_type = n_Transform;
  275.     //CN->node_type = n_Transform;
  276.     CN->translation.x = 0;
  277.     CN->translation.y = 0;
  278.     CN->translation.z = 0;
  279.  
  280.     CN->rotation.x = 0;
  281.     CN->rotation.y = 0;
  282.     CN->rotation.z = 1;
  283.     CN->rotation.teta = 0;
  284.  
  285.     CN->numChildTrans = 0;
  286.     CN->indChildTrans = 0;
  287.     CN->numChildShape = 0;
  288.     CN->indChildShape = 0;
  289.  
  290.     CN->ShapeLeave = 0;
  291.     CN->Acc = 0;
  292.     CN->Cro = 0;
  293.     CN->FlagChildren = 0;
  294.     CN->FlagScale = 0;
  295. }
  296.  
  297. static counter3 = 0;
  298. inline void Create_Child_Transform_Node()
  299. {
  300.   //cout << "CN->numChildTrans = " << CN->numChildTrans << endl;
  301.     // construct Son
  302.     CN->numChildTrans++;
  303.     int numChildTrans = CN->numChildTrans;
  304.   counter3++;
  305.     // If this is the first son do a malloc for the Node ** CN->Son else do a realloc.
  306.     if (CN->numChildTrans == 1){
  307.         if ( (CN->ChildrenTransform = (Type_Transform**) 
  308.           malloc (sizeof (Type_Transform*)) ) ==NULL) 
  309.             cout << "malloc error 1 " << endl;
  310.     } else
  311.         if ( (CN->ChildrenTransform = (Type_Transform**) realloc (CN->ChildrenTransform,numChildTrans*sizeof (Type_Transform*)) ) ==NULL) 
  312.             cout << "realloc error 11 " << endl;
  313.     // allocate the Son itself
  314.     if ( (CN->ChildrenTransform[CN->numChildTrans-1] = (Type_Transform*) malloc (sizeof (Type_Transform )) ) ==NULL)
  315.             cout << "malloc error 2 " << endl;
  316.     // Set current Type_Transform to son.
  317.     old_node = CN;
  318.     CN = CN->ChildrenTransform[CN->numChildTrans-1];
  319.     CN->FatherTransform = new Type_Transform;
  320.     CN->FatherTransform = old_node;
  321.     CN->numChildTrans = 0;
  322.     CN->indChildTrans = 0;
  323.     CN->numChildShape = 0;
  324.     CN->indChildShape = 0;
  325. }
  326.  
  327. inline 
  328. void Create_Child_Shape_Node()
  329. {
  330.     // construct Son
  331.     CN->numChildShape++;
  332.     int numChildShape = CN->numChildShape;
  333.     // If this is the first son do a malloc for the Node ** CN->Son else do a realloc.
  334.     if (CN->numChildShape == 1){
  335.         if ( (CN->ChildrenShape = (Type_Shape**) malloc (sizeof (Type_Shape*)) ) ==NULL) 
  336.             cout << "malloc error 1df " << endl;
  337.     } else
  338.         if ( (CN->ChildrenShape = (Type_Shape**) realloc (CN->ChildrenShape,numChildShape*sizeof (Type_Shape*)) ) ==NULL) 
  339.             cout << "realloc error 1341 " << endl;
  340.     // allocate the Son itself
  341.     if ( (CN->ChildrenShape[CN->numChildShape-1] = (Type_Shape*) malloc (sizeof (Type_Shape )) ) ==NULL)
  342.             cout << "malloc error 2443 " << endl;
  343.     // Put CNS
  344.     CNS = CN->ChildrenShape[CN->numChildShape-1];
  345. }
  346.  
  347. void
  348. Create_One_Shape_Node()
  349. {
  350.         // construct Son
  351.     CN->ShapeLeave =1;
  352.     if ( (CN->Shape = (Type_Shape*) malloc (sizeof (Type_Shape )) ) ==NULL)
  353.             cout << "malloc error 2443 " << endl;
  354.     CNS = CN->Shape;
  355. }
  356.  
  357. void
  358. InitializeChildrenShape()
  359. {
  360.     CNS->Acc = 0;
  361.     CNS->Cro = 0;
  362.     CNS->Texture.tex_name[0] = 99999;
  363.     CNS->Appearance.material.transparency = 0;
  364.  
  365.     //cout << "Initializing Counter_Id Number  " << Counter_Id <<endl;
  366.     CNS->Id = Counter_Id;
  367.     Counter_Id++;
  368.  
  369.     CNS->Geometry.IndexedFaceSet.color.col_el = 0;
  370.     CNS->Geometry.IndexedFaceSet.colorIndex.num_el = 0;
  371.  
  372.     CNS->Geometry.IndexedFaceSet.coord.num_el=0; // to verify that each Geom has a coord field.
  373.     CNS->Geometry.IndexedFaceSet.coordIndex.num_el=0; 
  374.  
  375.     CNS->Geometry.IndexedFaceSet.texCoordIndex.num_el=0; 
  376.     CNS->Geometry.IndexedFaceSet.num_el = 0;
  377. }
  378.  
  379. void Saffir_the_ys()
  380. {
  381.     MFVec3f &pt = CNS->Geometry.IndexedFaceSet.coord; //by reference
  382.     for (int i = 0 ; i<pt.num_el; i++) 
  383.         pt.pt[i].y = 0;
  384. }
  385. // Adjusts the buildings to the zero level.
  386. void adjust_to_zero()
  387. {
  388.     MFVec3f &pt = CNS->Geometry.IndexedFaceSet.coord; //by reference
  389.     float lowesty = 999999;
  390.     for (int i = 0 ; i<pt.num_el; i++) 
  391.         if (pt.pt[i].y < lowesty) lowesty = pt.pt[i].y;
  392.  
  393.     for (i = 0 ; i<pt.num_el; i++) 
  394.         pt.pt[i].y = pt.pt[i].y - lowesty;
  395. }
  396.  
  397. void read_all_points_into_this_node()
  398. {
  399.     char wordd[90];
  400.     fscanf (file,"%s", &wordd); // reads the [
  401.     if (strcmp (wordd,"[") !=0) {
  402.         cout << "mistakdke! a [ expected in here!!" << endl;
  403.         exit (0);
  404.     }
  405.  
  406.     MFVec3f &pt = CNS->Geometry.IndexedFaceSet.coord; // by reference
  407.     pt.num_el = 1;
  408.     // malloc for the first element read
  409.     if ( (pt.pt = (SFVec3f *) malloc (pt.num_el * sizeof ( SFVec3f)) ) ==NULL)
  410.             cout << "malloc error 1236187 " << endl;
  411.     fscanf (file,"%f %f %f",&pt.pt[pt.num_el-1].x,
  412.                             &pt.pt[pt.num_el-1].y,
  413.                             &pt.pt[pt.num_el-1].z);
  414.     fscanf (file,"%s", &wordd);
  415.     if (strcmp (wordd ,",") ==0) goto eid;
  416.     else goto end;
  417.     // realloc for the rest of the elements
  418. eid:
  419.     // look for , ]
  420.     fscanf (file,"%s", &wordd);
  421.     if (strcmp (wordd ,"]") ==0) goto end;
  422.     pt.num_el++;
  423.     if ( (pt.pt = 
  424.     (SFVec3f *) realloc (pt.pt, pt.num_el * sizeof ( SFVec3f)) ) ==NULL)
  425.             cout << "realloc error 1234187 " << endl;
  426.     pt.pt[pt.num_el-1].x = atof(wordd);
  427.     fscanf (file,"%f %f ",
  428.                             &pt.pt[pt.num_el-1].y,
  429.                             &pt.pt[pt.num_el-1].z);
  430.     fscanf (file,"%s", &wordd);
  431.     if (strcmp (wordd ,",") ==0) goto eid;
  432. end:
  433.     //cout << "I read" << pt.num_el << " points!!" << endl;
  434.     return;
  435. }
  436.    
  437.  
  438. void read_all_normal_vectors_into_this_node()
  439. {
  440.     char wordd[90];
  441.     fscanf (file,"%s", &wordd); // reads the [
  442.     if (strcmp (wordd,"[") !=0) {
  443.         cout << "mistake! a [ expected in here!!" << endl;
  444.         exit (0);
  445.     }
  446.     MFVec3f &pt = CNS->Geometry.IndexedFaceSet.normal; // by reference
  447.     pt.num_el = 1;
  448.     // malloc for the first element read
  449.     if ( (pt.pt = (SFVec3f *) malloc (pt.num_el * sizeof ( SFVec3f)) ) ==NULL)
  450.             cout << "malloc error 1236187 " << endl;
  451.     fscanf (file,"%f %f %f",&pt.pt[pt.num_el-1].x,
  452.                             &pt.pt[pt.num_el-1].y,
  453.                             &pt.pt[pt.num_el-1].z);
  454.     fscanf (file,"%s", &wordd);
  455.     if (strcmp (wordd ,",") ==0) goto eid12;
  456.     else goto end12;
  457.     // realloc for the rest of the elements
  458. eid12:
  459.     // look for , ]
  460.     fscanf (file,"%s", &wordd);
  461.     if (strcmp (wordd ,"]") ==0) goto end12;
  462.     pt.num_el++;
  463.     if ( (pt.pt = 
  464.     (SFVec3f *) realloc (pt.pt, pt.num_el * sizeof ( SFVec3f)) ) ==NULL)
  465.             cout << "realloc error 1234187 " << endl;
  466.     pt.pt[pt.num_el-1].x = atof(wordd);
  467.     fscanf (file,"%f %f ",
  468.                             &pt.pt[pt.num_el-1].y,
  469.                             &pt.pt[pt.num_el-1].z);
  470.     fscanf (file,"%s", &wordd);
  471.     if (strcmp (wordd ,",") ==0) goto eid12;
  472. end12:
  473.     //cout << "I read" << pt.num_el << " points!!" << endl;
  474.     return;
  475. }
  476.  
  477.  
  478. void read_all_texture_points_into_this_node()
  479. {
  480.     char wordd[90];
  481.     fscanf (file,"%s", &wordd); // reads the [
  482.     if (strcmp (wordd,"[") !=0) {
  483.         cout << "mistake!! a [ expected in here!!" << endl;
  484.         exit (0);
  485.     }
  486.     Type_IndexedFaceSet &pt = CNS->Geometry.IndexedFaceSet; // by reference
  487.     // malloc for the first element read
  488.     if ( (pt.texCoord = (Pixel *) malloc (sizeof ( Pixel)) ) ==NULL)
  489.             cout << "malloc error 1236187 " << endl;
  490.     pt.num_el = 1;
  491.     fscanf (file,"%f %f ",&pt.texCoord[pt.num_el-1].x,
  492.                           &pt.texCoord[pt.num_el-1].y );
  493.     fscanf (file,"%s", &wordd);
  494.     if (strcmp (wordd ,",") ==0) goto eid11;
  495.     else goto end11;
  496.     // realloc for the rest of the elements
  497. eid11:
  498.     // look for , ]
  499.     fscanf (file,"%s", &wordd);
  500.     if (strcmp (wordd ,"]") ==0) goto end11;
  501.     pt.num_el++;
  502.     if ( (pt.texCoord = 
  503.     (Pixel *) realloc (pt.texCoord, pt.num_el * sizeof ( Pixel)) ) ==NULL)
  504.             cout << "realloc error 1234187 " << endl;
  505.     pt.texCoord[pt.num_el-1].x = atof(wordd);
  506.     fscanf (file,"%f ",
  507.                             &pt.texCoord[pt.num_el-1].y );
  508.     fscanf (file,"%s", &wordd);
  509.     if (wordd[0] == '#') fscanf (file,"%s", &wordd);
  510.     if (strcmp (wordd ,",") ==0) goto eid11;
  511. end11:
  512.      //cout << "I read" << pt.num_el << " points!!" << endl;
  513.     return;
  514. }
  515. void read_all_texCoordIndex_into_CN()
  516. {
  517.     char wordd[90];
  518.     MFInt32 &pt = CNS->Geometry.IndexedFaceSet.texCoordIndex; // by reference
  519.  
  520.     fscanf (file,"%s", &wordd); // reads the [
  521.     if (strcmp (wordd,"[") !=0) {
  522.         cout << "mistake!!! a [ expected in here!!" << endl;
  523.         exit (0);
  524.     }
  525.     fscanf (file,"%s", &wordd);
  526.     if (strcmp (wordd ,"]") ==0) {
  527.        pt.num_el = 0;
  528.        goto end2tex;
  529.     }
  530.     pt.num_el = 1;
  531.     // malloc the first el.
  532.     if ( (pt.pElements = (SFInt32 *) malloc (pt.num_el * sizeof ( SFInt32)) ) ==NULL)
  533.             cout << "malloc error 1964187tex " << endl;
  534.     pt.pElements[pt.num_el-1] = atoi(wordd);
  535.     fscanf (file,"%s", &wordd);
  536.     if (strcmp (wordd ,",") ==0) goto eid2tex;
  537.     else goto end2tex;
  538.     // realloc the rest el.
  539. eid2tex:
  540.     // look for , ]
  541.     fscanf (file,"%s", &wordd);
  542.     if (strcmp (wordd ,"]") ==0) goto end2tex;
  543.     pt.num_el++;
  544.     if ( (pt.pElements = 
  545.     (SFInt32 *) realloc (pt.pElements, pt.num_el * sizeof ( SFInt32)) ) ==NULL)
  546.             cout << "realloc error 1444187 " << endl;
  547.  
  548.     pt.pElements[pt.num_el-1] = atoi(wordd);
  549.                         
  550.     fscanf (file,"%s", &wordd);
  551.     if (strcmp (wordd ,",") ==0) goto eid2tex;
  552. end2tex:
  553.     //cout << "texture pt.num_el=" << pt.num_el << endl;
  554.     return;
  555. }
  556. void read_all_coordIndex_into_CN()
  557. {
  558.     char wordd[90];
  559.     MFInt32 &pt = CNS->Geometry.IndexedFaceSet.coordIndex; // by reference
  560.  
  561.     fscanf (file,"%s", &wordd); // reads the [
  562.     if (strcmp (wordd,"[") !=0) {
  563.         cout << "mistake!!!! a [ expected in here!!" << endl;
  564.         exit (0);
  565.     }
  566.     fscanf (file,"%s", &wordd);
  567.     if (strcmp (wordd ,"]") ==0) {
  568.        pt.num_el = 0;
  569.        goto end2;
  570.     }
  571.     pt.num_el = 1;
  572.     // malloc the first el.
  573.     if ( (pt.pElements = (SFInt32 *) malloc (pt.num_el * sizeof ( SFInt32)) ) ==NULL)
  574.             cout << "malloc error 1964187 " << endl;
  575.     pt.pElements[pt.num_el-1] = atoi(wordd);
  576.     fscanf (file,"%s", &wordd);
  577.     if (strcmp (wordd ,",") ==0) goto eid2;
  578.     else goto end2;
  579.     // realloc the rest el.
  580. eid2:
  581.     // look for , ]
  582.     fscanf (file,"%s", &wordd);
  583.     if (strcmp (wordd ,"]") ==0) goto end2;
  584.     pt.num_el++;
  585.     if ( (pt.pElements = 
  586.     (SFInt32 *) realloc (pt.pElements, pt.num_el * sizeof ( SFInt32)) ) ==NULL)
  587.             cout << "realloc error 1444187 " << endl;
  588.  
  589.     pt.pElements[pt.num_el-1] = atoi(wordd);
  590.                         
  591.     fscanf (file,"%s", &wordd);
  592.     if (strcmp (wordd ,",") ==0) goto eid2;
  593. end2:
  594.     if (pt.num_el == 1) {
  595.         cout <<endl;
  596.     }
  597.  
  598.   //cout << "pt.num_el=" << pt.num_el << endl;
  599.     // cout << "I read" << pt.num_el << " Indexpoints!!" << endl;
  600.     return;
  601. }
  602. void read_all_colorIndex_into_CN()
  603. {
  604.     char wordd[90];
  605.     fscanf (file,"%s", &wordd); // reads the [
  606.     if (strcmp (wordd,"[") !=0) {
  607.         cout << "mistakeeee! a [ expected in here!!" << endl;
  608.         exit (0);
  609.     }
  610.  
  611.     MFInt32 &pt = CNS->Geometry.IndexedFaceSet.colorIndex; // by reference
  612.     pt.num_el = 1;
  613.     // malloc the first el.
  614.     if ( (pt.pElements = (SFInt32 *) malloc (pt.num_el * sizeof ( SFInt32)) ) ==NULL)
  615.             cout << "malloc error 1764187 " << endl;
  616.     fscanf (file,"%d" , &pt.pElements[pt.num_el-1]);
  617.     fscanf (file,"%s", &wordd);
  618.     if (strcmp (wordd ,",") ==0) goto eid3;
  619.     else goto end3;
  620.     // realloc the rest el.
  621. eid3:
  622.     // look for , ]
  623.     fscanf (file,"%s", &wordd);
  624.     if (strcmp (wordd ,"]") ==0) goto end3;
  625.     pt.num_el++;
  626.     if ( (pt.pElements = 
  627.     (SFInt32 *) realloc (pt.pElements, pt.num_el * sizeof ( SFInt32)) ) ==NULL)
  628.             cout <<  "realloc error 14443287 " << endl;
  629.  
  630.     pt.pElements[pt.num_el-1] = atoi(wordd);
  631.                         
  632.     fscanf (file,"%s", &wordd);
  633.     if (strcmp (wordd ,",") ==0) goto eid3;
  634. end3:
  635.     //cout << "I read" << pt.num_el << " ColorIndexpoints!!" << endl;
  636.     return;
  637. }
  638. void read_color_values()
  639. {
  640.     char wordd[90];
  641.     MFColor &pt = CNS->Geometry.IndexedFaceSet.color; // by reference
  642.     pt.col_el = 1;
  643.     // malloc the first el.
  644.     if ( (pt.pt = (SFColor *) malloc( sizeof (SFColor)) ) == NULL)
  645.         cout << " malloc error 1221122" << endl;
  646.     fscanf (file, "%f %f %f", &pt.pt[0].r,
  647.                               &pt.pt[0].g,
  648.                               &pt.pt[0].b);
  649.     fscanf (file,"%s", &wordd);
  650.     if (strcmp(wordd, ",")==0) goto eid4;
  651.     else goto end4;
  652. eid4:
  653.     // look for , ]
  654.     fscanf (file,"%s", &wordd);
  655.     if (strcmp (wordd ,"]") ==0) goto end4;
  656.     pt.col_el++;
  657.     if ( (pt.pt = (SFColor *) realloc (pt.pt, pt.col_el * sizeof(SFColor)) ) == NULL)
  658.         cout << "realloc error 199834992" << endl;
  659.     pt.pt[pt.col_el-1].r = atof(wordd);
  660.     fscanf (file, "%f %f ", 
  661.                               &pt.pt[pt.col_el-1].g,
  662.                               &pt.pt[pt.col_el-1].b);
  663.     fscanf (file,"%s", &wordd);
  664.     if (strcmp (wordd ,",") ==0) goto eid4;
  665. end4:
  666.     //cout << "I read" << pt.col_el << " Color_ppoints!!" << endl;
  667.     return;
  668. }
  669.  
  670. int Pass_To_Next_Trans()
  671. {
  672.  
  673. recom:
  674.   //cout << "numChild " << CN->numChildTrans << "indChild "<<CN->indChildTrans << endl;
  675.       //cout << "Node_type in Transform" << CN->node_type << endl;
  676.     if (CN->numChildTrans > CN->indChildTrans){
  677.         CN->indChildTrans++;
  678.         CN = CN->ChildrenTransform[CN->indChildTrans-1];
  679.         if (ADJUST_TO_ZERO) 
  680.             glTranslatef (CN->translation.x, 0, CN->translation.z);
  681.         else {    
  682.             glTranslatef (CN->translation.x, CN->translation.y, CN->translation.z);
  683.             glRotatef (CN->rotation.teta*180.0/PI, CN->rotation.x, CN->rotation.y, CN->rotation.z);
  684.             if (CN->FlagScale){
  685.                 glScalef (CN->scale.x, CN->scale.y, CN->scale.z);
  686.                 ScaleNormals.x = CN->scale.x * ScaleNormals.x;
  687.                 ScaleNormals.y = CN->scale.y * ScaleNormals.y;
  688.                 ScaleNormals.z = CN->scale.z * ScaleNormals.z;
  689.             }
  690.  
  691.  
  692.               // I didn't do the above Translatef / Rotatef in order to calculate 
  693.               // correctly the ?maxVrmlCity and do the espace calculation 
  694.               // correctly as well.
  695.             /* TransX = TransX + CN->translation.x;
  696.             TransY = TransY + CN->translation.y;
  697.             TransZ = TransZ + CN->translation.z;
  698.  
  699.             lastquat_vrml[3] = cos(CN->rotation.teta/2.0);
  700.             lastquat_vrml[0] = CN->rotation.x*sin(CN->rotation.teta/2.0);
  701.             lastquat_vrml[1] = CN->rotation.y*sin(CN->rotation.teta/2.0);
  702.             lastquat_vrml[2] = CN->rotation.z*sin(CN->rotation.teta/2.0);
  703.             add_quats(lastquat_vrml, curquat_vrml, curquat_vrml);
  704.             build_rotmatrix(m_vrml, curquat_vrml); */
  705.         }
  706.         return 1;
  707.     }else { // if going up the tree.
  708.         CN->indChildTrans = 0; // initializing for another evantual pass
  709.         if (ADJUST_TO_ZERO)
  710.             glTranslatef (-CN->translation.x,0 , -CN->translation.z);
  711.         else{
  712.             if (CN->FlagScale){
  713.                 glScalef (1/CN->scale.x, 1/CN->scale.y, 1/CN->scale.z);
  714.                 ScaleNormals.x = ScaleNormals.x / CN->scale.x ;
  715.                 ScaleNormals.y = ScaleNormals.y / CN->scale.y ;
  716.                 ScaleNormals.z = ScaleNormals.z / CN->scale.z ;
  717.             }
  718.             glRotatef (-CN->rotation.teta*180.0/PI, CN->rotation.x, CN->rotation.y, CN->rotation.z);
  719.             glTranslatef (-CN->translation.x, -CN->translation.y, -CN->translation.z);
  720.  
  721.             /*
  722.             lastquat_vrml[3] = cos(CN->rotation.teta/2.0);
  723.             lastquat_vrml[0] = -CN->rotation.x*sin(CN->rotation.teta/2.0);
  724.             lastquat_vrml[1] = -CN->rotation.y*sin(CN->rotation.teta/2.0);
  725.             lastquat_vrml[2] = -CN->rotation.z*sin(CN->rotation.teta/2.0);
  726.             add_quats(lastquat_vrml, curquat_vrml, curquat_vrml);
  727.             build_rotmatrix(m_vrml, curquat_vrml);
  728.  
  729.             TransX = TransX - CN->translation.x;
  730.             TransY = TransY - CN->translation.y;
  731.             TransZ = TransZ - CN->translation.z; */
  732.  
  733.         }
  734.  
  735.         CN = CN->FatherTransform;
  736.         if ((CN->node_type == Top_Scene)&&(CN->indChildTrans==CN->numChildTrans)){
  737.             CN->indChildTrans = 0;
  738.       //cout << "Node_type in returning 0" << CN->node_type << endl;
  739.       //cout << " I am returning 0 to the calling function " << endl;
  740.             return 0;
  741.         }
  742.     }
  743.     goto recom;
  744. }
  745.  
  746. void 
  747. Fill_Virtual_Espace_With_Voxels(){
  748.     // The idea is to calculate the intersection of all the triangles 
  749.     // with the voxels in the 3D space, and put the normal value in the
  750.     // corresponding voxel.
  751.     //Geometry
  752.     MFInt32 *ind       = &CNS->Geometry.IndexedFaceSet.coordIndex;
  753.     MFInt32 *indtex    = &CNS->Geometry.IndexedFaceSet.texCoordIndex;
  754.     MFVec3f *pt     = &CNS->Geometry.IndexedFaceSet.coord;
  755.     MFColor &col    =  CNS->Geometry.IndexedFaceSet.color;
  756.     MFInt32    &col_ind=  CNS->Geometry.IndexedFaceSet.colorIndex;
  757.     SFInt32 j,j0,j1,j2, t, t0, t1, t2,k,ii;
  758.     int c=0;
  759.     for (int i = 0;i<ind->num_el; i++) {
  760.         // count the number of vertex.
  761.         int num_vertx = 0;
  762.         while (ind->pElements[i+num_vertx]!= -1) {
  763.             num_vertx++; // q now is the number of vertices.
  764.         }
  765.         // Calculate the normal to the face
  766.         j0=ind->pElements[i  ];
  767.         j1=ind->pElements[i+1];
  768.         j2=ind->pElements[i+2];
  769.         SFVec3f norm, vect0, vect1, vect2, vect3, ScanPt1, Pas, FPt;
  770.         vect1 = sous_vect_from_vect (pt->pt[j1], pt->pt[j0]);
  771.         vect2 = sous_vect_from_vect (pt->pt[j1], pt->pt[j2]);
  772.         norm = vectoriel (vect1 , vect2);
  773.         unitaire (norm); // makes it 1 => norm.x norm.y norm.z 
  774.         // glNormal3f(norm.x, norm.y, norm.z);
  775.             // if 3 vertex
  776.         if (num_vertx==3) {
  777.             float pas , pas1, pas2; // vect subdivision
  778.             int   pasi1, pasi2;
  779.             pas = VoxelX; // dimension of one voxel.
  780.             if (pas > VoxelY) pas = VoxelY;
  781.             if (pas > VoxelZ) pas = VoxelZ;
  782.             pas = pas /3.0;
  783.             pasi2 = longueurv(vect2) / pas;
  784.             vect2 = div_vect_par_nbr (vect2, pasi2);
  785.             // remplit espace (voxel) en scannant chaque triangle.
  786.             for (int zik=0;zik<pasi2;zik++){
  787.                 struct point pt0, pt1, pt2;
  788.                 pt0.x = pt->pt[j0].x + TransX;
  789.                 pt0.y = pt->pt[j0].y + TransY;
  790.                 pt0.z = pt->pt[j0].z + TransZ;
  791.                 pt1.x = pt->pt[j1].x + TransX;
  792.                 pt1.y = pt->pt[j1].y + TransY;
  793.                 pt1.z = pt->pt[j1].z + TransZ;
  794.                 pt2.x = pt->pt[j2].x + TransX;
  795.                 pt2.y = pt->pt[j2].y + TransY;
  796.                 pt2.z = pt->pt[j2].z + TransZ;
  797.                 ScanPt1 = add_vect_to_pt (pt2, mul_vect_par_nbr(vect2,zik));
  798.                 vect0   = sous_vect_from_vect(ScanPt1,pt0);
  799.                 pasi1   = longueurv (vect0) / pas;
  800.                 Pas = div_vect_par_nbr (vect0 ,pasi1);
  801.                 for (int ayr=0;ayr<pasi1;ayr++){
  802.                     FPt = add_vect_to_pt(mul_vect_par_nbr(Pas,ayr), pt0);
  803.                    ii = (FPt.x - XminVrmlCity) * DimX / (XmaxVrmlCity - XminVrmlCity);
  804.                     j = (FPt.y - YminVrmlCity) * DimY / (YmaxVrmlCity - YminVrmlCity);
  805.                     k = (FPt.z - ZminVrmlCity) * DimZ / (ZmaxVrmlCity - ZminVrmlCity);
  806.                     if (espace[ii][j][k].FULL !=1){
  807.                         espace[ii][j][k].FULL = 1;
  808.                         /*if ( (espace[ii][j][k].N = (struct point*) malloc (sizeof (struct point)) ) ==NULL) 
  809.                                 cout << "malloc error espace " << endl;
  810.                         espace[ii][j][k].N[0].x = norm.x;
  811.                         espace[ii][j][k].N[0].y = norm.y;
  812.                         espace[ii][j][k].N[0].z = norm.z; */
  813.                     }
  814.                 }
  815.             }
  816.             i=i+3;
  817.         } // if (num_vertx==3
  818.         if (num_vertx==4) {
  819.             for (int marra = 0; marra<num_vertx; marra++) {
  820.                 j=ind->pElements[i];                
  821.                 glVertex3f (pt->pt[j].x,
  822.                             pt->pt[j].y,
  823.                             pt->pt[j].z);
  824.                     i++;
  825.             }
  826.             glEnd();
  827.         } // if (num_vertx>4
  828.         if (num_vertx>4) {
  829.             glBegin (GL_POLYGON);
  830.             for (int marra = 0; marra<num_vertx; marra++) {
  831.                 j=ind->pElements[i];
  832.                 glVertex3f (pt->pt[j].x,
  833.                             pt->pt[j].y,
  834.                             pt->pt[j].z);
  835.                 i++;
  836.             }
  837.         } // if (num_vertx>4
  838.     // i++ to skip the -1 and position on the next valid input. ( no not necessary since i++ in for...) 
  839.         c++;
  840.     } // for (int i = 0; i<ind->num_el; i++)
  841.  
  842. }    
  843.  
  844.  
  845. //Places point in the espace, for collision detection, This function works even if the 
  846. // espace is empty (no pts yet).
  847. inline 
  848. void 
  849. Virtual_Espace() {
  850.     TransX= TransY= TransZ=0; // Global Transformation.
  851.     VoxelX = (XmaxVrmlCity - XminVrmlCity)/DimX;
  852.     VoxelY = (YmaxVrmlCity - YminVrmlCity)/DimY;
  853.     VoxelZ = (ZmaxVrmlCity - ZminVrmlCity)/DimZ;
  854.     cout << "VoxelX = " << VoxelX << "  -  VoxelY = " << VoxelY << " - VoxelZ = " << VoxelZ << endl;
  855.     int i,j,k,toto1,toto2;
  856.     toto1 = toto2 = 0;
  857.     //Initialize the freeken space.
  858.     for ( i= 0; i<DimX; i++)
  859.         for ( j=0; j<DimY; j++)
  860.             for ( k=0; k<DimZ; k++)
  861.                 espace[i][j][k].FULL = 0;
  862.     /* Calculate the intersection with the surfaces with the city.
  863.     while (CN->node_type != Top_Scene)
  864.         CN = CN->FatherTransform;
  865.     while (Pass_To_Next_Trans()){
  866.      if (CN->ShapeLeave) {
  867.       CNS = CN->Shape;
  868.       Fill_Virtual_Espace_With_Voxels();
  869.      }
  870.         else for (CN->indChildShape=0; CN->indChildShape<CN->numChildShape; CN->indChildShape++) {
  871.             CNS = CN->ChildrenShape[CN->indChildShape];
  872.             Fill_Virtual_Espace_With_Voxels();
  873.         }
  874.     }// while
  875.  
  876.     // writing espace to file.
  877.     FILE *file_espace;
  878.     if ((file_espace = fopen ("espace","wb")) == NULL)
  879.         printf ("\n pas de chance l'ami ton fichier est corrompu \n");
  880.     for (i=0;i<DimX;i++)
  881.         for (j=0;j<DimY;j++)
  882.             for (k=0;k<DimZ;k++){
  883.                 fwrite (&espace[i][j][k].FULL, sizeof(char),1,file_espace);
  884.                 //if (espace[i][j][k].FULL==1){
  885.                 //    toto1++;
  886.                 //    fwrite (&espace[i][j][k].N[0].x, sizeof(float), 1, file_espace);
  887.                 //    fwrite (&espace[i][j][k].N[0].y, sizeof(float), 1, file_espace);
  888.                 //    fwrite (&espace[i][j][k].N[0].z, sizeof(float), 1, file_espace);
  889.                 //}
  890.             } */
  891.  
  892.     // reading espace to file.
  893.     FILE *file_espace;
  894.     if ((file_espace = fopen ("espace","rb")) == NULL)
  895.         printf ("\n pas de chance l'ami ton fichier est corrompu 185739945\n");
  896.     for (i=0;i<DimX;i++)
  897.         for (j=0;j<DimY;j++)
  898.             for (k=0;k<DimZ;k++){
  899.                 fread (&espace[i][j][k].FULL, sizeof(char),1,file_espace);
  900.                 //if (espace[i][j][k].FULL==1){
  901.                 //    toto2++;
  902.                 //    if ( (espace[i][j][k].N = (struct point*) malloc (sizeof (struct point)) ) ==NULL) 
  903.                 //        cout << "malloc error espaceeee " << endl;
  904.                 //    fread (&espace[i][j][k].N[0].x, sizeof(float), 1, file_espace);
  905.                 //    fread (&espace[i][j][k].N[0].y, sizeof(float), 1, file_espace);
  906.                 //    fread (&espace[i][j][k].N[0].z, sizeof(float), 1, file_espace);
  907.                 //}
  908.             } 
  909.             
  910.     // close the file, flush the buffer.
  911.     fclose (file_espace);
  912.  
  913.     // Fill the empty bottom...
  914.     for ( i= 0; i<DimX; i++)
  915.         for ( k=0; k<DimZ; k++)
  916.             for ( j=0; j<DimY; j++)
  917.                 if (espace[i][j][k].FULL == 1){
  918.                     for (int jj = 0; jj<=j+3; jj++){//The j+3 is due to the fact that I want the earth to be located 3 voxels above the real earth.
  919.                         espace[i][jj][k].FULL = j-jj+1+3; //The +3 is due to the fact that I want the earth to be located 3 voxels above the real earth.
  920.                         //espace[i][jj][k].N = espace[i][j][k].N;
  921.                     }
  922.                     j=DimY;
  923.                 } 
  924.     extern float HauteurEye;
  925.     HauteurEye = 2*VoxelY;
  926.     cout << "HauteurEye = " << HauteurEye << endl;
  927. }
  928.  
  929. inline 
  930. void 
  931. Draw_Shape_Node(int listnum){
  932.         extern double TOP, BOTTOM, LEFT, RIGHT;
  933.         GLfloat v[4],v1[4];
  934.         v[0] = CNS->Appearance.material.diffuseColor.r;
  935.         v[1] = CNS->Appearance.material.diffuseColor.g; 
  936.         v[2] = CNS->Appearance.material.diffuseColor.b;
  937.         v[3] = CNS->Appearance.material.transparency;
  938.     //cout << v[0] << "  vs  " << v[1] << endl;
  939.     //cout << v[2] << "  vs  " << v[3] << endl;
  940.         v1[0] = CNS->Appearance.material.specularColor.r;
  941.         v1[1] = CNS->Appearance.material.specularColor.g; 
  942.         v1[2] = CNS->Appearance.material.specularColor.b;
  943.         v1[3] = CNS->Appearance.material.transparency;
  944.         //cout << v[0] << " " << v[1] << " " << v[2] << " " << v[3] << endl;
  945.         
  946.         //glColorMaterial (GL_FRONT_AND_BACK, GL_DIFFUSE);
  947.         //glMateriali (GL_FRONT, GL_SHININESS,CNS->Appearance.material.shininess);
  948.         //glColorMaterial (GL_FRONT, GL_SPECULAR);
  949.         if (CNS->Geometry.IndexedFaceSet.color.col_el == 0)
  950.          glDisable (GL_COLOR_MATERIAL);
  951.         else 
  952.             glEnable (GL_COLOR_MATERIAL);
  953.         glMaterialfv (GL_FRONT_AND_BACK, GL_DIFFUSE,v); 
  954.         glMaterialfv (GL_FRONT_AND_BACK, GL_SPECULAR,v1); 
  955.         //glMaterialfv (GL_BACK , GL_DIFFUSE,v1); 
  956.         
  957.         //Geometry
  958.         MFInt32 *ind       = &CNS->Geometry.IndexedFaceSet.coordIndex;
  959.         MFInt32 *indtex    = &CNS->Geometry.IndexedFaceSet.texCoordIndex;
  960.         MFVec3f *pt     = &CNS->Geometry.IndexedFaceSet.coord;
  961.         MFColor &col    =  CNS->Geometry.IndexedFaceSet.color;
  962.         MFInt32    &col_ind=  CNS->Geometry.IndexedFaceSet.colorIndex;
  963.         SFInt32 j,j0,j1,j2, t, t0, t1, t2;
  964.         
  965.         int c=0;
  966.     //cout << "ind->num_el " << ind->num_el << " Of Counter_Id " << CNS->Id << endl;
  967.  
  968.         for (int i = 0;i<ind->num_el; i++) {
  969.             // count the number of vertex.
  970.             int num_vertx = 0;
  971.             while (ind->pElements[i+num_vertx]!= -1) {
  972.         //cout << "ind->pElements[" << i+num_vertx << "]="<< ind->pElements[i+num_vertx] << endl;
  973.                 num_vertx++; // q now is the number of vertices.
  974.             }
  975.             // Sets the normal for light calculation (see journals Dec 9th 1998).
  976.             j0=ind->pElements[i  ];
  977.       //cout << "j0=" << j0;
  978.             j1=ind->pElements[i+1];
  979.       //cout << "j0=" << j1;
  980.             j2=ind->pElements[i+2];
  981.       //cout << "j0=" << j2;
  982.             SFVec3f norm, vect1, vect2;
  983.             vect1 = sous_vect_from_vect (pt->pt[j1], pt->pt[j0]);
  984.             vect2 = sous_vect_from_vect (pt->pt[j1], pt->pt[j2]);
  985.             norm = vectoriel (vect1 , vect2);
  986.             //if (norm.y == 0) norm.y = 0.01; // For collision detection.
  987.             unitaire (norm); // makes it normal.
  988.             // I mult with ScaleNormals to correct for the light calculations.
  989.             glNormal3f( ScaleNormals.x * norm.x, ScaleNormals.y * norm.y,  ScaleNormals.z * norm.z);
  990.  
  991.             // Binds the texture if one exists
  992.             if (CNS->Texture.tex_name[0] !=99999) {
  993.                 glEnable(GL_TEXTURE_2D);
  994.                 glBindTexture(GL_TEXTURE_2D, CNS->Texture.tex_name[0]);
  995.             }else
  996.             glDisable(GL_TEXTURE_2D);
  997.             //glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
  998.             // if 3 vertex
  999.             if (num_vertx==3) {
  1000.                 glPointSize (3);
  1001.                 glBegin (GL_TRIANGLES);
  1002.                 if (CNS->Geometry.IndexedFaceSet.solid == GL_FALSE) {
  1003.                     //glPolygonMode(GL_FRONT,GL_LINE);
  1004.                     //glFrontFace(GL_CCW);
  1005.                     glCullFace (GL_FRONT);// The culling must be within the glBegin
  1006.                     glEnable(GL_CULL_FACE);// if we want a triangle rendered when outside
  1007.                 }                      // of window boundary.
  1008.                 for (int marra = 0; marra<num_vertx; marra++) {
  1009.                     struct point mempt;
  1010.                     j=ind->pElements[i];
  1011.                     mempt.x = pt->pt[j].x;
  1012.                     mempt.y = pt->pt[j].y;
  1013.                     mempt.z = pt->pt[j].z;
  1014.           //cout << "mempt.xyz = " << mempt.x << " " << mempt.y << " " <<mempt.z << endl;
  1015.                     // pt->pt[j] = mult_matrix_vector (m_vrml, pt->pt[j]); // Rotate.
  1016.                     //pt->pt[j].x = pt->pt[j].x + TransX; // I did this instead of Translatef
  1017.                     //pt->pt[j].y = pt->pt[j].y + TransY; // In order to calculate ?maxVrmlCity
  1018.                     //pt->pt[j].z = pt->pt[j].z + TransZ; // correctly and do the espace thing.
  1019.                     if (col_ind.num_el > c)
  1020.                     glColor3f (col.pt[col_ind.pElements[c]].r,
  1021.                                col.pt[col_ind.pElements[c]].g,
  1022.                                col.pt[col_ind.pElements[c]].b); 
  1023.           //if there is a texture, and if the indexed 3Dpoint has a correspondant 2D texture pt.
  1024.                     if ((CNS->Texture.tex_name[0] !=99999) && (i<indtex->num_el) ) {
  1025.                         //glBindTexture(GL_TEXTURE_2D, CNB->Geometry_ins.texture.tex_name[0]);
  1026.                         t=indtex->pElements[i];
  1027.                         glTexCoord2f(CNS->Geometry.IndexedFaceSet.texCoord[t].x , CNS->Geometry.IndexedFaceSet.texCoord[t].y);
  1028.                     }
  1029.                     glVertex3f (pt->pt[j].x,
  1030.                                 pt->pt[j].y,
  1031.                                 pt->pt[j].z);
  1032.                     nbr_vertex++;
  1033.                     if (listnum == 9) if (TOP    < pt->pt[j].y) TOP    = pt->pt[j].y;
  1034.                     if (listnum == 9) if (BOTTOM > pt->pt[j].y) BOTTOM = pt->pt[j].y;
  1035.                     if (listnum == 9) if (RIGHT  < pt->pt[j].x) RIGHT  = pt->pt[j].x;
  1036.                     if (listnum == 9) if (LEFT   > pt->pt[j].x) LEFT   = pt->pt[j].x;
  1037.                     if (listnum == 9) if (ZmaxVrmlCity   < pt->pt[j].z) ZmaxVrmlCity = pt->pt[j].z;
  1038.                     if (listnum == 9) if (ZminVrmlCity   > pt->pt[j].z) ZminVrmlCity = pt->pt[j].z;
  1039.                     pt->pt[j].x = mempt.x;  // For an eventual second pass.
  1040.                     pt->pt[j].y = mempt.y;
  1041.                     pt->pt[j].z = mempt.z;
  1042.                     i++;
  1043.                 }
  1044.                 glEnd();
  1045.             } // if (num_vertx==4
  1046.             if (num_vertx==4) {
  1047.                 glBegin (GL_QUADS);
  1048.                 if (CNS->Geometry.IndexedFaceSet.solid == GL_FALSE) {
  1049.                     glCullFace (GL_FRONT_AND_BACK);// The culling must be within the glBegin
  1050.                     glEnable(GL_CULL_FACE);// if we want a triangle rendered when outside
  1051.                 }                          // of window boundary.
  1052.                 for (int marra = 0; marra<num_vertx; marra++) {
  1053.                     j=ind->pElements[i];
  1054.                     pt->pt[j].x = pt->pt[j].x + TransX;
  1055.                     pt->pt[j].y = pt->pt[j].y + TransY;
  1056.                     pt->pt[j].z = pt->pt[j].z + TransZ;
  1057.                     if (col_ind.num_el > c)
  1058.                         glColor3f (col.pt[col_ind.pElements[c]].r,
  1059.                                    col.pt[col_ind.pElements[c]].g,
  1060.                                    col.pt[col_ind.pElements[c]].b);
  1061.                                                    
  1062.                     if (CNS->Texture.tex_name[0] !=99999) {
  1063.                         t=indtex->pElements[i];
  1064.                         //glBindTexture(GL_TEXTURE_2D, CNB->Geometry_ins.texture.tex_name[0]);
  1065.                         glTexCoord2f(CNS->Geometry.IndexedFaceSet.texCoord[t].x , CNS->Geometry.IndexedFaceSet.texCoord[t].y);
  1066.                     }
  1067.                     glVertex3f (pt->pt[j].x,
  1068.                                 pt->pt[j].y,
  1069.                                 pt->pt[j].z);
  1070.                     if (listnum == 9) if (TOP    < pt->pt[j].y) TOP    = pt->pt[j].y;
  1071.                     if (listnum == 9) if (BOTTOM > pt->pt[j].y) BOTTOM = pt->pt[j].y;
  1072.                     if (listnum == 9) if (RIGHT  < pt->pt[j].x) RIGHT  = pt->pt[j].x;
  1073.                     if (listnum == 9) if (LEFT   > pt->pt[j].x) LEFT   = pt->pt[j].x;
  1074.                     if (listnum == 9) if (ZmaxVrmlCity   < pt->pt[j].z) ZmaxVrmlCity = pt->pt[j].z;
  1075.                     if (listnum == 9) if (ZminVrmlCity   > pt->pt[j].z) ZminVrmlCity = pt->pt[j].z;
  1076.                     i++;
  1077.                 }
  1078.                 glEnd();
  1079.             } // if (num_vertx>4
  1080.             if (num_vertx>4) {
  1081.                 glBegin (GL_POLYGON);
  1082.                 if (CNS->Geometry.IndexedFaceSet.solid == GL_FALSE) {
  1083.                     glCullFace (GL_FRONT_AND_BACK);// The culling must be within the glBegin
  1084.                     glEnable(GL_CULL_FACE);// if we want a triangle rendered when outside
  1085.                 }                          // of window boundary.
  1086.                 for (int marra = 0; marra<num_vertx; marra++) {
  1087.                     j=ind->pElements[i];
  1088.                     pt->pt[j].x = pt->pt[j].x + TransX;
  1089.                     pt->pt[j].y = pt->pt[j].y + TransY;
  1090.                     pt->pt[j].z = pt->pt[j].z + TransZ;
  1091.                     
  1092.                     if (col_ind.num_el > c)
  1093.                     glColor3f (col.pt[col_ind.pElements[c]].r,
  1094.                                col.pt[col_ind.pElements[c]].g,
  1095.                                col.pt[col_ind.pElements[c]].b); 
  1096.  
  1097.                     if (CNS->Texture.tex_name[0] !=99999) {
  1098.                         t=indtex->pElements[i];
  1099.                         //glBindTexture(GL_TEXTURE_2D, CNB->Geometry_ins.texture.tex_name[0]);
  1100.                     glTexCoord2f(CNS->Geometry.IndexedFaceSet.texCoord[t].x , CNS->Geometry.IndexedFaceSet.texCoord[t].y);
  1101.                     }
  1102.                     glVertex3f (pt->pt[j].x,
  1103.                                 pt->pt[j].y,
  1104.                                 pt->pt[j].z);
  1105.                     if (listnum == 9) if (TOP    < pt->pt[j].y) TOP    = pt->pt[j].y;
  1106.                     if (listnum == 9) if (BOTTOM > pt->pt[j].y) BOTTOM = pt->pt[j].y;
  1107.                     if (listnum == 9) if (RIGHT  < pt->pt[j].x) RIGHT  = pt->pt[j].x;
  1108.                     if (listnum == 9) if (LEFT   > pt->pt[j].x) LEFT   = pt->pt[j].x;
  1109.                     if (listnum == 9) if (ZmaxVrmlCity   < pt->pt[j].z) ZmaxVrmlCity = pt->pt[j].z;
  1110.                     if (listnum == 9) if (ZminVrmlCity   > pt->pt[j].z) ZminVrmlCity = pt->pt[j].z;
  1111.                     i++;
  1112.                 }
  1113.             glEnd();
  1114.             } // if (num_vertx==3
  1115.         // i++ to skip the -1 and position on the next valid input. ( no not necessary since i++ in for...) 
  1116.             c++;
  1117.         } // for (int i = 0; i<ind->num_el; i++)
  1118.  
  1119. }    
  1120. void Draw_Vrml(Type_Transform *CNlocal, int listnum) // CNlocal is either CNC or CNV or...
  1121. {
  1122.     extern double TOP, BOTTOM, LEFT, RIGHT;
  1123.     CN = CNlocal;
  1124.     // calculate the correct Bounding box
  1125.     if (listnum == 9) TOP = -9999999;
  1126.     if (listnum == 9) BOTTOM = 9999999; 
  1127.  
  1128.     if (listnum == 9) LEFT = 9999999;
  1129.     if (listnum == 9) RIGHT =-9999999; 
  1130.  
  1131.     if (listnum == 9) ZmaxVrmlCity = -9999999;
  1132.     if (listnum == 9) ZminVrmlCity =  9999999;
  1133.     TransX= TransY= TransZ=0; // Global Transformation.
  1134.     trackball(curquat_vrml, 0.0, 0.0, 0.0,0.0);
  1135.     nbr_vertex = 0;
  1136.     glEnable (GL_TEXTURE_2D);
  1137.     // find beginning of nodes
  1138.   int counter = 0;
  1139.     while (CN->node_type != Top_Scene)
  1140.         CN = CN->FatherTransform;
  1141.     // compile the list.
  1142.     glNewList(listnum, GL_COMPILE_AND_EXECUTE);
  1143.     while (Pass_To_Next_Trans()){
  1144.     counter ++;
  1145.         if (CN->ShapeLeave) {
  1146.             CNS = CN->Shape;
  1147.             Draw_Shape_Node(listnum);
  1148.         }
  1149.         else for (CN->indChildShape=0; CN->indChildShape<CN->numChildShape; CN->indChildShape++) {
  1150.             CNS = CN->ChildrenShape[CN->indChildShape];
  1151.             Draw_Shape_Node(listnum);
  1152.         }
  1153.     }// while
  1154.   //cout << "number of Transform nodes" << counter << endl;
  1155.     glDisable(GL_TEXTURE_2D);
  1156.     glEndList();
  1157.     cout << "nbr_vertex = " << nbr_vertex << endl;
  1158.     cout << "top=" << TOP << "  bottom=" << BOTTOM << "RIGHT=" << RIGHT <<" LEFT=" << LEFT << endl;
  1159.     if (listnum == 9) XmaxVrmlCity = RIGHT;
  1160.     if (listnum == 9) YmaxVrmlCity = TOP;
  1161.     if (listnum == 9) XminVrmlCity = LEFT;
  1162.     if (listnum == 9) YminVrmlCity = BOTTOM;
  1163.     //if (listnum == 9) Virtual_Espace();
  1164. }
  1165.  
  1166. /* void Draw_Vrml_Vehicle()
  1167. {
  1168.     CN = CNV;
  1169.     //Draw_Vrml(19);
  1170.     glNewList(19, GL_COMPILE_AND_EXECUTE);
  1171.     glBegin(GL_TRIANGLES);
  1172.     glVertex3f (0,0,0);
  1173.     glVertex3f (0.1,0.1,0.1);
  1174.     glVertex3f (0.1, 0, 0.2);
  1175.     glEnd();
  1176.     glEndList(); 
  1177.  
  1178. }
  1179. void Draw_Vrml_City()
  1180. {
  1181.     CN = CNC;
  1182.     Draw_Vrml(9);
  1183.     CN = CNC;
  1184.     Virtual_Espace();
  1185. } */
  1186.  
  1187. Test_For_Coord_In_Geometry_node()
  1188. {    /*if ((CN->node_type == n_geometry) &&
  1189.          (CN->Geometry_ins.IndexedFaceSet_Ins.coord.point.num_el == 0)) 
  1190.     CN->Geometry.IndexedFaceSet.coord = CN->Father->Geometry_ins.IndexedFaceSet_Ins.coord;*/
  1191.     //cout << "forget me" << endl;
  1192. }
  1193. void
  1194. inline
  1195. OuvreAccolade()
  1196. {
  1197.     CN->Acc++; // Not necessary yet.
  1198.     AccTag = p_nothing;          // Keeps track of the Accolades
  1199.     Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1200.     Acc.indice = Acc.indice +1;
  1201. }
  1202. void 
  1203. inline
  1204. OuvreCrochet()
  1205. {
  1206.     CN->Cro++; // not necessary yet
  1207.     AccTag = p_nothing;          // Keeps track of the Accolades
  1208.     Acc.indice = Acc.indice +1;
  1209.     Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1210. }
  1211.  
  1212. void
  1213. inline
  1214. FermeCrochet()
  1215. {
  1216.     CN->Cro--; // not necessary yet
  1217.     Acc.indice = Acc.indice -1;
  1218.     if (Acc.indice <0) {
  1219.         cout << "Acc.indice < 0 search for me..." << endl;
  1220.         getchar();
  1221.         exit(1);
  1222.     }
  1223. }
  1224.  
  1225.  
  1226. void
  1227. inline 
  1228. read_RAW_file (char *directory, unsigned char *image, int *im_width, int *im_height)
  1229. {
  1230.   FILE * raw;
  1231.   im_width [0] = 8;
  1232.   im_height[0] = 8;
  1233.   if ((raw = fopen (directory, "rb"))==NULL){
  1234.     cout << "Error reading the raw file" << endl;
  1235.     cout << "width = " << im_width[0] << "   height=" << im_height[0]<< endl;
  1236.     // But still allocates a 64 byte image, just so that the program doesn't crash...
  1237.     if ((CNS->Texture.image = (unsigned char *)malloc (im_width[0]*im_height[0]*3) ) == NULL){
  1238.       cout << "Malloc error here 938488uf74" << endl;
  1239.       exit (1);
  1240.     }
  1241.     // fclose (raw);
  1242.     return ;
  1243.   }
  1244.   fread (im_width , sizeof(int), 1,raw);
  1245.   fread (im_height, sizeof(int), 1,raw);
  1246.   //cout << "width = " << im_width[0] << "   height=" << im_height[0]<< endl;
  1247.   if ((CNS->Texture.image = (unsigned char *)malloc (im_width[0]*im_height[0]*3) ) == NULL){
  1248.         cout << "Malloc error here 938488uf74" << endl;
  1249.         exit (1);
  1250.   }
  1251.   fread (CNS->Texture.image, sizeof(unsigned char), im_width[0]*im_height[0]*3,raw);
  1252.   //cout << "image read " << endl;
  1253.   fclose (raw); /*
  1254.   if ((CNS->Texture.image = (unsigned char *)malloc (128*256*3) ) == NULL){
  1255.         cout << "Malloc error here 9384793874" << endl;
  1256.         exit (1);
  1257.         }  
  1258.       for (int muk = 0 ; muk <64*64*3; muk++)
  1259.         CNS->Texture.image[muk] = 230;
  1260.         CNS->Texture.im_width[0]= 128; CNS->Texture.im_height[0]=256; */
  1261. }
  1262.  
  1263. Type_Transform *
  1264. Read_Vrml_File(char *vrml_filename)
  1265. {
  1266.     extern char *texture_directory;
  1267.     // Initialize ScaleNormals to 1.
  1268.     ScaleNormals.x = 1;
  1269.     ScaleNormals.y = 1;
  1270.     ScaleNormals.z = 1;
  1271.  
  1272.     int size,i;
  1273.     char wordd[90];
  1274.     Acc.indice = 0;
  1275.     iz.index = -1;
  1276.     iz.texIndex = -1;
  1277.  
  1278.     //glGenTextures(10,test);
  1279.  
  1280.     // Open vrml file for reading
  1281.     if ((file = fopen (vrml_filename,"r")) == NULL)
  1282.         printf ("\n pas de chance l'ami ton fichier est corrompu 89472229099\n");
  1283.   //cout << vrml_filename << endl;
  1284.  
  1285.     // initialising the node top_scene.
  1286.     CN = new Type_Transform;
  1287.     initialize_Transform_node();
  1288.     CN->node_type = Top_Scene;
  1289.     previous_node_type = Top_Scene;
  1290.   int counter2 = 0;
  1291.     while (fscanf (file,"%s",&wordd) != EOF) {
  1292.         // cout << wordd << endl;
  1293.         wordd_to_node(wordd); // result in node
  1294.         switch (node_type) {
  1295.         case n_CroO:
  1296.             OuvreCrochet();
  1297.             break;
  1298.         case n_CroF:
  1299.             FermeCrochet();
  1300.             break;
  1301.         case n_AccO:
  1302.             OuvreAccolade();
  1303.             break;
  1304.         case n_AccF:
  1305.             CN->Acc--; // Not necessary yet.
  1306.             Acc.indice = Acc.indice -1;
  1307.             if (Acc.indice >=1000){
  1308.                 cout << "Change your indice, exit 38959988477683" << endl;
  1309.                 exit(1);
  1310.             }
  1311.             if (Acc.pipe[Acc.indice] == p_Transform)
  1312.                 CN = CN->FatherTransform;
  1313.             if (Acc.indice <0) {
  1314.                 cout << "Acc.indice < 0 search for meeeee 135335..." << endl;
  1315.                 getchar();
  1316.                 exit(1);
  1317.             }
  1318.             break;
  1319.         case n_IndexedFaceSet:
  1320.             AccTag = p_IndexedFaceSet;          // Keeps track of the Accolades
  1321.             Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1322.       if (Acc.indice >=1000){
  1323.         cout << "Change your indice, exit 38959988477683" << endl;
  1324.         exit(1);
  1325.       }
  1326.             Acc.indice++;
  1327.             fscanf (file,"%s",&wordd);
  1328.             if (wordd[0] != '{') {
  1329.                 cout << "GetChar: An '{' is expected here!!! look for me 159395" << endl;
  1330.                 getchar();
  1331.             }
  1332.             break;
  1333.         case n_Transform : 
  1334.             //Test_For_Coord_In_Geometry_node();
  1335.       //cout << "Create_Child_Transform_Node" << endl;
  1336.             Create_Child_Transform_Node();
  1337.             initialize_Transform_node();
  1338.             //cout << "CN-> " << CN->node_type << endl;
  1339.             AccTag = p_Transform;          // Keeps track of the Accolades
  1340.             Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1341.       if (Acc.indice >=1000){
  1342.         cout << "Change your indice, exit 38959988477683" << endl;
  1343.         exit(1);
  1344.       }
  1345.             Acc.indice++;
  1346.       counter2 ++;
  1347.             fscanf (file,"%s",&wordd);
  1348.             if (wordd[0] != '{') {
  1349.                 cout << "GetChar: An '{' is expected here!!! look for me 159395" << endl;
  1350.                 getchar();
  1351.             }
  1352.             node_type = nothing;
  1353.             break;
  1354.         case n_Appearance:
  1355.             //Test_For_Coord_In_Geometry_node();
  1356.             //Create_Son_Node();
  1357.             //CN->node_type = n_Appearance;
  1358.             //previous_node_type = n_Appearance;
  1359.             //CN->Geometry_ins.texture.tex_name[0] = 99999;
  1360.             AccTag = p_Appearance;          // Keeps track of the Accolades
  1361.             Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1362.       if (Acc.indice >=1000){
  1363.         cout << "Change your indice, exit 38959988477683" << endl;
  1364.         exit(1);
  1365.       }
  1366.             Acc.indice++;
  1367.             fscanf (file,"%s",&wordd);
  1368.             if (wordd[0] != '{') {
  1369.                 cout << "GetChar: An '{' is expected here!!! look for me 159395" << endl;
  1370.                 getchar();
  1371.             }
  1372.             node_type = nothing;
  1373.             break;
  1374.         case n_geometry:
  1375.             //if (previous_node_type == n_Appearance) 
  1376.             //    Create_Brother_Node();
  1377.             //else Create_Son_Node();
  1378.             //CN->node_type = n_geometry;
  1379.             // strcpy (CN->Geometry_ins.texture.tex_blk , "nothing");
  1380.             previous_node_type = n_geometry; 
  1381.             node_type = nothing;
  1382.             break;
  1383.         case n_children:
  1384.             CN->FlagChildren = 1;
  1385.             AccTag = p_children;          // Keeps track of the Accolades
  1386.             Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1387.       if (Acc.indice >=1000){
  1388.         cout << "Change your indice, exit 378838789583" << endl;
  1389.         exit(1);
  1390.       }
  1391.             Acc.indice++;
  1392.             fscanf (file,"%s",&wordd);
  1393.             if (wordd[0] != '[') {
  1394.                 cout << "GetChar: An '[' is expected here!!! look for me 193843" << endl;
  1395.                 getchar();
  1396.             }
  1397.             break; 
  1398.         case n_Shape:
  1399.             if (CN->FlagChildren){
  1400.                 Create_Child_Shape_Node();
  1401.                 InitializeChildrenShape();
  1402.             } else {
  1403.                 Create_One_Shape_Node();
  1404.                 InitializeChildrenShape();
  1405.             }
  1406.             AccTag = p_Shape;              // Keeps track of the Accolades
  1407.             Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1408.       if (Acc.indice >=1000){
  1409.         cout << "Change your indice, exit 879384733" << endl;
  1410.         exit(1);
  1411.       }
  1412.             Acc.indice++;
  1413.             fscanf (file,"%s",&wordd);
  1414.             if (wordd[0] != '{') {
  1415.                 cout << "GetChar: An '{' is expected here!!! look for me 9593962" << endl;
  1416.                 getchar();
  1417.             }
  1418.             node_type = nothing;
  1419.             break; 
  1420.         case n_Material:
  1421.             //Create_Son_node();
  1422.             //CN->node_type = n_Material;
  1423.             AccTag = p_Material;          // Keeps track of the Accolades
  1424.             Acc.pipe[Acc.indice] = AccTag; // Keeps track of the Accolades
  1425.       if (Acc.indice >=1000){
  1426.         cout << "Change your indice, exit 98374983" << endl;
  1427.         exit(1);
  1428.       }
  1429.             Acc.indice++;
  1430.             fscanf (file,"%s",&wordd);
  1431.             if (wordd[0] != '{') {
  1432.                 cout << "GetChar: An '{' is expected here!!! look for me 991995922" << endl;
  1433.                 getchar();
  1434.             }
  1435.             break; 
  1436.         case n_translation:
  1437.             // the CN is a Transform.
  1438.             CN->translation.x = LisFlWrl();
  1439.             CN->translation.y = LisFlWrl();
  1440.             CN->translation.z = LisFlWrl();
  1441.             node_type = nothing;
  1442.             break; 
  1443.         case n_scale:
  1444.             // the CN is a Transform.
  1445.             CN->FlagScale = 1;
  1446.             CN->scale.x = LisFlWrl();
  1447.             CN->scale.y = LisFlWrl();
  1448.             CN->scale.z = LisFlWrl();
  1449.             node_type = nothing;
  1450.             break; 
  1451.         case n_rotation:
  1452.             // the CN is a Transform.
  1453.             CN->rotation.x = LisFlWrl();
  1454.             CN->rotation.y = LisFlWrl();
  1455.             CN->rotation.z = LisFlWrl();
  1456.             CN->rotation.teta = LisFlWrl();
  1457.             node_type = nothing;
  1458.             break; 
  1459.         case n_diffuseColor:
  1460.             CNS->Appearance.material.diffuseColor.r = LisFlWrl(); 
  1461.             CNS->Appearance.material.diffuseColor.g = LisFlWrl(); 
  1462.             CNS->Appearance.material.diffuseColor.b = LisFlWrl(); 
  1463.             node_type = nothing;
  1464.             break;
  1465.         case n_specularColor:
  1466.             CNS->Appearance.material.specularColor.r = LisFlWrl(); 
  1467.             CNS->Appearance.material.specularColor.g = LisFlWrl(); 
  1468.             CNS->Appearance.material.specularColor.b = LisFlWrl(); 
  1469.             node_type = nothing;
  1470.             break;
  1471.  
  1472.         case n_shininess:
  1473.             CNS->Appearance.material.shininess = LisFlWrl();
  1474.             node_type = nothing;
  1475.             break;
  1476.         case n_transparency:
  1477.             CNS->Appearance.material.transparency = LisFlWrl();
  1478.             node_type = nothing;
  1479.             break;
  1480.         case f_solid:
  1481.             fscanf (file,"%s",&wordd);
  1482.             if ((strcmp (wordd,"FALSE"))==0)
  1483.                 CNS->Geometry.IndexedFaceSet.solid = GL_FALSE;
  1484.             else
  1485.                 CNS->Geometry.IndexedFaceSet.solid = GL_TRUE;
  1486.             break;
  1487.         case n_TimeSensor:
  1488.                 AccTag = p_TimeSensor;          // Keeps track of the Accolades
  1489.                 Acc.pipe[Acc.indice] = AccTag;  // Keeps track of the Accolades
  1490.       if (Acc.indice >=1000){
  1491.         cout << "Change your indice, exit 3398439899903" << endl;
  1492.         exit(1);
  1493.       }
  1494.                 Acc.indice++;
  1495.             fscanf (file,"%s",&wordd);
  1496.             if (wordd[0] != '{') {
  1497.                 cout << "GetChar: An '{' is expected here!!! look for me 159383395" << endl;
  1498.                 getchar();
  1499.             }
  1500.                 break;
  1501.         case f_coord:
  1502.             fscanf (file,"%s",&wordd);
  1503.             if (strcmp(wordd,"DEF") == 0){
  1504.                 // Put Blk_name in hash table
  1505.                 iz.index++;
  1506.                 fscanf (file, "%s", &UseDef[iz.index].blk_name);
  1507.                 //UseDef[iz.index].coord = CNS->Geometry.IndexedFaceSet.coord; after reading the pts bozzo!!
  1508.                 // Reads p_Coordinate
  1509.                 fscanf (file,"%s",&wordd);
  1510.                 fscanf (file,"%s",&wordd);
  1511.                 if (wordd[0] != '{') {
  1512.                     cout << "GetChar: An '{' is expected here!!! look for me 159395" << endl;
  1513.                     getchar();
  1514.                 }
  1515.                 AccTag = p_Coordinate;          // Keeps track of the Accolades
  1516.                 Acc.pipe[Acc.indice] = AccTag;  // Keeps track of the Accolades
  1517.       if (Acc.indice >=1000){
  1518.         cout << "Change your indice, exit 3899932878897213" << endl;
  1519.         exit(1);
  1520.       }
  1521.                 Acc.indice++;
  1522.                 fscanf (file,"%s",&wordd);
  1523.                 wordd_to_node(wordd); 
  1524.                 if (node_type == n_point)
  1525.                     read_all_points_into_this_node();
  1526.                 if (ADJUST_TO_ZERO) {
  1527.                     adjust_to_zero();
  1528.                     if ((UseDef[iz.index].blk_name[2] == 'R') && (UseDef[iz.index].blk_name[3] == 'O') &&
  1529.                         (UseDef[iz.index].blk_name[4] == 'A') && (UseDef[iz.index].blk_name[5] == 'D') )
  1530.                         Saffir_the_ys();
  1531.                     if ((UseDef[iz.index].blk_name[2] == 'C') && (UseDef[iz.index].blk_name[3] == 'U') &&
  1532.                         (UseDef[iz.index].blk_name[4] == 'R') && (UseDef[iz.index].blk_name[5] == 'B') )
  1533.                         Saffir_the_ys();
  1534.                     if ((UseDef[iz.index].blk_name[2] == 'T') && (UseDef[iz.index].blk_name[3] == 'O') &&
  1535.                         (UseDef[iz.index].blk_name[4] == 'P') && (UseDef[iz.index].blk_name[5] == 'O') )
  1536.                         Saffir_the_ys();
  1537.                 }
  1538.                 UseDef[iz.index].coord = CNS->Geometry.IndexedFaceSet.coord;
  1539.                 node_type = nothing;
  1540.             }
  1541.             // If Use coord of another blk, just put it in!!
  1542.             if (strcmp(wordd,"USE") == 0) {
  1543.                 fscanf (file, "%s", &wordd);
  1544.                 for (int ozi=0;ozi<=iz.index; ozi++)
  1545.                     if (strcmp(wordd,UseDef[ozi].blk_name) == 0)
  1546.                         CNS->Geometry.IndexedFaceSet.coord = UseDef[ozi].coord;
  1547.             }
  1548.             break;
  1549.         case n_normal:
  1550.             fscanf (file, "%s", &wordd); //reads Normal
  1551.             if (strcmp (wordd, "Normal") != 0) {
  1552.                 cout << "What could be in front of normal else then Normal?? " << endl;
  1553.                 exit (0);
  1554.                 getchar();
  1555.             }
  1556.  
  1557.             fscanf (file, "%s", &wordd); //reads {
  1558.             if (strcmp (wordd, "{") != 0) {
  1559.                 cout << "What could be in front of normal Normal else then {?? " << endl;
  1560.                 exit (0);
  1561.                 getchar();
  1562.             }
  1563.             else 
  1564.                 OuvreAccolade();
  1565.                 
  1566.             fscanf (file, "%s", &wordd); //reads vector
  1567.             if (strcmp (wordd, "vector") != 0) {
  1568.                 cout << "What could be in front of normal Normal { else then vector?? " << endl;
  1569.                 exit (0);
  1570.                 getchar();
  1571.             }
  1572.  
  1573.             read_all_normal_vectors_into_this_node();
  1574.  
  1575.  
  1576.             break;
  1577. #if 1
  1578.         case f_texture:
  1579.             fscanf (file,"%s",&wordd); // Reads ImageTexture
  1580.             fscanf (file,"%s",&wordd); // Reads {
  1581.             fscanf (file,"%s",&wordd); // Reads url
  1582.             fscanf (file,"%s",&wordd); // Reads "image.jpg"
  1583.             char directory [200];
  1584.             strcpy (directory, texture_directory);
  1585.             //strcpy (directory, "/home/grof/MRcode/ver.5.1/"); WinUnix
  1586.             //strcpy (directory, "D:\\Arch98_Class\\VirtCity\\"); // WinUnix
  1587.             //strcpy (directory, "D:\\Arch98_Class\\VirtCity\\"); // WinUnix
  1588.             for (i = 1; i<89; i++){
  1589.                 if (wordd[i] == '"') wordd[i] = wordd[i+1];
  1590.                 wordd[i-1] = wordd[i];
  1591.             }
  1592.             // cout << wordd  ;
  1593.             strcat (directory, wordd);
  1594.         /* read_RAW_file (directory, 
  1595.                             CNS->Texture.image, 
  1596.                             CNS->Texture.im_width, 
  1597.                             CNS->Texture.im_height); */
  1598.  
  1599.       CNS->Texture.image=
  1600.                 read_JPEG_file (wordd, directory, 
  1601.                             CNS->Texture.image, 
  1602.                             CNS->Texture.im_width, 
  1603.                             CNS->Texture.im_height); 
  1604.  
  1605.       // cout << CNS->Texture.im_width[0] << "  " << CNS->Texture.im_height[0] << endl;
  1606.  
  1607.       /* if ((CNS->Texture.image = (unsigned char *)malloc (128*256*3) ) == NULL){
  1608.         cout << "Malloc error here 9384793874" << endl;
  1609.         exit (1);
  1610.         }  
  1611.       for (int muk = 0 ; muk <64*64*3; muk++)
  1612.         CNS->Texture.image[muk] = 230;
  1613.         CNS->Texture.im_width[0]= 128; CNS->Texture.im_height[0]=256; */
  1614.       //cout << wordd << endl;
  1615.       //cout << CNS->Texture.im_width[0] << "  " << CNS->Texture.im_height[0] << endl; 
  1616.             glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
  1617.             glClearColor (0.0, 0.0, 0.0, 0.0);
  1618.             glShadeModel(GL_FLAT);
  1619.             glEnable(GL_DEPTH_TEST);
  1620.             glGenTextures(1,CNS->Texture.tex_name);
  1621.             glBindTexture(GL_TEXTURE_2D, CNS->Texture.tex_name[0]);
  1622.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); //GL_CLAMP); //GL_REPEAT);
  1623.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); //GL_CLAMP); //GL_REPEAT);
  1624.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  1625.             glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  1626.             glTexImage2D(GL_TEXTURE_2D,           // target
  1627.                     0,                       // level
  1628.                     GL_RGB,                  // internal format
  1629.                     CNS->Texture.im_width[0], CNS->Texture.im_height[0],   
  1630.                     0,                       // border
  1631.                     GL_RGB,                  // format
  1632.                     GL_UNSIGNED_BYTE,        // type
  1633.                     CNS->Texture.image);
  1634.             fscanf (file,"%s",&wordd); // Reads }
  1635.             if (wordd[0] != '}') { cout << "error reading }..!! getchar()" << endl;
  1636.                             getchar();
  1637.             }
  1638.         break;
  1639.         case f_texCoord:
  1640.             fscanf (file, "%s", &wordd);
  1641.             if (strcmp (wordd, "DEF") == 0) {
  1642.                 iz.texIndex++;
  1643.                 fscanf (file, "%s", &UseDef[iz.texIndex].tex_blk_name);
  1644.                 strcpy(CNS->Texture.tex_blk,UseDef[iz.texIndex].tex_blk_name);
  1645.                 fscanf (file, "%s", &wordd);
  1646.                 if (strcmp (wordd, "TextureCoordinate") !=0){
  1647.                     cout << "Getchar! Que peut il y avoir apres texCoord qui ne soit pas DEF, USE ou TextureCoordinate?" << endl;
  1648.                     getchar();
  1649.                 }
  1650.                 AccTag = p_TextureCoordinate ;  // Keeps track of the Accolades
  1651.                 Acc.pipe[Acc.indice] = AccTag;  // Keeps track of the Accolades        
  1652.                 if (Acc.indice >=1000){
  1653.         cout << "Change your indice, exit 9899399399587778" << endl;
  1654.         exit(1);
  1655.       }
  1656.                 Acc.indice++;
  1657.                 fscanf (file,"%s",&wordd);
  1658.                 if (wordd[0] != '{') {
  1659.                     cout << "GetChar: An '{' is expected here!!! look for me 159395" << endl;
  1660.                     getchar();
  1661.                 }
  1662.                 fscanf (file,"%s",&wordd);
  1663.                 wordd_to_node(wordd); 
  1664.                 if (node_type == n_point)
  1665.                     read_all_texture_points_into_this_node();
  1666.                 else {
  1667.                     cout << "Getchar! Que peut il y avoir ici qui ne soit pas point???" << endl;
  1668.                     getchar();
  1669.                 }
  1670.                 UseDef[iz.texIndex].texCoord = CNS->Geometry.IndexedFaceSet.texCoord;
  1671.             }else
  1672.             if (strcmp (wordd, "USE") == 0){
  1673.                 //Type_Transform *CN_UP = CN;
  1674.                 fscanf (file,"%s", &wordd);
  1675.                 for (int ozi=0;ozi<=iz.texIndex; ozi++)
  1676.                     if (strcmp(wordd,UseDef[ozi].tex_blk_name) == 0)
  1677.                         CNS->Geometry.IndexedFaceSet.texCoord = UseDef[ozi].texCoord;
  1678.                 //while (strcmp (CN_UP->Geometry_ins.texture.tex_blk , wordd) != 0)
  1679.                 //    CN_UP = CN_UP->Father;
  1680.                 //CN->Geometry_ins.IndexedFaceSet_Ins.texCoord = CN_UP->Geometry_ins.IndexedFaceSet_Ins.texCoord;
  1681.             }else
  1682.             if (strcmp (wordd, "TextureCoordinate") == 0) {
  1683.                 fscanf (file,"%s",&wordd);
  1684.                 if (wordd[0] != '{') {
  1685.                     cout << "GetChar: An '{' is expected here!!! look for me 159395" << endl;
  1686.                     getchar();
  1687.                 }
  1688.                 AccTag = p_TextureCoordinate ;  // Keeps track of the Accolades
  1689.                 Acc.pipe[Acc.indice] = AccTag;  // Keeps track of the Accolades
  1690.       if (Acc.indice >=1000){
  1691.         cout << "Change your indice, exit 99887763325621" << endl;
  1692.         exit(1);
  1693.       }
  1694.                 Acc.indice++;
  1695.                 fscanf (file,"%s",&wordd);
  1696.                 wordd_to_node(wordd); 
  1697.                 if (node_type == n_point)
  1698.                     read_all_texture_points_into_this_node();
  1699.                 else {
  1700.                     cout << "Getchar! Que peut il y avoir ici qui ne soit pas point???" << endl;
  1701.                     getchar();
  1702.                 }
  1703.             }
  1704.                 node_type = nothing;
  1705.             break;
  1706.         case f_texCoordIndex:
  1707.             read_all_texCoordIndex_into_CN();
  1708.             break;
  1709. #endif
  1710.  
  1711.         case n_coordIndex:
  1712.       //cout << "reading coordIndex " << endl;
  1713.             read_all_coordIndex_into_CN();
  1714.             break;
  1715.         case f_colorIndex:
  1716.              read_all_colorIndex_into_CN();
  1717.              break;
  1718.         case f_color:
  1719.             fscanf (file,"%s",&wordd);
  1720.             if ((strcmp (wordd,"["))==0)
  1721.                 read_color_values();
  1722.             break;
  1723.         }
  1724.     }
  1725.     // Maybe the last node is a Geometry node and has the coord field not set yet.
  1726.     //if (CN->node_type == n_geometry) Test_For_Coord_In_Geometry_node();
  1727.  
  1728.   //cout << "After reading the vrml find there was " << counter2 << "transform nodes" << endl;
  1729.   //cout << "Number of nodes transform Created" << counter3 << endl;
  1730.     return (CN);
  1731.  
  1732. }
  1733.  
  1734. void test_bassit()
  1735. {
  1736.     float xmin = -500;
  1737.     float xmax =  500;
  1738.     float ymin = -500;
  1739.     float ymax =  500;
  1740.     float zmin = -500;
  1741.     float zmax =  500;
  1742.  
  1743. /*    glPopMatrix();
  1744.    glPushMatrix(); */
  1745.  
  1746.     glBegin(GL_LINES);
  1747.     glColor3f (0.45,0.45,0.45);
  1748.     glVertex3f (xmin,ymax,zmax);
  1749.     glVertex3f (xmax,ymax,zmax);
  1750.     glEnd();
  1751.  
  1752.     glBegin(GL_LINES);
  1753.     glColor3f (0.45,0.45,0.45);
  1754.     glVertex3f (xmax,ymax,zmax);
  1755.     glVertex3f (xmax,ymin,zmax);
  1756.     glEnd();
  1757.  
  1758.     glBegin(GL_LINES);
  1759.     glColor3f (0.45,0.45,0.45);
  1760.     // glColor3f (0.5,0,0);
  1761.     glVertex3f (xmax,ymin,zmax);
  1762.     glVertex3f (xmin,ymin,zmax);
  1763.     glEnd();
  1764.  
  1765.     glBegin(GL_LINES);
  1766.     glColor3f (0.45,0.45,0.45);
  1767.     // glColor3f (0.0,0.5,0.0);
  1768.     glVertex3f (xmin,ymin,zmax);
  1769.     glVertex3f (xmin,ymax,zmax);
  1770.     glEnd();
  1771.  
  1772. /*    glBegin(GL_LINES);
  1773.     glColor3f (0.45,0.45,0.45);
  1774.     // glColor3f (0,0,0.8);
  1775.     glVertex3f (xmin,ymax,zmax);
  1776.     glVertex3f (xmin,ymax,zmin);
  1777.     glEnd();
  1778.  
  1779.     glBegin(GL_LINES);
  1780.     glColor3f (0.45,0.45,0.45);
  1781.     //glColor3f (0,0,0.8);
  1782.     glVertex3f (xmax,ymax,zmax);
  1783.     glVertex3f (xmax,ymax,zmin);
  1784.     glEnd();
  1785.  
  1786.     glBegin(GL_LINES);
  1787.     glColor3f (0,0,0.8);
  1788.     glVertex3f (xmax,ymin,zmax);
  1789.     glVertex3f (xmax,ymin,zmin);
  1790.     glEnd();
  1791.  
  1792.     glBegin(GL_LINES);
  1793.     glColor3f (0,0,0.8);
  1794.     glVertex3f (xmin,ymin,zmax);
  1795.     glVertex3f (xmin,ymin,zmin);
  1796.     glEnd();*/
  1797.  
  1798.     glTranslatef(0.0,0.0,-1000.0);
  1799.  
  1800.     glBegin(GL_LINES);
  1801.     glColor3f (0.0,0.5,0.0);
  1802.     glVertex3f (xmin,ymax,zmax);
  1803.     glVertex3f (xmin,ymin,zmax);
  1804.     glEnd();
  1805.  
  1806.     glBegin(GL_LINES);
  1807.     glColor3f (0.5,0,0);
  1808.     glVertex3f (xmin,ymin,zmax);
  1809.     glVertex3f (xmax,ymin,zmax);
  1810.     glEnd();
  1811.  
  1812.     glBegin(GL_LINES);
  1813.     glColor3f (0.0,0.5,0.0);
  1814.     glVertex3f (xmax,ymin,zmax);
  1815.     glVertex3f (xmax,ymax,zmax);
  1816.     glEnd();
  1817.  
  1818.     glBegin(GL_LINES);
  1819.     glColor3f (0.5,0,0);
  1820.     glVertex3f (xmax,ymax,zmax);
  1821.     glVertex3f (xmin,ymax,zmax);
  1822.     glEnd();
  1823. }
  1824.  
  1825. void ReadBufferSphere(Type_Transform *CNSphere)
  1826. {
  1827.     // must be in this file for some puttain unknown reason!!!
  1828.    glReadBuffer(GL_BACK);    
  1829.    glReadPixels (0,0, CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.im_width[0],
  1830.                       CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.im_height[0], 
  1831.                       GL_RGB, GL_UNSIGNED_BYTE,
  1832.                       CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.image); // image[0][0]); 
  1833.    glBindTexture (GL_TEXTURE_2D, CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.tex_name[0]);
  1834.     glTexImage2D(  GL_TEXTURE_2D,    // target
  1835.                      0,                // level
  1836.                      //0, 0,                              // xoffset, yoffset
  1837.                      GL_RGB, // format
  1838.                      CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.im_width[0], 
  1839.                      CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.im_height[0],             // Width, Height
  1840.                      //im_width[0], im_height[0],
  1841.                      0, // border
  1842.                      GL_RGB,           // format
  1843.                      GL_UNSIGNED_BYTE, // type
  1844.                      //image);
  1845.                      CNSphere->ChildrenTransform[0]->ChildrenShape[0]->Texture.image);        // GLvoid *pixels */ 
  1846.  
  1847. }
  1848.