home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / pc / 3DTOSHI2.ZIP / mpg3d / source / g3dasc.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1996-04-20  |  7.4 KB  |  284 lines

  1.  
  2. // g3dasc.cpp
  3. //
  4. // Copyright (c) 1996 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. #include "stdgfx.h"
  7. #include "g3dasc.h"
  8.  
  9. G3DASCTOOL::G3DASCTOOL () : G3DFILETOOL ()
  10.   {
  11.   } // End of Constructor for G3DASCTOOL
  12.  
  13. G3DASCTOOL::~G3DASCTOOL ()
  14.   {
  15.   } // End of Destructor for G3DASCTOOL
  16.  
  17. INT G3DASCTOOL::ReadASCToken ( FILEHANDLE f, STRING String  )
  18.   {
  19.     return fscanf ( f, "%s", String );  
  20.   } // End of ReadASCToken for G3DASCTOOL
  21.  
  22. INT G3DASCTOOL::GoToASCToken ( FILEHANDLE f, STRING String )
  23.   {
  24.     BOOLEAN Found=FALSE;
  25.     CHAR Str[128];
  26.  
  27.     while (!Found)
  28.       {
  29.         if (ReadASCToken ( f, Str  )==EOF)
  30.           return EOF;
  31.         if (strcmp(String,Str)==0)
  32.           Found = TRUE;
  33.       } // End while
  34.     return 0;  
  35.   } // End of GoToASCToken for G3DASCTOOL
  36.  
  37. INT G3DASCTOOL::GetASCNumber ( FILEHANDLE f, double *Number )
  38.   {
  39.     CHAR Str[128];
  40.     INT Result;
  41.  
  42.     Result = fscanf ( f, "%s", Str );
  43.     *Number = atof ( Str );
  44.     return Result;
  45.   } // End of GetASCNumber for G3DASCTOOL
  46.  
  47. INT G3DASCTOOL::GetASCInt ( FILEHANDLE f, LONG *Number )
  48.   {
  49.     return fscanf ( f, "%d", Number );  
  50.   } // End of GetASCInt for G3DASCTOOL
  51.  
  52. INT G3DASCTOOL::GetASCName ( FILEHANDLE f, STRING Name )
  53.   {
  54.     CHAR Str[128];
  55.     INT Result;
  56.     
  57.     Result = fscanf ( f, "%s", Str );
  58.  
  59.     if (Result==EOF)
  60.       return Result;
  61.       
  62.     INT i=0;
  63.     INT Count=0;
  64.     while (Count<32)
  65.       {
  66.         if (Str[i]=='"')
  67.           {
  68.           } // End if
  69.         else if (Str[i]==NULL)
  70.           {
  71.             Name[Count] = NULL;
  72.             break;
  73.           } // End else if
  74.         else
  75.           Name[Count++] = Str[i];
  76.         i++;
  77.       } // End for
  78.     Name[Count] = NULL;
  79.     return Result;
  80.   } // End of GetASCName for G3DASCTOOL
  81.  
  82. BOOLEAN G3DASCTOOL::LoadASCPolyObject ( FILEHANDLE f,
  83.                                         G3DPOLYHEDRON *Object, 
  84.                                         double Scale )
  85.   {
  86.     double x,y,z;
  87.     LONG NumVertex,NumFaces;
  88.     FLPVECTOR3D *PointList;
  89.     G3DPOLY *PolyList;
  90.     FLPVECTOR2D *TexList;
  91.     LONG P1,P2,P3;
  92.     double u,v;
  93.     GEOMETRYDATA *GeometryData;
  94.         
  95.     if (GoToASCToken( f,"Vertices:" )==EOF)
  96.       return FAILURE;
  97.     else
  98.       {
  99.         GetASCInt ( f, &NumVertex );
  100.         GoToASCToken( f,"Faces:" );
  101.         GetASCInt ( f, &NumFaces );
  102.  
  103.         TexList = new FLPVECTOR2D [NumVertex];
  104.         if (TexList==NULL)
  105.           return FAILURE;
  106.  
  107.         Object->CreateGeometryData ( NumVertex, NumFaces );    
  108.         GeometryData = Object->GetGeometryData ();    
  109.         PointList = GeometryData->FLPLocalPoints;
  110.         PolyList = GeometryData->Polys;
  111.             
  112.         GoToASCToken ( f,"Vertex" );
  113.         GoToASCToken ( f, "list:" );
  114.         LONG i;
  115.         CHAR NumStr[128];        
  116.                   
  117.         strcpy (NumStr,"");
  118.         
  119.         for (i=0;i<(LONG)NumVertex;i++)
  120.           {
  121.             while (strcmp(NumStr,"Vertex"))
  122.               ReadASCToken( f,NumStr );
  123.  
  124.             sprintf ( NumStr, "%d:", i );
  125.  
  126.             GoToASCToken ( f, NumStr );
  127.  
  128.             ReadASCToken ( f, NumStr );
  129.             if (strlen(NumStr)>2)
  130.               x = atof ( NumStr+2 );
  131.             else
  132.               GetASCNumber ( f, &x );
  133.  
  134.             ReadASCToken ( f, NumStr );
  135.             if (strlen(NumStr)>2)
  136.               y = atof ( NumStr+2 );
  137.             else
  138.               GetASCNumber ( f, &y );
  139.  
  140.             ReadASCToken ( f, NumStr );
  141.             if (strlen(NumStr)>2)
  142.               z = atof ( NumStr+2 );
  143.             else
  144.               GetASCNumber ( f, &z );
  145.  
  146.             PointList[i].x = (float)(x*Scale);
  147.             PointList[i].y = (float)(z*Scale);
  148.             PointList[i].z = (float)(y*Scale);
  149.             
  150.             u = v = 0;
  151.             ReadASCToken ( f, NumStr );
  152.             if (strncmp(NumStr,"U:",2)==0) // if U,V are present
  153.               {
  154.                 Object->TextureMapped = TRUE;
  155.                 if (strlen(NumStr)>2)
  156.                   u = atof ( NumStr+2 );
  157.                 else
  158.                   GetASCNumber ( f, &u );
  159.  
  160.                 ReadASCToken ( f, NumStr );
  161.                 if (strlen(NumStr)>2)
  162.                   v = atof ( NumStr+2 );
  163.                 else
  164.                   GetASCNumber ( f, &v );
  165.               } // End if
  166.                           
  167.             if (u<0)
  168.               u = -u;
  169.             if (v<0)
  170.               v = -v;
  171.  
  172.             double IntPtr;
  173.             if (u>1.0)
  174.               u = modf ( u, &IntPtr );
  175.             if (v>1.0)
  176.               v = modf ( v, &IntPtr );
  177.             
  178.             TexList[i].x = (float)(u*255*65536);  
  179.             TexList[i].y = (float)(v*255*65536);  
  180.           } // End for
  181.               
  182.         if (strcmp(NumStr,"Face"))
  183.           GoToASCToken( f,"Face" );
  184.         if (GoToASCToken ( f, "list:" )==EOF)
  185.           return FAILURE;
  186.             
  187.         for (i=0;i<(LONG)NumFaces;i++)
  188.           {
  189.             GoToASCToken( f,"Face" );
  190.             CHAR Str[128];
  191.             sprintf ( Str, "%d:", i );
  192.             GoToASCToken ( f, Str );
  193.             
  194.             ReadASCToken ( f, Str );
  195.             P1 = atoi ( Str+2 );
  196.  
  197.             ReadASCToken ( f, Str );
  198.             P2 = atoi ( Str+2 );
  199.  
  200.             ReadASCToken ( f, Str );
  201.             P3 = atoi ( Str+2 );
  202.  
  203.             PolyList[i].Points[0] = (LONG)P1;
  204.             PolyList[i].Points[1] = (LONG)P2;
  205.             PolyList[i].Points[2] = (LONG)P3;
  206.             
  207.             PolyList[i].TexCoords[0].x = TexList[P1].x;
  208.             PolyList[i].TexCoords[0].y = TexList[P1].y;
  209.             PolyList[i].TexCoords[1].x = TexList[P2].x;
  210.             PolyList[i].TexCoords[1].y = TexList[P2].y;
  211.             PolyList[i].TexCoords[2].x = TexList[P3].x;
  212.             PolyList[i].TexCoords[2].y = TexList[P3].y;
  213.           } // End for
  214.         delete TexList;  
  215.       } // End else    
  216.     
  217.     return SUCCESS;  
  218.   } // End of LoadASCPolyObject for G3DASCTOOL
  219.  
  220. BOOLEAN G3DASCTOOL::Load ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  221.                            BOOLEAN ClockWise, double Scale )
  222.   {
  223.     G3DOBJECT *Object;
  224.  
  225.     BOOLEAN Done=FALSE;
  226.  
  227.     while (Done!=TRUE)
  228.       {
  229.         CHAR Name[32];
  230.     
  231.         if (GoToASCToken( f,"Named" )==EOF)
  232.           {
  233.             break;
  234.           } // End if
  235.  
  236.         if (GoToASCToken( f,"object:" )==EOF)
  237.           {
  238.             break;
  239.           } // End if
  240.             
  241.         if (GetASCName( f,Name )==EOF)
  242.           {
  243.             return FAILURE;
  244.           } // End if
  245.       
  246.         if (GoToASCToken( f,"Tri-mesh," )==EOF)
  247.           {
  248.             break;
  249.           } // End if  
  250.       
  251.         Object = new G3DPOLYHEDRON ();
  252.           
  253.         Object->SetName ( Name );
  254.         
  255.         if (LoadASCPolyObject (f, (G3DPOLYHEDRON*)Object, Scale )==FAILURE)
  256.           {
  257.             delete Object;  
  258.             return FAILURE;
  259.           } // End if  
  260.  
  261.         ((G3DPOLYHEDRON*)Object)->ClockWised = ClockWise;
  262.         ObjectList->AddObject ( Object );  
  263.       } // End while
  264.         
  265.     return SUCCESS;
  266.   } // End of LoadASC for G3DASCTOOL
  267.  
  268. BOOLEAN G3DASCTOOL::Save ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  269.                            BOOLEAN ClockWise, double Scale )
  270.   {
  271.     if (f)
  272.       {}
  273.     if (ObjectList)
  274.       {}
  275.     if (ClockWise)
  276.       {}
  277.     if (Scale)
  278.       {}
  279.     return FAILURE;          
  280.   } // End of Save for G3DASCTOOL  
  281.  
  282.  
  283.  
  284.