home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / READER / OBJREAD.C < prev    next >
C/C++ Source or Header  |  1996-03-12  |  7KB  |  344 lines

  1. /*
  2.  *        形状ファイル入力関数
  3.  *
  4.  *        Copyright T.Kobayashi    1993.1.17
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <math.h>
  9. #include <string.h>
  10. #include <assert.h>
  11.  
  12. #include "_reader.h"
  13. #include "word.h"
  14. #include "matrix.h"
  15.  
  16. #define PRIVATE_OP            1
  17.  
  18. #define NOT_FOUND            11
  19. #define BAD_EXIST            12
  20. #define NOT_SUF_MODEL        13
  21. #define NOT_IMPLIMENTED     14
  22. #define LESS_POINT            15
  23. #define ATR_NO_EXIST        16
  24. #define MAT_STACK_OVERFLOW    17
  25.  
  26. #define UNEXPECTED_EOF        21
  27. #define NOT_OBJ_FILE        22
  28.  
  29. #define    MAT_STACK_MAX        10
  30.  
  31. static    Matrix    MatStack[MAT_STACK_MAX+1] ;
  32. static    int        MatSP ;
  33. static    Matrix    CurMat ;
  34. static    int        UnitFlag;
  35.  
  36. static    char    AtrName[F_NAME_LEN];
  37. static    int        CurPolyType ;
  38.  
  39. static    void    objerror( int, char* );
  40. extern    int        lasterror;
  41.  
  42. int        ObjReadOpen( filename )
  43. const    char    *filename ;
  44. {
  45.     lasterror = 0;
  46.     /*    ファイルのオープン    */
  47.     if ( fileopen( filename ) == 0 )
  48.         return FALSE ;
  49.  
  50.     if ( wordid != WORD_OBJ )
  51.     {
  52.         objerror( NOT_OBJ_FILE, "" );
  53.         return FALSE ;
  54.     }
  55.     return TRUE ;
  56. }
  57.  
  58. int        ObjReadName( name )
  59. char    *name ;
  60. {
  61.     if ( end_of_file )
  62.         return FALSE ;
  63.  
  64.     /*    obj の検出    */
  65.     if ( wordid != WORD_OBJ )
  66.     {
  67.         objerror( NOT_FOUND, "obj" ) ;
  68.         skip( "obj" );
  69.         return FALSE;
  70.     }
  71.     get() ;
  72.  
  73.     /*    private の検出(警告)    */
  74.     if ( wordid == WORD_PRIVATE )
  75.     {
  76.         objerror( PRIVATE_OP, "" );
  77.         get() ;
  78.     }
  79.  
  80.     /*    suf の検出    */
  81.     if ( wordid != WORD_SUF ) {
  82.         objerror( NOT_SUF_MODEL, "" ) ;
  83.         return FALSE;
  84.     } else
  85.         get() ;
  86.  
  87.     /*    オブジェクト名のリード    */
  88.     getname( name );
  89.     if ( wordid != WORD_OPEN2 ) {
  90.         objerror( NOT_FOUND, "{" );
  91.         return FALSE;
  92.     } else
  93.         get() ;
  94.                        
  95.     MatSP = 0 ;
  96.     MatUnit( MatStack[MatSP] );
  97.     MatCopy( CurMat, MatStack[MatSP] );
  98.     UnitFlag = TRUE;
  99.  
  100.     strcpy( AtrName, "no" );
  101.     return TRUE ;
  102. }
  103.  
  104. int        ObjReadClose()
  105. {
  106.     fileclose() ;
  107.     return TRUE ;
  108. }
  109.  
  110. int        ObjReadPoly( atrname, typep )
  111. char    *atrname ;
  112. int        *typep ;
  113. {
  114.     char    name[F_NAME_LEN];
  115.  
  116.     while( wordid != WORD_PRIM && MatSP > -1 )
  117.     {
  118.         switch( wordid )
  119.         {
  120.             case WORD_ATR :
  121.                 get() ;
  122.                 getname( name );
  123. #if 0
  124.                 if ( strcmp( name, "no" ) == 0 )
  125.                     objerror( ATR_NO_EXIST, "" );
  126. #endif
  127.                 strcpy( AtrName, name );
  128.                 break ;
  129.             case WORD_OPEN2 :
  130.                 get() ;
  131.                 MatCopy( MatStack[MatSP+1], MatStack[MatSP] );
  132.                 if ( MatSP >= MAT_STACK_MAX )
  133.                     objerror( MAT_STACK_OVERFLOW, "" );
  134.                 else
  135.                 {
  136.                     MatSP ++ ;
  137.                     MatCopy( CurMat, MatStack[MatSP] );
  138.                 }
  139.                 break ;
  140.             case WORD_CLOSE2 :
  141.                 get() ;
  142.                 MatSP -- ;
  143.                 if ( MatSP > 0 )
  144.                     MatCopy( CurMat, MatStack[MatSP] );
  145.                 break ;
  146.             case WORD_PARTS :
  147.                 get() ;
  148.                 objerror( NOT_IMPLIMENTED, "形状参照指定" );
  149.                 skip( ")" );
  150.                 break ;
  151.             default :
  152.                 getmat( MatStack[MatSP] );
  153.                 MatCopy( CurMat, MatStack[MatSP] );
  154.                 UnitFlag = FALSE;
  155.                 break ;
  156.         }
  157.         if (lasterror) return FALSE;
  158.     }
  159.     if ( MatSP == -1 )
  160.         return FALSE ;
  161.  
  162.     get() ;
  163.     switch( wordid )
  164.     {
  165.         case WORD_POLY :
  166.             CurPolyType = TYPE_POLY ;
  167.             break ;
  168.         case WORD_SHADE :
  169.             CurPolyType = TYPE_SHADE ;
  170.             break ;
  171.         case WORD_UVPOLY :
  172.             CurPolyType = TYPE_UVPOLY ;
  173.             break ;
  174.         case WORD_UVSHADE :
  175.             CurPolyType = TYPE_UVSHADE ;
  176.             break ;
  177.         default :
  178.             objerror( BAD_EXIST, nextword ) ;
  179.     }
  180.     get() ;
  181.  
  182.     if ( wordid != WORD_OPEN1 )
  183.         objerror( NOT_FOUND, "(" ) ;
  184.     get() ;
  185.  
  186.     strcpy( atrname, AtrName );
  187.     *typep = CurPolyType ;
  188.  
  189.     return TRUE ;
  190. }
  191.  
  192. int        ObjReadVertex( xp, yp, zp, xvp, yvp, zvp, up, vp )
  193. float    *xp, *yp, *zp ;
  194. float    *xvp, *yvp, *zvp ;
  195. float    *up, *vp ;
  196. {
  197.     float    x, y, z, u, v ;
  198.  
  199.     if ( wordid == WORD_CLOSE1 )
  200.     {
  201.         get();
  202.         return FALSE ;
  203.     }
  204.  
  205.     x = getfloat();
  206.     y = getfloat();
  207.     z = getfloat();
  208.  
  209.     *xp = ( x * CurMat[0][0] + y * CurMat[1][0] + z * CurMat[2][0] ) + CurMat[3][0] ;
  210.     *yp = ( x * CurMat[0][1] + y * CurMat[1][1] + z * CurMat[2][1] ) + CurMat[3][1] ;
  211.     *zp = ( x * CurMat[0][2] + y * CurMat[1][2] + z * CurMat[2][2] ) + CurMat[3][2] ;
  212.  
  213.     if ( CurPolyType & 1 )
  214.     {
  215.         x = getfloat();
  216.         y = getfloat();
  217.         z = getfloat();
  218.         if ( xvp != NULL )
  219.         {
  220.             *xvp = x * CurMat[0][0] + y * CurMat[1][0] + z * CurMat[2][0] ;
  221.             *yvp = x * CurMat[0][1] + y * CurMat[1][1] + z * CurMat[2][1] ;
  222.             *zvp = x * CurMat[0][2] + y * CurMat[1][2] + z * CurMat[2][2] ;
  223.         }
  224.     }
  225.     if ( CurPolyType & 2 )
  226.     {
  227.         u = getfloat();
  228.         v = getfloat();
  229.         if ( up != NULL )
  230.         {
  231.             *up = u ;
  232.             *vp = v ;
  233.         }
  234.     }
  235.  
  236.     return TRUE ;
  237. }
  238.  
  239. int        ObjReadVertexInt( int data[8] )
  240. {
  241.     int    x, y, z, u, v ;
  242.  
  243.     if ( wordid == WORD_CLOSE1 )
  244.     {
  245.         get();
  246.         return FALSE ;
  247.     }
  248.  
  249.     x = getint();
  250.     y = getint();
  251.     z = getint();
  252.  
  253.     if (UnitFlag) {
  254.         data[0] = x;
  255.         data[1] = y;
  256.         data[2] = z;
  257.     } else {
  258.         data[0] = (int)( (float)x * CurMat[0][0] + (float)y * CurMat[1][0] + (float)z * CurMat[2][0] ) + CurMat[3][0] ;
  259.         data[1] = (int)( (float)x * CurMat[0][1] + (float)y * CurMat[1][1] + (float)z * CurMat[2][1] ) + CurMat[3][1] ;
  260.         data[2] = (int)( (float)x * CurMat[0][2] + (float)y * CurMat[1][2] + (float)z * CurMat[2][2] ) + CurMat[3][2] ;
  261.     }
  262.  
  263.     if ( CurPolyType & 1 )
  264.     {
  265.         x = getint();
  266.         y = getint();
  267.         z = getint();
  268.  
  269.         if (UnitFlag) {
  270.             data[3] = x;
  271.             data[4] = y;
  272.             data[5] = z;
  273.         } else {
  274.             data[3] = (int)( (float)x * CurMat[0][0] + (float)y * CurMat[1][0] + (float)z * CurMat[2][0] );
  275.             data[4] = (int)( (float)x * CurMat[0][1] + (float)y * CurMat[1][1] + (float)z * CurMat[2][1] );
  276.             data[5] = (int)( (float)x * CurMat[0][2] + (float)y * CurMat[1][2] + (float)z * CurMat[2][2] );
  277.         }
  278.     }
  279.     if ( CurPolyType & 2 )
  280.     {
  281.         data[6] = getint();
  282.         data[7] = getint();
  283.     }
  284.  
  285.     return TRUE ;
  286. }
  287.  
  288. static    void    objerror( n, arg )
  289. int        n ;
  290. char    *arg ;
  291. {
  292.     char    *msg ;
  293.     int        level ;
  294.  
  295.     switch( n )
  296.     {
  297.         case PRIVATE_OP :
  298.             msg = "警告:private 処理はサポートしていません。" ;
  299.             level = 1 ;
  300.             break ;
  301.         case ATR_NO_EXIST :
  302.             msg = "atr no があります。" ;
  303.             level = 1 ;
  304.             break ;
  305.         case NOT_FOUND :
  306.             msg = " %s がありません。" ;
  307.             level = 10 ;
  308.             break ;
  309.         case BAD_EXIST :
  310.             msg = " %s が存在します。" ;
  311.             level = 10 ;
  312.             break ;
  313.         case NOT_SUF_MODEL :
  314.             msg = "サーフィスモデルではありません。" ;
  315.             level = 10 ;
  316.             break ;
  317.         case NOT_IMPLIMENTED :
  318.             msg = " %s はサポートしていません。" ;
  319.             level = 10 ;
  320.             break ;
  321.         case LESS_POINT :
  322.             msg = "多角形の頂点が2つ以下しかありません。" ;
  323.             level = 10 ;
  324.             break ;
  325.         case MAT_STACK_OVERFLOW :
  326.             msg = "構\造定義が複雑すぎます。" ;
  327.             level = 10 ;
  328.             break ;
  329.         case UNEXPECTED_EOF :
  330.             msg = "エンドオブファイルになりました" ;
  331.             level = 20 ;
  332.             break ;
  333.         case NOT_OBJ_FILE :
  334.             msg = "形状ファイルではありません。" ;
  335.             level = 20 ;
  336.             break ;
  337.         default :
  338.             msg = "エラーコードの誤り。( objread.c )" ;
  339.             level = 20 ;
  340.             break ;
  341.     }
  342.     errormessage( level, msg, arg );
  343. }
  344.