--- ray/src/cv/rad2mgf.c 1994/07/09 09:42:48 2.4 +++ ray/src/cv/rad2mgf.c 1998/09/04 09:09:58 2.14 @@ -1,4 +1,4 @@ -/* Copyright (c) 1994 Regents of the University of California */ +/* Copyright (c) 1995 Regents of the University of California */ #ifndef lint static char SCCSid[] = "$SunId$ LBL"; @@ -8,19 +8,21 @@ static char SCCSid[] = "$SunId$ LBL"; * Convert Radiance scene description to MGF */ -#include +#include "standard.h" +#include #include -#include "fvect.h" #include "object.h" #include "color.h" #include "lookup.h" +#define C_1SIDEDTHICK 0.005 + 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(); +int o_instance(), o_illum(); +int o_plastic(), o_metal(), o_glass(), o_dielectric(), + o_mirror(), o_trans(), o_light(); -extern void free(); -extern char *malloc(); +extern int free(); LUTAB rmats = LU_SINIT(free,NULL); /* defined material table */ @@ -37,14 +39,14 @@ double unit_mult = 1.; /* units multiplier */ * Stuff for tracking and reusing vertices: */ -char VKFMT[] = "%+1.9e %+1.9e %+1.9e"; +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 clock; /* incremented at each vertex request */ +long vclock; /* incremented at each vertex request */ struct vert { long lused; /* when last used (0 if unassigned) */ @@ -80,6 +82,8 @@ char **argv; goto unkopt; } break; + default: + goto unkopt; } init(); if (i >= argc) @@ -186,8 +190,11 @@ FUNARGS *fa; fprintf(stderr, "%s: bad %s \"%s\"\n", 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); + } } @@ -252,8 +259,16 @@ char *id; if (end == NULL) end = cp; /* copy to current object */ - for (cp = id, cp2 = curobj; cp < end; *cp2++ = *cp++) + 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'; @@ -280,6 +295,7 @@ init() /* initialize dispatch table and output */ 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); @@ -287,7 +303,7 @@ 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"); + puts("# The following was converted from RADIANCE scene input"); if (hasmult) printf("xf -s %.4e\n", unit_mult); printf("o %s\n", curobj); @@ -299,13 +315,24 @@ uninit() /* mark end of MGF file */ 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); } +clrverts() /* clear vertex table */ +{ + register int i; + + lu_done(&vertab); + for (i = 0; i < NVERTS; i++) + vert[i].lused = 0; + lu_init(&vertab, NVERTS); +} + + add2dispatch(name, func) /* add function to dispatch table */ char *name; int (*func)(); @@ -328,11 +355,11 @@ getvertid(vname, vp) /* get/set vertex ID for this po char *vname; FVECT vp; { - char vkey[VKLEN]; + static char vkey[VKLEN]; register LUENT *lp; register int i, vndx; - clock++; /* increment counter */ + vclock++; /* increment counter */ mkvkey(vkey, vp); if ((lp = lu_find(&vertab, vkey)) == NULL) goto memerr; @@ -358,7 +385,7 @@ FVECT vp; lp->data = (char *)&vert[vndx]; /* set it */ } else vndx = (struct vert *)lp->data - vert; - vert[vndx].lused = clock; /* record this use */ + vert[vndx].lused = vclock; /* record this use */ sprintf(vname, "v%d", vndx); return(vname); memerr: @@ -368,11 +395,38 @@ memerr: int +o_unsupported(mod, typ, id, fa) /* mark unsupported primitive */ +char *mod, *typ, *id; +FUNARGS *fa; +{ + register int i; + + 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(mod, typ, id, fa) /* print out a polygon */ char *mod, *typ, *id; FUNARGS *fa; { - char entbuf[512]; + char entbuf[2048]; register char *cp; register int i; @@ -511,20 +565,12 @@ FUNARGS *fa; 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; -{ - return(0); /* there is no MGF equivalent! */ -} - - -int o_illum(mod, typ, id, fa) /* convert an illum material */ char *mod, *typ, *id; FUNARGS *fa; @@ -608,6 +654,7 @@ 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++) { @@ -633,6 +680,36 @@ register FUNARGS *fa; int +o_dielectric(mod, typ, id, fa) /* convert a dielectric material */ +char *mod, *typ, *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(mod, typ, id, fa) /* convert a mirror material */ char *mod, *typ, *id; register FUNARGS *fa; @@ -714,6 +791,6 @@ register FUNARGS *fa; puts("\tc"); if (d > FTINY) printf("\t\tcxy %.4f %.4f\n", cxyz[0]/d, cxyz[1]/d); - printf("\ted %.4g\n", cxyz[1]*WHTEFFICACY); + printf("\ted %.4g\n", cxyz[1]*(PI*WHTEFFICACY)); return(0); }