--- ray/src/cv/rad2mgf.c 1994/07/07 17:30:33 2.1 +++ ray/src/cv/rad2mgf.c 2005/12/28 18:35:42 2.24 @@ -1,39 +1,89 @@ -/* Copyright (c) 1994 Regents of the University of California */ - #ifndef lint -static char SCCSid[] = "$SunId$ LBL"; +static const char RCSid[] = "$Id: rad2mgf.c,v 2.24 2005/12/28 18:35:42 greg Exp $"; #endif - /* * Convert Radiance scene description to MGF */ -#include +#include #include -#include "fvect.h" +#include + +#include "platform.h" +#include "rtmath.h" +#include "rtio.h" +#include "rtprocess.h" #include "object.h" #include "color.h" #include "lookup.h" -int o_face(), o_cone(), o_sphere(), o_ring(), o_cylinder(); -int o_instance(), o_source(), o_illum(); -int o_plastic(), o_metal(), o_glass(), o_mirror(), o_trans(), o_light(); +#define C_1SIDEDTHICK 0.005 -extern void free(); -extern char *malloc(); LUTAB rmats = LU_SINIT(free,NULL); /* defined material table */ LUTAB rdispatch = LU_SINIT(NULL,NULL); /* function dispatch table */ -char curmat[80]; /* current material */ +char curmat[80]; /* current material */ +char curobj[128] = "Untitled"; /* current object name */ -double unit_mult = 1.; /* units multiplier */ +double unit_mult = 1.; /* units multiplier */ +#define hasmult (unit_mult < .999 || unit_mult > 1.001) -main(argc, argv) -int argc; -char **argv; +/* + * Stuff for tracking and reusing vertices: + */ + +char VKFMT[] = "%+16.9e %+16.9e %+16.9e"; +#define VKLEN 64 + +#define mkvkey(k,v) sprintf(k, VKFMT, (v)[0], (v)[1], (v)[2]) + +#define NVERTS 256 + +long vclock; /* incremented at each vertex request */ + +struct vert { + long lused; /* when last used (0 if unassigned) */ + FVECT p; /* track point position only */ +} vert[NVERTS]; /* our vertex cache */ + +LUTAB vertab = LU_SINIT(free,NULL); /* our vertex lookup table */ + +void rad2mgf(char *inp); +void cvtprim(char *inp, char *mod, char *typ, char *id, FUNARGS *fa); +void newmat(char *id, char *alias); +void setmat(char *id); +void setobj(char *id); +void init(void); +void uninit(void); +void clrverts(void); +void unspace(char *s); +void add2dispatch(char *name, int (*func)()); +char *getvertid(char *vname, FVECT vp); +int o_unsupported(char *mod, char *typ, char *id, FUNARGS *fa); +int o_face(char *mod, char *typ, char *id, FUNARGS *fa); +int o_cone(char *mod, char *typ, char *id, FUNARGS *fa); +int o_sphere(char *mod, char *typ, char *id, FUNARGS *fa); +int o_cylinder(char *mod, char *typ, char *id, FUNARGS *fa); +int o_ring(char *mod, char *typ, char *id, FUNARGS *fa); +int o_instance(char *mod, char *typ, char *id, FUNARGS *fa); +int o_illum(char *mod, char *typ, char *id, FUNARGS *fa); +int o_plastic(char *mod, char *typ, char *id, FUNARGS *fa); +int o_metal(char *mod, char *typ, char *id, FUNARGS *fa); +int o_glass(char *mod, char *typ, char *id, FUNARGS *fa); +int o_dielectric(char *mod, char *typ, char *id, FUNARGS *fa); +int o_mirror(char *mod, char *typ, char *id, FUNARGS *fa); +int o_trans(char *mod, char *typ, char *id, FUNARGS *fa); +int o_light(char *mod, char *typ, char *id, FUNARGS *fa); + + +int +main( + int argc, + char **argv +) { int i; @@ -57,6 +107,8 @@ char **argv; goto unkopt; } break; + default: + goto unkopt; } init(); if (i >= argc) @@ -72,20 +124,18 @@ unkopt: } -rad2mgf(inp) /* convert a Radiance file to MGF */ -char *inp; +void +rad2mgf( /* convert a Radiance file to MGF */ + char *inp +) { -#define mod buf -#define typ (buf+128) -#define id (buf+256) -#define alias (buf+384) - char buf[512]; + char mod[128], typ[32], id[128], alias[128]; FUNARGS fa; register FILE *fp; register int c; if (inp == NULL) { - inp = "the standard input"; + inp = "standard input"; fp = stdin; } else if (inp[0] == '!') { if ((fp = popen(inp+1, "r")) == NULL) { @@ -118,14 +168,19 @@ char *inp; break; default: /* Radiance primitive */ ungetc(c, fp); - if (fscanf(fp, "%s %s %s", mod, typ, id) != 3) { + if (fgetword(mod, sizeof(mod), fp) == NULL || + fgetword(typ, sizeof(typ), fp) == NULL || + fgetword(id, sizeof(id), fp) == NULL) { fputs(inp, stderr); fputs(": unexpected EOF\n", stderr); exit(1); } + unspace(mod); + unspace(id); if (!strcmp(typ, "alias")) { strcpy(alias, "EOF"); - fscanf(fp, "%s", alias); + fgetword(alias, sizeof(alias), fp); + unspace(alias); newmat(id, alias); } else { if (!readfargs(&fa, fp)) { @@ -144,33 +199,52 @@ char *inp; pclose(fp); else fclose(fp); -#undef mod -#undef typ -#undef id -#undef alias } -cvtprim(inp, mod, typ, id, fa) /* process Radiance primitive */ -char *inp, *mod, *typ, *id; -FUNARGS *fa; +void +unspace( /* replace spaces with underscores in s */ + char *s +) { + while (*s) { + if (isspace(*s)) + *s = '_'; + ++s; + } +} + + +void +cvtprim( /* process Radiance primitive */ + char *inp, + char *mod, + char *typ, + char *id, + FUNARGS *fa +) +{ int (*df)(); df = (int (*)())lu_find(&rdispatch, typ)->data; if (df != NULL) { /* convert */ if ((*df)(mod, typ, id, fa) < 0) { - fprintf(stderr, "%s: bad %s \"%s\"\n", typ, id); + fprintf(stderr, "%s: bad %s \"%s\"\n", "rad2mgf", typ, id); exit(1); } - } else if (lu_find(&rmats, mod)->data != NULL) /* make alias */ - newmat(id, mod); + } else { /* unsupported */ + o_unsupported(mod, typ, id, fa); + if (lu_find(&rmats, mod)->data != NULL) /* make alias */ + newmat(id, mod); + } } -newmat(id, alias) /* add a modifier to the alias list */ -char *id; -char *alias; +void +newmat( /* add a modifier to the alias list */ + char *id, + char *alias +) { register LUENT *lp, *lpa; @@ -204,18 +278,57 @@ memerr: } -setmat(id) /* set material to this one */ -char *id; +void +setmat( /* set material to this one */ + char *id +) { if (!strcmp(id, curmat)) /* already set? */ return; + if (!strcmp(id, VOIDID)) /* cannot set */ + return; printf("m %s\n", id); strcpy(curmat, id); } -init() /* initialize dispatch table and output */ +void +setobj( /* set object name to this one */ + char *id +) { + register char *cp, *cp2; + char *end = NULL; + int diff = 0; + /* use all but final suffix */ + for (cp = id; *cp; cp++) + if (*cp == '.') + end = cp; + if (end == NULL) + end = cp; + /* copy to current object */ + cp2 = curobj; + if (!isalpha(*id)) { /* start with letter */ + diff = *cp2 != 'O'; + *cp2++ = 'O'; + } + for (cp = id; cp < end; *cp2++ = *cp++) { + if ((*cp < '!') | (*cp > '~')) /* limit to visible chars */ + *cp = '?'; + diff += *cp != *cp2; + } + if (!diff && !*cp2) + return; + *cp2 = '\0'; + fputs("o\no ", stdout); + puts(curobj); +} + + +void +init(void) /* initialize dispatch table and output */ +{ + lu_init(&vertab, NVERTS); lu_init(&rdispatch, 22); add2dispatch("polygon", o_face); add2dispatch("cone", o_cone); @@ -226,11 +339,13 @@ init() /* initialize dispatch table and output */ add2dispatch("tube", o_cylinder); add2dispatch("ring", o_ring); add2dispatch("instance", o_instance); + add2dispatch("mesh", o_instance); add2dispatch("plastic", o_plastic); add2dispatch("plastic2", o_plastic); add2dispatch("metal", o_metal); add2dispatch("metal2", o_metal); add2dispatch("glass", o_glass); + add2dispatch("dielectric", o_dielectric); add2dispatch("trans", o_trans); add2dispatch("trans2", o_trans); add2dispatch("mirror", o_mirror); @@ -238,26 +353,44 @@ init() /* initialize dispatch table and output */ add2dispatch("spotlight", o_light); add2dispatch("glow", o_light); add2dispatch("illum", o_illum); - puts("# The following was converted from Radiance scene input"); - if (unit_mult < .999 || unit_mult > 1.001) + puts("# The following was converted from RADIANCE scene input"); + if (hasmult) printf("xf -s %.4e\n", unit_mult); + printf("o %s\n", curobj); } -uninit() /* mark end of MGF file */ +void +uninit(void) /* mark end of MGF file */ { - if (unit_mult < .999 || unit_mult > 1.001) + puts("o"); + if (hasmult) puts("xf"); - puts("# End of data converted from Radiance scene input"); + puts("# End of data converted from RADIANCE scene input"); lu_done(&rdispatch); lu_done(&rmats); + lu_done(&vertab); } -add2dispatch(name, func) /* add function to dispatch table */ -char *name; -int (*func)(); +void +clrverts(void) /* clear vertex table */ { + register int i; + + lu_done(&vertab); + for (i = 0; i < NVERTS; i++) + vert[i].lused = 0; + lu_init(&vertab, NVERTS); +} + + +void +add2dispatch( /* add function to dispatch table */ + char *name, + int (*func)() +) +{ register LUENT *lp; lp = lu_find(&rdispatch, name); @@ -271,35 +404,17 @@ int (*func)(); } -char VKFMT[] = "%+1.9e %+1.9e %+1.9e"; -#define VKLEN 64 - -#define mkvkey(k,v) sprintf(k, VKFMT, (v)[0], (v)[1], (v)[2]) - -#define NVERTS 256 - -long clock; /* incremented at each vertex request */ - -struct vert { - long lused; /* when last used (0 if unassigned) */ - FVECT p; /* track point position only */ -} vert[NVERTS]; - -LUTAB vertab = LU_SINIT(free,NULL); /* our vertex lookup table */ - - char * -getvertid(vp) /* get/set vertex ID for this point */ -FVECT vp; +getvertid( /* get/set vertex ID for this point */ + char *vname, + FVECT vp +) { - static char vname[6]; - char vkey[VKLEN]; + static char vkey[VKLEN]; register LUENT *lp; register int i, vndx; - if (!vertab.tsiz && !lu_init(&vertab, NVERTS)) - goto memerr; - clock++; /* increment counter */ + vclock++; /* increment counter */ mkvkey(vkey, vp); if ((lp = lu_find(&vertab, vkey)) == NULL) goto memerr; @@ -319,13 +434,13 @@ FVECT vp; mkvkey(vkey, vert[vndx].p); lu_delete(&vertab, vkey); } - vert[vndx].lused = clock; /* assign it */ - VCOPY(vert[vndx].p, vp); - printf("v v%d =\np %.15g %.15g %.15g\n", /* print it */ + VCOPY(vert[vndx].p, vp); /* assign it */ + printf("v v%d =\n\tp %.15g %.15g %.15g\n", /* print it */ vndx, vp[0], vp[1], vp[2]); lp->data = (char *)&vert[vndx]; /* set it */ } else vndx = (struct vert *)lp->data - vert; + vert[vndx].lused = vclock; /* record this use */ sprintf(vname, "v%d", vndx); return(vname); memerr: @@ -335,105 +450,152 @@ memerr: int -o_face(mod, typ, id, fa) /* print out a polygon */ -char *mod, *typ, *id; -FUNARGS *fa; +o_unsupported( /* mark unsupported primitive */ + char *mod, + char *typ, + char *id, + FUNARGS *fa +) { - char entbuf[512]; - register char *cp1, *cp2; register int i; - if (fa->nfargs < 9 | fa->nfargs % 3) + fputs("\n# Unsupported RADIANCE primitive:\n", stdout); + printf("# %s %s %s", mod, typ, id); + printf("\n# %d", fa->nsargs); + for (i = 0; i < fa->nsargs; i++) + printf(" %s", fa->sarg[i]); +#ifdef IARGS + printf("\n# %d", fa->niargs); + for (i = 0; i < fa->niargs; i++) + printf(" %ld", fa->iarg[i]); +#else + fputs("\n# 0", stdout); +#endif + printf("\n# %d", fa->nfargs); + for (i = 0; i < fa->nfargs; i++) + printf(" %g", fa->farg[i]); + fputs("\n\n", stdout); + return(0); +} + + +int +o_face( /* print out a polygon */ + char *mod, + char *typ, + char *id, + FUNARGS *fa +) +{ + char entbuf[2048], *linestart; + register char *cp; + register int i; + + if ((fa->nfargs < 9) | (fa->nfargs % 3)) return(-1); setmat(mod); - printf("o %s\n", id); - cp1 = entbuf; - *cp1++ = 'f'; + setobj(id); + cp = linestart = entbuf; + *cp++ = 'f'; for (i = 0; i < fa->nfargs; i += 3) { - cp2 = getvertid(fa->farg + i); - *cp1++ = ' '; - while ((*cp1 = *cp2++)) - cp1++; + *cp++ = ' '; + if (cp - linestart > 72) { + *cp++ = '\\'; *cp++ = '\n'; + linestart = cp; + *cp++ = ' '; *cp++ = ' '; + } + getvertid(cp, fa->farg + i); + while (*cp) + cp++; } puts(entbuf); - puts("o"); return(0); } int -o_cone(mod, typ, id, fa) /* print out a cone */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_cone( /* print out a cone */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { + char v1[6], v2[6]; + if (fa->nfargs != 8) return(-1); setmat(mod); - printf("o %s\n", id); - printf("v cv1 =\np %.12g %.12g %.12g\n", - fa->farg[0], fa->farg[1], fa->farg[2]); - printf("v cv2 =\np %.12g %.12g %.12g\n", - fa->farg[3], fa->farg[4], fa->farg[5]); + setobj(id); + getvertid(v1, fa->farg); + getvertid(v2, fa->farg + 3); if (typ[1] == 'u') /* cup -> inverted cone */ - printf("cone cv1 %.12g cv2 %.12g\n", - -fa->farg[6], -fa->farg[7]); + printf("cone %s %.12g %s %.12g\n", + v1, -fa->farg[6], v2, -fa->farg[7]); else - printf("cone cv1 %.12g cv2 %.12g\n", - fa->farg[6], fa->farg[7]); - puts("o"); + printf("cone %s %.12g %s %.12g\n", + v1, fa->farg[6], v2, fa->farg[7]); return(0); } int -o_sphere(mod, typ, id, fa) /* print out a sphere */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_sphere( /* print out a sphere */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { + char cent[6]; + if (fa->nfargs != 4) return(-1); setmat(mod); - printf("o %s\n", id); - printf("v cent =\np %.12g %.12g %.12g\n", - fa->farg[0], fa->farg[1], fa->farg[2]); - printf("sph cent %.12g\n", typ[0]=='b' ? -fa->farg[3] : fa->farg[3]); - puts("o"); + setobj(id); + printf("sph %s %.12g\n", getvertid(cent, fa->farg), + typ[0]=='b' ? -fa->farg[3] : fa->farg[3]); return(0); } int -o_cylinder(mod, typ, id, fa) /* print out a cylinder */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_cylinder( /* print out a cylinder */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { + char v1[6], v2[6]; + if (fa->nfargs != 7) return(-1); setmat(mod); - printf("o %s\n", id); - printf("v cv1 =\np %.12g %.12g %.12g\n", - fa->farg[0], fa->farg[1], fa->farg[2]); - printf("v cv2 =\np %.12g %.12g %.12g\n", - fa->farg[3], fa->farg[4], fa->farg[5]); - printf("cyl cv1 %.12g cv2\n", - typ[0]=='t' ? -fa->farg[6] : fa->farg[6]); - puts("o"); + setobj(id); + getvertid(v1, fa->farg); + getvertid(v2, fa->farg + 3); + printf("cyl %s %.12g %s\n", v1, + typ[0]=='t' ? -fa->farg[6] : fa->farg[6], v2); return(0); } int -o_ring(mod, typ, id, fa) /* print out a ring */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_ring( /* print out a ring */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { if (fa->nfargs != 8) return(-1); setmat(mod); - printf("o %s\n", id); - printf("v cent =\np %.12g %.12g %.12g\n", + setobj(id); + printf("v cent =\n\tp %.12g %.12g %.12g\n", fa->farg[0], fa->farg[1], fa->farg[2]); - printf("n %.12g %.12g %.12g\n", + printf("\tn %.12g %.12g %.12g\n", fa->farg[3], fa->farg[4], fa->farg[5]); if (fa->farg[6] < fa->farg[7]) printf("ring cent %.12g %.12g\n", @@ -441,49 +603,80 @@ register FUNARGS *fa; else printf("ring cent %.12g %.12g\n", fa->farg[7], fa->farg[6]); - puts("o"); return(0); } int -o_instance(mod, typ, id, fa) /* convert an instance */ -char *mod, *typ, *id; -FUNARGS *fa; +o_instance( /* convert an instance (or mesh) */ + char *mod, + char *typ, + char *id, + FUNARGS *fa +) { - return(0); /* this is too damned difficult! */ + register int i; + register char *cp; + char *start = NULL, *end = NULL; + /* + * We don't really know how to do this, so we just create + * a reference to an undefined MGF file and it's the user's + * responsibility to create this file and put the appropriate + * stuff into it. + */ + if (fa->nsargs < 1) + return(-1); + setmat(mod); /* only works if surfaces are void */ + setobj(id); + for (cp = fa->sarg[0]; *cp; cp++) /* construct MGF file name */ + if (*cp == '/') + start = cp+1; + else if (*cp == '.') + end = cp; + if (start == NULL) + start = fa->sarg[0]; + if (end == NULL || start >= end) + end = cp; + fputs("i ", stdout); /* print include entity */ + for (cp = start; cp < end; cp++) + putchar(*cp); + fputs(".mgf", stdout); /* add MGF suffix */ + for (i = 1; i < fa->nsargs; i++) { /* add transform */ + putchar(' '); + fputs(fa->sarg[i], stdout); + } + putchar('\n'); + clrverts(); /* vertex id's no longer reliable */ + return(0); } int -o_source(mod, typ, id, fa) /* convert a source */ -char *mod, *typ, *id; -FUNARGS *fa; +o_illum( /* convert an illum material */ + char *mod, + char *typ, + char *id, + FUNARGS *fa +) { - return(0); /* there is no MGF equivalent! */ -} - - -int -o_illum(mod, typ, id, fa) /* convert an illum material */ -char *mod, *typ, *id; -FUNARGS *fa; -{ if (fa->nsargs == 1 && strcmp(fa->sarg[0], VOIDID)) { newmat(id, fa->sarg[0]); /* just create alias */ return(0); } /* else create invisible material */ newmat(id, NULL); - puts("ts 1 0"); + puts("\tts 1 0"); return(0); } int -o_plastic(mod, typ, id, fa) /* convert a plastic material */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_plastic( /* convert a plastic material */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { COLOR cxyz, rrgb; double d; @@ -493,23 +686,28 @@ register FUNARGS *fa; newmat(id, NULL); rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2]; rgb_cie(cxyz, rrgb); - puts("c"); /* put diffuse component */ + puts("\tc"); /* put diffuse component */ d = cxyz[0] + cxyz[1] + cxyz[2]; if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("rd %.4f\n", cxyz[1]*(1. - fa->farg[3])); - puts("c"); /* put specular component */ - printf("rs %.4f %.4f\n", fa->farg[3], - typ[7]=='2' ? .5*(fa->farg[4] + fa->farg[5]) : - fa->farg[4]); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])); + if (fa->farg[3] > FTINY) { /* put specular component */ + puts("\tc"); + printf("\trs %.4f %.4f\n", fa->farg[3], + typ[7]=='2' ? .5*(fa->farg[4] + fa->farg[5]) : + fa->farg[4]); + } return(0); } int -o_metal(mod, typ, id, fa) /* convert a metal material */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_metal( /* convert a metal material */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { COLOR cxyz, rrgb; double d; @@ -519,13 +717,13 @@ register FUNARGS *fa; newmat(id, NULL); rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2]; rgb_cie(cxyz, rrgb); - puts("c"); /* put diffuse component */ + puts("\tc"); /* put diffuse component */ d = cxyz[0] + cxyz[1] + cxyz[2]; if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("rd %.4f\n", cxyz[1]*(1. - fa->farg[3])); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])); /* put specular component */ - printf("rs %.4f %.4f\n", cxyz[1]*fa->farg[3], + printf("\trs %.4f %.4f\n", cxyz[1]*fa->farg[3], typ[5]=='2' ? .5*(fa->farg[4] + fa->farg[5]) : fa->farg[4]); return(0); @@ -533,9 +731,12 @@ register FUNARGS *fa; int -o_glass(mod, typ, id, fa) /* convert a glass material */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_glass( /* convert a glass material */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { COLOR cxyz, rrgb, trgb; double nrfr = 1.52, F, d; @@ -546,34 +747,72 @@ register FUNARGS *fa; newmat(id, NULL); if (fa->nfargs == 4) nrfr = fa->farg[3]; + printf("\tir %f 0\n", nrfr); F = (1. - nrfr)/(1. + nrfr); /* use normal incidence */ F *= F; for (i = 0; i < 3; i++) { - rrgb[i] = (1. - F)*(1. - F)/(1. - F*F*fa->farg[i]*fa->farg[i]); - trgb[i] = F * (1. + (1. - 2.*F)*fa->farg[i]) / + trgb[i] = fa->farg[i] * (1. - F)*(1. - F) / (1. - F*F*fa->farg[i]*fa->farg[i]); + rrgb[i] = F * (1. + (1. - 2.*F)*fa->farg[i]) / + (1. - F*F*fa->farg[i]*fa->farg[i]); } rgb_cie(cxyz, rrgb); /* put reflected component */ - puts("c"); + puts("\tc"); d = cxyz[0] + cxyz[1] + cxyz[2]; if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("rs %.4f 0\n", cxyz[1]); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\trs %.4f 0\n", cxyz[1]); rgb_cie(cxyz, trgb); /* put transmitted component */ - puts("c"); + puts("\tc"); d = cxyz[0] + cxyz[1] + cxyz[2]; if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("ts %.4f 0\n", cxyz[1]); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\tts %.4f 0\n", cxyz[1]); return(0); } int -o_mirror(mod, typ, id, fa) /* convert a mirror material */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_dielectric( /* convert a dielectric material */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { + COLOR cxyz, trgb; + double F, d; + register int i; + + if (fa->nfargs != 5) + return(-1); + newmat(id, NULL); + F = (1. - fa->farg[3])/(1. + fa->farg[3]); /* normal incidence */ + F *= F; + for (i = 0; i < 3; i++) + trgb[i] = (1. - F)*pow(fa->farg[i], C_1SIDEDTHICK/unit_mult); + printf("\tir %f 0\n", fa->farg[3]); /* put index of refraction */ + printf("\tsides 1\n"); + puts("\tc"); /* put reflected component */ + printf("\trs %.4f 0\n", F); + rgb_cie(cxyz, trgb); /* put transmitted component */ + puts("\tc"); + d = cxyz[0] + cxyz[1] + cxyz[2]; + if (d > FTINY) + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\tts %.4f 0\n", cxyz[1]); + return(0); +} + + +int +o_mirror( /* convert a mirror material */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) +{ COLOR cxyz, rrgb; double d; @@ -586,19 +825,22 @@ register FUNARGS *fa; newmat(id, NULL); rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2]; rgb_cie(cxyz, rrgb); - puts("c"); /* put specular component */ + puts("\tc"); /* put specular component */ d = cxyz[0] + cxyz[1] + cxyz[2]; if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("rs %.4f 0\n", cxyz[1]); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\trs %.4f 0\n", cxyz[1]); return(0); } int -o_trans(mod, typ, id, fa) /* convert a trans material */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_trans( /* convert a trans material */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { COLOR cxyz, rrgb; double rough, trans, tspec, d; @@ -619,25 +861,28 @@ register FUNARGS *fa; newmat(id, NULL); rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2]; rgb_cie(cxyz, rrgb); - puts("c"); /* put transmitted diffuse */ + puts("\tc"); /* put transmitted diffuse */ d = cxyz[0] + cxyz[1] + cxyz[2]; if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("td %.4f\n", cxyz[1]*trans*(1. - fa->farg[3])*(1. - tspec)); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\ttd %.4f\n", cxyz[1]*trans*(1. - fa->farg[3])*(1. - tspec)); /* put transmitted specular */ - printf("ts %.4f %.4f\n", cxyz[1]*trans*tspec*(1. - fa->farg[3]), rough); + printf("\tts %.4f %.4f\n", cxyz[1]*trans*tspec*(1. - fa->farg[3]), rough); /* put reflected diffuse */ - printf("rd %.4f\n", cxyz[1]*(1. - fa->farg[3])*(1. - trans)); - puts("c"); /* put reflected specular */ - printf("rs %.4f %.4f\n", fa->farg[3], rough); + printf("\trd %.4f\n", cxyz[1]*(1. - fa->farg[3])*(1. - trans)); + puts("\tc"); /* put reflected specular */ + printf("\trs %.4f %.4f\n", fa->farg[3], rough); return(0); } int -o_light(mod, typ, id, fa) /* convert a light type */ -char *mod, *typ, *id; -register FUNARGS *fa; +o_light( /* convert a light type */ + char *mod, + char *typ, + char *id, + register FUNARGS *fa +) { COLOR cxyz, rrgb; double d; @@ -648,9 +893,9 @@ register FUNARGS *fa; rrgb[0] = fa->farg[0]; rrgb[1] = fa->farg[1]; rrgb[2] = fa->farg[2]; rgb_cie(cxyz, rrgb); d = cxyz[0] + cxyz[1] + cxyz[2]; - puts("c"); + puts("\tc"); if (d > FTINY) - printf("cxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("ed %.4g\n", cxyz[1]); + printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); + printf("\ted %.4g\n", cxyz[1]*(PI*WHTEFFICACY)); return(0); }