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

  1.  
  2. // g3d3ds.cpp
  3. //
  4. // Copyright (c) 1996 by Toshiaki Tsuji, all rights reserved.
  5.  
  6. #include "stdgfx.h"
  7. #include "g3d3ds.h"
  8.  
  9. G3D3DSTOOL::G3D3DSTOOL () : G3DFILETOOL ()
  10.   {
  11.     u_list = NULL;
  12.     v_list = NULL;  
  13.   } // End of Constructor for G3D3DSTOOL
  14.  
  15. G3D3DSTOOL::~G3D3DSTOOL ()
  16.   {
  17.     if (u_list!=NULL)
  18.       delete u_list;  
  19.     if (v_list!=NULL)
  20.       delete v_list;
  21.  
  22.     u_list = v_list;  
  23.   } // End of Destructor for G3D3DSTOOL
  24.  
  25. VOID G3D3DSTOOL::SkipToNextChunk ( FILEHANDLE f, CHUNK3DS *Chunk )
  26.   {
  27.     File.Seek ( f, Chunk->NextOffset-6, FROM_CURRENT );  
  28.   } // End of SkipToNextChunk for G3D3DSTOOL
  29.  
  30. BOOLEAN G3D3DSTOOL::Read3DSChunk ( FILEHANDLE f, CHUNK3DS *Chunk )
  31.   {
  32.     BOOLEAN Result;
  33.     Result = File.Read ( f, &(Chunk->ID), 2  );  
  34.     if (Result==FAILURE)
  35.       return FAILURE;
  36.  
  37.     Result = File.Read ( f, &(Chunk->NextOffset), 4  );      
  38.     #if defined (__MSBFIRST__)
  39.       SwapWord ( ((WORD*)&(Chunk->ID)) );
  40.       SwapDWord ( ((WORD*)&(Chunk->NextOffset)) );
  41.     #endif
  42.  
  43.     return Result;  
  44.   } // End of Read3DSChunk for G3D3DSTOOL
  45.  
  46. BOOLEAN G3D3DSTOOL::Read3DSTriVertices ( FILEHANDLE f, G3DPOLYHEDRON* Object,
  47.                                          LONG Fp )
  48.   {
  49.     SHORT NumVertices;
  50.  
  51.     File.Read ( f, &NumVertices, 2 );
  52.     #if defined (__MSBFIRST__)
  53.        SwapWord ( ((WORD*)&NumVertices) );
  54.     #endif
  55.  
  56.     Object->CreateGeometryPoints ( NumVertices );
  57.     GEOMETRYDATA *GeometryData;
  58.     GeometryData = Object->GetGeometryData ();
  59.  
  60.     LONG i;
  61.     float x,y,z;
  62.     
  63.     for (i=0;i<NumVertices;i++)
  64.       {
  65.         File.Read ( f, &x, 4 );  
  66.         File.Read ( f, &y, 4 );  
  67.         File.Read ( f, &z, 4 );
  68.  
  69.         #if defined (__MSBFIRST__)
  70.           SwapDWord ( (DWORD*)(&x) );
  71.           SwapDWord ( (DWORD*)(&y) );
  72.           SwapDWord ( (DWORD*)(&z) );
  73.         #endif
  74.  
  75.         GeometryData->FLPLocalPoints[i].x = (float)(x*AdjustScale);
  76.         GeometryData->FLPLocalPoints[i].y = (float)(z*AdjustScale);
  77.         GeometryData->FLPLocalPoints[i].z = (float)(y*AdjustScale);
  78.       } // End for    
  79.     
  80.     LONG CurP = File.GetPos ( f );
  81.     if (CurP!=Fp)
  82.       File.Seek ( f, Fp, FROM_BEGIN );
  83.       
  84.     return SUCCESS;  
  85.   } // End of Read3DSTriVertices for G3D3DSTOOL
  86.                                         
  87. BOOLEAN G3D3DSTOOL::Read3DSTriFaceList ( FILEHANDLE f, G3DPOLYHEDRON* Object,
  88.                                          LONG Fp )
  89.   {
  90.     SHORT NumFaces;
  91.  
  92.     File.Read ( f, &NumFaces, 2 );
  93.  
  94.     #if defined (__MSBFIRST__)
  95.       SwapWord ( ((WORD*)&NumFaces) );
  96.     #endif
  97.  
  98.     Object->CreateGeometryPolys ( NumFaces );
  99.     GEOMETRYDATA *GeometryData;
  100.     GeometryData = Object->GetGeometryData ();
  101.  
  102.     LONG i;
  103.     SHORT List0,List1,List2,Flags;
  104.     
  105.     for (i=0;i<NumFaces;i++)
  106.       {
  107.         File.Read ( f, &List0, 2 );  
  108.         File.Read ( f, &List1, 2 );  
  109.         File.Read ( f, &List2, 2 );
  110.         File.Read ( f, &Flags, 2 );
  111.  
  112.         #if defined (__MSBFIRST__)
  113.           SwapWord ( ((WORD*)&List0) );
  114.           SwapWord ( ((WORD*)&List1) );
  115.           SwapWord ( ((WORD*)&List2) );
  116.           SwapWord ( ((WORD*)&Flags) );
  117.         #endif
  118.  
  119.         // Because 3DS assumes it is clockwise, we have to change it to counter-clockwise
  120.         GeometryData->Polys[i].Points[0] = List0;
  121.         GeometryData->Polys[i].Points[1] = List1;
  122.         GeometryData->Polys[i].Points[2] = List2;
  123.         if (Flags)
  124.           {}
  125.       } // End for    
  126.     
  127.     LONG CurP = File.GetPos ( f );
  128.     if (CurP!=Fp)
  129.       File.Seek ( f, Fp, FROM_BEGIN );
  130.       
  131.     return SUCCESS;  
  132.   } // End of Read3DSTriFaceList for G3D3DSTOOL
  133.  
  134. BOOLEAN G3D3DSTOOL::Read3DSTriMapList ( FILEHANDLE f, G3DPOLYHEDRON* Object,
  135.                                         LONG Fp )
  136.   {
  137.     SHORT NumVertices;
  138.  
  139.     File.Read ( f, &NumVertices, 2 );
  140.  
  141.     #if defined (__MSBFIRST__)
  142.       SwapWord ( ((WORD*)&NumVertices) );
  143.     #endif
  144.  
  145.     GEOMETRYDATA *GeometryData;
  146.     GeometryData = Object->GetGeometryData ();
  147.     if (GeometryData)
  148.       {}
  149.  
  150.     LONG i;
  151.     float u,v;
  152.  
  153.     u_list = new float[NumVertices];
  154.     v_list = new float[NumVertices];
  155.  
  156.     double Val,IntPart;
  157.     
  158.     for (i=0;i<NumVertices;i++)
  159.       {
  160.         File.Read ( f, &u, 4 );  
  161.         File.Read ( f, &v, 4 );  
  162.  
  163.         #if defined (__MSBFIRST__)
  164.           SwapDWord ( (DWORD*)(&u) );
  165.           SwapDWord ( (DWORD*)(&v) );
  166.         #endif
  167.  
  168.         Val = u;        
  169.         if (u<0)
  170.           u = -u;
  171.         if (u>1.0)
  172.           u = (float)modf ( Val, &IntPart );
  173.         u_list[i] = u*255*65536;
  174.           
  175.         Val = v;
  176.         if (v<0)
  177.           v = -v;
  178.         if (v>1.0)
  179.           v = (float)modf ( Val, &IntPart );  
  180.         v_list[i] = v*255*65536;
  181.       } // End for    
  182.  
  183.     Object->TextureMapped = TRUE;
  184.     LONG CurP = File.GetPos ( f );
  185.     if (CurP!=Fp)
  186.       File.Seek ( f, Fp, FROM_BEGIN );
  187.       
  188.     return SUCCESS;  
  189.   } // End of Read3DSTriMapList for G3D3DSTOOL
  190.                                      
  191. BOOLEAN G3D3DSTOOL::Read3DSTriObjectChunks ( FILEHANDLE f, G3DPOLYHEDRON* Object,
  192.                                           LONG Fp )
  193.   {
  194.     CHUNK3DS Chunk;
  195.     LONG CurP;
  196.  
  197.     if (u_list!=NULL)
  198.       delete u_list;
  199.     u_list = NULL;
  200.     if (v_list!=NULL)
  201.       delete v_list;
  202.     v_list = NULL;
  203.       
  204.     if (Object)
  205.       {}
  206.     CurP = File.GetPos ( f );
  207.  
  208.     while (CurP<Fp)
  209.       {
  210.         if (Read3DSChunk( f, &Chunk )==FAILURE)
  211.           return FAILURE;
  212.  
  213.         switch (Chunk.ID)
  214.           {
  215.             case CHUNK_VERTICES :
  216.               if ( Read3DSTriVertices ( f, Object, CurP+Chunk.NextOffset )==FAILURE)
  217.                 return FAILURE;
  218.               break;  
  219.             case CHUNK_FACELIST :
  220.               if ( Read3DSTriFaceList ( f, Object, CurP+Chunk.NextOffset )==FAILURE)
  221.                 return FAILURE;
  222.               break;  
  223.             case CHUNK_MAPLIST :
  224.               if ( Read3DSTriMapList ( f, Object, CurP+Chunk.NextOffset )==FAILURE)
  225.                 return FAILURE;
  226.               break;  
  227.             case CHUNK_FACE_MAT :
  228.               SkipToNextChunk ( f, &Chunk );
  229.               break;  
  230.             case CHUNK_SMOOLIST :
  231.               SkipToNextChunk ( f, &Chunk );
  232.               break;
  233.             case CHUNK_TRMATRIX :
  234.               SkipToNextChunk ( f, &Chunk );
  235.               break;
  236.             default :
  237.               SkipToNextChunk ( f, &Chunk );
  238.               break;  
  239.           } // End switch
  240.         CurP = File.GetPos ( f );
  241.       } // End if
  242.  
  243.     GEOMETRYDATA *GeometryData;
  244.     GeometryData = Object->GetGeometryData ();
  245.  
  246.     LONG i; 
  247.     if ((u_list!=NULL)&&(v_list!=NULL))
  248.       {
  249.         for (i=0;i<GeometryData->NumPolys;i++)
  250.           {
  251.             LONG List0,List1,List2;
  252.             List0 = GeometryData->Polys[i].Points[0];  
  253.             List1 = GeometryData->Polys[i].Points[1];  
  254.             List2 = GeometryData->Polys[i].Points[2];  
  255.             GeometryData->Polys[i].TexCoords[0].x = u_list[List0];
  256.             GeometryData->Polys[i].TexCoords[0].y = v_list[List0];
  257.             GeometryData->Polys[i].TexCoords[1].x = u_list[List1];
  258.             GeometryData->Polys[i].TexCoords[1].y = v_list[List1];
  259.             GeometryData->Polys[i].TexCoords[2].x = u_list[List2];
  260.             GeometryData->Polys[i].TexCoords[2].y = v_list[List2];
  261.           } // End for
  262.       } // End if
  263.     else
  264.       {
  265.         for (i=0;i<GeometryData->NumPolys;i++)
  266.           {
  267.             GeometryData->Polys[i].TexCoords[0].x = (float)0;
  268.             GeometryData->Polys[i].TexCoords[0].y = (float)0;
  269.             GeometryData->Polys[i].TexCoords[1].x = (float)0;
  270.             GeometryData->Polys[i].TexCoords[1].y = (float)0;
  271.             GeometryData->Polys[i].TexCoords[2].x = (float)0;
  272.             GeometryData->Polys[i].TexCoords[2].y = (float)0;
  273.           } // End for
  274.       } // End else  
  275.           
  276.     if (u_list!=NULL)
  277.       delete u_list;
  278.     u_list = NULL;
  279.     if (v_list!=NULL)
  280.       delete v_list;
  281.     v_list = NULL;
  282.       
  283.     return SUCCESS;  
  284.   } // End of Read3DSTriObjectChunks for G3D3DSTOOL
  285.                                          
  286. BOOLEAN G3D3DSTOOL::Read3DSObjectChunks ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  287.                                        LONG Fp )
  288.   {
  289.     CHUNK3DS Chunk;
  290.     LONG CurP;
  291.  
  292.     CHAR Name[128];
  293.     INT i;
  294.  
  295.     i = 0;
  296.     
  297.     Name[i] = (CHAR)File.GetCh ( f );
  298.     while (Name[i++]!=NULL)
  299.       {
  300.         Name[i] = (CHAR)File.GetCh ( f );
  301.       } // End while
  302.     
  303.     CurP = File.GetPos ( f );
  304.  
  305.     while (CurP<Fp)
  306.       {
  307.         if (Read3DSChunk( f, &Chunk )==FAILURE)
  308.           return FAILURE;
  309.  
  310.         switch (Chunk.ID)
  311.           {
  312.             case CHUNK_TRIANGLE :
  313.               G3DPOLYHEDRON *PolyObject;
  314.               PolyObject = new G3DPOLYHEDRON ();
  315.               PolyObject->SetName ( Name );
  316.               PolyObject->ClockWised = Clockwise;
  317.               if ( Read3DSTriObjectChunks ( f, PolyObject, CurP+Chunk.NextOffset )==FAILURE)
  318.                 return FAILURE;
  319.               ObjectList->AddObject( PolyObject );  
  320.               break;  
  321.             case CHUNK_LIGHT :
  322.               SkipToNextChunk ( f, &Chunk );
  323.               break;  
  324.             case CHUNK_CAMERA :
  325.               SkipToNextChunk ( f, &Chunk );
  326.               break;  
  327.           } // End switch
  328.         CurP = File.GetPos ( f );
  329.       } // End if    
  330.     return SUCCESS;  
  331.   } // End of Read3DSObjectChunks for G3D3DSTOOL
  332.                                          
  333. BOOLEAN G3D3DSTOOL::Read3DSMeshChunks ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  334.                                         LONG Fp )
  335.   {
  336.     CHUNK3DS Chunk;
  337.     LONG CurP;
  338.  
  339.     CurP = File.GetPos ( f );
  340.  
  341.     while (CurP<Fp)
  342.       {
  343.         if (Read3DSChunk( f, &Chunk )==FAILURE)
  344.           return FAILURE;
  345.  
  346.         switch (Chunk.ID)
  347.           {
  348.             case CHUNK_BGCOLOR :
  349.               SkipToNextChunk ( f, &Chunk );
  350.               break;  
  351.             case CHUNK_AMBIENTCOLOR :
  352.               SkipToNextChunk ( f, &Chunk );
  353.               break;  
  354.             case CHUNK_OBJECTBLOCK :
  355.               if ( Read3DSObjectChunks ( f, ObjectList, CurP+Chunk.NextOffset )==FAILURE)
  356.                 return FAILURE;
  357.               break;
  358.             default :  
  359.               SkipToNextChunk ( f, &Chunk );
  360.               break;
  361.           } // End switch
  362.         if (ObjectList)
  363.           {}
  364.         CurP = File.GetPos ( f );
  365.       } // End if    
  366.     return SUCCESS;  
  367.   } // End of Read3DSMeshChunks for G3D3DSTOOL
  368.                                      
  369. BOOLEAN G3D3DSTOOL::Read3DSMainChunks ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  370.                                      LONG Fp )
  371.   {
  372.     CHUNK3DS Chunk;
  373.     LONG CurP;
  374.  
  375.     CurP = File.GetPos ( f );
  376.  
  377.     while (CurP<Fp)
  378.       {
  379.         if (Read3DSChunk( f, &Chunk )==FAILURE)
  380.           return FAILURE;
  381.  
  382.         switch (Chunk.ID)
  383.           {
  384.             case CHUNK_OBJECT_MESH : 
  385.               if ( Read3DSMeshChunks ( f, ObjectList, CurP+Chunk.NextOffset )==FAILURE)
  386.                 return FAILURE;
  387.               break;
  388.             case CHUNK_KEYFRAMER :
  389.               SkipToNextChunk ( f, &Chunk );
  390.               break;
  391.             default :
  392.               SkipToNextChunk ( f, &Chunk );
  393.               break;  
  394.           } // End switch
  395.           
  396.         CurP = File.GetPos ( f );
  397.       } // End switch
  398.     return SUCCESS;    
  399.   } // End of Read3DSMainChunks for G3D3DSTOOL
  400.                                      
  401. BOOLEAN G3D3DSTOOL::Load ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  402.                            BOOLEAN ClockWise, double Scale )
  403.   {
  404.     CHUNK3DS Chunk;
  405.  
  406.     Clockwise = ClockWise;
  407.     AdjustScale = Scale;
  408.  
  409.     if (Read3DSChunk(f,&Chunk)==FAILURE)
  410.       {
  411.         return FAILURE;  
  412.       } // End if
  413.  
  414.     if (Chunk.ID!=CHUNK_PRIMARY)
  415.       {
  416.         return FAILURE;  
  417.       } // End if
  418.  
  419.     LONG Size;
  420.  
  421.     Size = File.GetSize ( f );
  422.     if (Read3DSMainChunks(f,ObjectList,Size)==FAILURE)
  423.       {
  424.         return FAILURE;  
  425.       } // End if
  426.       
  427.     return SUCCESS;  
  428.   } // End of Load for G3D3DSTOOL                                
  429.  
  430. BOOLEAN G3D3DSTOOL::Save ( FILEHANDLE f, LINKEDLIST<G3DOBJECT*> *ObjectList,
  431.                            BOOLEAN ClockWise, double Scale )
  432.   {
  433.     if (f)
  434.       {}
  435.     if (ObjectList)
  436.       {}
  437.     if (ClockWise)
  438.       {}
  439.     if (Scale)
  440.       {}
  441.     return FAILURE;          
  442.   } // End of Save for G3D3DSTOOL                           
  443.  
  444.  
  445.