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 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:
Mcmake/CMakeLists.txt | 1+
Asrc/test_ssf_thin_transparent_dielectric.c | 123+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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; +}