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:
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);