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

Comparing ray/src/cv/mgf2rad.c (file contents):
Revision 2.17 by greg, Mon May 1 17:05:22 1995 UTC vs.
Revision 2.27 by schorsch, Sun Jul 27 22:12:01 2003 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1994 Regents of the University of California */
2
1   #ifndef lint
2 < static char SCCSid[] = "$SunId$ LBL";
2 > static const char       RCSid[] = "$Id$";
3   #endif
6
4   /*
5   * Convert MGF (Materials and Geometry Format) to Radiance
6   */
7  
8   #include <stdio.h>
9 + #include <stdlib.h>
10   #include <math.h>
11   #include <string.h>
12   #include "mgflib/parser.h"
# Line 23 | Line 21 | double glowdist = FHUGE;               /* glow test distance */
21  
22   double  emult = 1.;                     /* emitter multiplier */
23  
24 < FILE    *matfp = stdout;                /* material output file */
24 > FILE    *matfp;                         /* material output file */
25  
26   int     r_comment(), r_cone(), r_cyl(), r_face(), r_ies(), r_ring(), r_sph();
27   char    *material(), *object(), *addarg();
# Line 33 | Line 31 | main(argc, argv)               /* convert files to stdout */
31   int     argc;
32   char    *argv[];
33   {
34 <        int     i, rv;
34 >        int     i;
35 >
36 >        matfp = stdout;
37 >                                /* print out parser version */
38 >        printf("## Translated from MGF Version %d.%d\n", MG_VMAJOR, MG_VMINOR);
39                                  /* initialize dispatch table */
40          mg_ehand[MG_E_COMMENT] = r_comment;     /* we pass comments */
41          mg_ehand[MG_E_COLOR] = c_hcolor;        /* they get color */
# Line 92 | Line 94 | char   *argv[];
94          }
95          putchar('\n');
96          if (i == argc) {                /* convert stdin */
97 <                if ((rv = mg_load(NULL)) != MG_OK)
97 >                if (mg_load(NULL) != MG_OK)
98                          exit(1);
99 +                if (mg_nunknown)
100 +                        printf("## %s: %u unknown entities\n",
101 +                                        argv[0], mg_nunknown);
102          } else                          /* convert each file */
103                  for ( ; i < argc; i++) {
104                          printf("## %s %s ##############################\n",
105                                          argv[0], argv[i]);
106 <                        if ((rv = mg_load(argv[i])) != MG_OK)
106 >                        if (mg_load(argv[i]) != MG_OK)
107                                  exit(1);
108 +                        if (mg_nunknown) {
109 +                                printf("## %s %s: %u unknown entities\n",
110 +                                                argv[0], argv[i], mg_nunknown);
111 +                                mg_nunknown = 0;
112 +                        }
113                  }
114          exit(0);
115   userr:
# Line 153 | Line 163 | char   **av;
163                  if (r2 == 0.)
164                          return(MG_EILL);
165                  inv = r2 < 0.;
166 <        } else if (r2 != 0. && inv ^ r2 < 0.)
166 >        } else if (r2 != 0. && inv ^ (r2 < 0.))
167                  return(MG_EILL);
168          if (inv) {
169                  r1 = -r1;
# Line 266 | Line 276 | char   **av;
276          xf_rotvect(norm, cv->n);                /* rotate normal */
277          r1 = xf_scale(atof(av[2]));             /* scale radii */
278          r2 = xf_scale(atof(av[3]));
279 <        if (r1 < 0. | r2 <= r1)
279 >        if ((r1 < 0.) | (r2 <= r1))
280                  return(MG_EILL);
281          if ((mat = material()) == NULL)         /* get material */
282                  return(MG_EBADMAT);
# Line 286 | Line 296 | int    ac;
296   char    **av;
297   {
298          static int      nfaces;
299 +        int             myi = invert;
300          char    *mat;
301          register int    i;
302          register C_VERTEX       *cv;
# Line 297 | Line 308 | char   **av;
308          if ((mat = material()) == NULL) /* get material */
309                  return(MG_EBADMAT);
310          if (ac <= 5) {                          /* check for smoothing */
311 +                C_VERTEX        *cva[5];
312                  for (i = 1; i < ac; i++) {
313 <                        if ((cv = c_getvert(av[i])) == NULL)
313 >                        if ((cva[i-1] = c_getvert(av[i])) == NULL)
314                                  return(MG_EUNDEF);
315 <                        if (is0vect(cv->n))
315 >                        if (is0vect(cva[i-1]->n))
316                                  break;
317                  }
318 <                if (i == ac) {                  /* break into triangles */
319 <                        do_tri(mat, av[1], av[2], av[3]);
318 >                if (i < ac)
319 >                        i = ISFLAT;
320 >                else
321 >                        i = flat_tri(cva[0]->p, cva[1]->p, cva[2]->p,
322 >                                        cva[0]->n, cva[1]->n, cva[2]->n);
323 >                if (i == DEGEN)
324 >                        return(MG_OK);          /* degenerate (error?) */
325 >                if (i == RVBENT) {
326 >                        myi = !myi;
327 >                        i = ISBENT;
328 >                } else if (i == RVFLAT) {
329 >                        myi = !myi;
330 >                        i = ISFLAT;
331 >                }
332 >                if (i == ISBENT) {              /* smoothed triangles */
333 >                        do_tri(mat, cva[0], cva[1], cva[2], myi);
334                          if (ac == 5)
335 <                                do_tri(mat, av[3], av[4], av[1]);
335 >                                do_tri(mat, cva[2], cva[3], cva[0], myi);
336                          return(MG_OK);
337                  }
338          }
# Line 314 | Line 340 | char   **av;
340          printf("\n%s polygon %sf%d\n", mat, object(), ++nfaces);
341          printf("0\n0\n%d\n", 3*(ac-1));
342          for (i = 1; i < ac; i++) {      /* get, transform, print each vertex */
343 <                if ((cv = c_getvert(av[invert ? ac-i : i])) == NULL)
343 >                if ((cv = c_getvert(av[myi ? ac-i : i])) == NULL)
344                          return(MG_EUNDEF);
345                  xf_xfmpoint(v, cv->p);
346                  putv(v);
# Line 338 | Line 364 | char   **av;
364          if (ac < 2)
365                  return(MG_EARGC);
366                                          /* construct output file name */
367 <        if ((op = strrchr(av[1], '/')) == NULL)
367 >        if ((op = strrchr(av[1], '/')) != NULL)
368 >                op++;
369 >        else
370                  op = av[1];
371          (void)strcpy(fname, op);
372          if ((op = strrchr(fname, '.')) == NULL)
# Line 386 | Line 414 | char   **av;
414   }
415  
416  
417 < do_tri(mat, vn1, vn2, vn3)              /* put out smoothed triangle */
418 < char    *mat, *vn1, *vn2, *vn3;
417 > do_tri(mat, cv1, cv2, cv3, iv)          /* put out smoothed triangle */
418 > char    *mat;
419 > C_VERTEX        *cv1, *cv2, *cv3;
420 > int     iv;
421   {
422          static int      ntris;
423          BARYCCM bvecs;
424 <        FLOAT   bcoor[3][3];
425 <        C_VERTEX        *cv1, *cv2, *cv3;
424 >        RREAL   bcoor[3][3];
425 >        C_VERTEX        *cvt;
426          FVECT   v1, v2, v3;
427          FVECT   n1, n2, n3;
428          register int    i;
429 <                        /* the following is repeat code, so assume it's OK */
430 <        cv2 = c_getvert(vn2);
431 <        if (invert) {
432 <                cv3 = c_getvert(vn1);
433 <                cv1 = c_getvert(vn3);
404 <        } else {
405 <                cv1 = c_getvert(vn1);
406 <                cv3 = c_getvert(vn3);
429 >
430 >        if (iv) {                       /* swap vertex order if inverted */
431 >                cvt = cv1;
432 >                cv1 = cv3;
433 >                cv3 = cvt;
434          }
435          xf_xfmpoint(v1, cv1->p);
436          xf_xfmpoint(v2, cv2->p);
# Line 463 | Line 490 | material()                     /* get (and print) current material */
490          }
491          d = c_cmaterial->rd + c_cmaterial->td +
492                          c_cmaterial->rs + c_cmaterial->ts;
493 <        if (d < 0. | d > 1.)
493 >        if ((d < 0.) | (d > 1.))
494                  return(NULL);
495                                          /* check for glass/dielectric */
496          if (c_cmaterial->nr > 1.1 &&
# Line 529 | Line 556 | material()                     /* get (and print) current material */
556                  return(mname);
557          }
558                                          /* check for plastic */
559 <        if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .01 ||
533 <                                        c_isgrey(&c_cmaterial->rs_c))) {
559 >        if (c_cmaterial->rs < .1) {
560                  cvtcolor(radrgb, &c_cmaterial->rd_c,
561                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
562                  fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
# Line 595 | Line 621 | addarg(op, arg)                                /* add argument and advance pointer
621   register char   *op, *arg;
622   {
623          *op = ' ';
624 <        while (*++op = *arg++)
624 >        while ( (*++op = *arg++) )
625                  ;
626          return(op);
627   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines