home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / graphics / 3d2_pov / source / cyb_pov.c next >
C/C++ Source or Header  |  1994-09-30  |  9KB  |  250 lines

  1. /*
  2.         Konvertiert Cybersculpt 3D2-Files in das POV-Sourceformat.
  3.  
  4.         (c) Juni 1994 Jochen Knaus
  5.                                     Nickeleshalde 19
  6.                                     88400 Biberach
  7.                                     07351 / 24483
  8.  
  9.         Datum:                27.7.1994
  10.         Update:                30.9.1994
  11.         Version:            1.20
  12.  
  13.         Dieses Konvertierprogramm ist Freeware, im Geiste des POV.
  14.         Irgendwann demnächst wird's auf "smooth triangles" erweitert.
  15.  
  16.         Gegenüber Versionen <=1.01 wurde das Kommandozeilenformat geändert.
  17.         Die Files vertragen sich jetzt auch mit POV 2.x (über Option "-v2").
  18.         
  19.         Es kann nun auch eine "bounded_by" Optimierung erzeugt werden.
  20.         Ab Version 1.2: Schneller und kleiner...
  21.  
  22.         Aufruf:    CYB_POV -s<source> -d<destin> -n<objektnamen> -v<povversion>
  23.                                         -b<mode>
  24. */
  25.  
  26. #include<tos.h>
  27. #include<stdio.h>
  28. #include<string.h>
  29. #include<portab.h>
  30. #include<stdlib.h>
  31. #include<limits.h>
  32.  
  33. #define VERSION_A    1
  34. #define VERSION_B 2
  35. #define    PATHLEN    256+1
  36.  
  37. int    abbruch( void );
  38.  
  39. /* Filehandles global... */
  40. int source, destin;
  41.  
  42. int    main( int argc, char *argv[] )
  43. {
  44.     WORD                    header[128], anz_obj, anz_punkte, anz_facetten,
  45.                                 *punkte, *facetten;
  46.     char                    obj_name[10], buffer[2560], buffer2[256],
  47.                                 buffer3[4] = { '}', 13, 10, 0 },
  48.                                 def_file[PATHLEN] = "STD.POV", def_name[64] = "DEFOBJ",
  49.                                 source_file[PATHLEN], minus[2] = { '-', 0 }, nullos[2] = { 0 },
  50.                                 *vorzeichen[6];
  51.     register int    i, j, m;
  52.     int                        pov_mode = 1, bounds = 0;                    /* POV-Version. */
  53.     int                        wandel[6], minmax[6];
  54.  
  55.     puts( "" );
  56.     printf( "3D2->POV Converter vers. %d.%d, (c) 1994 by Jochen Knaus (AURA), Freeware.\n",
  57.                     VERSION_A, VERSION_B );
  58.     puts( "" );
  59.  
  60.     if( argc <= 1 ) return( -1 );                                    /* Keine Parameter ? */
  61.  
  62.     for( i=1, source_file[0] = '\0' ; i < argc ; i++ )
  63.     {
  64.         if( (argv[i])[0] == '-' )                                        /* Parameter ? */
  65.         {
  66.             switch( (argv[i])[1] )
  67.             {
  68.                 /* Zielfile ? */
  69.                 case    'd':    strncpy( def_file, argv[i]+2, 127 ); break;
  70.                 /* Objektnamen ? */
  71.                 case    'n':    strncpy( def_name, argv[i]+2, 63 ); break;
  72.                 /* Sourcefile ? */
  73.                 case    's':    strncpy( source_file, argv[i]+2, 127 ); break;
  74.                 /* POV-Version ? */
  75.                 case    'v':    pov_mode = (int) ((argv[i])[2] - '0'); break;
  76.                 /* Grenzbox berechnen. */
  77.                 case    'b':    bounds = (int) ((argv[i])[2] - '0') ; break;
  78.             }
  79.         }
  80.     }
  81.  
  82.     if( strlen( source_file ) == 0 )                            /* Kein 3D2-File angegeben ? */
  83.     { puts( "No source (3D2) file." );
  84.         return( -1 ); }
  85.  
  86.     /* Quelldatei öffnen. */
  87.     if( ( source = Fopen( source_file, FO_READ ) ) < 0 )
  88.     {    puts( "Cannot open sourcefile. ");
  89.         return( source ); }
  90.  
  91.     /* Zieldatei erzeugen. */
  92.     if( ( destin = Fcreate( def_file, (int) 0 ) ) < 0 ) 
  93.     {    puts( "Cannot create destinationfile." );
  94.         return( destin ); }
  95.  
  96.     /* Header lesen. */
  97.     if( Fread( source, (long) 256, header ) < 0 ) return( abbruch() );
  98.  
  99.     if( header[0] != 15618 )                                             /* 3D2-File ? */
  100.     {    puts( "Kein 3D2 File..." );
  101.         return( abbruch() ); }
  102.  
  103.     anz_obj = header[1];
  104.     printf( "%s: convert %d object(s).\n\n", source_file, anz_obj );
  105.  
  106.     sprintf( buffer, "#declare %s = union {%s", def_name, &buffer3[1] );
  107.     Fwrite( destin, strlen(buffer), buffer );
  108.  
  109.     if( bounds != 0 )                                                            /* Grenzwerte initialisieren. */
  110.     {
  111.         minmax[0] = INT_MAX; minmax[1] = INT_MIN;
  112.         minmax[2] = INT_MAX; minmax[3] = INT_MIN;
  113.         minmax[4] = INT_MAX; minmax[5] = INT_MIN;
  114.     }
  115.  
  116.     for( i=0 ; i<anz_obj ; i++ )                                    /* Alle Objekte ! */
  117.     {
  118.         Fread( source, (long) 9, obj_name );                /* Objektnamen */
  119.         Fread( source, (long) 2, &anz_punkte );
  120.  
  121.         if( anz_punkte > 0 )
  122.         {
  123.             /* Speicher für Punkte reservieren. */
  124.             if( ( punkte = malloc( (long) (anz_punkte * 6) ) ) == NULL )
  125.                 return( abbruch() );
  126.             else
  127.                 Fread( source, (long) anz_punkte*3*2, punkte ); /* Punkte einlesen. */
  128.  
  129.             if( bounds != 0 )                                        /* Objektgrenzen feststellen ? */
  130.             {
  131.                 for( j = 0 ; j < anz_punkte ; j++ )        /* Objektextremas festellen. */
  132.                 {
  133.                     if( punkte[j*3+0] < minmax[0] ) minmax[0] = punkte[j*3+0];
  134.                     if( punkte[j*3+0] > minmax[1] ) minmax[1] = punkte[j*3+0];
  135.                     if( punkte[j*3+1] < minmax[2] ) minmax[2] = punkte[j*3+1];
  136.                     if( punkte[j*3+1] > minmax[3] ) minmax[3] = punkte[j*3+1];
  137.                     if( punkte[j*3+2] < minmax[4] ) minmax[4] = punkte[j*3+2];
  138.                     if( punkte[j*3+2] > minmax[5] ) minmax[5] = punkte[j*3+2];
  139.                 }
  140.             }
  141.  
  142.             /* Anzahl Facetten. */
  143.             Fread( source, (long) 2, &anz_facetten );
  144.  
  145.             printf( "'%s' %d facettes: ", obj_name, anz_facetten );
  146.  
  147.             /* Speicher für Dreiecke. */
  148.             if( ( facetten = malloc( (long) (anz_facetten * 8) ) ) == NULL )
  149.             {    free( punkte ); return( abbruch() ); }
  150.             else
  151.                 /* Facetten einlesen. */
  152.                 Fread( source, (long) anz_facetten*4*2, facetten );
  153.  
  154.             /* Facetten konvertieren. */
  155.             for( j = 0, buffer[0] = '\0' ; j<anz_facetten ; j++ )
  156.             {
  157.                 strcat( buffer, " triangle{" );
  158.  
  159.                 /* Punkte wandeln... 2 Stellen Nachkomma reichen (/100), weitere
  160.                      Verkleinerung muß POV übernehmen... */
  161.                 for( m=0 ; m<3 ; m++ )
  162.                 {
  163.                     wandel[0] = (punkte[facetten[j*4+m]*3+0]);            /* x */
  164.                     wandel[1] = (punkte[facetten[j*4+m]*3+1]);            /* y */
  165.                     wandel[2] = (punkte[facetten[j*4+m]*3+2]);            /* z */
  166.                     wandel[3] = abs( wandel[0] );                                        /* Für Nachkomma... */
  167.                     wandel[4] = abs( wandel[1] );
  168.                     wandel[5] = abs( wandel[2] );
  169.                     if( wandel[0] < 0 ) vorzeichen[0] = minus; else vorzeichen[0] = nullos;
  170.                     if( wandel[1] < 0 ) vorzeichen[1] = minus; else vorzeichen[1] = nullos;
  171.                     if( wandel[2] < 0 ) vorzeichen[2] = minus; else vorzeichen[2] = nullos;
  172.  
  173.                     if( pov_mode == 1 )                                        /* POV vers.1 : Keine Kommas */
  174.                         sprintf( buffer2, "<%s%d.%d %s%d.%d %s%d.%d>",
  175.                                             vorzeichen[0], wandel[3] / 100, wandel[3] % 100,
  176.                                             vorzeichen[1], wandel[4] / 100, wandel[4] % 100,
  177.                                             vorzeichen[2], wandel[5] / 100, wandel[5] % 100 );
  178.                     else
  179.                         sprintf( buffer2, "<%s%d.%d,%s%d.%d,%s%d.%d>",
  180.                                             vorzeichen[0], wandel[3] / 100, wandel[3] % 100,
  181.                                             vorzeichen[1], wandel[4] / 100, wandel[4] % 100,
  182.                                             vorzeichen[2], wandel[5] / 100, wandel[5] % 100 );
  183.  
  184.                     strcat( buffer, buffer2 );
  185.                 }
  186.  
  187.                 strcat( buffer, buffer3 );
  188.  
  189.                 if( j%10 == 0 )                                                            /* Alle 10 Dreiecke schreiben. */
  190.                 {
  191.                     printf( "." );
  192.                     Fwrite( destin, strlen(buffer), buffer );
  193.                     buffer[0] = '\0';
  194.                 }
  195.             }
  196.  
  197.             if( strlen( buffer ) > 0 )                                        /* Restlichen Punkte schreiben. */
  198.                 Fwrite( destin, strlen(buffer), buffer );
  199.  
  200.             free(punkte); free(facetten);
  201.         }
  202.  
  203.         puts( " done." );
  204.     }
  205.  
  206.     if( bounds != 0 )                                                                    /* <bounded_by> schreiben. */
  207.     {
  208.         wandel[0] = abs( minmax[0] ); wandel[1] = abs( minmax[1] );
  209.         wandel[2] = abs( minmax[2] ); wandel[3] = abs( minmax[3] );
  210.         wandel[4] = abs( minmax[4] ); wandel[5] = abs( minmax[5] );
  211.         if( minmax[0] < 0 ) vorzeichen[0] = minus; else vorzeichen[0] = nullos;
  212.         if( minmax[1] < 0 ) vorzeichen[1] = minus; else vorzeichen[1] = nullos;
  213.         if( minmax[2] < 0 ) vorzeichen[2] = minus; else vorzeichen[2] = nullos;
  214.         if( minmax[3] < 0 ) vorzeichen[3] = minus; else vorzeichen[3] = nullos;
  215.         if( minmax[4] < 0 ) vorzeichen[4] = minus; else vorzeichen[4] = nullos;
  216.         if( minmax[5] < 0 ) vorzeichen[5] = minus; else vorzeichen[5] = nullos;
  217.  
  218.         if( pov_mode == 1 )
  219.             sprintf( buffer, " bounded_by{box{<%s%d.%d %s%d.%d %s%d.%d><%s%d.%d %s%d.%d %s%d.%d>}}",
  220.                                 vorzeichen[0], wandel[0] / 100, wandel[0] % 100,
  221.                                 vorzeichen[2], wandel[2] / 100, wandel[2] % 100,
  222.                                 vorzeichen[4], wandel[4] / 100, wandel[4] % 100,
  223.                                 vorzeichen[1], wandel[1] / 100, wandel[1] % 100,
  224.                                 vorzeichen[3], wandel[3] / 100, wandel[3] % 100,
  225.                                 vorzeichen[5], wandel[5] / 100, wandel[5] % 100 );
  226.         else
  227.             sprintf( buffer, " bounded_by{box{<%s%d.%d,%s%d.%d,%s%d.%d><%s%d.%d,%s%d.%d,%s%d.%d>}}",
  228.                                 vorzeichen[0], wandel[0] / 100, wandel[0] % 100,
  229.                                 vorzeichen[2], wandel[2] / 100, wandel[2] % 100,
  230.                                 vorzeichen[4], wandel[4] / 100, wandel[4] % 100,
  231.                                 vorzeichen[1], wandel[1] / 100, wandel[1] % 100,
  232.                                 vorzeichen[3], wandel[3] / 100, wandel[3] % 100,
  233.                                 vorzeichen[5], wandel[5] / 100, wandel[5] % 100 );
  234.  
  235.         Fwrite( destin, strlen( buffer ), buffer );
  236.         buffer[0] = 13; buffer[1] = 10; buffer[2] = '\0';
  237.         Fwrite( destin, 2, buffer );
  238.     }
  239.  
  240.     Fwrite( destin, strlen(buffer3), buffer3 );
  241.     Fclose( source ); Fclose( destin );
  242.     return( 0 );
  243. }
  244.  
  245. int abbruch()
  246. {
  247.     Fclose( source );
  248.     Fclose( destin );
  249.     return( -1 );                                /* Gemdosfehler: <0 */
  250. }