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.5 by greg, Fri Jul 1 10:20:19 1994 UTC vs.
Revision 2.12 by greg, Wed Dec 7 12:40:37 1994 UTC

# Line 17 | Line 17 | static char SCCSid[] = "$SunId$ LBL";
17  
18   #define putv(v)         printf("%18.12g %18.12g %18.12g\n",(v)[0],(v)[1],(v)[2])
19  
20 + #define invert          (xf_context != NULL && xf_context->rev)
21 +
22   double  glowdist = FHUGE;               /* glow test distance */
23  
24 < double  emult = 1.;                     /* emmitter multiplier */
24 > double  emult = 1.;                     /* emitter multiplier */
25  
26 + FILE    *matfp = stdout;                /* 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();
30  
# Line 48 | Line 52 | char   *argv[];
52          mg_ehand[MG_E_RD] = c_hmaterial;
53          mg_ehand[MG_E_RING] = r_ring;
54          mg_ehand[MG_E_RS] = c_hmaterial;
55 +        mg_ehand[MG_E_SIDES] = c_hmaterial;
56          mg_ehand[MG_E_SPH] = r_sph;
57          mg_ehand[MG_E_TD] = c_hmaterial;
58          mg_ehand[MG_E_TS] = c_hmaterial;
# Line 60 | Line 65 | char   *argv[];
65                  printf(" %s", argv[i]);
66                  switch (argv[i][1]) {
67                  case 'g':                       /* glow distance (meters) */
68 <                        if (argv[i][2] || badarg(argc-i, argv+i, "f"))
68 >                        if (argv[i][2] || badarg(argc-i-1, argv+i+1, "f"))
69                                  goto userr;
70                          glowdist = atof(argv[++i]);
71                          printf(" %s", argv[i]);
72                          break;
73                  case 'e':                       /* emitter multiplier */
74 <                        if (argv[i][2] || badarg(argc-i, argv+i, "f"))
74 >                        if (argv[i][2] || badarg(argc-i-1, argv+i+1, "f"))
75                                  goto userr;
76                          emult = atof(argv[++i]);
77                          printf(" %s", argv[i]);
78                          break;
79 +                case 'm':                       /* materials file */
80 +                        matfp = fopen(argv[++i], "a");
81 +                        if (matfp == NULL) {
82 +                                fprintf(stderr, "%s: cannot append\n", argv[i]);
83 +                                exit(1);
84 +                        }
85 +                        printf(" %s", argv[i]);
86 +                        break;
87                  default:
88                          goto userr;
89                  }
# Line 88 | Line 101 | char   *argv[];
101                  }
102          exit(0);
103   userr:
104 <        fprintf(stderr, "Usage: %s [-g dist][-m mult] [file.mgf] ..\n",
104 >        fprintf(stderr, "Usage: %s [-g dist][-e mult][-m matf] [file.mgf] ..\n",
105                          argv[0]);
106          exit(1);
107   }
# Line 99 | Line 112 | r_comment(ac, av)              /* repeat a comment verbatim */
112   register int    ac;
113   register char   **av;
114   {
115 <        fputs("\n#", stdout);   /* use Radiance comment character */
115 >        putchar('#');           /* use Radiance comment character */
116          while (--ac) {
117                  putchar(' ');
118                  fputs(*++av, stdout);
# Line 292 | Line 305 | char   **av;
305          printf("\n%s polygon %sf%d\n", mat, object(), ++nfaces);
306          printf("0\n0\n%d\n", 3*(ac-1));
307          for (i = 1; i < ac; i++) {
308 <                if ((cv = c_getvert(av[i])) == NULL)
308 >                if ((cv = c_getvert(av[invert ? ac-i : i])) == NULL)
309                          return(MG_EUNDEF);
310                  xf_xfmpoint(v, cv->p);
311                  putv(v);
# Line 366 | Line 379 | char   *mat, *vn1, *vn2, *vn3;
379          FVECT   n1, n2, n3;
380          register int    i;
381                          /* the following is repeat code, so assume it's OK */
369        cv1 = c_getvert(vn1);
382          cv2 = c_getvert(vn2);
383 <        cv3 = c_getvert(vn3);
383 >        if (invert) {
384 >                cv3 = c_getvert(vn1);
385 >                cv1 = c_getvert(vn3);
386 >        } else {
387 >                cv1 = c_getvert(vn1);
388 >                cv3 = c_getvert(vn3);
389 >        }
390          xf_xfmpoint(v1, cv1->p);
391          xf_xfmpoint(v2, cv2->p);
392          xf_xfmpoint(v3, cv3->p);
# Line 409 | Line 427 | material()                     /* get (and print) current material */
427          c_cmaterial->clock = 0;
428          if (c_cmaterial->ed > .1) {     /* emitter */
429                  cvtcolor(radrgb, &c_cmaterial->ed_c,
430 <                                emult*c_cmaterial->ed/WHTEFFICACY);
430 >                                emult*c_cmaterial->ed/(PI*WHTEFFICACY));
431                  if (glowdist < FHUGE) {         /* do a glow */
432 <                        printf("\nvoid glow %s\n0\n0\n", mname);
433 <                        printf("4 %f %f %f %f\n", colval(radrgb,RED),
432 >                        fprintf(matfp, "\nvoid glow %s\n0\n0\n", mname);
433 >                        fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
434                                          colval(radrgb,GRN),
435                                          colval(radrgb,BLU), glowdist);
436                  } else {
437 <                        printf("\nvoid light %s\n0\n0\n", mname);
438 <                        printf("3 %f %f %f\n", colval(radrgb,RED),
437 >                        fprintf(matfp, "\nvoid light %s\n0\n0\n", mname);
438 >                        fprintf(matfp, "3 %f %f %f\n", colval(radrgb,RED),
439                                          colval(radrgb,GRN),
440                                          colval(radrgb,BLU));
441                  }
# Line 425 | Line 443 | material()                     /* get (and print) current material */
443          }
444          d = c_cmaterial->rd + c_cmaterial->td +
445                          c_cmaterial->rs + c_cmaterial->ts;
446 <        if (d <= 0. | d >= 1.)
446 >        if (d < 0. | d > 1.)
447                  return(NULL);
448                                          /* check for trans */
449          if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {
450                  double  ts, a5, a6;
451  
452 <                ts = sqrt(c_cmaterial->ts);     /* because we use 2 sides */
452 >                if (c_cmaterial->sided) {
453 >                        ts = sqrt(c_cmaterial->ts);     /* approximate */
454 >                        a5 = .5;
455 >                } else {
456 >                        ts = c_cmaterial->ts;
457 >                        a5 = 1.;
458 >                }
459                                                  /* average colors */
460                  d = c_cmaterial->rd + c_cmaterial->td + ts;
461                  cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/d);
# Line 441 | Line 465 | material()                     /* get (and print) current material */
465                  addcolor(radrgb, c2);
466                  if (c_cmaterial->rs + ts > .0001)
467                          a5 = (c_cmaterial->rs*c_cmaterial->rs_a +
468 <                                        ts*.5*c_cmaterial->ts_a) /
468 >                                        ts*a5*c_cmaterial->ts_a) /
469                                          (c_cmaterial->rs + ts);
470                  a6 = (c_cmaterial->td + ts) /
471                                  (c_cmaterial->rd + c_cmaterial->td + ts);
472 <                if (a6 < .999) {
472 >                if (a6 < .999)
473                          d = c_cmaterial->rd/(1. - c_cmaterial->rs)/(1. - a6);
474 <                        scalecolor(radrgb, d);
475 <                }
476 <                printf("\nvoid trans %s\n0\n0\n", mname);
477 <                printf("7 %f %f %f\n", colval(radrgb,RED),
474 >                else
475 >                        d = c_cmaterial->td + ts;
476 >                scalecolor(radrgb, d);
477 >                fprintf(matfp, "\nvoid trans %s\n0\n0\n", mname);
478 >                fprintf(matfp, "7 %f %f %f\n", colval(radrgb,RED),
479                                  colval(radrgb,GRN), colval(radrgb,BLU));
480 <                printf("\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
480 >                fprintf(matfp, "\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
481                                  ts/(ts + c_cmaterial->td));
482                  return(mname);
483          }
484                                          /* check for plastic */
485 <        if (c_cmaterial->rs < .01 || c_isgrey(&c_cmaterial->rs_c)) {
486 <                if (c_cmaterial->rs > .999)
487 <                        cvtcolor(radrgb, &c_cmaterial->rd_c, 1.);
463 <                else
464 <                        cvtcolor(radrgb, &c_cmaterial->rd_c,
485 >        if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .01 ||
486 >                                        c_isgrey(&c_cmaterial->rs_c))) {
487 >                cvtcolor(radrgb, &c_cmaterial->rd_c,
488                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
489 <                printf("\nvoid plastic %s\n0\n0\n", mname);
490 <                printf("5 %f %f %f %f %f\n", colval(radrgb,RED),
489 >                fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
490 >                fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
491                                  colval(radrgb,GRN), colval(radrgb,BLU),
492                                  c_cmaterial->rs, c_cmaterial->rs_a);
493                  return(mname);
494          }
495                                          /* else it's metal */
496 <        d = c_cmaterial->rd + c_cmaterial->rs;  /* average colors */
497 <        cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd/d);
498 <        cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs/d);
496 >                                                /* average colors */
497 >        cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
498 >        cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
499          addcolor(radrgb, c2);
500 <        if (c_cmaterial->rs < .999) {
501 <                d = c_cmaterial->rd/(1. - c_cmaterial->rs);
479 <                scalecolor(radrgb, d);
480 <        }
481 <        printf("\nvoid metal %s\n0\n0\n", mname);
482 <        printf("5 %f %f %f %f %f\n", colval(radrgb,RED),
500 >        fprintf(matfp, "\nvoid metal %s\n0\n0\n", mname);
501 >        fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
502                          colval(radrgb,GRN), colval(radrgb,BLU),
503 <                        c_cmaterial->rs, c_cmaterial->rs_a);
503 >                        c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs),
504 >                        c_cmaterial->rs_a);
505          return(mname);
506   }
507  

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines