--- ray/src/cv/bsdf2ttree.c 2019/12/28 18:05:14 2.44 +++ ray/src/cv/bsdf2ttree.c 2020/05/07 02:36:37 2.47 @@ -1,5 +1,5 @@ #ifndef lint -static const char RCSid[] = "$Id: bsdf2ttree.c,v 2.44 2019/12/28 18:05:14 greg Exp $"; +static const char RCSid[] = "$Id: bsdf2ttree.c,v 2.47 2020/05/07 02:36:37 greg Exp $"; #endif /* * Load measured BSDF interpolant and write out as XML file with tensor tree. @@ -25,10 +25,10 @@ static double pctcull = 90.; /* sampling order */ static int samp_order = 6; /* super-sampling threshold */ -const double ssamp_thresh = 0.35; +const double ssamp_thresh = 0.30; /* number of super-samples */ #ifndef NSSAMP -#define NSSAMP 64 +#define NSSAMP 256 #endif /* limit on number of RBF lobes */ static int lobe_lim = 15000; @@ -129,6 +129,8 @@ eval_isotropic(char *funame) { const int sqres = 1< 0) + rtrip = (char *)calloc(sqres, 1); /* track sample triggerings */ + ryval = (float *)calloc(sqres, sizeof(float)); +#endif /* run through directions */ for (ix = 0; ix < sqres/2; ix++) { - RBFNODE *rbf = NULL; + const int zipsgn = (ix & 1)*2 - 1; + RBFNODE *rbf = NULL; iovec[0] = 2.*sqfact*(ix+.5) - 1.; - iovec[1] = .0; - iovec[2] = input_orient * sqrt(1. - iovec[0]*iovec[0]); + iovec[1] = zipsgn*sqfact*.5; + iovec[2] = input_orient * sqrt(1. - iovec[0]*iovec[0] + - iovec[1]*iovec[1]); if (funame == NULL) rbf = advect_rbf(iovec, lobe_lim); for (ox = 0; ox < sqres; ox++) { - float last_bsdf = -1; + SDValue sdv_next; + SDsquare2disk(iovec+3, (ox+.5)*sqfact, .5*sqfact); + iovec[5] = output_orient * + sqrt(1. - iovec[3]*iovec[3] - iovec[4]*iovec[4]); + if (funame == NULL) { + eval_rbfcol(&sdv_next, rbf, iovec+3); + } else { + sdv_next.spec = c_dfcolor; + if (assignD) { + varset("Dx", '=', -iovec[3]); + varset("Dy", '=', -iovec[4]); + varset("Dz", '=', -iovec[5]); + ++eclock; + } + sdv_next.cieY = funvalue(funame, 6, iovec); + } for (oy = 0; oy < sqres; oy++) { - SDsquare2disk(iovec+3, (ox+.5)*sqfact, (oy+.5)*sqfact); - iovec[5] = output_orient * + int trip; + bsdf = sdv_next.cieY; /* keeping one step ahead... */ + if (oy < sqres-1) { + SDsquare2disk(iovec+3, (ox+.5)*sqfact, (oy+1.5)*sqfact); + iovec[5] = output_orient * sqrt(1. - iovec[3]*iovec[3] - iovec[4]*iovec[4]); + } if (funame == NULL) { - SDValue sdv; - eval_rbfcol(&sdv, rbf, iovec+3); - bsdf = sdv.cieY; + SDValue sdv = sdv_next; + if (oy < sqres-1) + eval_rbfcol(&sdv_next, rbf, iovec+3); #if (NSSAMP > 0) - if (abs_diff(bsdf, last_bsdf) > ssamp_thresh) { + trip = (abs_diff(bsdf, sdv_next.cieY) > ssamp_thresh || + (ox && abs_diff(bsdf, ryval[oy]) > ssamp_thresh) || + (oy && abs_diff(bsdf, ryval[oy-1]) > ssamp_thresh)); + if (trip | rtrip[oy] || (oy && rtrip[oy-1])) { int ssi; double ssa[2], sum = 0, usum = 0, vsum = 0; /* super-sample voxel */ @@ -242,27 +272,37 @@ eval_isotropic(char *funame) uv[1] *= 9.*sdv.spec.cy; } } else { - if (assignD) { - varset("Dx", '=', -iovec[3]); - varset("Dy", '=', -iovec[4]); - varset("Dz", '=', -iovec[5]); - ++eclock; + if (oy < sqres-1) { + if (assignD) { + varset("Dx", '=', -iovec[3]); + varset("Dy", '=', -iovec[4]); + varset("Dz", '=', -iovec[5]); + ++eclock; + } + sdv_next.cieY = funvalue(funame, 6, iovec); } - bsdf = funvalue(funame, 6, iovec); #if (NSSAMP > 0) - if (abs_diff(bsdf, last_bsdf) > ssamp_thresh) { + trip = (abs_diff(bsdf, sdv_next.cieY) > ssamp_thresh || + (ox && abs_diff(bsdf, ryval[oy]) > ssamp_thresh) || + (oy && abs_diff(bsdf, ryval[oy-1]) > ssamp_thresh)); + if (trip | rtrip[oy] || (oy && rtrip[oy-1])) { int ssi; - double ssa[3], ssvec[6], sum = 0; + double ssa[4], ssvec[6], sum = 0; /* super-sample voxel */ for (ssi = NSSAMP; ssi--; ) { - SDmultiSamp(ssa, 3, (ssi+frandom()) * + SDmultiSamp(ssa, 4, (ssi+frandom()) * (1./NSSAMP)); ssvec[0] = 2.*sqfact*(ix+ssa[0]) - 1.; - ssvec[1] = .0; - ssvec[2] = input_orient * - sqrt(1. - ssvec[0]*ssvec[0]); - SDsquare2disk(ssvec+3, (ox+ssa[1])*sqfact, - (oy+ssa[2])*sqfact); + ssvec[1] = zipsgn*sqfact*ssa[1]; + ssvec[2] = 1. - ssvec[0]*ssvec[0] + - ssvec[1]*ssvec[1]; + if (ssvec[2] < .0) { + ssvec[1] = 0; + ssvec[2] = 1. - ssvec[0]*ssvec[0]; + } + ssvec[2] = input_orient * sqrt(ssvec[2]); + SDsquare2disk(ssvec+3, (ox+ssa[2])*sqfact, + (oy+ssa[3])*sqfact); ssvec[5] = output_orient * sqrt(1. - ssvec[3]*ssvec[3] - ssvec[4]*ssvec[4]); @@ -292,7 +332,10 @@ eval_isotropic(char *funame) fprintf(uvfp[1], "\t%.3e\n", uv[1]); } } - last_bsdf = bsdf; + if (ryval != NULL) { + rtrip[oy] = trip; + ryval[oy] = bsdf; + } } } if (rbf != NULL) @@ -300,6 +343,10 @@ eval_isotropic(char *funame) prog_show((ix+1.)*(2.*sqfact)); } prog_done(); + if (ryval != NULL) { + free(rtrip); + free(ryval); + } if (pctcull >= 0) { /* finish output */ if (pclose(ofp)) { fprintf(stderr, "%s: error running rttree_reduce on Y\n", @@ -343,6 +390,8 @@ eval_anisotropic(char *funame) { const int sqres = 1< 0) + rtrip = (char *)calloc(sqres, 1); /* track sample triggerings */ + ryval = (float *)calloc(sqres, sizeof(float)); +#endif /* run through directions */ for (ix = 0; ix < sqres; ix++) for (iy = 0; iy < sqres; iy++) { @@ -418,17 +471,39 @@ eval_anisotropic(char *funame) if (funame == NULL) rbf = advect_rbf(iovec, lobe_lim); for (ox = 0; ox < sqres; ox++) { - float last_bsdf = -1; + SDValue sdv_next; + SDsquare2disk(iovec+3, (ox+.5)*sqfact, .5*sqfact); + iovec[5] = output_orient * + sqrt(1. - iovec[3]*iovec[3] - iovec[4]*iovec[4]); + if (funame == NULL) { + eval_rbfcol(&sdv_next, rbf, iovec+3); + } else { + sdv_next.spec = c_dfcolor; + if (assignD) { + varset("Dx", '=', -iovec[3]); + varset("Dy", '=', -iovec[4]); + varset("Dz", '=', -iovec[5]); + ++eclock; + } + sdv_next.cieY = funvalue(funame, 6, iovec); + } for (oy = 0; oy < sqres; oy++) { - SDsquare2disk(iovec+3, (ox+.5)*sqfact, (oy+.5)*sqfact); - iovec[5] = output_orient * + int trip; + bsdf = sdv_next.cieY; /* keeping one step ahead... */ + if (oy < sqres-1) { + SDsquare2disk(iovec+3, (ox+.5)*sqfact, (oy+1.5)*sqfact); + iovec[5] = output_orient * sqrt(1. - iovec[3]*iovec[3] - iovec[4]*iovec[4]); + } if (funame == NULL) { - SDValue sdv; - eval_rbfcol(&sdv, rbf, iovec+3); - bsdf = sdv.cieY; + SDValue sdv = sdv_next; + if (oy < sqres-1) + eval_rbfcol(&sdv_next, rbf, iovec+3); #if (NSSAMP > 0) - if (abs_diff(bsdf, last_bsdf) > ssamp_thresh) { + trip = (abs_diff(bsdf, sdv_next.cieY) > ssamp_thresh || + (ox && abs_diff(bsdf, ryval[oy]) > ssamp_thresh) || + (oy && abs_diff(bsdf, ryval[oy-1]) > ssamp_thresh)); + if (trip | rtrip[oy] || (oy && rtrip[oy-1])) { int ssi; double ssa[2], sum = 0, usum = 0, vsum = 0; /* super-sample voxel */ @@ -462,15 +537,20 @@ eval_anisotropic(char *funame) uv[1] *= 9.*sdv.spec.cy; } } else { - if (assignD) { - varset("Dx", '=', -iovec[3]); - varset("Dy", '=', -iovec[4]); - varset("Dz", '=', -iovec[5]); - ++eclock; + if (oy < sqres-1) { + if (assignD) { + varset("Dx", '=', -iovec[3]); + varset("Dy", '=', -iovec[4]); + varset("Dz", '=', -iovec[5]); + ++eclock; + } + sdv_next.cieY = funvalue(funame, 6, iovec); } - bsdf = funvalue(funame, 6, iovec); #if (NSSAMP > 0) - if (abs_diff(bsdf, last_bsdf) > ssamp_thresh) { + trip = (abs_diff(bsdf, sdv_next.cieY) > ssamp_thresh || + (ox && abs_diff(bsdf, ryval[oy]) > ssamp_thresh) || + (oy && abs_diff(bsdf, ryval[oy-1]) > ssamp_thresh)); + if (trip | rtrip[oy] || (oy && rtrip[oy-1])) { int ssi; double ssa[4], ssvec[6], sum = 0; /* super-sample voxel */ @@ -513,14 +593,21 @@ eval_anisotropic(char *funame) fprintf(uvfp[1], "\t%.3e\n", uv[1]); } } - last_bsdf = bsdf; + if (ryval != NULL) { + rtrip[oy] = trip; + ryval[oy] = bsdf; + } } - } if (rbf != NULL) free(rbf); prog_show((ix*sqres+iy+1.)/(sqres*sqres)); } + } prog_done(); + if (ryval != NULL) { + free(rtrip); + free(ryval); + } if (pctcull >= 0) { /* finish output */ if (pclose(ofp)) { fprintf(stderr, "%s: error running rttree_reduce on Y\n", @@ -626,6 +713,8 @@ main(int argc, char *argv[]) switch (argv[i][1]) { /* get options */ case 'e': scompile(argv[++i], NULL, 0); + if (single_plane_incident < 0) + single_plane_incident = 0; break; case 'f': if (!argv[i][2]) { @@ -642,7 +731,8 @@ main(int argc, char *argv[]) return(1); } fcompile(fpath); - single_plane_incident = 0; + if (single_plane_incident < 0) + single_plane_incident = 0; } } else dofwd = (argv[i][0] == '+');