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.8 by greg, Tue Jul 19 15:54:44 1994 UTC vs.
Revision 2.14 by greg, Thu Apr 13 14:43:33 1995 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.;                     /* 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 37 | 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 61 | Line 67 | char   *argv[];
67                  printf(" %s", argv[i]);
68                  switch (argv[i][1]) {
69                  case 'g':                       /* glow distance (meters) */
70 <                        if (argv[i][2] || badarg(argc-i, argv+i, "f"))
70 >                        if (argv[i][2] || badarg(argc-i-1, argv+i+1, "f"))
71                                  goto userr;
72                          glowdist = atof(argv[++i]);
73                          printf(" %s", argv[i]);
74                          break;
75                  case 'e':                       /* emitter multiplier */
76 <                        if (argv[i][2] || badarg(argc-i, argv+i, "f"))
76 >                        if (argv[i][2] || badarg(argc-i-1, argv+i+1, "f"))
77                                  goto userr;
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 89 | 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 293 | Line 307 | char   **av;
307          printf("\n%s polygon %sf%d\n", mat, object(), ++nfaces);
308          printf("0\n0\n%d\n", 3*(ac-1));
309          for (i = 1; i < ac; i++) {
310 <                if ((cv = c_getvert(av[i])) == NULL)
310 >                if ((cv = c_getvert(av[invert ? ac-i : i])) == NULL)
311                          return(MG_EUNDEF);
312                  xf_xfmpoint(v, cv->p);
313                  putv(v);
# Line 367 | Line 381 | char   *mat, *vn1, *vn2, *vn3;
381          FVECT   n1, n2, n3;
382          register int    i;
383                          /* the following is repeat code, so assume it's OK */
370        cv1 = c_getvert(vn1);
384          cv2 = c_getvert(vn2);
385 <        cv3 = c_getvert(vn3);
385 >        if (invert) {
386 >                cv3 = c_getvert(vn1);
387 >                cv1 = c_getvert(vn3);
388 >        } else {
389 >                cv1 = c_getvert(vn1);
390 >                cv3 = c_getvert(vn3);
391 >        }
392          xf_xfmpoint(v1, cv1->p);
393          xf_xfmpoint(v2, cv2->p);
394          xf_xfmpoint(v3, cv3->p);
# Line 410 | Line 429 | material()                     /* get (and print) current material */
429          c_cmaterial->clock = 0;
430          if (c_cmaterial->ed > .1) {     /* emitter */
431                  cvtcolor(radrgb, &c_cmaterial->ed_c,
432 <                                emult*c_cmaterial->ed/WHTEFFICACY);
432 >                                emult*c_cmaterial->ed/(PI*WHTEFFICACY));
433                  if (glowdist < FHUGE) {         /* do a glow */
434 <                        printf("\nvoid glow %s\n0\n0\n", mname);
435 <                        printf("4 %f %f %f %f\n", colval(radrgb,RED),
434 >                        fprintf(matfp, "\nvoid glow %s\n0\n0\n", mname);
435 >                        fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
436                                          colval(radrgb,GRN),
437                                          colval(radrgb,BLU), glowdist);
438                  } else {
439 <                        printf("\nvoid light %s\n0\n0\n", mname);
440 <                        printf("3 %f %f %f\n", colval(radrgb,RED),
439 >                        fprintf(matfp, "\nvoid light %s\n0\n0\n", mname);
440 >                        fprintf(matfp, "3 %f %f %f\n", colval(radrgb,RED),
441                                          colval(radrgb,GRN),
442                                          colval(radrgb,BLU));
443                  }
# Line 428 | Line 447 | material()                     /* get (and print) current material */
447                          c_cmaterial->rs + c_cmaterial->ts;
448          if (d < 0. | d > 1.)
449                  return(NULL);
450 +                                        /* check for glass/dielectric */
451 +        if (c_cmaterial->nr > 1.1 &&
452 +                        c_cmaterial->ts > .25 && c_cmaterial->rs <= .125 &&
453 +                        c_cmaterial->td <= .01 && c_cmaterial->rd <= .01 &&
454 +                        c_cmaterial->rs_a <= .01 && c_cmaterial->ts_a <= .01) {
455 +                cvtcolor(radrgb, &c_cmaterial->ts_c,
456 +                                c_cmaterial->ts + c_cmaterial->rs);
457 +                if (c_cmaterial->sided) {               /* dielectric */
458 +                        colval(radrgb,RED) = pow(colval(radrgb,RED),
459 +                                                        1./C_1SIDEDTHICK);
460 +                        colval(radrgb,GRN) = pow(colval(radrgb,GRN),
461 +                                                        1./C_1SIDEDTHICK);
462 +                        colval(radrgb,BLU) = pow(colval(radrgb,BLU),
463 +                                                        1./C_1SIDEDTHICK);
464 +                        fprintf(matfp, "\nvoid dielectric %s\n0\n0\n", mname);
465 +                        fprintf(matfp, "5 %g %g %g %f 0\n", colval(radrgb,RED),
466 +                                        colval(radrgb,GRN), colval(radrgb,BLU),
467 +                                        c_cmaterial->nr);
468 +                        return(mname);
469 +                }
470 +                                                        /* glass */
471 +                fprintf(matfp, "\nvoid glass %s\n0\n0\n", mname);
472 +                fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
473 +                                colval(radrgb,GRN), colval(radrgb,BLU),
474 +                                c_cmaterial->nr);
475 +                return(mname);
476 +                }
477                                          /* check for trans */
478          if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {
479                  double  ts, a5, a6;
# Line 457 | Line 503 | material()                     /* get (and print) current material */
503                  else
504                          d = c_cmaterial->td + ts;
505                  scalecolor(radrgb, d);
506 <                printf("\nvoid trans %s\n0\n0\n", mname);
507 <                printf("7 %f %f %f\n", colval(radrgb,RED),
506 >                fprintf(matfp, "\nvoid trans %s\n0\n0\n", mname);
507 >                fprintf(matfp, "7 %f %f %f\n", colval(radrgb,RED),
508                                  colval(radrgb,GRN), colval(radrgb,BLU));
509 <                printf("\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
509 >                fprintf(matfp, "\t%f %f %f %f\n", c_cmaterial->rs, a5, a6,
510                                  ts/(ts + c_cmaterial->td));
511                  return(mname);
512          }
# Line 469 | Line 515 | material()                     /* get (and print) current material */
515                                          c_isgrey(&c_cmaterial->rs_c))) {
516                  cvtcolor(radrgb, &c_cmaterial->rd_c,
517                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
518 <                printf("\nvoid plastic %s\n0\n0\n", mname);
519 <                printf("5 %f %f %f %f %f\n", colval(radrgb,RED),
518 >                fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
519 >                fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
520                                  colval(radrgb,GRN), colval(radrgb,BLU),
521                                  c_cmaterial->rs, c_cmaterial->rs_a);
522                  return(mname);
# Line 480 | Line 526 | material()                     /* get (and print) current material */
526          cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
527          cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
528          addcolor(radrgb, c2);
529 <        printf("\nvoid metal %s\n0\n0\n", mname);
530 <        printf("5 %f %f %f %f %f\n", colval(radrgb,RED),
529 >        fprintf(matfp, "\nvoid metal %s\n0\n0\n", mname);
530 >        fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
531                          colval(radrgb,GRN), colval(radrgb,BLU),
532                          c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs),
533                          c_cmaterial->rs_a);

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines