--- ray/src/gen/mkillum3.c 1991/07/24 16:48:45 1.1 +++ ray/src/gen/mkillum3.c 1992/08/10 15:55:10 2.4 @@ -10,7 +10,7 @@ static char SCCSid[] = "$SunId$ LBL"; #include "mkillum.h" -#define brt(col) (.295*(col)[0] + .636*(col)[1] + .070*(col)[2]) +#define brt(col) (.263*(col)[0]+.655*(col)[1]+.082*(col)[2]) char DATORD[] = "RGB"; /* data ordering */ char DATSUF[] = ".dat"; /* data file suffix */ @@ -24,6 +24,8 @@ register OBJREC *obj; { register int i; + if (issurface(obj->otype) && !strcmp(mod, VOIDID)) + return; /* don't print void surfaces */ printf("\n%s %s %s", mod, ofun[obj->otype].funame, obj->oname); printf("\n%d", obj->oargs.nsargs); for (i = 0; i < obj->oargs.nsargs; i++) @@ -87,35 +89,6 @@ int c; } -illumout(il, ob) /* print illum object */ -register struct illum_args *il; -OBJREC *ob; -{ - double cout[3]; - - printf("\n%s%s %s %s", il->matname, DSTSUF, - ofun[il->flags&IL_LIGHT?MAT_LIGHT:MAT_ILLUM].funame, - il->matname); - if (il->flags & IL_LIGHT || !strcmp(il->altmat,VOIDID)) - printf("\n0"); - else - printf("\n1 %s", il->altmat); - if (il->flags & IL_COLAVG) { - cout[0] = il->col[0]; - cout[1] = il->col[1]; - cout[2] = il->col[2]; - } else { - cout[0] = cout[1] = cout[2] = brt(il->col); - } - if (il->flags & IL_LIGHT) - printf("\n3 %f %f %f\n", cout[0], cout[1], cout[2]); - else - printf("\n4 %f %f %f 0\n", cout[0], cout[1], cout[2]); - - printobj(il->matname, ob); -} - - flatout(il, da, n, m, u, v, w) /* write hemispherical distribution */ struct illum_args *il; float *da; @@ -123,32 +96,38 @@ int n, m; FVECT u, v, w; { FILE *dfp; + float col[3]; int i; - average(il, da, n*m); if (il->flags & IL_COLDST) { printf("\n%s %s %s%s", VOIDID, ofun[PAT_CDATA].funame, il->matname, DSTSUF); - printf("\n9 red green blue"); + printf("\n9 h_red h_grn h_blu"); for (i = 0; i < 3; i++) { dfp = dfopen(il, DATORD[i]); - fprintf(dfp, "2\n1 0 %d\n0 %f %d\n", n, 2.*PI, m); - colorout(i, da, n*m, 1./il->nsamps/il->col[i], dfp); + fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", + 1.-.5/n, .5/n, n, + 0., 2.*PI, m+1); + colorout(i, da, n, m, 1./il->nsamps/il->col[i], dfp); fclose(dfp); printf(" %s", dfname(il, DATORD[i])); } } else { printf("\n%s %s %s%s", VOIDID, ofun[PAT_BDATA].funame, il->matname, DSTSUF); - printf("\n5 noop"); + printf("\n5 h_gry"); dfp = dfopen(il, 0); - fprintf(dfp, "2\n1 0 %d\n0 %f %d\n", n, 2.*PI, m); - brightout(da, n*m, 1./il->nsamps/brt(il->col), dfp); + fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", 1.-.5/n, .5/n, n, + 0., 2.*PI, m+1); + brightout(da, n, m, 1./il->nsamps/brt(il->col), dfp); fclose(dfp); printf(" %s", dfname(il, 0)); } printf("\n\t%s il_alth il_azih", FNCFNM); - printf("\n0\n9\n"); + printf("\n0\n13\n"); + compavg(col, da, m, il->nsamps); + printf("\t%f\t%f\t%f\t%f\n", col[0]/il->col[0], + col[1]/il->col[1], col[2]/il->col[2], 1.-.5/n); printf("\t%f\t%f\t%f\n", u[0], u[1], u[2]); printf("\t%f\t%f\t%f\n", v[0], v[1], v[2]); printf("\t%f\t%f\t%f\n", w[0], w[1], w[2]); @@ -162,87 +141,159 @@ float *da; int n, m; { FILE *dfp; + float col[3]; int i; - average(il, da, n*m); if (il->flags & IL_COLDST) { printf("\n%s %s %s%s", VOIDID, ofun[PAT_CDATA].funame, il->matname, DSTSUF); - printf("\n9 red green blue"); + printf("\n9 s_red s_grn s_blu"); for (i = 0; i < 3; i++) { dfp = dfopen(il, DATORD[i]); - fprintf(dfp, "2\n1 -1 %d\n0 %f %d\n", n, 2.*PI, m); - colorout(i, da, n*m, 1./il->nsamps/il->col[i], dfp); + fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", + 1.-1./n, -1.+1./n, n, + 0., 2.*PI, m+1); + colorout(i, da, n, m, 1./il->nsamps/il->col[i], dfp); fclose(dfp); printf(" %s", dfname(il, DATORD[i])); } } else { printf("\n%s %s %s%s", VOIDID, ofun[PAT_BDATA].funame, il->matname, DSTSUF); - printf("\n5 noop"); + printf("\n5 s_gry"); dfp = dfopen(il, 0); - fprintf(dfp, "2\n1 -1 %d\n0 %f %d\n", n, 2.*PI, m); - brightout(da, n*m, 1./il->nsamps/brt(il->col), dfp); + fprintf(dfp, "2\n%f %f %d\n%f %f %d\n", 1.-1./n, -1.+1./n, n, + 0., 2.*PI, m+1); + brightout(da, n, m, 1./il->nsamps/brt(il->col), dfp); fclose(dfp); printf(" %s", dfname(il, 0)); } printf("\n\t%s il_alt il_azi", FNCFNM); - printf("\n0\n0\n"); + printf("\n0\n7\n"); + compavg(col, da, m, il->nsamps); /* north pole */ + printf("\t%f\t%f\t%f\n", col[0]/il->col[0], + col[1]/il->col[1], col[2]/il->col[2]); + compavg(col, da+(n-1)*m*3, m, il->nsamps); /* south pole */ + printf("\t%f\t%f\t%f\n", col[0]/il->col[0], + col[1]/il->col[1], col[2]/il->col[2]); + printf("\t%f\n", 1.-1./n); il->dfnum++; } -average(il, da, n) /* compute average value for distribution */ +illumout(il, ob) /* print illum object */ register struct illum_args *il; +OBJREC *ob; +{ + double cout[3]; + + if (il->sampdens <= 0) + printf("\n%s ", VOIDID); + else + printf("\n%s%s ", il->matname, DSTSUF); + printf("%s %s", ofun[il->flags&IL_LIGHT?MAT_LIGHT:MAT_ILLUM].funame, + il->matname); + if (il->flags & IL_LIGHT || !strcmp(il->altmat,VOIDID)) + printf("\n0"); + else + printf("\n1 %s", il->altmat); + if (il->flags & IL_COLAVG) { + cout[0] = il->col[0]; + cout[1] = il->col[1]; + cout[2] = il->col[2]; + } else { + cout[0] = cout[1] = cout[2] = brt(il->col); + } + printf("\n0\n3 %f %f %f\n", cout[0], cout[1], cout[2]); + + printobj(il->matname, ob); +} + + +compavg(col, da, n, ns) /* compute average for set of data values */ +float col[3]; register float *da; -int n; +int n, ns; { register int i; - il->col[0] = il->col[1] = il->col[2] = 0.; + col[0] = col[1] = col[2] = 0.; i = n; while (i-- > 0) { - il->col[0] += *da++; - il->col[1] += *da++; - il->col[2] += *da++; + col[0] += *da++; + col[1] += *da++; + col[2] += *da++; } for (i = 0; i < 3; i++) - il->col[i] /= (double)n*il->nsamps; + col[i] /= (double)(n*ns); } -colorout(p, da, n, mult, fp) /* put out color distribution data */ +average(il, da, n) /* evaluate average value for distribution */ +register struct illum_args *il; +float *da; +int n; +{ + compavg(il->col, da, n, il->nsamps); + /* brighter than minimum? */ + return(brt(il->col) > il->minbrt+FTINY); +} + + +static int colmcnt = 0; /* count of columns written */ + +fputnum(d, fp) /* put out a number to fp */ +double d; +FILE *fp; +{ + if (colmcnt++ % 6 == 0) + putc('\n', fp); + fprintf(fp, " %11e", d); +} + + +fputeol(fp) /* write end of line to fp */ +register FILE *fp; +{ + putc('\n', fp); + colmcnt = 0; +} + + +colorout(p, da, n, m, mult, fp) /* put out color distribution data */ int p; register float *da; -int n; +int n, m; double mult; FILE *fp; { - register int i; + register int i, j; for (i = 0; i < n; i++) { - if (i%6 == 0) - putc('\n', fp); - fprintf(fp, " %11e", mult*da[p]); - da += 3; + for (j = 0; j < m; j++) { + fputnum(mult*da[p], fp); + da += 3; + } + fputnum(mult*da[p-3*m], fp); /* wrap phi */ } - putc('\n', fp); + fputeol(fp); } -brightout(da, n, mult, fp) /* put out brightness distribution data */ +brightout(da, n, m, mult, fp) /* put out brightness distribution data */ register float *da; -int n; +int n, m; double mult; FILE *fp; { - register int i; + register int i, j; for (i = 0; i < n; i++) { - if (i%6 == 0) - putc('\n', fp); - fprintf(fp, " %11e", mult*brt(da)); - da += 3; + for (j = 0; j < m; j++) { + fputnum(mult*brt(da), fp); + da += 3; + } + fputnum(mult*brt(da-3*m), fp); /* wrap phi */ } - putc('\n', fp); + fputeol(fp); }