commit cfe84c5d96e733cee2e5b07238c1ed5285751810
parent 427e2d9afc36770535cff2813b85fc20ad3eb06d
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 1 Mar 2017 11:27:47 +0100
Test the ssf_thin_transparent_dielectric BxDF
Diffstat:
2 files changed, 124 insertions(+), 0 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -114,6 +114,7 @@ if(NOT NO_TEST)
new_test(test_ssf_microfacet_distribution)
new_test(test_ssf_microfacet_reflection)
new_test(test_ssf_specular_reflection)
+ new_test(test_ssf_thin_transparent_dielectric)
rcmake_copy_runtime_libraries(test_ssf_beckmann_distribution)
endif()
diff --git a/src/test_ssf_thin_transparent_dielectric.c b/src/test_ssf_thin_transparent_dielectric.c
@@ -0,0 +1,123 @@
+/* Copyright (C) |Meso|Star> 2016-2017 (contact@meso-star.com)
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>. */
+
+#include "ssf.h"
+#include "test_ssf_utils.h"
+
+#include <rsys/double3.h>
+
+int
+main(int argc, char** argv)
+{
+ const size_t NSTEPS = 100000;
+ struct mem_allocator allocator;
+ struct ssp_rng* rng;
+ struct ssf_bxdf* bsdf;
+ struct ssf_bxdf* dummy;
+ double wo[3], wi[3];
+ double N[3];
+ double tmp[3];
+ double reflect[3];
+ double refract[3];
+ double pdf;
+ double R; /* Directional reflectance */
+ size_t i;
+ (void)argc, (void)argv;
+
+ mem_init_proxy_allocator(&allocator, &mem_default_allocator);
+ CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+ CHECK(ssf_bxdf_create
+ (&allocator, &ssf_thin_transparent_dielectric, &bsdf), RES_OK);
+ CHECK(ssf_bxdf_create(&allocator, &bxdf_dummy, &dummy), RES_OK);
+
+ #define SETUP ssf_thin_transparent_dielectric_setup
+ CHECK(SETUP(NULL, -1, 0, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 0, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 0, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 0, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 1.00027, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 1.00027, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 1.00027, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 1.00027, 0, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 0, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 0, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 0, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 0, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 1.00027, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 1.00027, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 1.00027, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 1.00027, 1.5, -1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 0, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 0, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 0, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 0, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 1.00027, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 1.00027, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 1.00027, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 1.00027, 0, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 0, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 0, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 0, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 0, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, -1, 1.00027, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, -1, 1.00027, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(NULL, 1, 1.00027, 1.5, 0.1), RES_BAD_ARG);
+ CHECK(SETUP(bsdf, 1, 1.00027, 1.5, 0.1), RES_OK);
+ CHECK(SETUP(dummy, 1, 1.00027, 1.5, 0.1), RES_BAD_ARG);
+ #undef SETUP
+
+ d3(N, 0.0, 1.0, 0.0);
+ d3_normalize(wo, d3(wo, 1.0, 1.0, 0.0));
+ R = ssf_bxdf_sample(bsdf, rng, wo, N, wi, &pdf);
+ NCHECK(R, 0);
+ CHECK(IS_INF(pdf), 1);
+ CHECK(d3_eq_eps(wi, d3(tmp, -wo[0], wo[1], 0), 1.e-6)
+ || d3_eq_eps(wi, d3(tmp, -wo[0], -wo[1], 0), 1.e-6), 1);
+
+ CHECK(ssf_bxdf_eval(bsdf, wo, N, wi), 0.0);
+ CHECK(ssf_bxdf_pdf(bsdf, wo, N, wi), 0.0);
+
+ d3(wo, 0.0, 1.0, 0.0);
+ R = ssf_bxdf_sample(bsdf, rng, wo, N, wi, &pdf);
+ NCHECK(R, 0);
+ CHECK(IS_INF(pdf), 1);
+ CHECK(d3_eq_eps(wi, d3(tmp, -wo[0], -wo[1], 0), 1.e-6), 1);
+
+ d3(wo, 1.0, 0.0, 0.0);
+ R = ssf_bxdf_sample(bsdf, rng, wo, N, wi, &pdf);
+ NCHECK(R, 0);
+ CHECK(IS_INF(pdf), 1);
+ CHECK(d3_eq_eps(wi, d3(tmp, -wo[0], wo[1], 0), 1.e-6), 1);
+
+ wo[0] = ssp_rng_uniform_double(rng, -1, 1);
+ wo[1] = ssp_rng_uniform_double(rng, -1, 1);
+ wo[2] = ssp_rng_uniform_double(rng, -1, 1);
+ d3_normalize(wo, wo);
+ d3_sub(reflect, d3_muld(reflect, N, 2*d3_dot(wo, N)), wo);
+ d3_minus(refract, wo);
+
+ FOR_EACH(i, 0, NSTEPS) {
+ R = ssf_bxdf_sample(bsdf, rng, wo, N, wi, &pdf);
+ NCHECK(R, 0);
+ CHECK(IS_INF(pdf), 1);
+ CHECK(d3_eq_eps(wi, reflect, 1.e-6) || d3_eq_eps(wi, refract, 1e-6), 1);
+ }
+
+ CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHECK(ssf_bxdf_ref_put(bsdf), RES_OK);
+ CHECK(ssf_bxdf_ref_put(dummy), RES_OK);
+
+ return 0;
+}