--- ray/src/cv/bsdf2rad.c 2017/04/09 21:39:26 2.16 +++ ray/src/cv/bsdf2rad.c 2017/04/10 01:31:37 2.19 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: bsdf2rad.c,v 2.16 2017/04/09 21:39:26 greg Exp $"; +static const char RCSid[] = "$Id: bsdf2rad.c,v 2.19 2017/04/10 01:31:37 greg Exp $"; #endif /* * Plot 3-D BSDF output based on scattering interpolant or XML representation @@ -13,7 +13,7 @@ static const char RCSid[] = "$Id: bsdf2rad.c,v 2.16 20 #include "resolu.h" #include "bsdfrep.h" -#define NINCIDENT 25 /* number of samples/hemisphere */ +#define NINCIDENT 37 /* number of samples/hemisphere */ #define GRIDSTEP 2 /* our grid step size */ #define SAMPRES (GRIDRES/GRIDSTEP) @@ -50,19 +50,31 @@ const double sph_xoffset = 15.; char *progname; /* Get Fibonacci sphere vector (0 to NINCIDENT-1) */ -static void +static RREAL * get_ivector(FVECT iv, int i) { - const double zstep = 1./(2*NINCIDENT-1); const double phistep = PI*(3. - 2.236067978); double r; - iv[2] = 1. - (i+.5)*zstep; + iv[2] = 1. - (i+.5)*(1./NINCIDENT); r = sqrt(1. - iv[2]*iv[2]); iv[0] = r * cos((i+1.)*phistep); iv[1] = r * sin((i+1.)*phistep); + + return(iv); } +/* Convert incident vector into sphere position */ +static RREAL * +cvt_sposition(FVECT sp, const FVECT iv, int inc_side) +{ + sp[0] = -iv[0]*sph_rad - inc_side*sph_xoffset; + sp[1] = -iv[1]*sph_rad; + sp[2] = iv[2]*sph_rad; + + return(sp); +} + /* Get temporary file name */ static char * tfile_name(const char *prefix, const char *suffix, int i) @@ -249,7 +261,7 @@ build_wRBF(void) RBFNODE *rbf; get_ivector(ivec, i); if (input_orient < 0) { - ivec[0] = -ivec[0]; ivec[1] = -ivec[1]; ivec[2] = -ivec[2]; + ivec[0] = -ivec[0]; ivec[2] = -ivec[2]; } rbf = advect_rbf(ivec, 15000); if (!plotRBF(tfile_name(pref, dsuffix, i), rbf)) @@ -268,11 +280,10 @@ put_mirror_arrow(const FVECT ivec, int inc_side) FVECT origin, refl; int i; - for (i = 3; i--; ) origin[i] = ivec[i]*sph_rad; - origin[0] -= inc_side*sph_xoffset; + cvt_sposition(origin, ivec, inc_side); - refl[0] = 2.*ivec[2]*ivec[0]; - refl[1] = 2.*ivec[2]*ivec[1]; + refl[0] = -2.*ivec[2]*ivec[0]; + refl[1] = -2.*ivec[2]*ivec[1]; refl[2] = 2.*ivec[2]*ivec[2] - 1.; printf("\n# Mirror arrow\n"); @@ -308,8 +319,7 @@ put_trans_arrow(const FVECT ivec, int inc_side) FVECT origin; int i; - for (i = 3; i--; ) origin[i] = ivec[i]*sph_rad; - origin[0] -= inc_side*sph_xoffset; + cvt_sposition(origin, ivec, inc_side); printf("\n# Transmission arrow\n"); printf("\narrow_mat cylinder trans_dir\n0\n0\n7"); @@ -365,7 +375,7 @@ static int put_BSDFs(void) { const double scalef = bsdf_rad/(log10(overall_max) - min_log10); - FVECT ivec; + FVECT ivec, sorg; RREAL vMtx[3][3]; char *fname; char cmdbuf[256]; @@ -379,13 +389,14 @@ put_BSDFs(void) printf("\nvoid glow arrow_glow\n0\n0\n4 1 0 1 0\n"); printf("\nvoid mixfunc arrow_mat\n4 arrow_glow void .5 .\n0\n0\n"); - if (front_comp & SDsampR) + if (front_comp & SDsampR) /* front reflection */ for (i = 0; i < NINCIDENT; i++) { get_ivector(ivec, i); put_mirror_arrow(ivec, 1); + cvt_sposition(sorg, ivec, 1); + ivec[0] = -ivec[0]; ivec[1] = -ivec[1]; /* normal */ sprintf(xfargs, "-s %f -t %f %f %f", bsdf_rad, - ivec[0]*sph_rad - sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + sorg[0], sorg[1], sorg[2]); nxfa = 6; printf("\nvoid colorfunc scale_pat\n"); printf("%d bsdf_red bsdf_grn bsdf_blu bsdf2rad.cal\n\t%s\n0\n0\n", @@ -394,23 +405,23 @@ put_BSDFs(void) SDcompXform(vMtx, ivec, Yaxis); nxfa = addrot(xfargs, vMtx[0], vMtx[1], vMtx[2]); sprintf(xfargs+strlen(xfargs), " -s %f -t %f %f %f", - scalef, ivec[0]*sph_rad - sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + scalef, sorg[0], sorg[1], sorg[2]); nxfa += 6; fname = tfile_name(frpref, dsuffix, i); - sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -mx -my %s", + sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform %s", frpref, i+1, fname, fname, fname, SAMPRES-1, SAMPRES-1, xfargs); if (!run_cmd(cmdbuf)) return(0); } - if (front_comp & SDsampT) + if (front_comp & SDsampT) /* front transmission */ for (i = 0; i < NINCIDENT; i++) { get_ivector(ivec, i); put_trans_arrow(ivec, 1); + cvt_sposition(sorg, ivec, 1); + ivec[0] = -ivec[0]; ivec[1] = -ivec[1]; /* normal */ sprintf(xfargs, "-s %f -t %f %f %f", bsdf_rad, - ivec[0]*sph_rad - sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + sorg[0], sorg[1], sorg[2]); nxfa = 6; printf("\nvoid colorfunc scale_pat\n"); printf("%d bsdf_red bsdf_grn bsdf_blu bsdf2rad.cal\n\t%s\n0\n0\n", @@ -419,24 +430,23 @@ put_BSDFs(void) SDcompXform(vMtx, ivec, Yaxis); nxfa = addrot(xfargs, vMtx[0], vMtx[1], vMtx[2]); sprintf(xfargs+strlen(xfargs), " -s %f -t %f %f %f", - scalef, ivec[0]*sph_rad - sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + scalef, sorg[0], sorg[1], sorg[2]); nxfa += 6; fname = tfile_name(ftpref, dsuffix, i); - sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -I -mx -my %s", + sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -I %s", ftpref, i+1, fname, fname, fname, SAMPRES-1, SAMPRES-1, xfargs); if (!run_cmd(cmdbuf)) return(0); } - if (back_comp & SDsampR) + if (back_comp & SDsampR) /* rear reflection */ for (i = 0; i < NINCIDENT; i++) { get_ivector(ivec, i); put_mirror_arrow(ivec, -1); - fname = tfile_name(brpref, dsuffix, i); + cvt_sposition(sorg, ivec, -1); + ivec[0] = -ivec[0]; ivec[1] = -ivec[1]; /* normal */ sprintf(xfargs, "-s %f -t %f %f %f", bsdf_rad, - ivec[0]*sph_rad + sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + sorg[0], sorg[1], sorg[2]); nxfa = 6; printf("\nvoid colorfunc scale_pat\n"); printf("%d bsdf_red bsdf_grn bsdf_blu bsdf2rad.cal\n\t%s\n0\n0\n", @@ -445,24 +455,23 @@ put_BSDFs(void) SDcompXform(vMtx, ivec, Yaxis); nxfa = addrot(xfargs, vMtx[0], vMtx[1], vMtx[2]); sprintf(xfargs+strlen(xfargs), " -s %f -t %f %f %f", - scalef, ivec[0]*sph_rad + sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + scalef, sorg[0], sorg[1], sorg[2]); nxfa += 6; fname = tfile_name(brpref, dsuffix, i); - sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -I -ry 180 -mx -my %s", + sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -I -ry 180 %s", brpref, i+1, fname, fname, fname, SAMPRES-1, SAMPRES-1, xfargs); if (!run_cmd(cmdbuf)) return(0); } - if (back_comp & SDsampT) + if (back_comp & SDsampT) /* rear transmission */ for (i = 0; i < NINCIDENT; i++) { get_ivector(ivec, i); put_trans_arrow(ivec, -1); - fname = tfile_name(btpref, dsuffix, i); + cvt_sposition(sorg, ivec, -1); + ivec[0] = -ivec[0]; ivec[1] = -ivec[1]; /* normal */ sprintf(xfargs, "-s %f -t %f %f %f", bsdf_rad, - ivec[0]*sph_rad + sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + sorg[0], sorg[1], sorg[2]); nxfa = 6; printf("\nvoid colorfunc scale_pat\n"); printf("%d bsdf_red bsdf_grn bsdf_blu bsdf2rad.cal\n\t%s\n0\n0\n", @@ -471,11 +480,10 @@ put_BSDFs(void) SDcompXform(vMtx, ivec, Yaxis); nxfa = addrot(xfargs, vMtx[0], vMtx[1], vMtx[2]); sprintf(xfargs+strlen(xfargs), " -s %f -t %f %f %f", - scalef, ivec[0]*sph_rad + sph_xoffset, - ivec[1]*sph_rad, ivec[2]*sph_rad); + scalef, sorg[0], sorg[1], sorg[2]); nxfa += 6; fname = tfile_name(btpref, dsuffix, i); - sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -ry 180 -mx -my %s", + sprintf(cmdbuf, "gensurf scale_mat %s%d %s %s %s %d %d | xform -ry 180 %s", btpref, i+1, fname, fname, fname, SAMPRES-1, SAMPRES-1, xfargs); if (!run_cmd(cmdbuf)) @@ -524,7 +532,7 @@ static void put_source(void) { printf("\n# Overhead parallel light source\n"); - printf("\nvoid light bright\n0\n0\n3 1000 1000 1000\n"); + printf("\nvoid light bright\n0\n0\n3 2000 2000 2000\n"); printf("\nbright source light\n0\n0\n4 0 0 1 2\n"); printf("\n# Material used for labels\n"); printf("\nvoid trans vellum\n0\n0\n7 1 1 1 0 0 .5 0\n"); @@ -544,15 +552,15 @@ put_hemispheres(void) -1.01*sph_rad - sph_xoffset, -1.01*sph_rad, -1.01*sph_rad); printf("\nvoid brighttext front_text\n3 helvet.fnt . FRONT\n0\n"); printf("12\n\t%f %f 0\n\t%f 0 0\n\t0 %f 0\n\t.01 1 -.1\n", - -.22*sph_rad - sph_xoffset, -1.2*sph_rad, + -.22*sph_rad - sph_xoffset, -1.4*sph_rad, .35/5.*sph_rad, -1.6*.35/5.*sph_rad); printf("\nfront_text alias front_label_mat vellum\n"); printf("\nfront_label_mat polygon front_label\n0\n0\n12"); printf("\n\t%f %f 0\n\t%f %f 0\n\t%f %f 0\n\t%f %f 0\n", - -.25*sph_rad - sph_xoffset, -1.1*sph_rad, - -.25*sph_rad - sph_xoffset, (-1.2-1.6*.35/5.-.1)*sph_rad, - .25*sph_rad - sph_xoffset, (-1.2-1.6*.35/5.-.1)*sph_rad, - .25*sph_rad - sph_xoffset, -1.1*sph_rad ); + -.25*sph_rad - sph_xoffset, -1.3*sph_rad, + -.25*sph_rad - sph_xoffset, (-1.4-1.6*.35/5.-.1)*sph_rad, + .25*sph_rad - sph_xoffset, (-1.4-1.6*.35/5.-.1)*sph_rad, + .25*sph_rad - sph_xoffset, -1.3*sph_rad ); } if (back_comp) { printf("\n%s bubble Back\n0\n0\n4 %f 0 0 %f\n", @@ -562,15 +570,15 @@ put_hemispheres(void) -1.01*sph_rad + sph_xoffset, -1.01*sph_rad, -1.01*sph_rad); printf("\nvoid brighttext back_text\n3 helvet.fnt . BACK\n0\n"); printf("12\n\t%f %f 0\n\t%f 0 0\n\t0 %f 0\n\t.01 1 -.1\n", - -.22*sph_rad + sph_xoffset, -1.2*sph_rad, + -.22*sph_rad + sph_xoffset, -1.4*sph_rad, .35/4.*sph_rad, -1.6*.35/4.*sph_rad); printf("\nback_text alias back_label_mat vellum\n"); printf("\nback_label_mat polygon back_label\n0\n0\n12"); printf("\n\t%f %f 0\n\t%f %f 0\n\t%f %f 0\n\t%f %f 0\n", - -.25*sph_rad + sph_xoffset, -1.1*sph_rad, - -.25*sph_rad + sph_xoffset, (-1.2-1.6*.35/4.-.1)*sph_rad, - .25*sph_rad + sph_xoffset, (-1.2-1.6*.35/4.-.1)*sph_rad, - .25*sph_rad + sph_xoffset, -1.1*sph_rad ); + -.25*sph_rad + sph_xoffset, -1.3*sph_rad, + -.25*sph_rad + sph_xoffset, (-1.4-1.6*.35/4.-.1)*sph_rad, + .25*sph_rad + sph_xoffset, (-1.4-1.6*.35/4.-.1)*sph_rad, + .25*sph_rad + sph_xoffset, -1.3*sph_rad ); } } @@ -582,21 +590,21 @@ put_scale(void) const double leg_width = 2.*.75*(sph_xoffset - sph_rad); const double leg_height = 2.*sph_rad; const int text_lines = 6; - const int text_digits = 7; + const int text_digits = 8; char fmt[16]; int i; printf("\n# BSDF legend with falsecolor scale\n"); printf("\nvoid colorfunc lscale\n10 sca_red(Py) sca_grn(Py) sca_blu(Py)"); printf("\n\tbsdf2rad.cal -s %f -t 0 %f 0\n0\n0\n", leg_height, -.5*leg_height); - sprintf(fmt, "%%%dg", text_digits-2); + sprintf(fmt, "%%.%df", text_digits-3); for (i = 0; i < text_lines; i++) { char vbuf[16]; sprintf(vbuf, fmt, pow(10., (i+.5)/text_lines*(max_log10-min_log10)+min_log10)); printf("\nlscale brighttext lscale\n"); printf("3 helvet.fnt . %s\n0\n12\n", vbuf); printf("\t%f %f 0\n", -.45*leg_width, ((i+.9)/text_lines-.5)*leg_height); - printf("\t%f 0 0\n", .9*leg_width/strlen(vbuf)); + printf("\t%f 0 0\n", .8*leg_width/strlen(vbuf)); printf("\t0 %f 0\n", -.9/text_lines*leg_height); printf("\t.01 1 -.1\n"); } @@ -623,7 +631,7 @@ put_scale(void) return; printf("\nvoid brighttext BSDFname\n3 helvet.fnt . \"%s\"\n0\n12\n", bsdf_name); printf("\t%f %f 0\n", -.95*leg_width, -.6*leg_height); - printf("\t%f 0 0\n", .4/strlen(bsdf_name)*leg_width); + printf("\t%f 0 0\n", 1.8/strlen(bsdf_name)*leg_width); printf("\t0 %f 0\n", -.1*leg_height); printf("\t.01 1 -.1\n"); printf("\nBSDFname alias name_mat vellum\n");