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.30 by greg, Sat Jan 25 18:02:06 2014 UTC vs.
Revision 2.35 by greg, Wed Jan 17 00:43:45 2024 UTC

# Line 14 | Line 14 | static const char      RCSid[] = "$Id$";
14   #include "mgf_parser.h"
15   #include "color.h"
16   #include "tmesh.h"
17 + #include "lookup.h"
18  
19   #define putv(v)         printf("%18.12g %18.12g %18.12g\n",(v)[0],(v)[1],(v)[2])
20  
# Line 25 | Line 26 | double  emult = 1.;                    /* emitter multiplier */
26  
27   FILE    *matfp;                         /* material output file */
28  
29 + int     dospectra = 0;                  /* output spectral colors? */
30  
31 +
32   extern int r_comment(int ac, char **av);
33 + extern int r_color(int ac, char **av);
34   extern int r_cone(int ac, char **av);
35   extern int r_cyl(int ac, char **av);
36   extern int r_sph(int ac, char **av);
# Line 38 | Line 42 | extern char * material(void);
42   extern char * object(void);
43   extern char * addarg(char *op, char *arg);
44   extern void do_tri(char *mat, C_VERTEX *cv1, C_VERTEX *cv2, C_VERTEX *cv3, int iv);
45 < extern void cvtcolor(COLOR radrgb, register C_COLOR *ciec, double intensity);
45 > extern void cvtcolor(COLOR radrgb, C_COLOR *ciec, double intensity);
46 > extern char * specolor(COLOR radrgb, C_COLOR *ciec, double intensity);
47  
48  
49   int
# Line 57 | Line 62 | main(
62          mg_ehand[MG_E_COLOR] = c_hcolor;        /* they get color */
63          mg_ehand[MG_E_CONE] = r_cone;           /* we do cones */
64          mg_ehand[MG_E_CMIX] = c_hcolor;         /* they mix colors */
60        mg_ehand[MG_E_CSPEC] = c_hcolor;        /* they get spectra */
65          mg_ehand[MG_E_CXY] = c_hcolor;          /* they get chromaticities */
66 <        mg_ehand[MG_E_CCT] = c_hcolor;          /* they get color temp's */
66 >        mg_ehand[MG_E_CSPEC] = r_color;         /* we get spectra */
67 >        mg_ehand[MG_E_CCT] = r_color;           /* we get color temp's */
68          mg_ehand[MG_E_CYL] = r_cyl;             /* we do cylinders */
69          mg_ehand[MG_E_ED] = c_hmaterial;        /* they get emission */
70          mg_ehand[MG_E_FACE] = r_face;           /* we do faces */
# Line 104 | Line 109 | main(
109                          }
110                          printf(" %s", argv[i]);
111                          break;
112 +                case 's':                       /* spectral color output? */
113 +                        dospectra = !dospectra;
114 +                        break;
115                  default:
116                          goto userr;
117                  }
# Line 129 | Line 137 | main(
137                  }
138          exit(0);
139   userr:
140 <        fprintf(stderr, "Usage: %s [-g dist][-e mult][-m matf] [file.mgf] ..\n",
140 >        fprintf(stderr, "Usage: %s [-s][-g dist][-e mult][-m matf] [file.mgf] ..\n",
141                          argv[0]);
142          exit(1);
143   }
# Line 137 | Line 145 | userr:
145  
146   int
147   r_comment(              /* repeat a comment verbatim */
148 <        register int    ac,
149 <        register char   **av
148 >        int     ac,
149 >        char    **av
150   )
151   {
152          putchar('#');           /* use Radiance comment character */
# Line 152 | Line 160 | r_comment(             /* repeat a comment verbatim */
160  
161  
162   int
163 + r_color(                /* call color handler & remember name */
164 +        int     ac,
165 +        char    **av
166 + )
167 + {
168 +        int     rval = c_hcolor(ac, av);
169 +
170 +        if (rval == MG_OK)
171 +                c_ccolor->client_data = c_ccname;
172 +
173 +        return(rval);
174 + }
175 +
176 +
177 + int
178   r_cone(                 /* put out a cone */
179          int     ac,
180          char    **av
# Line 320 | Line 343 | r_face(                        /* convert a face */
343          static int      nfaces;
344          int             myi = invert;
345          char    *mat;
346 <        register int    i;
347 <        register C_VERTEX       *cv;
346 >        int     i;
347 >        C_VERTEX        *cv;
348          FVECT   v;
349  
350                                          /* check argument count and type */
# Line 381 | Line 404 | r_ies(                         /* convert an IES luminaire file */
404          char    combuf[128];
405          char    fname[48];
406          char    *oname;
407 <        register char   *op;
408 <        register int    i;
407 >        char    *op;
408 >        int     i;
409                                          /* check argument count */
410          if (ac < 2)
411                  return(MG_EARGC);
# Line 452 | Line 475 | do_tri(                /* put out smoothed triangle */
475          C_VERTEX        *cvt;
476          FVECT   v1, v2, v3;
477          FVECT   n1, n2, n3;
478 <        register int    i;
478 >        int     i;
479  
480          if (iv) {                       /* swap vertex order if inverted */
481                  cvt = cv1;
# Line 475 | Line 498 | do_tri(                /* put out smoothed triangle */
498                  bcoor[i][1] = n2[i];
499                  bcoor[i][2] = n3[i];
500          }
501 <        put_baryc(&bvecs, bcoor, 3);
501 >        fput_baryc(&bvecs, bcoor, 3, stdout);
502                                                  /* put out triangle */
503          printf("\nT-nor polygon %st%d\n", object(), ++ntris);
504          printf("0\n0\n9\n");
# Line 497 | Line 520 | char *
520   material(void)                  /* get (and print) current material */
521   {
522          char    *mname = "mat";
523 +        char    *pname;
524          COLOR   radrgb, c2;
525          double  d;
526  
# Line 507 | Line 531 | material(void)                 /* get (and print) current material *
531                                  /* else update output */
532          c_cmaterial->clock = 0;
533          if (c_cmaterial->ed > .1) {     /* emitter */
534 <                cvtcolor(radrgb, &c_cmaterial->ed_c,
534 >                pname = specolor(radrgb, &c_cmaterial->ed_c,
535                                  emult*c_cmaterial->ed/(PI*WHTEFFICACY));
536                  if (glowdist < FHUGE) {         /* do a glow */
537 <                        fprintf(matfp, "\nvoid glow %s\n0\n0\n", mname);
537 >                        fprintf(matfp, "\n%s glow %s\n0\n0\n", pname, mname);
538                          fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
539                                          colval(radrgb,GRN),
540                                          colval(radrgb,BLU), glowdist);
541                  } else {
542 <                        fprintf(matfp, "\nvoid light %s\n0\n0\n", mname);
542 >                        fprintf(matfp, "\n%s light %s\n0\n0\n", pname, mname);
543                          fprintf(matfp, "3 %f %f %f\n", colval(radrgb,RED),
544                                          colval(radrgb,GRN),
545                                          colval(radrgb,BLU));
# Line 552 | Line 576 | material(void)                 /* get (and print) current material *
576                                  colval(radrgb,GRN), colval(radrgb,BLU),
577                                  c_cmaterial->nr);
578                  return(mname);
579 <                }
579 >        }
580                                          /* check for trans */
581          if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {
582                  double  a5, a6;
# Line 584 | Line 608 | material(void)                 /* get (and print) current material *
608                  return(mname);
609          }
610                                          /* check for plastic */
611 <        if (c_cmaterial->rs < .1) {
612 <                cvtcolor(radrgb, &c_cmaterial->rd_c,
611 >        if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .1*c_cmaterial->rd ||
612 >                                        c_isgrey(&c_cmaterial->rs_c))) {
613 >                pname = specolor(radrgb, &c_cmaterial->rd_c,
614                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
615 <                fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
615 >                fprintf(matfp, "\n%s plastic %s\n0\n0\n", pname, mname);
616                  fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
617                                  colval(radrgb,GRN), colval(radrgb,BLU),
618                                  c_cmaterial->rs, c_cmaterial->rs_a);
# Line 596 | Line 621 | material(void)                 /* get (and print) current material *
621                  return(mname);
622          }
623                                          /* else it's metal */
624 <                                                /* average colors */
625 <        cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
626 <        cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
627 <        addcolor(radrgb, c2);
628 <        fprintf(matfp, "\nvoid metal %s\n0\n0\n", mname);
624 >                                                /* compute color */
625 >        if (c_equiv(&c_cmaterial->rd_c, &c_cmaterial->rs_c)) {
626 >                pname = specolor(radrgb, &c_cmaterial->rs_c, c_cmaterial->rs+c_cmaterial->rd);
627 >        } else if (c_cmaterial->rd <= .05f) {
628 >                pname = specolor(radrgb, &c_cmaterial->rs_c, c_cmaterial->rs);
629 >                cvtcolor(c2, &c_cmaterial->rd_c, c_cmaterial->rd);
630 >                addcolor(radrgb, c2);
631 >        } else {
632 >                pname = "void";
633 >                cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
634 >                cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
635 >                addcolor(radrgb, c2);
636 >        }
637 >        fprintf(matfp, "\n%s metal %s\n0\n0\n", pname, mname);
638          fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
639                          colval(radrgb,GRN), colval(radrgb,BLU),
640                          c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs),
# Line 614 | Line 648 | material(void)                 /* get (and print) current material *
648   void
649   cvtcolor(       /* convert a CIE XYZ color to RGB */
650          COLOR   radrgb,
651 <        register C_COLOR        *ciec,
651 >        C_COLOR *ciec,
652          double  intensity
653   )
654   {
655 <        static COLOR    ciexyz;
655 >        COLOR   ciexyz;
656  
657          c_ccvt(ciec, C_CSXY);           /* get xy representation */
658          ciexyz[1] = intensity;
# Line 628 | Line 662 | cvtcolor(      /* convert a CIE XYZ color to RGB */
662   }
663  
664  
665 + static int      /* new spectrum definition? */
666 + newspecdef(C_COLOR *spc)
667 + {
668 +        static LUTAB    spc_tab = LU_SINIT(NULL,free);
669 +        LUENT   *lp = lu_find(&spc_tab, (const char *)spc->client_data);
670 +
671 +        if (lp == NULL)                 /* should never happen */
672 +                return(1);
673 +        if (lp->data == NULL) {         /* new entry */
674 +                lp->key = (char *)spc->client_data;
675 +                lp->data = (char *)malloc(sizeof(C_COLOR));
676 +        } else if (c_equiv(spc, (C_COLOR *)lp->data))
677 +                return(0);              /* unchanged */
678 +
679 +        if (lp->data != NULL)           /* else remember if we can */
680 +                *(C_COLOR *)lp->data = *spc;
681 +        return(1);                      /* good as new */
682 + }
683 +
684 +
685   char *
686 + specolor(       /* check if color has spectra and output accordingly */
687 +        COLOR   radrgb,
688 +        C_COLOR *clr,
689 +        double  intensity
690 + )
691 + {
692 +        static char     spname[128];
693 +        double  mult;
694 +        int     cbeg, cend, i;
695 +
696 +        if (!dospectra | !(clr->flags & C_CDSPEC)) {
697 +                cvtcolor(radrgb, clr, intensity);
698 +                return("void");                 /* just use RGB */
699 +        }
700 +        setcolor(radrgb, intensity, intensity, intensity);
701 +        for (cbeg = 0; cbeg < C_CNSS; cbeg++)   /* trim zeros off beginning */
702 +                if (clr->ssamp[cbeg])
703 +                        break;
704 +        if (cbeg >= C_CNSS)                     /* should never happen! */
705 +                return("void");
706 +        if (clr->client_data != NULL) {         /* get name if available */
707 +                strcpy(spname, (char *)clr->client_data);
708 +                strcat(spname, "*");            /* make sure it's special */
709 +                if (!newspecdef(clr))           /* output already? */
710 +                        return(spname);
711 +        } else
712 +                strcpy(spname, "spec*");
713 +        c_ccvt(clr, C_CSEFF);                   /* else output spectrum prim */
714 +        for (cend = 0; !clr->ssamp[C_CNSS-1-cend]; cend++)
715 +                ;                               /* trim zeros off end */
716 +        fprintf(matfp, "\nvoid spectrum %s\n0\n0\n", spname);
717 +        fprintf(matfp, "%d %d %d", C_CNSS+2-cbeg-cend,
718 +                C_CMINWL+cbeg*C_CWLI, C_CMAXWL-cend*C_CWLI);
719 +        mult = (C_CNSS*c_dfcolor.eff)/(clr->ssum*clr->eff);
720 +        for (i = cbeg; i < C_CNSS-cend; i++) {
721 +                if (!((i-cbeg+1)%6)) fputc('\n', matfp);
722 +                fprintf(matfp, "\t%.5f", clr->ssamp[i]*mult);
723 +        }
724 +        fputc('\n', matfp);
725 +        return(spname);
726 + }
727 +
728 +
729 + char *
730   object(void)                    /* return current object name */
731   {
732          static char     objbuf[64];
733 <        register int    i;
734 <        register char   *cp;
733 >        int     i;
734 >        char    *cp;
735          int     len;
736                                                  /* tracked by obj_handler */
737          i = obj_nnames - sizeof(objbuf)/16;
# Line 652 | Line 750 | object(void)                   /* return current object name */
750  
751   char *
752   addarg(                         /* add argument and advance pointer */
753 <        register char *op,
754 <        register char *arg
753 >        char *op,
754 >        char *arg
755   )
756   {
757          *op = ' ';

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines