ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/mgflib/3ds2mgf.c
(Generate patch)

Comparing ray/src/cv/mgflib/3ds2mgf.c (file contents):
Revision 1.1 by greg, Thu Feb 8 11:08:03 1996 UTC vs.
Revision 1.10 by greg, Mon Nov 10 19:08:18 2008 UTC

# Line 1 | Line 1
1 + #ifndef lint
2 + static const char       RCSid[] = "$Id$";
3 + #endif
4   /*
5 <      3DS2POV.C  Copyright (c) 1996 Steve Anger and Jeff Bowermaster
5 >      3DS2POV.C  by Steve Anger and Jeff Bowermaster
6                          MGF output added by Greg Ward
7  
8        Reads a 3D Studio .3DS file and writes a POV-Ray, Vivid,
# Line 10 | Line 13
13        Compiled with MSDOS GNU C++ 2.4.1 or generic ANSI-C compiler
14   */
15  
13 #ifndef lint
14 static char SCCSid[] = "$SunId$ LBL";
15 #endif
16
16   #include <stdio.h>
17   #include <stdlib.h>
18   #include <math.h>
# Line 47 | Line 46 | extern unsigned _stklen = 16384;
46   #define MGF      4
47   #define RAW      99
48  
49 < #define DEG(x) ((180.0/M_PI)*(x))
50 < #define RAD(x) ((M_PI/180.0)*(x))
49 > #define DEG(x) ((double)(180.0/M_PI)*(x))
50 > #define RAD(x) ((double)(M_PI/180.0)*(x))
51  
52   #ifndef M_PI
53   #define M_PI (3.14159265358979323846)
# Line 270 | Line 269 | int    cameras = 0;
269   int    libs = 0;
270   float  vue_version = 1.0;
271   Matrix *ani_matrix = NULL;
272 + int    no_opt = FALSE;
273 + FILE   *meshf = NULL;
274  
275  
276   void process_args (int argc, char *argv[]);
# Line 349 | Line 350 | char *read_string (void);
350   float findfov (float lens);
351   int read_mgfmatname (char *s, int n, FILE *f);
352  
353 + char *progname;
354  
355 +
356   int main (int argc, char *argv[])
357   {
358 +    char meshfname[128];
359      Material *m;
360      int i;
361  
362      process_args (argc, argv);
363  
364 <    if (format != RAW) {
364 >    if (!no_opt) {
365          opt_set_format (format);
366          opt_set_dec (4);
367          opt_set_bound (bound);
368          opt_set_smooth (smooth);
369          opt_set_quiet (!verbose);
370          opt_set_fname (outname, "");
371 +    } else if (format == MGF) {
372 +        strcpy(meshfname, outname);
373 +        add_ext(meshfname, "inc", 1);
374 +        if (!strcmp(meshfname, outname)) {
375 +            printf ("Output and mesh file names are identical!\n");
376 +            exit (1);
377 +        }
378 +        if ((meshf = fopen (meshfname, "w")) == NULL) {
379 +            printf ("Cannot open mesh output file %s!\n", meshfname);
380 +            exit (1);
381 +        }
382      }
383  
384      if ((in = fopen (inname, "rb")) == NULL) {
# Line 407 | Line 422 | int main (int argc, char *argv[])
422      if (frame >= 0)
423          save_animation();
424  
425 <    if (format != RAW) {
425 >    if (!no_opt) {
426          write_summary (out);
427          fflush (out);
428  
429          opt_finish();
430 +    } else if (meshf != NULL) {
431 +        fclose(meshf);
432 +        fprintf (out, "i %s\n", meshfname);
433      }
434  
435      fclose (out);
# Line 436 | Line 454 | int main (int argc, char *argv[])
454   void process_args (int argc, char *argv[])
455   {
456      int i;
439    char *progname;
457      char *env_opt, *option;
458  
459      printf("\n\nAutodesk 3D Studio to Raytracer file Translator. Feb/96\n");
460 <    printf("Version 2.0 Copyright (c) 1996 Steve Anger and Jeff Bowermaster\n");
444 < #ifdef __GNUC__
445 <    printf ("32 bit version. DOS extender Copyright (c) 1991 DJ Delorie\n");
446 < #endif
460 >    printf("Version 2.0 by Steve Anger and Jeff Bowermaster 1996\n");
461      printf ("\n");
462  
463      if (argc < 2) {
# Line 456 | Line 470 | void process_args (int argc, char *argv[])
470          printf ("         -b<object>   - Convert this object as a box\n");
471          printf ("         +i, -i       - Turn internal bounding on or off\n");
472          printf ("         +v, -v       - Turn verbose status messages on or off\n");
473 <        printf ("         -op          - Output to POV-Ray 2.0 format (default)\n");
473 >        printf ("         -op          - Output to POV-Ray 2.0 format\n");
474          printf ("         -op1         - Output to POV-Ray 1.0 format\n");
475          printf ("         -ov          - Output to Vivid format\n");
476          printf ("         -ol          - Output to poLyray format\n");
# Line 480 | Line 494 | void process_args (int argc, char *argv[])
494      else if (!strcmp(progname, "3ds2raw"))
495          format = RAW;
496      else
497 <        format = MGF;           /* default if program name strange */
497 >        format = POV20;         /* default if program name strange */
498  
499      strcpy (inname, "");
500      strcpy (outname, "");
# Line 536 | Line 550 | void process_args (int argc, char *argv[])
550  
551      if ((strlen(vuename) > 0) != (frame >= 0))
552          abortmsg ("The -a and -f parameters must be used together", 1);
553 +
554 +    if (format == RAW || (format == MGF && smooth < 0.1))
555 +        no_opt = TRUE;
556   }
557  
558  
# Line 906 | Line 923 | void write_summary (FILE *f)
923          case MGF:
924              comstr = "# ";
925              break;
926 +        default:
927 +                printf ("Illegal format in write_summary() '%c'\n", format);
928 +                exit(1);
929      }
930      fprintf (f, "%s   Object    CenterX    CenterY    CenterZ    LengthX    LengthY    LengthZ\n", comstr);
931      fprintf (f, "%s ---------- ---------- ---------- ---------- ---------- ---------- ----------\n", comstr);
# Line 991 | Line 1011 | void write_light (FILE *f, char *name, Vector pos, Col
1011              if (name[0]) fprintf (f, "o %s\n", name);
1012              fprintf (f, "m\n\tsides 1\n\tc\n\t\t\tcmix %.3f R %.3f G %.3f B\n\ted %e\n",
1013                      CIE_Y_r*col.red, CIE_Y_g*col.green, CIE_Y_b*col.blue,
1014 <            10000.0*(CIE_Y_r*col.red + CIE_Y_g*col.green + CIE_Y_b*col.blue));
1014 >            100000.0*(CIE_Y_r*col.red + CIE_Y_g*col.green + CIE_Y_b*col.blue));
1015              fprintf (f, "v c =\n\tp %.4f %.4f %.4f\nsph c .01\n",
1016                      pos[X], pos[Y], pos[Z]);
1017              if (name[0]) fprintf (f, "o\n");
# Line 1066 | Line 1086 | void write_spot (FILE *f, char *name, Vector pos, Vect
1086              fprintf (f, "# hotspot: %.2f\n# falloff: %.2f\n", hotspot, falloff);
1087              fprintf (f, "m\n\tsides 1\n\tc\n\t\t\tcmix %.3f R %.3f G %.3f B\n\ted %e\n",
1088                      CIE_Y_r*col.red, CIE_Y_g*col.green, CIE_Y_b*col.blue,
1089 <            10000.0*(CIE_Y_r*col.red + CIE_Y_g*col.green + CIE_Y_b*col.blue));
1089 >            100000.0*(CIE_Y_r*col.red + CIE_Y_g*col.green + CIE_Y_b*col.blue));
1090              fprintf (f, "v c =\n\tp %.4f %.4f %.4f\n\tn %.4f %.4f %.4f\n",
1091                      pos[X], pos[Y], pos[Z],
1092                      target[X]-pos[X], target[Y]-pos[Y], target[Z]-pos[Z]);
# Line 1581 | Line 1601 | void write_mgf_material (FILE *f, MatProp *m)
1601   void write_mesh (FILE *f, Mesh *mesh)
1602   {
1603      int i;
1604 +    char curmat[80];
1605      Vector va, vb, vc;
1606      Summary *new_summary;
1607      Matrix obj_matrix;
# Line 1607 | Line 1628 | void write_mesh (FILE *f, Mesh *mesh)
1628      }
1629  
1630      switch (format) {
1631 +        case MGF:
1632 +            if (no_opt) {
1633 +                if (mesh->name[0]) fprintf (meshf, "o %s\n", mesh->name);
1634 +                for (i = 0; i < mesh->vertices; i++) {
1635 +                    vect_copy(va, mesh->vertex[i]);
1636 +                    if (ani_matrix != NULL)
1637 +                        vect_transform (va, va, obj_matrix);
1638 +                    fprintf (meshf, "v v%d =\n\tp %.5f %.5f %.5f\n",
1639 +                                i, va[X], va[Y], va[Z]);
1640 +                }
1641 +                curmat[0] = '\0';
1642 +                for (i = 0; i < mesh->faces; i++) {
1643 +                    if (strcmp(mesh->mtl[i]->name, curmat)) {
1644 +                        strcpy(curmat, mesh->mtl[i]->name);
1645 +                        fprintf (meshf, "m %s\n", curmat);
1646 +                    }
1647 +                    fprintf (meshf, "f v%d v%d v%d\n", mesh->face[i].a,
1648 +                                mesh->face[i].b, mesh->face[i].c);
1649 +                }
1650 +                if (mesh->name[0]) fprintf (meshf, "o\n");
1651 +                break;
1652 +            }
1653 +            /*FALL THROUGH*/
1654          case POV10:
1655          case POV20:
1656          case VIVID:
1657          case POLYRAY:
1614        case MGF:
1658              opt_set_vert (mesh->vertices);
1659  
1660              for (i = 0; i < mesh->faces; i++) {
# Line 2332 | Line 2375 | void parse_3ds (Chunk *mainchunk)
2375  
2376      do  {
2377          start_chunk (&chunk);
2378 <
2378 >        if (feof(in)) {
2379 >                fprintf(stderr, "%s: unexpected EOF\n", progname);
2380 >                break;
2381 >        }
2382          if (chunk.end <= mainchunk->end) {
2383              switch (chunk.tag) {
2384                  case 0x3D3D: parse_mdata (&chunk);
# Line 2904 | Line 2950 | dword read_dword()
2950  
2951   float read_float()
2952   {
2953 +    union { dword i; char c[8]; } u;
2954      dword data;
2955  
2956      data = read_dword();
2957  
2958 <    return *(float *)&data;
2958 >    if (sizeof(dword) == sizeof(float))
2959 >        return *(float *)&data;
2960 >
2961 >    u.i = 1;
2962 >    if (u.c[0] == 0)
2963 >        return *(float *)&data; /* assume big-endian */
2964 >
2965 >    if (sizeof(dword) != 2*sizeof(float)) {
2966 >        fputs("Unsupported word length\n", stderr);
2967 >        exit(1);
2968 >    }
2969 >    u.i = data;
2970 >    return *(float *)&u.c[4];
2971   }
2972  
2973  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines