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.32 by greg, Thu Apr 15 23:51:04 2021 UTC vs.
Revision 2.33 by greg, Thu Jan 4 01:55:42 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 27 | Line 28 | FILE   *matfp;                         /* material output file */
28  
29  
30   extern int r_comment(int ac, char **av);
31 + extern int r_color(int ac, char **av);
32   extern int r_cone(int ac, char **av);
33   extern int r_cyl(int ac, char **av);
34   extern int r_sph(int ac, char **av);
# Line 38 | Line 40 | extern char * material(void);
40   extern char * object(void);
41   extern char * addarg(char *op, char *arg);
42   extern void do_tri(char *mat, C_VERTEX *cv1, C_VERTEX *cv2, C_VERTEX *cv3, int iv);
43 < extern void cvtcolor(COLOR radrgb, register C_COLOR *ciec, double intensity);
43 > extern void cvtcolor(COLOR radrgb, C_COLOR *ciec, double intensity);
44 > extern char * specolor(COLOR radrgb, C_COLOR *ciec, double intensity);
45  
46  
47   int
# Line 57 | Line 60 | main(
60          mg_ehand[MG_E_COLOR] = c_hcolor;        /* they get color */
61          mg_ehand[MG_E_CONE] = r_cone;           /* we do cones */
62          mg_ehand[MG_E_CMIX] = c_hcolor;         /* they mix colors */
60        mg_ehand[MG_E_CSPEC] = c_hcolor;        /* they get spectra */
63          mg_ehand[MG_E_CXY] = c_hcolor;          /* they get chromaticities */
64 <        mg_ehand[MG_E_CCT] = c_hcolor;          /* they get color temp's */
64 >        mg_ehand[MG_E_CSPEC] = r_color;         /* we get spectra */
65 >        mg_ehand[MG_E_CCT] = r_color;           /* we get color temp's */
66          mg_ehand[MG_E_CYL] = r_cyl;             /* we do cylinders */
67          mg_ehand[MG_E_ED] = c_hmaterial;        /* they get emission */
68          mg_ehand[MG_E_FACE] = r_face;           /* we do faces */
# Line 137 | Line 140 | userr:
140  
141   int
142   r_comment(              /* repeat a comment verbatim */
143 <        register int    ac,
144 <        register char   **av
143 >        int     ac,
144 >        char    **av
145   )
146   {
147          putchar('#');           /* use Radiance comment character */
# Line 152 | Line 155 | r_comment(             /* repeat a comment verbatim */
155  
156  
157   int
158 + r_color(                /* call color handler & remember name */
159 +        int     ac,
160 +        char    **av
161 + )
162 + {
163 +        int     rval = c_hcolor(ac, av);
164 +
165 +        if (rval == MG_OK)
166 +                c_ccolor->client_data = c_ccname;
167 +
168 +        return(rval);
169 + }
170 +
171 +
172 + int
173   r_cone(                 /* put out a cone */
174          int     ac,
175          char    **av
# Line 320 | Line 338 | r_face(                        /* convert a face */
338          static int      nfaces;
339          int             myi = invert;
340          char    *mat;
341 <        register int    i;
342 <        register C_VERTEX       *cv;
341 >        int     i;
342 >        C_VERTEX        *cv;
343          FVECT   v;
344  
345                                          /* check argument count and type */
# Line 381 | Line 399 | r_ies(                         /* convert an IES luminaire file */
399          char    combuf[128];
400          char    fname[48];
401          char    *oname;
402 <        register char   *op;
403 <        register int    i;
402 >        char    *op;
403 >        int     i;
404                                          /* check argument count */
405          if (ac < 2)
406                  return(MG_EARGC);
# Line 452 | Line 470 | do_tri(                /* put out smoothed triangle */
470          C_VERTEX        *cvt;
471          FVECT   v1, v2, v3;
472          FVECT   n1, n2, n3;
473 <        register int    i;
473 >        int     i;
474  
475          if (iv) {                       /* swap vertex order if inverted */
476                  cvt = cv1;
# Line 497 | Line 515 | char *
515   material(void)                  /* get (and print) current material */
516   {
517          char    *mname = "mat";
518 +        char    *pname;
519          COLOR   radrgb, c2;
520          double  d;
521  
# Line 507 | Line 526 | material(void)                 /* get (and print) current material *
526                                  /* else update output */
527          c_cmaterial->clock = 0;
528          if (c_cmaterial->ed > .1) {     /* emitter */
529 <                cvtcolor(radrgb, &c_cmaterial->ed_c,
529 >                pname = specolor(radrgb, &c_cmaterial->ed_c,
530                                  emult*c_cmaterial->ed/(PI*WHTEFFICACY));
531                  if (glowdist < FHUGE) {         /* do a glow */
532 <                        fprintf(matfp, "\nvoid glow %s\n0\n0\n", mname);
532 >                        fprintf(matfp, "\n%s glow %s\n0\n0\n", pname, mname);
533                          fprintf(matfp, "4 %f %f %f %f\n", colval(radrgb,RED),
534                                          colval(radrgb,GRN),
535                                          colval(radrgb,BLU), glowdist);
536                  } else {
537 <                        fprintf(matfp, "\nvoid light %s\n0\n0\n", mname);
537 >                        fprintf(matfp, "\n%s light %s\n0\n0\n", pname, mname);
538                          fprintf(matfp, "3 %f %f %f\n", colval(radrgb,RED),
539                                          colval(radrgb,GRN),
540                                          colval(radrgb,BLU));
# Line 552 | Line 571 | material(void)                 /* get (and print) current material *
571                                  colval(radrgb,GRN), colval(radrgb,BLU),
572                                  c_cmaterial->nr);
573                  return(mname);
574 <                }
574 >        }
575                                          /* check for trans */
576          if (c_cmaterial->td > .01 || c_cmaterial->ts > .01) {
577                  double  a5, a6;
# Line 584 | Line 603 | material(void)                 /* get (and print) current material *
603                  return(mname);
604          }
605                                          /* check for plastic */
606 <        if (c_cmaterial->rs < .08 && (c_cmaterial->rs < .1*c_cmaterial->rd ||
606 >        if (c_cmaterial->rs < .1 && (c_cmaterial->rs < .1*c_cmaterial->rd ||
607                                          c_isgrey(&c_cmaterial->rs_c))) {
608 <                cvtcolor(radrgb, &c_cmaterial->rd_c,
608 >                pname = specolor(radrgb, &c_cmaterial->rd_c,
609                                          c_cmaterial->rd/(1.-c_cmaterial->rs));
610 <                fprintf(matfp, "\nvoid plastic %s\n0\n0\n", mname);
610 >                fprintf(matfp, "\n%s plastic %s\n0\n0\n", pname, mname);
611                  fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
612                                  colval(radrgb,GRN), colval(radrgb,BLU),
613                                  c_cmaterial->rs, c_cmaterial->rs_a);
# Line 597 | Line 616 | material(void)                 /* get (and print) current material *
616                  return(mname);
617          }
618                                          /* else it's metal */
619 <                                                /* average colors */
620 <        cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
621 <        cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
622 <        addcolor(radrgb, c2);
623 <        fprintf(matfp, "\nvoid metal %s\n0\n0\n", mname);
619 >                                                /* compute color */
620 >        if (c_equiv(&c_cmaterial->rd_c, &c_cmaterial->rs_c)) {
621 >                pname = specolor(radrgb, &c_cmaterial->rs_c, c_cmaterial->rs+c_cmaterial->rd);
622 >        } else if (c_cmaterial->rd <= .05f) {
623 >                pname = specolor(radrgb, &c_cmaterial->rs_c, c_cmaterial->rs);
624 >                cvtcolor(c2, &c_cmaterial->rd_c, c_cmaterial->rd);
625 >                addcolor(radrgb, c2);
626 >        } else {
627 >                pname = "void";
628 >                cvtcolor(radrgb, &c_cmaterial->rd_c, c_cmaterial->rd);
629 >                cvtcolor(c2, &c_cmaterial->rs_c, c_cmaterial->rs);
630 >                addcolor(radrgb, c2);
631 >        }
632 >        fprintf(matfp, "\n%s metal %s\n0\n0\n", pname, mname);
633          fprintf(matfp, "5 %f %f %f %f %f\n", colval(radrgb,RED),
634                          colval(radrgb,GRN), colval(radrgb,BLU),
635                          c_cmaterial->rs/(c_cmaterial->rd + c_cmaterial->rs),
# Line 615 | Line 643 | material(void)                 /* get (and print) current material *
643   void
644   cvtcolor(       /* convert a CIE XYZ color to RGB */
645          COLOR   radrgb,
646 <        register C_COLOR        *ciec,
646 >        C_COLOR *ciec,
647          double  intensity
648   )
649   {
650 <        static COLOR    ciexyz;
650 >        COLOR   ciexyz;
651  
652          c_ccvt(ciec, C_CSXY);           /* get xy representation */
653          ciexyz[1] = intensity;
# Line 629 | Line 657 | cvtcolor(      /* convert a CIE XYZ color to RGB */
657   }
658  
659  
660 + static int      /* new spectrum definition? */
661 + newspecdef(C_COLOR *spc)
662 + {
663 +        static LUTAB    spc_tab = LU_SINIT(NULL,free);
664 +        LUENT   *lp = lu_find(&spc_tab, (const char *)spc->client_data);
665 +
666 +        if (lp == NULL)                 /* should never happen */
667 +                return(1);
668 +        if (lp->data == NULL) {         /* new entry */
669 +                lp->key = (char *)spc->client_data;
670 +                lp->data = (char *)malloc(sizeof(C_COLOR));
671 +        } else if (c_equiv(spc, (C_COLOR *)lp->data))
672 +                return(0);              /* unchanged */
673 +
674 +        if (lp->data != NULL)           /* else remember if we can */
675 +                *(C_COLOR *)lp->data = *spc;
676 +        return(1);                      /* good as new */
677 + }
678 +
679 +
680   char *
681 + specolor(       /* check if color has spectra and output accordingly */
682 +        COLOR   radrgb,
683 +        C_COLOR *clr,
684 +        double  intensity
685 + )
686 + {
687 +        static char     spname[128];
688 +        double  mult;
689 +        int     i;
690 +
691 +        if (!(clr->flags & C_CDSPEC)) {         /* not defined spectrally? */
692 +                cvtcolor(radrgb, clr, intensity);
693 +                return("void");
694 +        }
695 +        setcolor(radrgb, intensity, intensity, intensity);
696 +        if (clr->client_data != NULL) {         /* get name if available */
697 +                strcpy(spname, (char *)clr->client_data);
698 +                strcat(spname, "*");            /* make sure it's special */
699 +                if (!newspecdef(clr))           /* output already? */
700 +                        return(spname);
701 +        } else
702 +                strcpy(spname, "spec*");
703 +        c_ccvt(clr, C_CSEFF);                   /* else output spectrum prim */
704 +        fprintf(matfp, "\nvoid spectrum %s\n0\n0\n", spname);
705 +        fprintf(matfp, "%d %d %d", C_CNSS+2, C_CMINWL, C_CMAXWL);
706 +        mult = (C_CNSS*c_dfcolor.eff)/(clr->ssum*clr->eff);
707 +        for (i = 0; i < C_CNSS; i++) {
708 +                if (!((i+1)%6)) fputc('\n', matfp);
709 +                fprintf(matfp, "\t%.5f", clr->ssamp[i]*mult);
710 +        }
711 +        fputc('\n', matfp);
712 +        return(spname);
713 + }
714 +
715 +
716 + char *
717   object(void)                    /* return current object name */
718   {
719          static char     objbuf[64];
720 <        register int    i;
721 <        register char   *cp;
720 >        int     i;
721 >        char    *cp;
722          int     len;
723                                                  /* tracked by obj_handler */
724          i = obj_nnames - sizeof(objbuf)/16;
# Line 653 | Line 737 | object(void)                   /* return current object name */
737  
738   char *
739   addarg(                         /* add argument and advance pointer */
740 <        register char *op,
741 <        register char *arg
740 >        char *op,
741 >        char *arg
742   )
743   {
744          *op = ' ';

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines