commit a87af66e64385f762d8e7e736751aa4a22aad3b8
parent 7b2b81aa5f40ea71924e7eac6e61f817662edabd
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 12 Sep 2016 15:24:44 +0200
Update the ssf_fresnel API
The eval function directly returns the Fresnel term rather than
affecting its value to an output variable.
Diffstat:
5 files changed, 14 insertions(+), 30 deletions(-)
diff --git a/src/ssf.h b/src/ssf.h
@@ -156,11 +156,10 @@ SSF_API res_T
ssf_fresnel_ref_put
(struct ssf_fresnel* fresnel);
-SSF_API res_T
+SSF_API double
ssf_fresnel_eval
(struct ssf_fresnel* fresnel,
- const double cos_theta, /* Cos between facet normal and outgoing dir */
- double* value);
+ const double cos_theta); /* Cos between facet normal and outgoing dir */
/* Retrieve the internal data of the Fresnel term. Usefull for user defined
* Fresnel terms on which the caller has to retrieve their data to setup the
diff --git a/src/ssf_fresnel.c b/src/ssf_fresnel.c
@@ -110,13 +110,11 @@ ssf_fresnel_ref_put(struct ssf_fresnel* fresnel)
return RES_OK;
}
-res_T
-ssf_fresnel_eval
- (struct ssf_fresnel* fresnel, const double cos_theta, double* val)
+double
+ssf_fresnel_eval(struct ssf_fresnel* fresnel, const double cos_theta)
{
- if(!fresnel || cos_theta < 0.0 || !val) return RES_BAD_ARG;
- *val = fresnel->type.eval(fresnel->data, cos_theta);
- return RES_OK;
+ ASSERT(fresnel && cos_theta >= 0);
+ return fresnel->type.eval(fresnel->data, cos_theta);
}
res_T
diff --git a/src/test_ssf_fresnel.c b/src/test_ssf_fresnel.c
@@ -60,7 +60,6 @@ main(int argc, char** argv)
struct fresnel* data;
struct ssf_fresnel* fresnel;
struct ssf_fresnel_type type;
- double val;
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
@@ -125,18 +124,10 @@ main(int argc, char** argv)
data->cos_theta = 0.1;
data->value = 1.234;
- CHECK(ssf_fresnel_eval(NULL, -1, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(fresnel, -1, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(NULL, 0.1, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(fresnel, 0.1, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(NULL, -1, &val), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(fresnel, -1, &val), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(NULL, 0.1, &val), RES_BAD_ARG);
- CHECK(ssf_fresnel_eval(fresnel, 0.1, &val), RES_OK);
- CHECK(val, data->value);
+ CHECK(ssf_fresnel_eval(fresnel, 0.1), data->value);
+ data->cos_theta = 1.234;
data->value = 8.1;
- CHECK(ssf_fresnel_eval(fresnel, 0.1, &val), RES_OK);
- CHECK(val, data->value);
+ CHECK(ssf_fresnel_eval(fresnel, 1.234), data->value);
CHECK(fresnel_is_init, 1);
CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
diff --git a/src/test_ssf_fresnel_dielectric_dielectric.c b/src/test_ssf_fresnel_dielectric_dielectric.c
@@ -40,13 +40,13 @@ main(int argc, char** argv)
CHECK(ssf_fresnel_dielectric_dielectric_setup(dummy,-1.0, -1.0), RES_BAD_ARG);
CHECK(ssf_fresnel_dielectric_dielectric_setup(fresnel,1.000277, 1.5), RES_OK);
- CHECK(ssf_fresnel_eval(fresnel, 1, &val), RES_OK);
+ val = ssf_fresnel_eval(fresnel, 1);
CHECK(eq_eps(val, 0.04, 1.e-4), 1);
FOR_EACH(i, 0, nsteps+1) {
const double theta_i = MMIN((double)i*step, PI/2);
const double cos_theta_i = cos(theta_i);
- CHECK(ssf_fresnel_eval(fresnel, cos_theta_i, &val), RES_OK);
+ val = ssf_fresnel_eval(fresnel, cos_theta_i);
printf("%g %g\n", theta_i, val);
}
diff --git a/src/test_ssf_fresnel_no_op.c b/src/test_ssf_fresnel_no_op.c
@@ -20,19 +20,15 @@ int
main(int argc, char** argv)
{
struct mem_allocator allocator;
- double val;
struct ssf_fresnel* fresnel;
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
CHECK(ssf_fresnel_create(&allocator, &ssf_fresnel_no_op, &fresnel), RES_OK);
- CHECK(ssf_fresnel_eval(fresnel, 0, &val), RES_OK);
- CHECK(val, 1.0);
- CHECK(ssf_fresnel_eval(fresnel, 1, &val), RES_OK);
- CHECK(val, 1.0);
- CHECK(ssf_fresnel_eval(fresnel, 0.48, &val), RES_OK);
- CHECK(val, 1.0);
+ CHECK(ssf_fresnel_eval(fresnel, 0), 1.0);
+ CHECK(ssf_fresnel_eval(fresnel, 1), 1.0);
+ CHECK(ssf_fresnel_eval(fresnel, 0.48), 1.0);
CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);