ViewVC Help
View File | Revision Log | Show Annotations | Download File | Root Listing
root/radiance/ray/src/cv/rad2mgf.c
(Generate patch)

Comparing ray/src/cv/rad2mgf.c (file contents):
Revision 2.1 by greg, Thu Jul 7 17:30:33 1994 UTC vs.
Revision 2.14 by gwlarson, Fri Sep 4 09:09:58 1998 UTC

# Line 1 | Line 1
1 < /* Copyright (c) 1994 Regents of the University of California */
1 > /* Copyright (c) 1995 Regents of the University of California */
2  
3   #ifndef lint
4   static char SCCSid[] = "$SunId$ LBL";
# Line 8 | Line 8 | static char SCCSid[] = "$SunId$ LBL";
8   * Convert Radiance scene description to MGF
9   */
10  
11 < #include <stdio.h>
11 > #include "standard.h"
12 > #include <ctype.h>
13   #include <string.h>
13 #include "fvect.h"
14   #include "object.h"
15   #include "color.h"
16   #include "lookup.h"
17  
18 + #define C_1SIDEDTHICK   0.005
19 +
20   int     o_face(), o_cone(), o_sphere(), o_ring(), o_cylinder();
21 < int     o_instance(), o_source(), o_illum();
22 < int     o_plastic(), o_metal(), o_glass(), o_mirror(), o_trans(), o_light();
21 > int     o_instance(), o_illum();
22 > int     o_plastic(), o_metal(), o_glass(), o_dielectric(),
23 >        o_mirror(), o_trans(), o_light();
24  
25 < extern void     free();
23 < extern char     *malloc();
25 > extern int      free();
26  
27   LUTAB   rmats = LU_SINIT(free,NULL);            /* defined material table */
28  
29   LUTAB   rdispatch = LU_SINIT(NULL,NULL);        /* function dispatch table */
30  
31 < char    curmat[80];             /* current material */
31 > char    curmat[80];                             /* current material */
32 > char    curobj[128] = "Untitled";               /* current object name */
33  
34 < double  unit_mult = 1.;         /* units multiplier */
34 > double  unit_mult = 1.;                         /* units multiplier */
35  
36 + #define hasmult         (unit_mult < .999 || unit_mult > 1.001)
37  
38 + /*
39 + * Stuff for tracking and reusing vertices:
40 + */
41 +
42 + char    VKFMT[] = "%+16.9e %+16.9e %+16.9e";
43 + #define VKLEN           64
44 +
45 + #define mkvkey(k,v)     sprintf(k, VKFMT, (v)[0], (v)[1], (v)[2])
46 +
47 + #define NVERTS          256
48 +
49 + long    vclock;         /* incremented at each vertex request */
50 +
51 + struct vert {
52 +        long    lused;          /* when last used (0 if unassigned) */
53 +        FVECT   p;              /* track point position only */
54 + } vert[NVERTS];         /* our vertex cache */
55 +
56 + LUTAB   vertab = LU_SINIT(free,NULL);   /* our vertex lookup table */
57 +
58 +
59   main(argc, argv)
60   int     argc;
61   char    **argv;
# Line 57 | Line 82 | char   **argv;
82                                  goto unkopt;
83                          }
84                          break;
85 +                default:
86 +                        goto unkopt;
87                  }
88          init();
89          if (i >= argc)
# Line 85 | Line 112 | char   *inp;
112          register int    c;
113  
114          if (inp == NULL) {
115 <                inp = "the standard input";
115 >                inp = "standard input";
116                  fp = stdin;
117          } else if (inp[0] == '!') {
118                  if ((fp = popen(inp+1, "r")) == NULL) {
# Line 163 | Line 190 | FUNARGS        *fa;
190                          fprintf(stderr, "%s: bad %s \"%s\"\n", typ, id);
191                          exit(1);
192                  }
193 <        } else if (lu_find(&rmats, mod)->data != NULL)  /* make alias */
194 <                newmat(id, mod);
193 >        } else {                                        /* unsupported */
194 >                o_unsupported(mod, typ, id, fa);
195 >                if (lu_find(&rmats, mod)->data != NULL) /* make alias */
196 >                        newmat(id, mod);
197 >        }
198   }
199  
200  
# Line 209 | Line 239 | char   *id;
239   {
240          if (!strcmp(id, curmat))        /* already set? */
241                  return;
242 +        if (!strcmp(id, VOIDID))        /* cannot set */
243 +                return;
244          printf("m %s\n", id);
245          strcpy(curmat, id);
246   }
247  
248  
249 + setobj(id)                      /* set object name to this one */
250 + char    *id;
251 + {
252 +        register char   *cp, *cp2;
253 +        char    *end = NULL;
254 +        int     diff = 0;
255 +                                /* use all but final suffix */
256 +        for (cp = id; *cp; cp++)
257 +                if (*cp == '.')
258 +                        end = cp;
259 +        if (end == NULL)
260 +                end = cp;
261 +                                /* copy to current object */
262 +        cp2 = curobj;
263 +        if (!isalpha(*id)) {    /* start with letter */
264 +                diff = *cp2 != 'O';
265 +                *cp2++ = 'O';
266 +        }
267 +        for (cp = id; cp < end; *cp2++ = *cp++) {
268 +                if (*cp < '!' | *cp > '~')      /* limit to visible chars */
269 +                        *cp = '?';
270 +                diff += *cp != *cp2;
271 +        }
272 +        if (!diff && !*cp2)
273 +                return;
274 +        *cp2 = '\0';
275 +        fputs("o\no ", stdout);
276 +        puts(curobj);
277 + }
278 +
279 +
280   init()                  /* initialize dispatch table and output */
281   {
282 +        lu_init(&vertab, NVERTS);
283          lu_init(&rdispatch, 22);
284          add2dispatch("polygon", o_face);
285          add2dispatch("cone", o_cone);
# Line 231 | Line 295 | init()                 /* initialize dispatch table and output */
295          add2dispatch("metal", o_metal);
296          add2dispatch("metal2", o_metal);
297          add2dispatch("glass", o_glass);
298 +        add2dispatch("dielectric", o_dielectric);
299          add2dispatch("trans", o_trans);
300          add2dispatch("trans2", o_trans);
301          add2dispatch("mirror", o_mirror);
# Line 238 | Line 303 | init()                 /* initialize dispatch table and output */
303          add2dispatch("spotlight", o_light);
304          add2dispatch("glow", o_light);
305          add2dispatch("illum", o_illum);
306 <        puts("# The following was converted from Radiance scene input");
307 <        if (unit_mult < .999 || unit_mult > 1.001)
306 >        puts("# The following was converted from RADIANCE scene input");
307 >        if (hasmult)
308                  printf("xf -s %.4e\n", unit_mult);
309 +        printf("o %s\n", curobj);
310   }
311  
312  
313   uninit()                        /* mark end of MGF file */
314   {
315 <        if (unit_mult < .999 || unit_mult > 1.001)
315 >        puts("o");
316 >        if (hasmult)
317                  puts("xf");
318 <        puts("# End of data converted from Radiance scene input");
318 >        puts("# End of data converted from RADIANCE scene input");
319          lu_done(&rdispatch);
320          lu_done(&rmats);
321 +        lu_done(&vertab);
322   }
323  
324  
325 + clrverts()                      /* clear vertex table */
326 + {
327 +        register int    i;
328 +
329 +        lu_done(&vertab);
330 +        for (i = 0; i < NVERTS; i++)
331 +                vert[i].lused = 0;
332 +        lu_init(&vertab, NVERTS);
333 + }
334 +
335 +
336   add2dispatch(name, func)        /* add function to dispatch table */
337   char    *name;
338   int     (*func)();
# Line 271 | Line 350 | int    (*func)();
350   }
351  
352  
274 char    VKFMT[] = "%+1.9e %+1.9e %+1.9e";
275 #define VKLEN           64
276
277 #define mkvkey(k,v)     sprintf(k, VKFMT, (v)[0], (v)[1], (v)[2])
278
279 #define NVERTS          256
280
281 long    clock;          /* incremented at each vertex request */
282
283 struct vert {
284        long    lused;          /* when last used (0 if unassigned) */
285        FVECT   p;              /* track point position only */
286 } vert[NVERTS];
287
288 LUTAB   vertab = LU_SINIT(free,NULL);   /* our vertex lookup table */
289
290
353   char *
354 < getvertid(vp)                   /* get/set vertex ID for this point */
354 > getvertid(vname, vp)            /* get/set vertex ID for this point */
355 > char    *vname;
356   FVECT   vp;
357   {
358 <        static char     vname[6];
296 <        char    vkey[VKLEN];
358 >        static char     vkey[VKLEN];
359          register LUENT  *lp;
360          register int    i, vndx;
361  
362 <        if (!vertab.tsiz && !lu_init(&vertab, NVERTS))
301 <                goto memerr;
302 <        clock++;                        /* increment counter */
362 >        vclock++;                       /* increment counter */
363          mkvkey(vkey, vp);
364          if ((lp = lu_find(&vertab, vkey)) == NULL)
365                  goto memerr;
# Line 319 | Line 379 | FVECT  vp;
379                          mkvkey(vkey, vert[vndx].p);
380                          lu_delete(&vertab, vkey);
381                  }
382 <                vert[vndx].lused = clock;                       /* assign it */
383 <                VCOPY(vert[vndx].p, vp);
324 <                printf("v v%d =\np %.15g %.15g %.15g\n",        /* print it */
382 >                VCOPY(vert[vndx].p, vp);                        /* assign it */
383 >                printf("v v%d =\n\tp %.15g %.15g %.15g\n",      /* print it */
384                                  vndx, vp[0], vp[1], vp[2]);
385                  lp->data = (char *)&vert[vndx];                 /* set it */
386          } else
387                  vndx = (struct vert *)lp->data - vert;
388 +        vert[vndx].lused = vclock;              /* record this use */
389          sprintf(vname, "v%d", vndx);
390          return(vname);
391   memerr:
# Line 335 | Line 395 | memerr:
395  
396  
397   int
398 + o_unsupported(mod, typ, id, fa)         /* mark unsupported primitive */
399 + char    *mod, *typ, *id;
400 + FUNARGS *fa;
401 + {
402 +        register int    i;
403 +
404 +        fputs("\n# Unsupported RADIANCE primitive:\n", stdout);
405 +        printf("# %s %s %s", mod, typ, id);
406 +        printf("\n# %d", fa->nsargs);
407 +        for (i = 0; i < fa->nsargs; i++)
408 +                printf(" %s", fa->sarg[i]);
409 + #ifdef IARGS
410 +        printf("\n# %d", fa->niargs);
411 +        for (i = 0; i < fa->niargs; i++)
412 +                printf(" %ld", fa->iarg[i]);
413 + #else
414 +        fputs("\n# 0", stdout);
415 + #endif
416 +        printf("\n# %d", fa->nfargs);
417 +        for (i = 0; i < fa->nfargs; i++)
418 +                printf(" %g", fa->farg[i]);
419 +        fputs("\n\n", stdout);
420 +        return(0);
421 + }
422 +
423 +
424 + int
425   o_face(mod, typ, id, fa)                /* print out a polygon */
426   char    *mod, *typ, *id;
427   FUNARGS *fa;
428   {
429 <        char    entbuf[512];
430 <        register char   *cp1, *cp2;
429 >        char    entbuf[2048];
430 >        register char   *cp;
431          register int    i;
432  
433          if (fa->nfargs < 9 | fa->nfargs % 3)
434                  return(-1);
435          setmat(mod);
436 <        printf("o %s\n", id);
437 <        cp1 = entbuf;
438 <        *cp1++ = 'f';
436 >        setobj(id);
437 >        cp = entbuf;
438 >        *cp++ = 'f';
439          for (i = 0; i < fa->nfargs; i += 3) {
440 <                cp2 = getvertid(fa->farg + i);
441 <                *cp1++ = ' ';
442 <                while ((*cp1 = *cp2++))
443 <                        cp1++;
440 >                *cp++ = ' ';
441 >                getvertid(cp, fa->farg + i);
442 >                while (*cp)
443 >                        cp++;
444          }
445          puts(entbuf);
359        puts("o");
446          return(0);
447   }
448  
# Line 366 | Line 452 | o_cone(mod, typ, id, fa)       /* print out a cone */
452   char    *mod, *typ, *id;
453   register FUNARGS        *fa;
454   {
455 +        char    v1[6], v2[6];
456 +
457          if (fa->nfargs != 8)
458                  return(-1);
459          setmat(mod);
460 <        printf("o %s\n", id);
461 <        printf("v cv1 =\np %.12g %.12g %.12g\n",
462 <                        fa->farg[0], fa->farg[1], fa->farg[2]);
375 <        printf("v cv2 =\np %.12g %.12g %.12g\n",
376 <                        fa->farg[3], fa->farg[4], fa->farg[5]);
460 >        setobj(id);
461 >        getvertid(v1, fa->farg);
462 >        getvertid(v2, fa->farg + 3);
463          if (typ[1] == 'u')                      /* cup -> inverted cone */
464 <                printf("cone cv1 %.12g cv2 %.12g\n",
465 <                                -fa->farg[6], -fa->farg[7]);
464 >                printf("cone %s %.12g %s %.12g\n",
465 >                                v1, -fa->farg[6], v2, -fa->farg[7]);
466          else
467 <                printf("cone cv1 %.12g cv2 %.12g\n",
468 <                                fa->farg[6], fa->farg[7]);
383 <        puts("o");
467 >                printf("cone %s %.12g %s %.12g\n",
468 >                                v1, fa->farg[6], v2, fa->farg[7]);
469          return(0);
470   }
471  
# Line 390 | Line 475 | o_sphere(mod, typ, id, fa)     /* print out a sphere */
475   char    *mod, *typ, *id;
476   register FUNARGS        *fa;
477   {
478 +        char    cent[6];
479 +
480          if (fa->nfargs != 4)
481                  return(-1);
482          setmat(mod);
483 <        printf("o %s\n", id);
484 <        printf("v cent =\np %.12g %.12g %.12g\n",
485 <                        fa->farg[0], fa->farg[1], fa->farg[2]);
399 <        printf("sph cent %.12g\n", typ[0]=='b' ? -fa->farg[3] : fa->farg[3]);
400 <        puts("o");
483 >        setobj(id);
484 >        printf("sph %s %.12g\n", getvertid(cent, fa->farg),
485 >                        typ[0]=='b' ? -fa->farg[3] : fa->farg[3]);
486          return(0);
487   }
488  
# Line 407 | Line 492 | o_cylinder(mod, typ, id, fa)   /* print out a cylinder *
492   char    *mod, *typ, *id;
493   register FUNARGS        *fa;
494   {
495 +        char    v1[6], v2[6];
496 +
497          if (fa->nfargs != 7)
498                  return(-1);
499          setmat(mod);
500 <        printf("o %s\n", id);
501 <        printf("v cv1 =\np %.12g %.12g %.12g\n",
502 <                        fa->farg[0], fa->farg[1], fa->farg[2]);
503 <        printf("v cv2 =\np %.12g %.12g %.12g\n",
504 <                        fa->farg[3], fa->farg[4], fa->farg[5]);
418 <        printf("cyl cv1 %.12g cv2\n",
419 <                        typ[0]=='t' ? -fa->farg[6] : fa->farg[6]);
420 <        puts("o");
500 >        setobj(id);
501 >        getvertid(v1, fa->farg);
502 >        getvertid(v2, fa->farg + 3);
503 >        printf("cyl %s %.12g %s\n", v1,
504 >                        typ[0]=='t' ? -fa->farg[6] : fa->farg[6], v2);
505          return(0);
506   }
507  
# Line 430 | Line 514 | register FUNARGS       *fa;
514          if (fa->nfargs != 8)
515                  return(-1);
516          setmat(mod);
517 <        printf("o %s\n", id);
518 <        printf("v cent =\np %.12g %.12g %.12g\n",
517 >        setobj(id);
518 >        printf("v cent =\n\tp %.12g %.12g %.12g\n",
519                          fa->farg[0], fa->farg[1], fa->farg[2]);
520 <        printf("n %.12g %.12g %.12g\n",
520 >        printf("\tn %.12g %.12g %.12g\n",
521                          fa->farg[3], fa->farg[4], fa->farg[5]);
522          if (fa->farg[6] < fa->farg[7])
523                  printf("ring cent %.12g %.12g\n",
# Line 441 | Line 525 | register FUNARGS       *fa;
525          else
526                  printf("ring cent %.12g %.12g\n",
527                                  fa->farg[7], fa->farg[6]);
444        puts("o");
528          return(0);
529   }
530  
# Line 451 | Line 534 | o_instance(mod, typ, id, fa)   /* convert an instance */
534   char    *mod, *typ, *id;
535   FUNARGS *fa;
536   {
537 <        return(0);              /* this is too damned difficult! */
537 >        register int    i;
538 >        register char   *cp;
539 >        char    *start = NULL, *end = NULL;
540 >        /*
541 >         * We don't really know how to do this, so we just create
542 >         * a reference to an undefined MGF file and it's the user's
543 >         * responsibility to create this file and put the appropriate
544 >         * stuff into it.
545 >         */
546 >        if (fa->nsargs < 1)
547 >                return(-1);
548 >        setmat(mod);                    /* only works if surfaces are void */
549 >        setobj(id);
550 >        for (cp = fa->sarg[0]; *cp; cp++)       /* construct MGF file name */
551 >                if (*cp == '/')
552 >                        start = cp+1;
553 >                else if (*cp == '.')
554 >                        end = cp;
555 >        if (start == NULL)
556 >                start = fa->sarg[0];
557 >        if (end == NULL || start >= end)
558 >                end = cp;
559 >        fputs("i ", stdout);                    /* print include entity */
560 >        for (cp = start; cp < end; cp++)
561 >                putchar(*cp);
562 >        fputs(".mgf", stdout);                  /* add MGF suffix */
563 >        for (i = 1; i < fa->nsargs; i++) {      /* add transform */
564 >                putchar(' ');
565 >                fputs(fa->sarg[i], stdout);
566 >        }
567 >        putchar('\n');
568 >        clrverts();                     /* vertex id's no longer reliable */
569 >        return(0);
570   }
571  
572  
573   int
459 o_source(mod, typ, id, fa)      /* convert a source */
460 char    *mod, *typ, *id;
461 FUNARGS *fa;
462 {
463        return(0);              /* there is no MGF equivalent! */
464 }
465
466
467 int
574   o_illum(mod, typ, id, fa)       /* convert an illum material */
575   char    *mod, *typ, *id;
576   FUNARGS *fa;
# Line 475 | Line 581 | FUNARGS        *fa;
581          }
582                                          /* else create invisible material */
583          newmat(id, NULL);
584 <        puts("ts 1 0");
584 >        puts("\tts 1 0");
585          return(0);
586   }
587  
# Line 493 | Line 599 | register FUNARGS       *fa;
599          newmat(id, NULL);
600          rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2];
601          rgb_cie(cxyz, rrgb);
602 <        puts("c");                              /* put diffuse component */
602 >        puts("\tc");                            /* put diffuse component */
603          d = cxyz[0] + cxyz[1] + cxyz[2];
604          if (d > FTINY)
605 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
606 <        printf("rd %.4f\n", cxyz[1]*(1. - fa->farg[3]));
607 <        puts("c");                              /* put specular component */
608 <        printf("rs %.4f %.4f\n", fa->farg[3],
609 <                        typ[7]=='2' ? .5*(fa->farg[4] + fa->farg[5]) :
610 <                                        fa->farg[4]);
605 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
606 >        printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3]));
607 >        if (fa->farg[3] > FTINY) {              /* put specular component */
608 >                puts("\tc");
609 >                printf("\trs %.4f %.4f\n", fa->farg[3],
610 >                                typ[7]=='2' ? .5*(fa->farg[4] + fa->farg[5]) :
611 >                                                fa->farg[4]);
612 >        }
613          return(0);
614   }
615  
# Line 519 | Line 627 | register FUNARGS       *fa;
627          newmat(id, NULL);
628          rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2];
629          rgb_cie(cxyz, rrgb);
630 <        puts("c");                              /* put diffuse component */
630 >        puts("\tc");                            /* put diffuse component */
631          d = cxyz[0] + cxyz[1] + cxyz[2];
632          if (d > FTINY)
633 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
634 <        printf("rd %.4f\n", cxyz[1]*(1. - fa->farg[3]));
633 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
634 >        printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3]));
635                                                  /* put specular component */
636 <        printf("rs %.4f %.4f\n", cxyz[1]*fa->farg[3],
636 >        printf("\trs %.4f %.4f\n", cxyz[1]*fa->farg[3],
637                          typ[5]=='2' ? .5*(fa->farg[4] + fa->farg[5]) :
638                                          fa->farg[4]);
639          return(0);
# Line 546 | Line 654 | register FUNARGS       *fa;
654          newmat(id, NULL);
655          if (fa->nfargs == 4)
656                  nrfr = fa->farg[3];
657 +        printf("\tir %f 0\n", nrfr);
658          F = (1. - nrfr)/(1. + nrfr);            /* use normal incidence */
659          F *= F;
660          for (i = 0; i < 3; i++) {
661 <                rrgb[i] = (1. - F)*(1. - F)/(1. - F*F*fa->farg[i]*fa->farg[i]);
553 <                trgb[i] = F * (1. + (1. - 2.*F)*fa->farg[i]) /
661 >                trgb[i] = fa->farg[i] * (1. - F)*(1. - F) /
662                                  (1. - F*F*fa->farg[i]*fa->farg[i]);
663 +                rrgb[i] = F * (1. + (1. - 2.*F)*fa->farg[i]) /
664 +                                (1. - F*F*fa->farg[i]*fa->farg[i]);
665          }
666          rgb_cie(cxyz, rrgb);                    /* put reflected component */
667 <        puts("c");
667 >        puts("\tc");
668          d = cxyz[0] + cxyz[1] + cxyz[2];
669          if (d > FTINY)
670 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
671 <        printf("rs %.4f 0\n", cxyz[1]);
670 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
671 >        printf("\trs %.4f 0\n", cxyz[1]);
672          rgb_cie(cxyz, trgb);                    /* put transmitted component */
673 <        puts("c");
673 >        puts("\tc");
674          d = cxyz[0] + cxyz[1] + cxyz[2];
675          if (d > FTINY)
676 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
677 <        printf("ts %.4f 0\n", cxyz[1]);
676 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
677 >        printf("\tts %.4f 0\n", cxyz[1]);
678          return(0);
679   }
680  
681  
682   int
683 + o_dielectric(mod, typ, id, fa)  /* convert a dielectric material */
684 + char    *mod, *typ, *id;
685 + register FUNARGS        *fa;
686 + {
687 +        COLOR   cxyz, trgb;
688 +        double  F, d;
689 +        register int    i;
690 +
691 +        if (fa->nfargs != 5)
692 +                return(-1);
693 +        newmat(id, NULL);
694 +        F = (1. - fa->farg[3])/(1. + fa->farg[3]);      /* normal incidence */
695 +        F *= F;
696 +        for (i = 0; i < 3; i++)
697 +                trgb[i] = (1. - F)*pow(fa->farg[i], C_1SIDEDTHICK/unit_mult);
698 +        printf("\tir %f 0\n", fa->farg[3]);     /* put index of refraction */
699 +        printf("\tsides 1\n");
700 +        puts("\tc");                            /* put reflected component */
701 +        printf("\trs %.4f 0\n", F);
702 +        rgb_cie(cxyz, trgb);                    /* put transmitted component */
703 +        puts("\tc");
704 +        d = cxyz[0] + cxyz[1] + cxyz[2];
705 +        if (d > FTINY)
706 +                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
707 +        printf("\tts %.4f 0\n", cxyz[1]);
708 +        return(0);
709 + }
710 +
711 +
712 + int
713   o_mirror(mod, typ, id, fa)      /* convert a mirror material */
714   char    *mod, *typ, *id;
715   register FUNARGS        *fa;
# Line 586 | Line 726 | register FUNARGS       *fa;
726          newmat(id, NULL);
727          rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2];
728          rgb_cie(cxyz, rrgb);
729 <        puts("c");                              /* put specular component */
729 >        puts("\tc");                            /* put specular component */
730          d = cxyz[0] + cxyz[1] + cxyz[2];
731          if (d > FTINY)
732 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
733 <        printf("rs %.4f 0\n", cxyz[1]);
732 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
733 >        printf("\trs %.4f 0\n", cxyz[1]);
734          return(0);
735   }
736  
# Line 619 | Line 759 | register FUNARGS       *fa;
759          newmat(id, NULL);
760          rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2];
761          rgb_cie(cxyz, rrgb);
762 <        puts("c");                              /* put transmitted diffuse */
762 >        puts("\tc");                            /* put transmitted diffuse */
763          d = cxyz[0] + cxyz[1] + cxyz[2];
764          if (d > FTINY)
765 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
766 <        printf("td %.4f\n", cxyz[1]*trans*(1. - fa->farg[3])*(1. - tspec));
765 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
766 >        printf("\ttd %.4f\n", cxyz[1]*trans*(1. - fa->farg[3])*(1. - tspec));
767                                                  /* put transmitted specular */
768 <        printf("ts %.4f %.4f\n", cxyz[1]*trans*tspec*(1. - fa->farg[3]), rough);
768 >        printf("\tts %.4f %.4f\n", cxyz[1]*trans*tspec*(1. - fa->farg[3]), rough);
769                                                  /* put reflected diffuse */
770 <        printf("rd %.4f\n", cxyz[1]*(1. - fa->farg[3])*(1. - trans));
771 <        puts("c");                              /* put reflected specular */
772 <        printf("rs %.4f %.4f\n", fa->farg[3], rough);
770 >        printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])*(1. - trans));
771 >        puts("\tc");                            /* put reflected specular */
772 >        printf("\trs %.4f %.4f\n", fa->farg[3], rough);
773          return(0);
774   }
775  
# Line 648 | Line 788 | register FUNARGS       *fa;
788          rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2];
789          rgb_cie(cxyz, rrgb);
790          d = cxyz[0] + cxyz[1] + cxyz[2];
791 <        puts("c");
791 >        puts("\tc");
792          if (d > FTINY)
793 <                printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
794 <        printf("ed %.4g\n", cxyz[1]);
793 >                printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d);
794 >        printf("\ted %.4g\n", cxyz[1]*(PI*WHTEFFICACY));
795          return(0);
796   }

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines