home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / VPR_DATA / DOGA / SOURCES / POLYEDIT.LZH / MODEL / FILE.C < prev    next >
C/C++ Source or Header  |  1996-07-31  |  6KB  |  263 lines

  1. /*
  2.  *        ファイル入出力
  3.  *
  4.  *        Copyright    T.Kobayashi        1994.7.17
  5.  */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <math.h>
  10. #include <io.h>
  11. #include <assert.h>
  12.  
  13. #include "lib.h"
  14. #include "reader.h"
  15. #include "poly.h"
  16. #include "view.h"
  17. #include "vector.h"
  18.  
  19. #if    0
  20. static    void    ObjectName( name, file )
  21. char    *name ;
  22. const char    *file ;
  23. {
  24.     char    *p ;
  25.  
  26.     p = strrchr( file, '\\' );
  27.     if ( p == NULL )
  28.         p = strrchr( file, '/' );
  29.     if ( p == NULL )
  30.         p = strrchr( file, ':' );
  31.     if ( p != NULL )
  32.         file = p + 1 ;
  33.     strcpy( name, file );
  34.     p = strchr( name, '.' );
  35.     assert( p != NULL );
  36.     *p = '\0' ;
  37. }
  38. #endif
  39.  
  40.  
  41. int        PolyReadFile(char *file, int mode)
  42. {
  43.     int        i, type, atrno, objno ;
  44.     int rdata[8];
  45. #if 0
  46.     int pvx, pvy, pvz;
  47. #else
  48.     int coe[3];
  49. #endif
  50.     float r;
  51.  
  52.     char    atrname[64] ;
  53.     char    objname[64] ;
  54.  
  55.     ObjReadOpen( file );
  56.  
  57.     objno = -1 ;
  58.     while( ObjReadName( objname ) && !ReaderError())
  59.     {
  60.         if (mode != FILE_APPEND) {
  61.             objno = ObjAppend( objname );
  62.         } else {
  63.             objno = ObjSearchOrAppend( objname );
  64.         }
  65.         strcpy( ObjData[objno].fname, file );
  66.         CurrentPoly->obj = objno ;
  67.  
  68.         while( ObjReadPoly( atrname, &type ) && !ReaderError())
  69.         {
  70.             atrno = AttrSearchOrAppend( atrname );
  71. /*            assert( atrno >= 0 );*/
  72.             if (atrno < 0) return -1;
  73.  
  74.             CurrentPoly->type = type ;
  75.             CurrentPoly->atr = atrno ;
  76.             for( i = 0 ; ObjReadVertexInt( rdata ) && !ReaderError(); i++ )
  77.             {
  78.                 CurrentPoly->ver[i].x = (int)rdata[0] ;
  79.                 CurrentPoly->ver[i].y = (int)rdata[1] ;
  80.                 CurrentPoly->ver[i].z = (int)rdata[2] ;
  81.  
  82.                 if ( type & POLY_SHADE )
  83.                 {
  84. #if 0
  85.                     if ( i > 0 )
  86.                     {
  87.                         if ( pvx * rdata[3] + pvy * rdata[4] + pvz * rdata[5] < 0 )
  88.                         {
  89.                             rdata[3] = -rdata[3];
  90.                             rdata[4] = -rdata[4];
  91.                             rdata[5] = -rdata[5];
  92.                         }
  93.                     }
  94. #endif
  95. /*                    r = 256.0 / sqrt( vx * vx + vy * vy + vz * vz );
  96.                     r = 256.0 / sqrt( vx * vx + vy * vy + vz * vz );
  97.                     CurrentPoly->ver[i].vx = (int)( vx * r );
  98.                     CurrentPoly->ver[i].vy = (int)( vy * r );
  99.                     CurrentPoly->ver[i].vz = (int)( vz * r );
  100. */
  101. /*
  102.                     r = 256.0 / sqrt(rdata[3] * rdata[3] + rdata[4] * rdata[4] + rdata[5] * rdata[5]);
  103. */
  104.                     r = sqrt((float)rdata[3] * (float)rdata[3]
  105.                             +(float)rdata[4] * (float)rdata[4]
  106.                             +(float)rdata[5] * (float)rdata[5]);
  107.                     if (r > 0.0) r = 256.0 / r;
  108.                     CurrentPoly->ver[i].vx = (int)(r * (float)rdata[3]);
  109.                     CurrentPoly->ver[i].vy = (int)(r * (float)rdata[4]);
  110.                     CurrentPoly->ver[i].vz = (int)(r * (float)rdata[5]);
  111. #if 0
  112.                     pvx = CurrentPoly->ver[i].vx;
  113.                     pvx = CurrentPoly->ver[i].vy;
  114.                     pvx = CurrentPoly->ver[i].vz;
  115. #endif
  116.                 } else {
  117.                     CurrentPoly->ver[i].vx = CurrentPoly->ver[i].vy = CurrentPoly->ver[i].vz = 0;
  118.                 }
  119.  
  120.                 if ( type & POLY_UV) {
  121.                     CurrentPoly->ver[i].u = rdata[6] ;
  122.                     CurrentPoly->ver[i].v = rdata[7] ;
  123.                 } else {
  124.                     CurrentPoly->ver[i].u = CurrentPoly->ver[i].v = 0;
  125.                 }
  126.             }
  127.             CurrentPoly->vers = i ;
  128.             CurrentPoly->select = TRUE ;
  129.             Coefficent(coe, CurrentPoly->ver, CurrentPoly->vers);
  130.             if ( coe[0] * CurrentPoly->ver[0].vx
  131.                + coe[1] * CurrentPoly->ver[0].vy
  132.                + coe[2] * CurrentPoly->ver[0].vz < 0) {
  133.                 for( i = 1 ; i < CurrentPoly->vers; i++) {
  134.                     Vertex *ver;
  135.                     ver = &(CurrentPoly->ver[i]);
  136.                     if ( coe[0] * ver->vx + coe[1] * ver->vy + coe[2] * ver->vz > 0) {
  137.                         ver->vx = -ver->vx;
  138.                         ver->vy = -ver->vy;
  139.                         ver->vz = -ver->vz;
  140.                     }
  141.                 }
  142.             } else {
  143.                 for( i = 1 ; i < CurrentPoly->vers; i++) {
  144.                     Vertex *ver;
  145.                     ver = &(CurrentPoly->ver[i]);
  146.                     if ( coe[0] * ver->vx + coe[1] * ver->vy + coe[2] * ver->vz < 0) {
  147.                         ver->vx = -ver->vx;
  148.                         ver->vy = -ver->vy;
  149.                         ver->vz = -ver->vz;
  150.                     }
  151.                 }
  152.             }
  153.  
  154. /*            Selects ++ ;*/
  155.             PolyAppend();
  156.         }
  157.         ObjData[objno].edit = FALSE ;
  158.     }
  159.     ObjReadClose();
  160.     if (ReaderError()) {
  161.         return -1;
  162.     }
  163.     return objno ;
  164. }
  165.  
  166. /*    ファイルに書き込む    */
  167. int        PolyWriteFile( objno, mode )
  168. int        objno ;
  169. int        mode ;
  170. {
  171.     FILE    *fp ;
  172.     int        i, atrno ;
  173.     Polygon    *poly ;
  174.     Vertex    *ver ;
  175.     static    char    *typename[4] = { "poly", "shade", "uvpoly", "uvshade" };
  176.  
  177.     assert( 0 <= objno && objno <= ObjLast );
  178.  
  179.     if ( ObjData[objno].flag == FALSE )
  180.         return FALSE ;
  181.  
  182.     if ( mode == FILE_APPEND )
  183.         fp = fopen( ObjData[objno].fname, "a" );
  184.     else
  185.         fp = fopen( ObjData[objno].fname, "w" );
  186.     if ( fp == NULL )
  187.     {
  188.         MessageWarning( "ファイルがオープンできません" );
  189.         return FALSE ;
  190.     }
  191.  
  192.     fprintf( fp, "obj suf %s {\n", ObjData[objno].name );
  193.     atrno = -1 ;
  194.     poly = PolyTop();
  195.     while( poly != NULL )
  196.     {
  197.         if ( poly->select == ON )
  198.         {
  199.             if ( poly->atr != atrno )
  200.             {
  201.                 atrno = poly->atr ;
  202.                 fprintf( fp, "atr %s\n", AttrData[atrno].name );
  203.             }
  204.             fprintf( fp, "prim\t%s\t(", typename[poly->type] );
  205.             ver = poly->ver ;
  206.             for( i = 0 ; i < poly->vers ; i++ )
  207.             {
  208.                 fprintf( fp, "\t%d\t%d\t%d", ver->x, ver->y, ver->z );
  209.                 if ( poly->type & POLY_SHADE )
  210.                     fprintf( fp, "\t%d\t%d\t%d", ver->vx, ver->vy, ver->vz );
  211.                 if ( poly->type & POLY_UV )
  212.                     fprintf( fp, "\t%d\t%d", ver->u, ver->v );
  213.                 if ( i < poly->vers - 1 )
  214.                     fprintf( fp, "\n\t\t " );
  215.                 ver++ ;
  216.             }
  217.             fprintf( fp, " )\n\n" );
  218.         }
  219.         poly = PolyNext( poly );
  220.     }
  221.     fprintf( fp, "}\n" );
  222.     if (ferror(fp)) {
  223.         return FALSE;
  224.     }
  225.     fclose( fp );
  226.  
  227.     return TRUE ;
  228. }
  229.  
  230. /*    フレームファイルを出力する    */
  231. void    WriteFrame( mat, filename, objname, back)
  232. Matrix    mat ;
  233. char    *filename ;
  234. char    *objname ;
  235. Vector    *back;
  236. {
  237.     FILE    *fp ;
  238.  
  239.     fp = fopen( filename, "w" );
  240.     if ( fp == NULL )
  241.     {
  242.         InternalError( "フレームファイルが出力できません" );
  243.         return ;
  244.     }
  245.     if (back->x != 0 || back->y != 0 || back->z != 0) {
  246.         fprintf( fp, "env { back ( rgb ( %8f %8f %8f ) ) }",
  247.                 back->x, back->y, back->z);
  248.     }
  249.     fprintf( fp, "fram {\n" );
  250.     fprintf( fp, "\tlight pal ( rgb ( 1 1 1 ) 4 2 -1 )\n" );
  251.     fprintf( fp, "\teye deg ( %d )\n", PersAngle(0) );
  252.     fprintf( fp, "\tmat(\n" );
  253.     fprintf( fp, "\t\t%8f %8f %8f 0.0\n", mat[0][0], mat[0][1], mat[0][2] );
  254.     fprintf( fp, "\t\t%8f %8f %8f 0.0\n", mat[1][0], mat[1][1], mat[1][2] );
  255.     fprintf( fp, "\t\t%8f %8f %8f 0.0\n", mat[2][0], mat[2][1], mat[2][2] );
  256.     fprintf( fp, "\t\t%8f %8f %8f 1.0\n", mat[3][0], mat[3][1], mat[3][2] );
  257.     fprintf( fp, "\t)\n" );
  258.     fprintf( fp, "\tobj %s\n", objname );
  259.     fprintf( fp, "}\n" );
  260.     fclose( fp );
  261. }
  262.  
  263.