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.10 by greg, Thu Jul 21 17:23:43 1994 UTC vs.
Revision 2.15 by greg, Fri Apr 14 10:47:50 1995 UTC

# 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 */
27 +
28   int     r_comment(), r_cone(), r_cyl(), r_face(), r_ies(), r_ring(), r_sph();
29   char    *material(), *object(), *addarg();
30  
# Line 39 | Line 41 | char   *argv[];
41          mg_ehand[MG_E_CMIX] = c_hcolor;
42          mg_ehand[MG_E_CSPEC] = c_hcolor;
43          mg_ehand[MG_E_CXY] = c_hcolor;
44 +        mg_ehand[MG_E_CCT] = c_hcolor;
45          mg_ehand[MG_E_CYL] = r_cyl;
46          mg_ehand[MG_E_ED] = c_hmaterial;
47          mg_ehand[MG_E_FACE] = r_face;
48          mg_ehand[MG_E_IES] = r_ies;
49 +        mg_ehand[MG_E_IR] = c_hmaterial;
50          mg_ehand[MG_E_MATERIAL] = c_hmaterial;
51          mg_ehand[MG_E_NORMAL] = c_hvertex;
52          mg_ehand[MG_E_OBJECT] = obj_handler;
# Line 74 | Line 78 | char   *argv[];
78                          emult = atof(argv[++i]);
79                          printf(" %s", argv[i]);
80                          break;
81 +                case 'm':                       /* materials file */
82 +                        matfp = fopen(argv[++i], "a");
83 +                        if (matfp == NULL) {
84 +                                fprintf(stderr, "%s: cannot append\n", argv[i]);
85 +                                exit(1);
86 +                        }
87 +                        printf(" %s", argv[i]);
88 +                        break;
89                  default:
90                          goto userr;
91                  }
# Line 91 | Line 103 | char   *argv[];
103                  }
104          exit(0);
105   userr:
106 <        fprintf(stderr, "Usage: %s [-g dist][-m mult] [file.mgf] ..\n",
106 >        fprintf(stderr, "Usage: %s [-g dist][-e mult][-m matf] [file.mgf] ..\n",
107                          argv[0]);
108          exit(1);
109   }
# Line 304 | Line 316 | char   **av;
316   }
317  
318  
319 + int
320   r_ies(ac, av)                           /* convert an IES luminaire file */
321   int     ac;
322   char    **av;
323   {
324          int     xa0 = 2;
325 <        char    combuf[72];
325 >        char    combuf[128];
326          char    fname[48];
327          char    *oname;
328          register char   *op;
# Line 318 | Line 331 | char   **av;
331          if (ac < 2)
332                  return(MG_EARGC);
333          (void)strcpy(combuf, "ies2rad");
334 <        op = combuf + 7;
334 >        op = combuf + 7;                /* get -m option (must be first) */
335          if (ac-xa0 >= 2 && !strcmp(av[xa0], "-m")) {
336                  if (!isflt(av[xa0+1]))
337                          return(MG_ETYPE);
338                  op = addarg(addarg(op, "-m"), av[xa0+1]);
339                  xa0 += 2;
340          }
341 <        if (access(av[1], 0) == -1)
341 >        *op++ = ' ';                    /* build IES filename */
342 >        i = 0;
343 >        if (mg_file != NULL &&
344 >                        (oname = strrchr(mg_file->fname, '/')) != NULL) {
345 >                i = oname - mg_file->fname + 1;
346 >                (void)strcpy(op, mg_file->fname);
347 >        }
348 >        (void)strcpy(op+i, av[1]);
349 >        if (access(op, 0) == -1)
350                  return(MG_ENOFILE);
330        *op++ = ' ';                    /* IES filename goes last */
331        (void)strcpy(op, av[1]);
351          system(combuf);                 /* run ies2rad */
352                                          /* now let's find the output file */
353          if ((op = strrchr(av[1], '/')) == NULL)
# Line 417 | Line 436 | material()                     /* get (and print) current material */
436          c_cmaterial->clock = 0;
437          if (c_cmaterial->ed > .1) {     /* emitter */
438                  cvtcolor(radrgb, &c_cmaterial->ed_c,
439 <                                emult*c_cmaterial->ed/WHTEFFICACY);
439 >                                emult*c_cmaterial->ed/(PI*WHTEFFICACY));
440                  if (glowdist < FHUGE) {         /* do a glow */
441 <                        printf("\nvoid glow %s\n0\n0\n", mname);
442 <                        printf("4 %f %f %f %f\n", colval(radrgb,RED),
441 >                        fprintf(matfp, "\nvoid glow %s\n0\n0\n", mname);
442 >                        fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
443                                          colval(radrgb,GRN),
444                                          colval(radrgb,BLU), glowdist);
445                  } else {
446 <                        printf("\nvoid light %s\n0\n0\n", mname);
447 <                        printf("3 %f %f %f\n", colval(radrgb,RED),
446 >                        fprintf(matfp, "\nvoid light %s\n0\n0\n", mname);
447 >                        fprintf(matfp, "3 %f %f %f\n", colval(radrgb,RED),
448                                          colval(radrgb,GRN),
449                                          colval(radrgb,BLU));
450                  }
# Line 435 | Line 454 | material()                     /* get (and print) current material */
454                          c_cmaterial->rs + c_cmaterial->ts;
455          if (d < 0. | d > 1.)
456                  return(NULL);
457 +                                        /* check for glass/dielectric */
458 +        if (c_cmaterial->nr > 1.1 &&
459 +                        c_cmaterial->ts > .25 && c_cmaterial->rs <= .125 &&
460 +                        c_cmaterial->td <= .01 && c_cmaterial->rd <= .01 &&
461 +                        c_cmaterial->rs_a <= .01 && c_cmaterial->ts_a <= .01) {
462 +                cvtcolor(radrgb, &c_cmaterial->ts_c,
463 +                                c_cmaterial->ts + c_cmaterial->rs);
464 +                if (c_cmaterial->sided) {               /* dielectric */
465 +                        colval(radrgb,RED) = pow(colval(radrgb,RED),
466 +                                                        1./C_1SIDEDTHICK);
467 +                        colval(radrgb,GRN) = pow(colval(radrgb,GRN),
468 +                                                        1./C_1SIDEDTHICK);
469 +                        colval(radrgb,BLU) = pow(colval(radrgb,BLU),
470 +                                                        1./C_1SIDEDTHICK);
471 +                        fprintf(matfp, "\nvoid dielectric %s\n0\n0\n", mname);
472 +                        fprintf(matfp, "5 %g %g %g %f 0\n", colval(radrgb,RED),
473 +                                        colval(radrgb,GRN), colval(radrgb,BLU),
474 +                                        c_cmaterial->nr);
475 +                        return(mname);
476 +                }
477 +                                                        /* glass */
478 +                fprintf(matfp, "\nvoid glass %s\n0\n0\n", mname);
479 +                fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
480 +                                colval(radrgb,GRN), colval(radrgb,BLU),
481 +                                c_cmaterial->nr);
482 +                return(mname);
483 +                }
484                                          /* check for trans */
485          if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {
486                  double  ts, a5, a6;
# Line 464 | Line 510 | material()                     /* get (and print) current material */
510                  else
511                          d = c_cmaterial->td + ts;
512                  scalecolor(radrgb, d);
513 <                printf("\nvoid trans %s\n0\n0\n", mname);
514 <                printf("7 %f %f %f\n", colval(radrgb,RED),
513 >                fprintf(matfp, "\nvoid trans %s\n0\n0\n", mname);
514 >                fprintf(matfp, "7 %f %f %f\n", colval(radrgb,RED),
515                                  colval(radrgb,GRN), colval(radrgb,BLU));
516 <                printf("\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
516 >                fprintf(matfp, "\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
517                                  ts/(ts + c_cmaterial->td));
518                  return(mname);
519          }
# Line 476 | Line 522 | material()                     /* get (and print) current material */
522                                          c_isgrey(&c_cmaterial->rs_c))) {
523                  cvtcolor(radrgb, &c_cmaterial->rd_c,
524                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
525 <                printf("\nvoid plastic %s\n0\n0\n", mname);
526 <                printf("5 %f %f %f %f %f\n", colval(radrgb,RED),
525 >                fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
526 >                fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
527                                  colval(radrgb,GRN), colval(radrgb,BLU),
528                                  c_cmaterial->rs, c_cmaterial->rs_a);
529                  return(mname);
# Line 487 | Line 533 | material()                     /* get (and print) current material */
533          cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
534          cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
535          addcolor(radrgb, c2);
536 <        printf("\nvoid metal %s\n0\n0\n", mname);
537 <        printf("5 %f %f %f %f %f\n", colval(radrgb,RED),
536 >        fprintf(matfp, "\nvoid metal %s\n0\n0\n", mname);
537 >        fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
538                          colval(radrgb,GRN), colval(radrgb,BLU),
539                          c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs),
540                          c_cmaterial->rs_a);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines