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.18 by greg, Thu May 11 20:17:56 1995 UTC vs.
Revision 2.30 by greg, Sat Jan 25 18:02:06 2014 UTC

# Line 1 | Line 1
1 /* Copyright (c) 1995 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"
12 >
13 > #include "platform.h"
14 > #include "mgf_parser.h"
15   #include "color.h"
16   #include "tmesh.h"
17  
# Line 23 | Line 23 | double glowdist = FHUGE;               /* glow test distance */
23  
24   double  emult = 1.;                     /* emitter multiplier */
25  
26 < FILE    *matfp = stdout;                /* material output file */
26 > FILE    *matfp;                         /* material output file */
27  
28 int     r_comment(), r_cone(), r_cyl(), r_face(), r_ies(), r_ring(), r_sph();
29 char    *material(), *object(), *addarg();
28  
29 + extern int r_comment(int ac, char **av);
30 + extern int r_cone(int ac, char **av);
31 + extern int r_cyl(int ac, char **av);
32 + extern int r_sph(int ac, char **av);
33 + extern int r_ring(int ac, char **av);
34 + extern int r_face(int ac, char **av);
35 + extern int r_ies(int ac, char **av);
36 + extern void putsided(char *mname);
37 + extern char * material(void);
38 + extern char * object(void);
39 + extern char * addarg(char *op, char *arg);
40 + extern void do_tri(char *mat, C_VERTEX *cv1, C_VERTEX *cv2, C_VERTEX *cv3, int iv);
41 + extern void cvtcolor(COLOR radrgb, register C_COLOR *ciec, double intensity);
42  
43 < main(argc, argv)                /* convert files to stdout */
44 < int     argc;
45 < char    *argv[];
43 >
44 > int
45 > main(
46 >        int     argc,
47 >        char    *argv[]
48 > )
49   {
50 <        int     i, rv;
50 >        int     i;
51 >
52 >        matfp = stdout;
53 >                                /* print out parser version */
54 >        printf("## Translated from MGF Version %d.%d\n", MG_VMAJOR, MG_VMINOR);
55                                  /* initialize dispatch table */
56          mg_ehand[MG_E_COMMENT] = r_comment;     /* we pass comments */
57          mg_ehand[MG_E_COLOR] = c_hcolor;        /* they get color */
# Line 92 | Line 110 | char   *argv[];
110          }
111          putchar('\n');
112          if (i == argc) {                /* convert stdin */
113 <                if ((rv = mg_load(NULL)) != MG_OK)
113 >                if (mg_load(NULL) != MG_OK)
114                          exit(1);
115                  if (mg_nunknown)
116                          printf("## %s: %u unknown entities\n",
# Line 101 | Line 119 | char   *argv[];
119                  for ( ; i < argc; i++) {
120                          printf("## %s %s ##############################\n",
121                                          argv[0], argv[i]);
122 <                        if ((rv = mg_load(argv[i])) != MG_OK)
122 >                        if (mg_load(argv[i]) != MG_OK)
123                                  exit(1);
124                          if (mg_nunknown) {
125                                  printf("## %s %s: %u unknown entities\n",
# Line 118 | Line 136 | userr:
136  
137  
138   int
139 < r_comment(ac, av)               /* repeat a comment verbatim */
140 < register int    ac;
141 < register char   **av;
139 > r_comment(              /* repeat a comment verbatim */
140 >        register int    ac,
141 >        register char   **av
142 > )
143   {
144          putchar('#');           /* use Radiance comment character */
145          while (--ac) {                  /* pass through verbatim */
# Line 133 | Line 152 | register char  **av;
152  
153  
154   int
155 < r_cone(ac, av)                  /* put out a cone */
156 < int     ac;
157 < char    **av;
155 > r_cone(                 /* put out a cone */
156 >        int     ac,
157 >        char    **av
158 > )
159   {
160          static int      ncones;
161          char    *mat;
# Line 161 | Line 181 | char   **av;
181                  if (r2 == 0.)
182                          return(MG_EILL);
183                  inv = r2 < 0.;
184 <        } else if (r2 != 0. && inv ^ r2 < 0.)
184 >        } else if (r2 != 0. && inv ^ (r2 < 0.))
185                  return(MG_EILL);
186          if (inv) {
187                  r1 = -r1;
# Line 181 | Line 201 | char   **av;
201  
202  
203   int
204 < r_cyl(ac, av)                   /* put out a cylinder */
205 < int     ac;
206 < char    **av;
204 > r_cyl(                  /* put out a cylinder */
205 >        int     ac,
206 >        char    **av
207 > )
208   {
209          static int      ncyls;
210          char    *mat;
# Line 219 | Line 240 | char   **av;
240  
241  
242   int
243 < r_sph(ac, av)                   /* put out a sphere */
244 < int     ac;
245 < char    **av;
243 > r_sph(                  /* put out a sphere */
244 >        int     ac,
245 >        char    **av
246 > )
247   {
248          static int      nsphs;
249          char    *mat;
# Line 252 | Line 274 | char   **av;
274  
275  
276   int
277 < r_ring(ac, av)                  /* put out a ring */
278 < int     ac;
279 < char    **av;
277 > r_ring(                 /* put out a ring */
278 >        int     ac,
279 >        char    **av
280 > )
281   {
282          static int      nrings;
283          char    *mat;
# Line 274 | Line 297 | char   **av;
297          xf_rotvect(norm, cv->n);                /* rotate normal */
298          r1 = xf_scale(atof(av[2]));             /* scale radii */
299          r2 = xf_scale(atof(av[3]));
300 <        if (r1 < 0. | r2 <= r1)
300 >        if ((r1 < 0.) | (r2 <= r1))
301                  return(MG_EILL);
302          if ((mat = material()) == NULL)         /* get material */
303                  return(MG_EBADMAT);
# Line 289 | Line 312 | char   **av;
312  
313  
314   int
315 < r_face(ac, av)                  /* convert a face */
316 < int     ac;
317 < char    **av;
315 > r_face(                 /* convert a face */
316 >        int     ac,
317 >        char    **av
318 > )
319   {
320          static int      nfaces;
321 +        int             myi = invert;
322          char    *mat;
323          register int    i;
324          register C_VERTEX       *cv;
325          FVECT   v;
326 <        int     rv;
326 >
327                                          /* check argument count and type */
328          if (ac < 4)
329                  return(MG_EARGC);
330          if ((mat = material()) == NULL) /* get material */
331                  return(MG_EBADMAT);
332          if (ac <= 5) {                          /* check for smoothing */
333 +                C_VERTEX        *cva[5];
334                  for (i = 1; i < ac; i++) {
335 <                        if ((cv = c_getvert(av[i])) == NULL)
335 >                        if ((cva[i-1] = c_getvert(av[i])) == NULL)
336                                  return(MG_EUNDEF);
337 <                        if (is0vect(cv->n))
337 >                        if (is0vect(cva[i-1]->n))
338                                  break;
339                  }
340 <                if (i == ac) {                  /* break into triangles */
341 <                        do_tri(mat, av[1], av[2], av[3]);
340 >                if (i < ac)
341 >                        i = ISFLAT;
342 >                else
343 >                        i = flat_tri(cva[0]->p, cva[1]->p, cva[2]->p,
344 >                                        cva[0]->n, cva[1]->n, cva[2]->n);
345 >                if (i == DEGEN)
346 >                        return(MG_OK);          /* degenerate (error?) */
347 >                if (i == RVBENT) {
348 >                        myi = !myi;
349 >                        i = ISBENT;
350 >                } else if (i == RVFLAT) {
351 >                        myi = !myi;
352 >                        i = ISFLAT;
353 >                }
354 >                if (i == ISBENT) {              /* smoothed triangles */
355 >                        do_tri(mat, cva[0], cva[1], cva[2], myi);
356                          if (ac == 5)
357 <                                do_tri(mat, av[3], av[4], av[1]);
357 >                                do_tri(mat, cva[2], cva[3], cva[0], myi);
358                          return(MG_OK);
359                  }
360          }
# Line 322 | Line 362 | char   **av;
362          printf("\n%s polygon %sf%d\n", mat, object(), ++nfaces);
363          printf("0\n0\n%d\n", 3*(ac-1));
364          for (i = 1; i < ac; i++) {      /* get, transform, print each vertex */
365 <                if ((cv = c_getvert(av[invert ? ac-i : i])) == NULL)
365 >                if ((cv = c_getvert(av[myi ? ac-i : i])) == NULL)
366                          return(MG_EUNDEF);
367                  xf_xfmpoint(v, cv->p);
368                  putv(v);
# Line 332 | Line 372 | char   **av;
372  
373  
374   int
375 < r_ies(ac, av)                           /* convert an IES luminaire file */
376 < int     ac;
377 < char    **av;
375 > r_ies(                          /* convert an IES luminaire file */
376 >        int     ac,
377 >        char    **av
378 > )
379   {
380          int     xa0 = 2;
381          char    combuf[128];
# Line 346 | Line 387 | char   **av;
387          if (ac < 2)
388                  return(MG_EARGC);
389                                          /* construct output file name */
390 <        if ((op = strrchr(av[1], '/')) == NULL)
390 >        if ((op = strrchr(av[1], '/')) != NULL)
391 >                op++;
392 >        else
393                  op = av[1];
394          (void)strcpy(fname, op);
395          if ((op = strrchr(fname, '.')) == NULL)
# Line 394 | Line 437 | char   **av;
437   }
438  
439  
440 < do_tri(mat, vn1, vn2, vn3)              /* put out smoothed triangle */
441 < char    *mat, *vn1, *vn2, *vn3;
440 > void
441 > do_tri(         /* put out smoothed triangle */
442 >        char    *mat,
443 >        C_VERTEX        *cv1,
444 >        C_VERTEX        *cv2,
445 >        C_VERTEX        *cv3,
446 >        int     iv
447 > )
448   {
449          static int      ntris;
450          BARYCCM bvecs;
451 <        FLOAT   bcoor[3][3];
452 <        C_VERTEX        *cv1, *cv2, *cv3;
451 >        RREAL   bcoor[3][3];
452 >        C_VERTEX        *cvt;
453          FVECT   v1, v2, v3;
454          FVECT   n1, n2, n3;
455          register int    i;
456 <                        /* the following is repeat code, so assume it's OK */
457 <        cv2 = c_getvert(vn2);
458 <        if (invert) {
459 <                cv3 = c_getvert(vn1);
460 <                cv1 = c_getvert(vn3);
412 <        } else {
413 <                cv1 = c_getvert(vn1);
414 <                cv3 = c_getvert(vn3);
456 >
457 >        if (iv) {                       /* swap vertex order if inverted */
458 >                cvt = cv1;
459 >                cv1 = cv3;
460 >                cv3 = cvt;
461          }
462          xf_xfmpoint(v1, cv1->p);
463          xf_xfmpoint(v2, cv2->p);
# Line 439 | Line 485 | char   *mat, *vn1, *vn2, *vn3;
485   }
486  
487  
488 + void
489 + putsided(char *mname)           /* print out mixfunc for sided material */
490 + {
491 +        fprintf(matfp, "\nvoid mixfunc %s\n", mname);
492 +        fprintf(matfp, "4 %s void if(Rdot,1,0) .\n0\n0\n", mname);
493 + }
494 +
495 +
496   char *
497 < material()                      /* get (and print) current material */
497 > material(void)                  /* get (and print) current material */
498   {
499          char    *mname = "mat";
500          COLOR   radrgb, c2;
501          double  d;
448        register int    i;
502  
503          if (c_cmname != NULL)
504                  mname = c_cmname;
# Line 471 | Line 524 | material()                     /* get (and print) current material */
524          }
525          d = c_cmaterial->rd + c_cmaterial->td +
526                          c_cmaterial->rs + c_cmaterial->ts;
527 <        if (d < 0. | d > 1.)
527 >        if ((d < 0.) | (d > 1.))
528                  return(NULL);
529                                          /* check for glass/dielectric */
530          if (c_cmaterial->nr > 1.1 &&
# Line 502 | Line 555 | material()                     /* get (and print) current material */
555                  }
556                                          /* check for trans */
557          if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {
558 <                double  ts, a5, a6;
506 <
507 <                if (c_cmaterial->sided) {
508 <                        ts = sqrt(c_cmaterial->ts);     /* approximate */
509 <                        a5 = .5;
510 <                } else {
511 <                        ts = c_cmaterial->ts;
512 <                        a5 = 1.;
513 <                }
558 >                double  a5, a6;
559                                                  /* average colors */
560 <                d = c_cmaterial->rd + c_cmaterial->td + ts;
560 >                d = c_cmaterial->rd + c_cmaterial->td + c_cmaterial->ts;
561                  cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/d);
562                  cvtcolor(c2, &c_cmaterial->td_c, c_cmaterial->td/d);
563                  addcolor(radrgb, c2);
564 <                cvtcolor(c2, &c_cmaterial->ts_c, ts/d);
564 >                cvtcolor(c2, &c_cmaterial->ts_c, c_cmaterial->ts/d);
565                  addcolor(radrgb, c2);
566 <                if (c_cmaterial->rs + ts > .0001)
566 >                if (c_cmaterial->rs + c_cmaterial->ts > .0001)
567                          a5 = (c_cmaterial->rs*c_cmaterial->rs_a +
568 <                                        ts*a5*c_cmaterial->ts_a) /
569 <                                        (c_cmaterial->rs + ts);
570 <                a6 = (c_cmaterial->td + ts) /
571 <                                (c_cmaterial->rd + c_cmaterial->td + ts);
568 >                                        c_cmaterial->ts*c_cmaterial->ts_a) /
569 >                                        (c_cmaterial->rs + c_cmaterial->ts);
570 >                a6 = (c_cmaterial->td + c_cmaterial->ts) /
571 >                                (c_cmaterial->rd + c_cmaterial->td + c_cmaterial->ts);
572                  if (a6 < .999)
573                          d = c_cmaterial->rd/(1. - c_cmaterial->rs)/(1. - a6);
574                  else
575 <                        d = c_cmaterial->td + ts;
575 >                        d = c_cmaterial->td + c_cmaterial->ts;
576                  scalecolor(radrgb, d);
577                  fprintf(matfp, "\nvoid trans %s\n0\n0\n", mname);
578                  fprintf(matfp, "7 %f %f %f\n", colval(radrgb,RED),
579                                  colval(radrgb,GRN), colval(radrgb,BLU));
580                  fprintf(matfp, "\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
581 <                                ts/(ts + c_cmaterial->td));
581 >                                c_cmaterial->ts/(c_cmaterial->ts + c_cmaterial->td));
582 >                if (c_cmaterial->sided)
583 >                        putsided(mname);
584                  return(mname);
585          }
586                                          /* check for plastic */
587 <        if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .01 ||
541 <                                        c_isgrey(&c_cmaterial->rs_c))) {
587 >        if (c_cmaterial->rs < .1) {
588                  cvtcolor(radrgb, &c_cmaterial->rd_c,
589                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
590                  fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
591                  fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
592                                  colval(radrgb,GRN), colval(radrgb,BLU),
593                                  c_cmaterial->rs, c_cmaterial->rs_a);
594 +                if (c_cmaterial->sided)
595 +                        putsided(mname);
596                  return(mname);
597          }
598                                          /* else it's metal */
# Line 557 | Line 605 | material()                     /* get (and print) current material */
605                          colval(radrgb,GRN), colval(radrgb,BLU),
606                          c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs),
607                          c_cmaterial->rs_a);
608 +        if (c_cmaterial->sided)
609 +                putsided(mname);
610          return(mname);
611   }
612  
613  
614 < cvtcolor(radrgb, ciec, intensity)       /* convert a CIE XYZ color to RGB */
615 < COLOR   radrgb;
616 < register C_COLOR        *ciec;
617 < double  intensity;
614 > void
615 > cvtcolor(       /* convert a CIE XYZ color to RGB */
616 >        COLOR   radrgb,
617 >        register C_COLOR        *ciec,
618 >        double  intensity
619 > )
620   {
621          static COLOR    ciexyz;
622  
# Line 577 | Line 629 | double intensity;
629  
630  
631   char *
632 < object()                        /* return current object name */
632 > object(void)                    /* return current object name */
633   {
634          static char     objbuf[64];
635          register int    i;
# Line 599 | Line 651 | object()                       /* return current object name */
651  
652  
653   char *
654 < addarg(op, arg)                         /* add argument and advance pointer */
655 < register char   *op, *arg;
654 > addarg(                         /* add argument and advance pointer */
655 >        register char *op,
656 >        register char *arg
657 > )
658   {
659          *op = ' ';
660 <        while (*++op = *arg++)
660 >        while ( (*++op = *arg++) )
661                  ;
662          return(op);
663   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines