star-sf

Set of surface and volume scattering functions
git clone git://git.meso-star.fr/star-sf.git
Log | Files | Refs | README | LICENSE

commit af3f5499c28c8a909442ed7c30a5edcf21bf24ef
parent 8a68cde950b885fa209de3b5a7a2e4b5ff2e42c9
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon, 19 Sep 2016 14:54:03 +0200

Implement and test the ssf_bsdf_view_eval function

Diffstat:
Msrc/ssf_bsdf.c | 1-
Msrc/ssf_bsdf_view.c | 22+++++++++++++++++++++-
Msrc/test_ssf_bsdf_view.c | 2++
3 files changed, 23 insertions(+), 2 deletions(-)

diff --git a/src/ssf_bsdf.c b/src/ssf_bsdf.c @@ -105,7 +105,6 @@ ssf_bsdf_add(struct ssf_bsdf* bsdf, struct ssf_bxdf* bxdf, const double weight) return RES_OK; } - res_T ssf_bsdf_clear(struct ssf_bsdf* bsdf) { diff --git a/src/ssf_bsdf_view.c b/src/ssf_bsdf_view.c @@ -18,6 +18,7 @@ #include "ssf.h" #include "ssf_bsdf_view_c.h" +#include <rsys/double3.h> #include <rsys/mem_allocator.h> #include <float.h> @@ -138,6 +139,8 @@ ssf_bsdf_view_sample double pdf; double w; size_t i, icomponent; + ASSERT(view && u>=0 && u<1 && v>=0 && v<1 && wi && N && wo); + ASSERT(d3_is_normalized(wi) && d3_is_normalized(N)); if(!view->ncomponents) return 0; if(view->ncomponents == 1) { @@ -149,7 +152,7 @@ ssf_bsdf_view_sample if(u >= view->cumulative[icomponent]) break; } - /* Rescale the random number to reuse it (NOTE why?) */ + /* Rescale the random number to reuse it */ w = (u - view->cumulative[icomponent] )/ nextafter (view->cumulative[icomponent+1] - view->cumulative[icomponent], DBL_MAX); @@ -170,6 +173,23 @@ ssf_bsdf_view_sample return reflectivity / pdf; } +double +ssf_bsdf_view_eval + (struct ssf_bsdf_view* view, + const double wi[3], + const double wo[3]) +{ + double R = 0; + size_t i; + ASSERT(view && wi && wo); + ASSERT(d3_is_normalized(wi) && d3_is_normalized(wo)); + + FOR_EACH(i, 0, view->ncomponents) { + R += ssf_bxdf_eval(view->components[i], wi, wo) * view->probas[i]; + } + return R; +} + /******************************************************************************* * Local functions ******************************************************************************/ diff --git a/src/test_ssf_bsdf_view.c b/src/test_ssf_bsdf_view.c @@ -77,6 +77,7 @@ main(int argc, char** argv) const double u = rand_canonic(); const double v = rand_canonic(); const double weight = ssf_bsdf_view_sample(view, u, v, w, N, dir); + CHECK(ssf_bsdf_view_eval(view, w, dir), 0); sum += weight; sqr_sum += weight*weight; } @@ -85,6 +86,7 @@ main(int argc, char** argv) SE = sqrt(V / (double)NSTEPS); CHECK(eq_eps((0.1234+0.6789) * 0.5, E, SE), 1); + CHECK(ssf_bsdf_view_ref_get(NULL), RES_BAD_ARG); CHECK(ssf_bsdf_view_ref_get(view), RES_OK); CHECK(ssf_bsdf_view_ref_put(NULL), RES_BAD_ARG);