commit 8bef65d76127e7ee1f219f827d2b6d4b139a892c
parent ac0f8e53ea90b6858ab255fd21f78974869fa039
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 13 Dec 2017 10:44:03 +0100
Merge branch 'release_0.5'
Diffstat:
20 files changed, 704 insertions(+), 488 deletions(-)
diff --git a/README.md b/README.md
@@ -26,9 +26,15 @@ project from the `cmake/CMakeLists.txt` file by appending to the
## Release notes
+### Version 0.5
+
+- Add the pillbox microfacet distribution.
+- Update the version of the RSys dependency to 0.6: replace the deprecated
+ `[N]CHECK` macros by the new macro `CHK`.
+
### Version 0.4
-- Fix the Blinn distribution.
+- Fix the Blinn microfacet distribution.
- Change the microfacet distribution API to no longer require the unused
outgoing direction parameter.
- Use and require Star-SamPling version 0.5.
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -24,8 +24,8 @@ set(SSF_SOURCE_DIR ${PROJECT_SOURCE_DIR}/../src)
################################################################################
# Dependencies
################################################################################
-find_package(RCMake REQUIRED)
-find_package(RSys 0.4 REQUIRED)
+find_package(RCMake 0.4 REQUIRED)
+find_package(RSys 0.6 REQUIRED)
find_package(StarSP 0.5 REQUIRED)
include_directories(${RSys_INCLUDE_DIR} ${StarSP_INCLUDE_DIR})
@@ -39,7 +39,7 @@ rcmake_append_runtime_dirs(_runtime_dirs RSys StarSP)
# Define targets
################################################################################
set(VERSION_MAJOR 0)
-set(VERSION_MINOR 4)
+set(VERSION_MINOR 5)
set(VERSION_PATCH 0)
set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH})
@@ -62,6 +62,7 @@ set(SSF_FILES_SRC
ssf_lambertian_reflection.c
ssf_microfacet_distribution.c
ssf_microfacet_reflection.c
+ ssf_pillbox_distribution.c
ssf_specular_dielectric_dielectric_interface.c
ssf_specular_reflection.c
ssf_thin_specular_dielectric.c)
@@ -101,6 +102,7 @@ if(NOT NO_TEST)
new_test(test_ssf_beckmann_distribution)
new_test(test_ssf_blinn_distribution)
+ new_test(test_ssf_pillbox_distribution)
new_test(test_ssf_bsdf)
new_test(test_ssf_fresnel)
new_test(test_ssf_fresnel_constant)
diff --git a/src/ssf.h b/src/ssf.h
@@ -255,6 +255,10 @@ SSF_API const struct ssf_microfacet_distribution_type ssf_beckmann_distribution;
* with `e' an exponent in [0, SSF_BLINN_DISTRIBUTION_MAX_EXPONENT] */
SSF_API const struct ssf_microfacet_distribution_type ssf_blinn_distribution;
+/* Pillbox microfacet distribution.
+ * D(wh) = */
+SSF_API const struct ssf_microfacet_distribution_type ssf_pillbox_distribution;
+
/*******************************************************************************
* BSDF API - Bidirectional Scattering Distribution Function. Describes the way
* the light is scattered by a surface. Note that by convention the outgoing
@@ -438,13 +442,18 @@ ssf_microfacet_distribution_get_data
SSF_API res_T
ssf_beckmann_distribution_setup
(struct ssf_microfacet_distribution* distrib,
- const double roughness); /* Must be > 0 */
+ const double roughness); /* In ]0, 1] */
SSF_API res_T
ssf_blinn_distribution_setup
(struct ssf_microfacet_distribution* distrib,
const double exponent); /* in [0, SSF_BLINN_DISTRIBUTION_MAX_EXPONENT] */
+SSF_API res_T
+ssf_pillbox_distribution_setup
+ (struct ssf_microfacet_distribution* distrib,
+ const double roughness); /* In ]0, 1] */
+
END_DECLS
#endif /* SSF_H */
diff --git a/src/ssf_pillbox_distribution.c b/src/ssf_pillbox_distribution.c
@@ -0,0 +1,132 @@
+/* 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 "ssf_microfacet_distribution_c.h"
+
+#include <rsys/double3.h>
+#include <rsys/double33.h>
+
+#include <star/ssp.h>
+
+struct pillbox_distribution {
+ double sin2_theta_max;
+};
+
+/*******************************************************************************
+ * Private functions
+ ******************************************************************************/
+static res_T
+pillbox_distribution_init(struct mem_allocator* allocator, void* distrib)
+{
+ ASSERT(distrib);
+ (void)allocator;
+ ((struct pillbox_distribution*)distrib)->sin2_theta_max = 1.0;
+ return RES_OK;
+}
+
+static void
+pillbox_distribution_release(void* distrib)
+{ (void)distrib; }
+
+static double
+pillbox_distribution_eval(void* distrib, const double N[3], const double wh[3])
+{
+ struct pillbox_distribution* pillbox = distrib;
+ double cos2_theta_max;
+ double cos2_wh_N;
+ ASSERT(distrib && N && wh);
+ ASSERT(d3_is_normalized(wh) && d3_is_normalized(N));
+ cos2_wh_N = d3_dot(N, wh);
+ cos2_wh_N *= cos2_wh_N;
+ cos2_theta_max = 1.0 - pillbox->sin2_theta_max;
+ /* if |wh.N| >= theta_max then 0
+ * <=> if cos(|wh.N|)^2 < cos(theta_max)^2 then 0 */
+ return (cos2_wh_N >= cos2_theta_max) ? 1.0 / (PI - PI*cos2_theta_max) : 0.0;
+}
+
+static void
+pillbox_distribution_sample
+ (void* distrib,
+ struct ssp_rng* rng,
+ const double N[3],
+ double wh[3],
+ double* pdf)
+{
+ struct pillbox_distribution* pillbox = distrib;
+ double basis[9];
+ double dir[3];
+ double cos2_theta_max;
+ double phi, sin2_theta, sin_theta, cos_theta;
+ ASSERT(rng && wh && N);
+ ASSERT(d3_is_normalized(N));
+
+ cos2_theta_max = 1 - pillbox->sin2_theta_max;
+ sin2_theta = ssp_rng_uniform_double(rng, 0, pillbox->sin2_theta_max);
+ sin_theta = sqrt(sin2_theta);
+ cos_theta = sqrt(1 - sin2_theta);
+ phi = ssp_rng_uniform_double(rng, 0, 2 * PI);
+ dir[0] = cos(phi) * sin_theta;
+ dir[1] = sin(phi) * sin_theta;
+ dir[2] = cos_theta;
+ d33_muld3(wh, d33_basis(basis, N), dir);
+ *pdf = cos_theta / (PI-PI*cos2_theta_max);
+}
+
+static double
+pillbox_distribution_pdf(void* distrib, const double N[3], const double wh[3])
+{
+ struct pillbox_distribution* pillbox = distrib;
+ double cos_wh_N;
+ double cos2_wh_N;
+ double cos2_theta_max;
+ ASSERT(distrib && N && wh);
+ ASSERT(d3_is_normalized(wh) && d3_is_normalized(N));
+ cos_wh_N = d3_dot(wh, N);
+ if(cos_wh_N < 0.0) return 0.0;
+ cos2_theta_max = 1 - pillbox->sin2_theta_max;
+ cos2_wh_N = cos_wh_N * cos_wh_N;
+ if(cos2_wh_N < cos2_theta_max) return 0.0;
+ return cos_wh_N / (PI-PI*cos2_theta_max);
+}
+
+/*******************************************************************************
+ * Exported symbols
+ ******************************************************************************/
+const struct ssf_microfacet_distribution_type ssf_pillbox_distribution = {
+ pillbox_distribution_init,
+ pillbox_distribution_release,
+ pillbox_distribution_sample,
+ pillbox_distribution_eval,
+ pillbox_distribution_pdf,
+ sizeof(struct pillbox_distribution),
+ ALIGNOF(struct pillbox_distribution)
+};
+
+res_T
+ssf_pillbox_distribution_setup
+ (struct ssf_microfacet_distribution* distrib,
+ const double roughness)
+{
+ double sin2_theta_max;
+ if(!distrib || roughness <= 0 || roughness > 1) return RES_BAD_ARG;
+ if(!MICROFACET_DISTRIBUTION_TYPE_EQ(&distrib->type, &ssf_pillbox_distribution))
+ return RES_BAD_ARG;
+ sin2_theta_max = sin(roughness);
+ sin2_theta_max *= sin2_theta_max;
+ ((struct pillbox_distribution*)distrib->data)->sin2_theta_max = sin2_theta_max;
+ return RES_OK;
+}
+
diff --git a/src/test_ssf_beckmann_distribution.c b/src/test_ssf_beckmann_distribution.c
@@ -33,36 +33,36 @@ main(int argc, char** argv)
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
- CHECK(ssf_microfacet_distribution_create
- (&allocator, &ssf_beckmann_distribution, &distrib), RES_OK);
- CHECK(ssf_microfacet_distribution_create
- (&allocator, µfacet_dummy, &dummy), RES_OK);
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, &ssf_beckmann_distribution, &distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, µfacet_dummy, &dummy) == RES_OK);
- CHECK(ssf_beckmann_distribution_setup(NULL, -1), RES_BAD_ARG);
- CHECK(ssf_beckmann_distribution_setup(distrib, -1), RES_BAD_ARG);
- CHECK(ssf_beckmann_distribution_setup(NULL, 0.5), RES_BAD_ARG);
- CHECK(ssf_beckmann_distribution_setup(distrib, 0.5), RES_OK);
- CHECK(ssf_beckmann_distribution_setup(dummy, 0.5), RES_BAD_ARG);
+ CHK(ssf_beckmann_distribution_setup(NULL, -1) == RES_BAD_ARG);
+ CHK(ssf_beckmann_distribution_setup(distrib, -1) == RES_BAD_ARG);
+ CHK(ssf_beckmann_distribution_setup(NULL, 0.5) == RES_BAD_ARG);
+ CHK(ssf_beckmann_distribution_setup(distrib, 0.5) == RES_OK);
+ CHK(ssf_beckmann_distribution_setup(dummy, 0.5) == RES_BAD_ARG);
- CHECK(ssf_beckmann_distribution_setup(distrib, 1), RES_OK);
- CHECK(ssf_beckmann_distribution_setup(distrib, nextafter(0, 1)), RES_OK);
- CHECK(ssf_beckmann_distribution_setup(distrib, nextafter(1, 2)), RES_BAD_ARG);
- CHECK(ssf_beckmann_distribution_setup(distrib, 0), RES_BAD_ARG);
+ CHK(ssf_beckmann_distribution_setup(distrib, 1) == RES_OK);
+ CHK(ssf_beckmann_distribution_setup(distrib, nextafter(0, 1)) == RES_OK);
+ CHK(ssf_beckmann_distribution_setup(distrib, nextafter(1, 2)) == RES_BAD_ARG);
+ CHK(ssf_beckmann_distribution_setup(distrib, 0) == RES_BAD_ARG);
FOR_EACH(itest, 0, NTESTS) {
const double roughness = nextafter(ssp_rng_canonical(rng), 2); /*in ]0, 1]*/
- CHECK(ssf_beckmann_distribution_setup(distrib, roughness), RES_OK);
+ CHK(ssf_beckmann_distribution_setup(distrib, roughness) == RES_OK);
check_microfacet_distribution(distrib, rng);
}
- CHECK(ssf_microfacet_distribution_ref_put(distrib), RES_OK);
- CHECK(ssf_microfacet_distribution_ref_put(dummy), RES_OK);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(dummy) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_blinn_distribution.c b/src/test_ssf_blinn_distribution.c
@@ -30,41 +30,41 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
- CHECK(ssf_microfacet_distribution_create
- (&allocator, &ssf_blinn_distribution, &distrib), RES_OK);
- CHECK(ssf_microfacet_distribution_create
- (&allocator, µfacet_dummy, &dummy), RES_OK);
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, &ssf_blinn_distribution, &distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, µfacet_dummy, &dummy) == RES_OK);
- CHECK(ssf_blinn_distribution_setup(NULL, -1), RES_BAD_ARG);
- CHECK(ssf_blinn_distribution_setup(distrib, -1), RES_BAD_ARG);
- CHECK(ssf_blinn_distribution_setup(NULL, 8), RES_BAD_ARG);
- CHECK(ssf_blinn_distribution_setup(distrib, 8), RES_OK);
- CHECK(ssf_blinn_distribution_setup(distrib, 0), RES_OK);
- CHECK(ssf_blinn_distribution_setup(dummy, 0), RES_BAD_ARG);
+ CHK(ssf_blinn_distribution_setup(NULL, -1) == RES_BAD_ARG);
+ CHK(ssf_blinn_distribution_setup(distrib, -1) == RES_BAD_ARG);
+ CHK(ssf_blinn_distribution_setup(NULL, 8) == RES_BAD_ARG);
+ CHK(ssf_blinn_distribution_setup(distrib, 8) == RES_OK);
+ CHK(ssf_blinn_distribution_setup(distrib, 0) == RES_OK);
+ CHK(ssf_blinn_distribution_setup(dummy, 0) == RES_BAD_ARG);
- CHECK(ssf_blinn_distribution_setup
- (distrib, SSF_BLINN_DISTRIBUTION_MAX_EXPONENT), RES_OK);
- CHECK(ssf_blinn_distribution_setup
- (distrib, nextafter(SSF_BLINN_DISTRIBUTION_MAX_EXPONENT, DBL_MAX)),
+ CHK(ssf_blinn_distribution_setup
+ (distrib, SSF_BLINN_DISTRIBUTION_MAX_EXPONENT) ==RES_OK);
+ CHK(ssf_blinn_distribution_setup
+ (distrib, nextafter(SSF_BLINN_DISTRIBUTION_MAX_EXPONENT, DBL_MAX)) ==
RES_BAD_ARG);
- CHECK(ssf_blinn_distribution_setup(distrib, nextafter(0,-1)), RES_BAD_ARG);
- CHECK(ssf_blinn_distribution_setup(distrib, 32.32), RES_OK);
+ CHK(ssf_blinn_distribution_setup(distrib, nextafter(0,-1)) == RES_BAD_ARG);
+ CHK(ssf_blinn_distribution_setup(distrib, 32.32) == RES_OK);
FOR_EACH(itest, 0, NTESTS) {
const double exponent = ssp_rng_uniform_double
(rng, 0, SSF_BLINN_DISTRIBUTION_MAX_EXPONENT);
- CHECK(ssf_blinn_distribution_setup(distrib, exponent), RES_OK);
+ CHK(ssf_blinn_distribution_setup(distrib, exponent) == RES_OK);
check_microfacet_distribution(distrib, rng);
}
- CHECK(ssf_microfacet_distribution_ref_put(distrib), RES_OK);
- CHECK(ssf_microfacet_distribution_ref_put(dummy), RES_OK);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(dummy) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_bsdf.c b/src/test_ssf_bsdf.c
@@ -35,9 +35,9 @@ struct ALIGN(64) bsdf {
static res_T
bsdf_init(struct mem_allocator* allocator, void* bsdf)
{
- NCHECK(allocator, NULL);
- NCHECK(bsdf, NULL);
- CHECK(IS_ALIGNED(bsdf, 64), 1);
+ CHK(allocator != NULL);
+ CHK(bsdf != NULL);
+ CHK(IS_ALIGNED(bsdf, 64) == 1);
((struct bsdf*)bsdf)->id = 0xDECAFBAD;
bsdf_is_init = 1;
return RES_OK;
@@ -46,8 +46,8 @@ bsdf_init(struct mem_allocator* allocator, void* bsdf)
static void
bsdf_release(void* bsdf)
{
- NCHECK(bsdf, NULL);
- CHECK(((struct bsdf*)bsdf)->id, 0xDECAFBAD);
+ CHK(bsdf != NULL);
+ CHK(((struct bsdf*)bsdf)->id == 0xDECAFBAD);
bsdf_is_init = 0;
}
@@ -62,10 +62,10 @@ bsdf_sample
double* pdf)
{
struct bsdf* BxDF = bsdf;
- NCHECK(BxDF, NULL);
- CHECK(BxDF->rng, rng);
- CHECK(d3_eq(BxDF->wo, wo), 1);
- CHECK(d3_eq(BxDF->N, N), 1);
+ CHK(BxDF != NULL);
+ CHK(BxDF->rng == rng);
+ CHK(d3_eq(BxDF->wo, wo) == 1);
+ CHK(d3_eq(BxDF->N, N) == 1);
d3(wi, 1.0, 2.0, 3.0);
*type = 314;
*pdf = 4;
@@ -80,12 +80,12 @@ bsdf_eval
const double wi[3])
{
struct bsdf* BxDF = bsdf;
- NCHECK(BxDF, NULL);
- NCHECK(wi, NULL);
- NCHECK(wo, NULL);
- CHECK(d3_eq(BxDF->wo, wo), 1);
- CHECK(d3_eq(BxDF->N, N), 1);
- CHECK(d3_eq(BxDF->wi, wi), 1);
+ CHK(BxDF != NULL);
+ CHK(wi != NULL);
+ CHK(wo != NULL);
+ CHK(d3_eq(BxDF->wo, wo) == 1);
+ CHK(d3_eq(BxDF->N, N) == 1);
+ CHK(d3_eq(BxDF->wi, wi) == 1);
return BxDF->value;
}
@@ -97,12 +97,12 @@ bsdf_pdf
const double wi[3])
{
struct bsdf* BxDF = bsdf;
- NCHECK(BxDF, NULL);
- NCHECK(wi, NULL);
- NCHECK(wo, NULL);
- CHECK(d3_eq(BxDF->wo, wo), 1);
- CHECK(d3_eq(BxDF->N, N), 1);
- CHECK(d3_eq(BxDF->wi, wi), 1);
+ CHK(BxDF != NULL);
+ CHK(wi != NULL);
+ CHK(wo != NULL);
+ CHK(d3_eq(BxDF->wo, wo) == 1);
+ CHK(d3_eq(BxDF->N, N) == 1);
+ CHK(d3_eq(BxDF->wi, wi) == 1);
return BxDF->pdf;
}
@@ -122,7 +122,7 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
type.init = bsdf_init;
type.release = bsdf_release;
@@ -132,55 +132,55 @@ main(int argc, char** argv)
type.sizeof_bsdf = sizeof(struct bsdf);
type.alignof_bsdf = ALIGNOF(struct bsdf);
- CHECK(ssf_bsdf_create(NULL, NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_create(&allocator, NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_create(NULL, &type, NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_create(&allocator, &type, NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_create(NULL, NULL, &bsdf), RES_BAD_ARG);
- CHECK(ssf_bsdf_create(&allocator, NULL, &bsdf), RES_BAD_ARG);
-
- CHECK(bsdf_is_init, 0);
- CHECK(ssf_bsdf_create(NULL, &type, &bsdf), RES_OK);
- CHECK(bsdf_is_init, 1);
-
- CHECK(ssf_bsdf_ref_get(NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_ref_get(bsdf), RES_OK);
- CHECK(ssf_bsdf_ref_put(NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_ref_put(bsdf), RES_OK);
- CHECK(bsdf_is_init, 1);
- CHECK(ssf_bsdf_ref_put(bsdf), RES_OK);
- CHECK(bsdf_is_init, 0);
-
- CHECK(ssf_bsdf_create(&allocator, &type, &bsdf), RES_OK);
- CHECK(bsdf_is_init, 1);
- CHECK(ssf_bsdf_ref_put(bsdf), RES_OK);
- CHECK(bsdf_is_init, 0);
+ CHK(ssf_bsdf_create(NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_create(&allocator, NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_create(NULL, &type, NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_create(&allocator, &type, NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_create(NULL, NULL, &bsdf) == RES_BAD_ARG);
+ CHK(ssf_bsdf_create(&allocator, NULL, &bsdf) == RES_BAD_ARG);
+
+ CHK(bsdf_is_init == 0);
+ CHK(ssf_bsdf_create(NULL, &type, &bsdf) == RES_OK);
+ CHK(bsdf_is_init == 1);
+
+ CHK(ssf_bsdf_ref_get(NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_ref_get(bsdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ CHK(bsdf_is_init == 1);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ CHK(bsdf_is_init == 0);
+
+ CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_OK);
+ CHK(bsdf_is_init == 1);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ CHK(bsdf_is_init == 0);
type.init = NULL;
- CHECK(ssf_bsdf_create(&allocator, &type, &bsdf), RES_BAD_ARG);
- CHECK(bsdf_is_init, 0);
+ CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
+ CHK(bsdf_is_init == 0);
type.init = bsdf_init;
type.release = NULL;
- CHECK(ssf_bsdf_create(&allocator, &type, &bsdf), RES_BAD_ARG);
- CHECK(bsdf_is_init, 0);
+ CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
+ CHK(bsdf_is_init == 0);
type.release = bsdf_release;
type.sample = NULL;
- CHECK(ssf_bsdf_create(&allocator, &type, &bsdf), RES_BAD_ARG);
- CHECK(bsdf_is_init, 0);
+ CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
+ CHK(bsdf_is_init == 0);
type.sample = bsdf_sample;
type.alignof_bsdf = 3;
- CHECK(ssf_bsdf_create(&allocator, &type, &bsdf), RES_BAD_ARG);
- CHECK(bsdf_is_init, 0);
+ CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_BAD_ARG);
+ CHK(bsdf_is_init == 0);
type.alignof_bsdf = ALIGNOF(struct bsdf);
- CHECK(ssf_bsdf_create(&allocator, &type, &bsdf), RES_OK);
- CHECK(bsdf_is_init, 1);
+ CHK(ssf_bsdf_create(&allocator, &type, &bsdf) == RES_OK);
+ CHK(bsdf_is_init == 1);
- CHECK(ssf_bsdf_get_data(NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_get_data(bsdf, NULL), RES_BAD_ARG);
- CHECK(ssf_bsdf_get_data(NULL, (void**)&data), RES_BAD_ARG);
- CHECK(ssf_bsdf_get_data(bsdf, (void**)&data), RES_OK);
+ CHK(ssf_bsdf_get_data(NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_get_data(bsdf, NULL) == RES_BAD_ARG);
+ CHK(ssf_bsdf_get_data(NULL, (void**)&data) == RES_BAD_ARG);
+ CHK(ssf_bsdf_get_data(bsdf, (void**)&data) == RES_OK);
- CHECK(data->id, 0xDECAFBAD);
+ CHK(data->id == 0xDECAFBAD);
d3_normalize(wo, d3(wo, -1, -1, 0));
d3(N, 0.0, 1.0, 0.0);
@@ -189,30 +189,30 @@ main(int argc, char** argv)
data->rng = rng;
data->reflectivity = 0.1234;
- CHECK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &i, &pdf), 0.1234);
- CHECK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &i, &pdf), 0.1234);
- CHECK(i, 314);
- CHECK(pdf, 4);
+ CHK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &i, &pdf) == 0.1234);
+ CHK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &i, &pdf) == 0.1234);
+ CHK(i == 314);
+ CHK(pdf == 4);
data->reflectivity = 0.314;
- CHECK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &i, &pdf), 0.314);
+ CHK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &i, &pdf) == 0.314);
d3_normalize(wi, wi);
d3_set(data->wi, wi);
data->value = 0.4567;
- CHECK(ssf_bsdf_eval(bsdf, wo, N, wi), data->value);
+ CHK(ssf_bsdf_eval(bsdf, wo, N, wi) == data->value);
data->pdf = 0.890;
- CHECK(ssf_bsdf_pdf(bsdf, wo, N, wi), data->pdf);
+ CHK(ssf_bsdf_pdf(bsdf, wo, N, wi) == data->pdf);
- CHECK(bsdf_is_init, 1);
- CHECK(ssf_bsdf_ref_put(bsdf), RES_OK);
- CHECK(bsdf_is_init, 0);
+ CHK(bsdf_is_init == 1);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ CHK(bsdf_is_init == 0);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_fresnel.c b/src/test_ssf_fresnel.c
@@ -27,9 +27,9 @@ struct ALIGN(64) fresnel {
static res_T
fresnel_init(struct mem_allocator* allocator, void* fresnel)
{
- NCHECK(allocator, NULL);
- NCHECK(fresnel, NULL);
- CHECK(IS_ALIGNED(fresnel, 64), 1);
+ CHK(allocator != NULL);
+ CHK(fresnel != NULL);
+ CHK(IS_ALIGNED(fresnel, 64) == 1);
((struct fresnel*)fresnel)->id = 0xDECAFBAD;
fresnel_is_init = 1;
return RES_OK;
@@ -38,8 +38,8 @@ fresnel_init(struct mem_allocator* allocator, void* fresnel)
static void
fresnel_release(void* fresnel)
{
- NCHECK(fresnel, NULL);
- CHECK(((struct fresnel*)fresnel)->id, 0xDECAFBAD);
+ CHK(fresnel != NULL);
+ CHK(((struct fresnel*)fresnel)->id == 0xDECAFBAD);
fresnel_is_init = 0;
}
@@ -47,9 +47,9 @@ static double
fresnel_eval(void* fresnel, const double cos_theta)
{
struct fresnel* f = fresnel;
- NCHECK(f, NULL);
- CHECK(f->id, 0xDECAFBAD);
- CHECK(f->cos_theta, cos_theta);
+ CHK(f != NULL);
+ CHK(f->id == 0xDECAFBAD);
+ CHK(f->cos_theta == cos_theta);
return f->value;
}
@@ -70,72 +70,72 @@ main(int argc, char** argv)
type.sizeof_fresnel = sizeof(struct fresnel);
type.alignof_fresnel = ALIGNOF(struct fresnel);
- CHECK(ssf_fresnel_create(NULL, NULL, NULL), RES_BAD_ARG);
+ CHK(ssf_fresnel_create(NULL, NULL, NULL) == RES_BAD_ARG);
- CHECK(ssf_fresnel_create(NULL, NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_create(&allocator, NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_create(NULL, &type, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_create(&allocator, &type, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_create(NULL, NULL, &fresnel), RES_BAD_ARG);
- CHECK(ssf_fresnel_create(&allocator, NULL, &fresnel), RES_BAD_ARG);
+ CHK(ssf_fresnel_create(NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_create(&allocator, NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_create(NULL, &type, NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_create(&allocator, &type, NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_create(NULL, NULL, &fresnel) == RES_BAD_ARG);
+ CHK(ssf_fresnel_create(&allocator, NULL, &fresnel) == RES_BAD_ARG);
- CHECK(fresnel_is_init, 0);
- CHECK(ssf_fresnel_create(NULL, &type, &fresnel), RES_OK);
- CHECK(fresnel_is_init, 1);
+ CHK(fresnel_is_init == 0);
+ CHK(ssf_fresnel_create(NULL, &type, &fresnel) == RES_OK);
+ CHK(fresnel_is_init == 1);
- CHECK(ssf_fresnel_ref_get(NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_ref_get(fresnel), RES_OK);
- CHECK(ssf_fresnel_ref_put(NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(fresnel_is_init, 1);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(fresnel_is_init, 0);
+ CHK(ssf_fresnel_ref_get(NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_ref_get(fresnel) == RES_OK);
+ CHK(ssf_fresnel_ref_put(NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(fresnel_is_init == 1);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(fresnel_is_init == 0);
- CHECK(ssf_fresnel_create(&allocator, &type, &fresnel), RES_OK);
- CHECK(fresnel_is_init, 1);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(fresnel_is_init, 0);
+ CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_OK);
+ CHK(fresnel_is_init == 1);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(fresnel_is_init == 0);
type.init = NULL;
- CHECK(ssf_fresnel_create(&allocator, &type, &fresnel), RES_BAD_ARG);
- CHECK(fresnel_is_init, 0);
+ CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
+ CHK(fresnel_is_init == 0);
type.init = fresnel_init;
type.release = NULL;
- CHECK(ssf_fresnel_create(&allocator, &type, &fresnel), RES_BAD_ARG);
- CHECK(fresnel_is_init, 0);
+ CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
+ CHK(fresnel_is_init == 0);
type.release = fresnel_release;
type.eval = NULL;
- CHECK(ssf_fresnel_create(&allocator, &type, &fresnel), RES_BAD_ARG);
- CHECK(fresnel_is_init, 0);
+ CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
+ CHK(fresnel_is_init == 0);
type.eval = fresnel_eval;
type.alignof_fresnel = 0;
- CHECK(ssf_fresnel_create(&allocator, &type, &fresnel), RES_BAD_ARG);
- CHECK(fresnel_is_init, 0);
+ CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_BAD_ARG);
+ CHK(fresnel_is_init == 0);
type.alignof_fresnel = ALIGNOF(struct fresnel);
- CHECK(ssf_fresnel_create(&allocator, &type, &fresnel), RES_OK);
- CHECK(fresnel_is_init, 1);
+ CHK(ssf_fresnel_create(&allocator, &type, &fresnel) == RES_OK);
+ CHK(fresnel_is_init == 1);
- CHECK(ssf_fresnel_get_data(NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_get_data(fresnel, NULL), RES_BAD_ARG);
- CHECK(ssf_fresnel_get_data(NULL, (void**)&data), RES_BAD_ARG);
- CHECK(ssf_fresnel_get_data(fresnel, (void**)&data), RES_OK);
+ CHK(ssf_fresnel_get_data(NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_get_data(fresnel, NULL) == RES_BAD_ARG);
+ CHK(ssf_fresnel_get_data(NULL, (void**)&data) == RES_BAD_ARG);
+ CHK(ssf_fresnel_get_data(fresnel, (void**)&data) == RES_OK);
- CHECK(data->id, 0xDECAFBAD);
+ CHK(data->id == 0xDECAFBAD);
data->cos_theta = 0.1;
data->value = 1.234;
- CHECK(ssf_fresnel_eval(fresnel, 0.1), data->value);
+ CHK(ssf_fresnel_eval(fresnel, 0.1) == data->value);
data->cos_theta = 1.234;
data->value = 8.1;
- CHECK(ssf_fresnel_eval(fresnel, 1.234), data->value);
+ CHK(ssf_fresnel_eval(fresnel, 1.234) == data->value);
- CHECK(fresnel_is_init, 1);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(fresnel_is_init, 0);
+ CHK(fresnel_is_init == 1);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(fresnel_is_init == 0);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_fresnel_constant.c b/src/test_ssf_fresnel_constant.c
@@ -27,32 +27,32 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssf_fresnel_create(&allocator, &ssf_fresnel_constant, &fresnel), RES_OK);
- CHECK(ssf_fresnel_create(&allocator, &fresnel_dummy, &dummy), RES_OK);
-
- CHECK(ssf_fresnel_constant_setup(NULL, -1), RES_BAD_ARG);
- CHECK(ssf_fresnel_constant_setup(fresnel, -1), RES_BAD_ARG);
- CHECK(ssf_fresnel_constant_setup(NULL, 0.5), RES_BAD_ARG);
- CHECK(ssf_fresnel_constant_setup(fresnel, 0), RES_OK);
- CHECK(ssf_fresnel_constant_setup(fresnel, 1), RES_OK);
- CHECK(ssf_fresnel_constant_setup(fresnel, 0.5), RES_OK);
- CHECK(ssf_fresnel_constant_setup(fresnel, nextafter(0, -1)), RES_BAD_ARG);
- CHECK(ssf_fresnel_constant_setup(fresnel, nextafter(1, 2)), RES_BAD_ARG);
- CHECK(ssf_fresnel_constant_setup(dummy, 0.5), RES_BAD_ARG);
-
- CHECK(ssf_fresnel_eval(fresnel, 0), 0.5);
- CHECK(ssf_fresnel_eval(fresnel, 1), 0.5);
- CHECK(ssf_fresnel_eval(fresnel, 0.1234), 0.5);
- CHECK(ssf_fresnel_constant_setup(fresnel, 0.123), RES_OK);
- CHECK(ssf_fresnel_eval(fresnel, 0), 0.123);
- CHECK(ssf_fresnel_eval(fresnel, 1), 0.123);
- CHECK(ssf_fresnel_eval(fresnel, 0.25), 0.123);
-
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(ssf_fresnel_ref_put(dummy), RES_OK);
+ CHK(ssf_fresnel_create(&allocator, &ssf_fresnel_constant, &fresnel) == RES_OK);
+ CHK(ssf_fresnel_create(&allocator, &fresnel_dummy, &dummy) == RES_OK);
+
+ CHK(ssf_fresnel_constant_setup(NULL, -1) == RES_BAD_ARG);
+ CHK(ssf_fresnel_constant_setup(fresnel, -1) == RES_BAD_ARG);
+ CHK(ssf_fresnel_constant_setup(NULL, 0.5) == RES_BAD_ARG);
+ CHK(ssf_fresnel_constant_setup(fresnel, 0) == RES_OK);
+ CHK(ssf_fresnel_constant_setup(fresnel, 1) == RES_OK);
+ CHK(ssf_fresnel_constant_setup(fresnel, 0.5) == RES_OK);
+ CHK(ssf_fresnel_constant_setup(fresnel, nextafter(0, -1)) == RES_BAD_ARG);
+ CHK(ssf_fresnel_constant_setup(fresnel, nextafter(1, 2)) == RES_BAD_ARG);
+ CHK(ssf_fresnel_constant_setup(dummy, 0.5) == RES_BAD_ARG);
+
+ CHK(ssf_fresnel_eval(fresnel, 0) == 0.5);
+ CHK(ssf_fresnel_eval(fresnel, 1) == 0.5);
+ CHK(ssf_fresnel_eval(fresnel, 0.1234) == 0.5);
+ CHK(ssf_fresnel_constant_setup(fresnel, 0.123) == RES_OK);
+ CHK(ssf_fresnel_eval(fresnel, 0) == 0.123);
+ CHK(ssf_fresnel_eval(fresnel, 1) == 0.123);
+ CHK(ssf_fresnel_eval(fresnel, 0.25) == 0.123);
+
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(ssf_fresnel_ref_put(dummy) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_fresnel_dielectric_conductor.c b/src/test_ssf_fresnel_dielectric_conductor.c
@@ -27,23 +27,23 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssf_fresnel_create(&allocator, &fresnel_dummy, &dummy), RES_OK);
- CHECK(ssf_fresnel_create
- (&allocator, &ssf_fresnel_dielectric_conductor, &fresnel), RES_OK);
+ CHK(ssf_fresnel_create(&allocator, &fresnel_dummy, &dummy) == RES_OK);
+ CHK(ssf_fresnel_create
+ (&allocator, &ssf_fresnel_dielectric_conductor, &fresnel) == RES_OK);
- CHECK(ssf_fresnel_dielectric_conductor_setup(NULL, 1.0, 1.0, 1.0), RES_BAD_ARG);
- CHECK(ssf_fresnel_dielectric_conductor_setup(fresnel, 1.0, 1.0, 1.0), RES_OK);
- CHECK(ssf_fresnel_dielectric_conductor_setup(dummy, 1.0, 1.0, 1.0), RES_BAD_ARG);
+ CHK(ssf_fresnel_dielectric_conductor_setup(NULL, 1.0, 1.0, 1.0) == RES_BAD_ARG);
+ CHK(ssf_fresnel_dielectric_conductor_setup(fresnel, 1.0, 1.0, 1.0) == RES_OK);
+ CHK(ssf_fresnel_dielectric_conductor_setup(dummy, 1.0, 1.0, 1.0) == RES_BAD_ARG);
/* TODO eval a dielectric->conductor Fresnel term on a reference */
- /*CHECK(ssf_fresnel_eval(fresnel, 1), ref);*/
+ /*CHK(ssf_fresnel_eval(fresnel, 1) == ref);*/
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(ssf_fresnel_ref_put(dummy), RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(ssf_fresnel_ref_put(dummy) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_fresnel_dielectric_dielectric.c b/src/test_ssf_fresnel_dielectric_dielectric.c
@@ -31,17 +31,17 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssf_fresnel_create(&allocator, &fresnel_dummy, &dummy), RES_OK);
- CHECK(ssf_fresnel_create
- (&allocator, &ssf_fresnel_dielectric_dielectric, &fresnel), RES_OK);
+ CHK(ssf_fresnel_create(&allocator, &fresnel_dummy, &dummy) == RES_OK);
+ CHK(ssf_fresnel_create
+ (&allocator, &ssf_fresnel_dielectric_dielectric, &fresnel) == RES_OK);
- CHECK(ssf_fresnel_dielectric_dielectric_setup(NULL, -1.0, -1.0), RES_BAD_ARG);
- CHECK(ssf_fresnel_dielectric_dielectric_setup(fresnel, -1.0, -1.0), RES_OK);
- 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);
+ CHK(ssf_fresnel_dielectric_dielectric_setup(NULL, -1.0, -1.0) == RES_BAD_ARG);
+ CHK(ssf_fresnel_dielectric_dielectric_setup(fresnel, -1.0, -1.0) == RES_OK);
+ CHK(ssf_fresnel_dielectric_dielectric_setup(dummy,-1.0, -1.0) == RES_BAD_ARG);
+ CHK(ssf_fresnel_dielectric_dielectric_setup(fresnel,1.000277, 1.5) == RES_OK);
val = ssf_fresnel_eval(fresnel, 1);
- CHECK(eq_eps(val, 0.04, 1.e-4), 1);
+ CHK(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);
@@ -50,11 +50,11 @@ main(int argc, char** argv)
printf("%g %g\n", theta_i, val);
}
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(ssf_fresnel_ref_put(dummy), RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(ssf_fresnel_ref_put(dummy) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_fresnel_no_op.c b/src/test_ssf_fresnel_no_op.c
@@ -24,16 +24,16 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssf_fresnel_create(&allocator, &ssf_fresnel_no_op, &fresnel), RES_OK);
+ CHK(ssf_fresnel_create(&allocator, &ssf_fresnel_no_op, &fresnel) == RES_OK);
- 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);
+ CHK(ssf_fresnel_eval(fresnel, 0) == 1.0);
+ CHK(ssf_fresnel_eval(fresnel, 1) == 1.0);
+ CHK(ssf_fresnel_eval(fresnel, 0.48) == 1.0);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_lambertian_reflection.c b/src/test_ssf_lambertian_reflection.c
@@ -40,31 +40,31 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
- CHECK(ssf_bsdf_create(&allocator, &ssf_lambertian_reflection, &brdf), RES_OK);
- CHECK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy), RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &ssf_lambertian_reflection, &brdf) == RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy) == RES_OK);
- CHECK(ssf_lambertian_reflection_setup(NULL, -1.0), RES_BAD_ARG);
- CHECK(ssf_lambertian_reflection_setup(brdf, -1.0), RES_BAD_ARG);
- CHECK(ssf_lambertian_reflection_setup(NULL, 1.0), RES_BAD_ARG);
- CHECK(ssf_lambertian_reflection_setup(brdf, 1.0), RES_OK);
- CHECK(ssf_lambertian_reflection_setup(brdf, 0.0), RES_OK);
- CHECK(ssf_lambertian_reflection_setup(brdf, 1.1), RES_BAD_ARG);
- CHECK(ssf_lambertian_reflection_setup(dummy, 0.0), RES_BAD_ARG);
+ CHK(ssf_lambertian_reflection_setup(NULL, -1.0) == RES_BAD_ARG);
+ CHK(ssf_lambertian_reflection_setup(brdf, -1.0) == RES_BAD_ARG);
+ CHK(ssf_lambertian_reflection_setup(NULL, 1.0) == RES_BAD_ARG);
+ CHK(ssf_lambertian_reflection_setup(brdf, 1.0) == RES_OK);
+ CHK(ssf_lambertian_reflection_setup(brdf, 0.0) == RES_OK);
+ CHK(ssf_lambertian_reflection_setup(brdf, 1.1) == RES_BAD_ARG);
+ CHK(ssf_lambertian_reflection_setup(dummy, 0.0) == RES_BAD_ARG);
d3(N, 0.0, 0.0, 1.0);
d3_normalize(wo, d3(wo, 1.0, 0.0, 1.0));
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(wi[2]/PI, pdf, 1.e-6), 1);
- CHECK(R, 0);
- CHECK(type, SSF_DIFFUSE|SSF_REFLECTION);
+ CHK(eq_eps(wi[2]/PI, pdf, 1.e-6) == 1);
+ CHK(R == 0);
+ CHK(type == (SSF_DIFFUSE|SSF_REFLECTION));
- CHECK(ssf_lambertian_reflection_setup(brdf, 0.7), RES_OK);
+ CHK(ssf_lambertian_reflection_setup(brdf, 0.7) == RES_OK);
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, 0.7, 1.e-6), 1);
- CHECK(eq_eps(pdf, d3_dot(wi, N)/PI, 1.e-6), 1);
- CHECK(type, SSF_DIFFUSE|SSF_REFLECTION);
+ CHK(eq_eps(R, 0.7, 1.e-6) == 1);
+ CHK(eq_eps(pdf, d3_dot(wi, N)/PI, 1.e-6) == 1);
+ CHK(type == (SSF_DIFFUSE|SSF_REFLECTION));
d3_normalize(wo, d3(wo, 1.0, 0.0, 1.0));
N[0] = ssp_rng_uniform_double(rng, -1, 1);
@@ -79,16 +79,16 @@ main(int argc, char** argv)
double cos_wi_N;
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf) / PI;
cos_wi_N = d3_dot(wi, N);
- CHECK(eq_eps(R, 0.7/PI, 1.e-6), 1);
- CHECK(eq_eps(cos_wi_N/PI, pdf, 1.e-6), 1);
- CHECK(type, SSF_DIFFUSE|SSF_REFLECTION);
+ CHK(eq_eps(R, 0.7/PI, 1.e-6) == 1);
+ CHK(eq_eps(cos_wi_N/PI, pdf, 1.e-6) == 1);
+ CHK(type == (SSF_DIFFUSE|SSF_REFLECTION));
sum += cos_wi_N;
sum_sqr += cos_wi_N * cos_wi_N;
}
E = sum/(double)NSTEPS;
V = sum_sqr/(double)NSTEPS - E*E;
SE = sqrt(V/(double)NSTEPS);
- CHECK(eq_eps(E, 2.0/3.0, SE), 1);
+ CHK(eq_eps(E, 2.0/3.0, SE) == 1);
sum = sum_sqr = 0;
FOR_EACH(i, 0, NSTEPS) {
@@ -97,9 +97,9 @@ main(int argc, char** argv)
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf)/PI;
cos_wi_N = d3_dot(wi, N);
- CHECK(eq_eps(R, 0.7/PI, 1.e-6), 1);
- CHECK(eq_eps(cos_wi_N/PI, pdf, 1.e-6), 1);
- CHECK(type, SSF_DIFFUSE|SSF_REFLECTION);
+ CHK(eq_eps(R, 0.7/PI, 1.e-6) == 1);
+ CHK(eq_eps(cos_wi_N/PI, pdf, 1.e-6) == 1);
+ CHK(type == (SSF_DIFFUSE|SSF_REFLECTION));
w = cos_wi_N*cos_wi_N;
sum += w;
sum_sqr += w*w;
@@ -108,25 +108,25 @@ main(int argc, char** argv)
E = sum/(double)NSTEPS;
V = sum_sqr/(double)NSTEPS - E*E;
SE = sqrt(V/(double)NSTEPS);
- CHECK(eq_eps(E, 2.0/4.0, 2.0*SE), 1);
- CHECK(eq_eps(SE, 1.0/sqrt((double)NSTEPS) * sqrt(1.0/3.0 - 1.0/4.0), 1.e-6), 1);
+ CHK(eq_eps(E, 2.0/4.0, 2.0*SE) == 1);
+ CHK(eq_eps(SE, 1.0/sqrt((double)NSTEPS) * sqrt(1.0/3.0 - 1.0/4.0), 1.e-6) == 1);
FOR_EACH(i, 0, NSTEPS) {
double val;
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, 0.7, 1.e-6), 1);
+ CHK(eq_eps(R, 0.7, 1.e-6) == 1);
val = ssf_bsdf_eval(brdf, wo, N, wi) * d3_dot(wi, N);
- CHECK(eq_eps(val, R * pdf, 1.e-6), 1);
- CHECK(type, SSF_DIFFUSE|SSF_REFLECTION);
+ CHK(eq_eps(val, R * pdf, 1.e-6) == 1);
+ CHK(type == (SSF_DIFFUSE|SSF_REFLECTION));
}
- CHECK(ssf_bsdf_ref_put(brdf), RES_OK);
- CHECK(ssf_bsdf_ref_put(dummy), RES_OK);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssf_bsdf_ref_put(brdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(dummy) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_microfacet_distribution.c b/src/test_ssf_microfacet_distribution.c
@@ -32,9 +32,9 @@ struct ALIGN(64) ufacet {
static res_T
ufacet_init(struct mem_allocator* allocator, void* distrib)
{
- NCHECK(allocator, NULL);
- NCHECK(distrib, NULL);
- CHECK(IS_ALIGNED(distrib, 64), 1);
+ CHK(allocator != NULL);
+ CHK(distrib != NULL);
+ CHK(IS_ALIGNED(distrib, 64) == 1);
((struct ufacet*)distrib)->id = 0xDECAFBAD;
ufacet_is_init = 1;
return RES_OK;
@@ -43,8 +43,8 @@ ufacet_init(struct mem_allocator* allocator, void* distrib)
static void
ufacet_release(void* distrib)
{
- NCHECK(distrib, NULL);
- CHECK(((struct ufacet*)distrib)->id, 0xDECAFBAD);
+ CHK(distrib != NULL);
+ CHK(((struct ufacet*)distrib)->id == 0xDECAFBAD);
ufacet_is_init = 0;
}
@@ -57,12 +57,12 @@ ufacet_sample
double* pdf)
{
struct ufacet* ufacet = distrib;
- NCHECK(ufacet, NULL);
- NCHECK(N, NULL);
- NCHECK(wh, NULL);
- NCHECK(pdf, NULL);
- CHECK(ufacet->rng, rng);
- CHECK(d3_eq(ufacet->N, N), 1);
+ CHK(ufacet != NULL);
+ CHK(N != NULL);
+ CHK(wh != NULL);
+ CHK(pdf != NULL);
+ CHK(ufacet->rng == rng);
+ CHK(d3_eq(ufacet->N, N) == 1);
d3_normalize(wh, d3(wh, 1.0, 2.0, 3.0));
*pdf = ufacet->pdf;
}
@@ -74,11 +74,11 @@ ufacet_eval
const double wh[3])
{
struct ufacet* ufacet = distrib;
- NCHECK(distrib, NULL);
- NCHECK(N, NULL);
- NCHECK(wh, NULL);
- CHECK(d3_eq(ufacet->wh, wh), 1);
- CHECK(d3_eq(ufacet->N, N), 1);
+ CHK(distrib != NULL);
+ CHK(N != NULL);
+ CHK(wh != NULL);
+ CHK(d3_eq(ufacet->wh, wh) == 1);
+ CHK(d3_eq(ufacet->N, N) == 1);
return ufacet->value;
}
@@ -89,10 +89,10 @@ ufacet_pdf
const double wh[3])
{
struct ufacet* ufacet = distrib;
- NCHECK(N, NULL);
- NCHECK(wh, NULL);
- CHECK(d3_eq(ufacet->wh, wh), 1);
- CHECK(d3_eq(ufacet->N, N), 1);
+ CHK(N != NULL);
+ CHK(wh != NULL);
+ CHK(d3_eq(ufacet->wh, wh) == 1);
+ CHK(d3_eq(ufacet->N, N) == 1);
return ufacet->pdf;
}
@@ -109,7 +109,7 @@ main(int argc, char** argv)
(void)argc, (void)argv;
mem_init_proxy_allocator(&allocator, &mem_default_allocator);
- CHECK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
type.init = ufacet_init;
type.release = ufacet_release;
@@ -120,57 +120,57 @@ main(int argc, char** argv)
type.alignof_distribution = ALIGNOF(struct ufacet);
#define CREATE ssf_microfacet_distribution_create
- CHECK(CREATE(NULL, NULL, NULL), RES_BAD_ARG);
- CHECK(CREATE(&allocator, NULL, NULL), RES_BAD_ARG);
- CHECK(CREATE(NULL, &type, NULL), RES_BAD_ARG);
- CHECK(CREATE(&allocator, &type, NULL), RES_BAD_ARG);
- CHECK(CREATE(NULL, NULL, &distrib), RES_BAD_ARG);
- CHECK(CREATE(&allocator, NULL, &distrib), RES_BAD_ARG);
-
- CHECK(ufacet_is_init, 0);
- CHECK(CREATE(NULL, &type, &distrib), RES_OK);
- CHECK(ufacet_is_init, 1);
-
- CHECK(ssf_microfacet_distribution_ref_get(NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_distribution_ref_get(distrib), RES_OK);
- CHECK(ssf_microfacet_distribution_ref_put(NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_distribution_ref_put(distrib), RES_OK);
- CHECK(ufacet_is_init, 1);
- CHECK(ssf_microfacet_distribution_ref_put(distrib), RES_OK);
- CHECK(ufacet_is_init, 0);
-
- CHECK(CREATE(&allocator, &type, &distrib), RES_OK);
- CHECK(ufacet_is_init, 1);
- CHECK(ssf_microfacet_distribution_ref_put(distrib), RES_OK);
- CHECK(ufacet_is_init, 0);
+ CHK(CREATE(NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(&allocator, NULL, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, &type, NULL) == RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, NULL) == RES_BAD_ARG);
+ CHK(CREATE(NULL, NULL, &distrib) == RES_BAD_ARG);
+ CHK(CREATE(&allocator, NULL, &distrib) == RES_BAD_ARG);
+
+ CHK(ufacet_is_init == 0);
+ CHK(CREATE(NULL, &type, &distrib) == RES_OK);
+ CHK(ufacet_is_init == 1);
+
+ CHK(ssf_microfacet_distribution_ref_get(NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_distribution_ref_get(distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ufacet_is_init == 1);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ufacet_is_init == 0);
+
+ CHK(CREATE(&allocator, &type, &distrib) == RES_OK);
+ CHK(ufacet_is_init == 1);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ufacet_is_init == 0);
type.init = NULL;
- CHECK(CREATE(&allocator, &type, &distrib), RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.init = ufacet_init;
type.release = NULL;
- CHECK(CREATE(&allocator, &type, &distrib), RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.release = ufacet_release;
type.sample = NULL;
- CHECK(CREATE(&allocator, &type, &distrib), RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.sample = ufacet_sample;
type.eval = NULL;
- CHECK(CREATE(&allocator, &type, &distrib), RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.eval = ufacet_eval;
type.pdf = NULL;
- CHECK(CREATE(&allocator, &type, &distrib), RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.pdf = ufacet_pdf;
type.alignof_distribution = 0;
- CHECK(CREATE(&allocator, &type, &distrib), RES_BAD_ARG);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_BAD_ARG);
type.alignof_distribution = ALIGNOF(struct ufacet);
- CHECK(CREATE(&allocator, &type, &distrib), RES_OK);
- CHECK(ufacet_is_init, 1);
+ CHK(CREATE(&allocator, &type, &distrib) == RES_OK);
+ CHK(ufacet_is_init == 1);
#undef CREATE
- CHECK(ssf_microfacet_distribution_get_data(NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_distribution_get_data(distrib, NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_distribution_get_data(NULL, (void**)&data), RES_BAD_ARG);
- CHECK(ssf_microfacet_distribution_get_data(distrib, (void**)&data), RES_OK);
- CHECK(data->id, 0xDECAFBAD);
+ CHK(ssf_microfacet_distribution_get_data(NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_distribution_get_data(distrib, NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_distribution_get_data(NULL, (void**)&data) == RES_BAD_ARG);
+ CHK(ssf_microfacet_distribution_get_data(distrib, (void**)&data) == RES_OK);
+ CHK(data->id == 0xDECAFBAD);
d3(N, 0.0, 1.0, 0.0);
d3_set(data->N, N);
@@ -180,22 +180,22 @@ main(int argc, char** argv)
data->value = 0.43;
ssf_microfacet_distribution_sample(distrib, rng, N, wh, &pdf);
- CHECK(d3_eq(wh, data->wh), 1);
- CHECK(pdf, data->pdf);
+ CHK(d3_eq(wh, data->wh) == 1);
+ CHK(pdf == data->pdf);
ssf_microfacet_distribution_sample(distrib, rng, N, wh, &pdf);
- CHECK(d3_eq(wh, data->wh), 1);
- CHECK(pdf, data->pdf);
+ CHK(d3_eq(wh, data->wh) == 1);
+ CHK(pdf == data->pdf);
- CHECK(ssf_microfacet_distribution_eval(distrib, N, wh), data->value);
- CHECK(ssf_microfacet_distribution_pdf(distrib, N, wh), data->pdf);
+ CHK(ssf_microfacet_distribution_eval(distrib, N, wh) == data->value);
+ CHK(ssf_microfacet_distribution_pdf(distrib, N, wh) == data->pdf);
- CHECK(ssf_microfacet_distribution_ref_put(distrib), RES_OK);
- CHECK(ufacet_is_init, 0);
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ufacet_is_init == 0);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_microfacet_reflection.c b/src/test_ssf_microfacet_reflection.c
@@ -34,23 +34,23 @@ main(int argc, char** argv)
(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_bsdf_create(&allocator, &ssf_microfacet2_reflection, &bsdf), RES_OK);
- CHECK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy), RES_OK);
- CHECK(ssf_fresnel_create(&allocator, &ssf_fresnel_no_op, &F), RES_OK);
- CHECK(ssf_microfacet_distribution_create
- (&allocator, &ssf_beckmann_distribution, &D), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &ssf_microfacet2_reflection, &bsdf) == RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy) == RES_OK);
+ CHK(ssf_fresnel_create(&allocator, &ssf_fresnel_no_op, &F) == RES_OK);
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, &ssf_beckmann_distribution, &D) == RES_OK);
- CHECK(ssf_beckmann_distribution_setup(D, 0.9), RES_OK);
+ CHK(ssf_beckmann_distribution_setup(D, 0.9) == RES_OK);
- CHECK(ssf_microfacet_reflection_setup(NULL, NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(bsdf, NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(NULL, F, NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(bsdf, F, NULL), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(NULL, NULL, D), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(bsdf, NULL, D), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(NULL, F, D), RES_BAD_ARG);
- CHECK(ssf_microfacet_reflection_setup(bsdf, F, D), RES_OK);
+ CHK(ssf_microfacet_reflection_setup(NULL, NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(bsdf, NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(NULL, F, NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(bsdf, F, NULL) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(NULL, NULL, D) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(bsdf, NULL, D) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(NULL, F, D) == RES_BAD_ARG);
+ CHK(ssf_microfacet_reflection_setup(bsdf, F, D) == RES_OK);
/* Check energy conservation */
ssp_ran_sphere_uniform(rng, N, NULL);
@@ -58,20 +58,20 @@ main(int argc, char** argv)
FOR_EACH(i, 0, NSTEPS) {
double wi[3], pdf;
int type;
- CHECK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &pdf), 1);
- CHECK(type, SSF_GLOSSY | SSF_REFLECTION);
- CHECK(d3_dot(wi, N) > 0, 1);
+ CHK(ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &pdf) == 1);
+ CHK(type == (SSF_GLOSSY | SSF_REFLECTION));
+ CHK(d3_dot(wi, N) > 0);
}
- CHECK(ssf_bsdf_ref_put(bsdf), RES_OK);
- CHECK(ssf_bsdf_ref_put(dummy), RES_OK);
- CHECK(ssf_fresnel_ref_put(F), RES_OK);
- CHECK(ssf_microfacet_distribution_ref_put(D), RES_OK);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(dummy) == RES_OK);
+ CHK(ssf_fresnel_ref_put(F) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(D) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_pillbox_distribution.c b/src/test_ssf_pillbox_distribution.c
@@ -0,0 +1,68 @@
+/* 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/>. */
+
+#define _POSIX_C_SOURCE 200112L /* nextafter support */
+
+#include "ssf.h"
+#include "test_ssf_utils.h"
+
+#include <math.h>
+
+int
+main(int argc, char** argv)
+{
+ struct mem_allocator allocator;
+ struct ssp_rng* rng;
+ struct ssf_microfacet_distribution* distrib;
+ struct ssf_microfacet_distribution* dummy;
+ const size_t NTESTS = 10;
+ size_t itest;
+ (void)argc, (void)argv;
+
+ mem_init_proxy_allocator(&allocator, &mem_default_allocator);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
+
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, &ssf_pillbox_distribution, &distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_create
+ (&allocator, µfacet_dummy, &dummy) == RES_OK);
+
+ CHK(ssf_pillbox_distribution_setup(NULL, -1) == RES_BAD_ARG);
+ CHK(ssf_pillbox_distribution_setup(distrib, -1) == RES_BAD_ARG);
+ CHK(ssf_pillbox_distribution_setup(NULL, 0.5) == RES_BAD_ARG);
+ CHK(ssf_pillbox_distribution_setup(distrib, 0.5) == RES_OK);
+ CHK(ssf_pillbox_distribution_setup(dummy, 0.5) == RES_BAD_ARG);
+
+ CHK(ssf_pillbox_distribution_setup(distrib, 1) == RES_OK);
+ CHK(ssf_pillbox_distribution_setup(distrib, nextafter(0, 1)) == RES_OK);
+ CHK(ssf_pillbox_distribution_setup(distrib, nextafter(1, 2)) == RES_BAD_ARG);
+ CHK(ssf_pillbox_distribution_setup(distrib, 0) == RES_BAD_ARG);
+
+ FOR_EACH(itest, 0, NTESTS) {
+ const double roughness = nextafter(ssp_rng_canonical(rng), 2); /*in ]0, 1]*/
+ CHK(ssf_pillbox_distribution_setup(distrib, roughness) == RES_OK);
+ check_microfacet_distribution(distrib, rng);
+ }
+
+ CHK(ssf_microfacet_distribution_ref_put(distrib) == RES_OK);
+ CHK(ssf_microfacet_distribution_ref_put(dummy) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
+
+ check_memory_allocator(&allocator);
+ mem_shutdown_proxy_allocator(&allocator);
+ CHK(mem_allocated_size() == 0);
+ return 0;
+}
+
diff --git a/src/test_ssf_specular_reflection.c b/src/test_ssf_specular_reflection.c
@@ -36,71 +36,70 @@ main(int argc, char** argv)
(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_bsdf_create(&allocator, &ssf_specular_reflection, &brdf), RES_OK);
- CHECK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy), RES_OK);
- CHECK(ssf_fresnel_create
- (&allocator, &ssf_fresnel_dielectric_dielectric, &fresnel), RES_OK);
- CHECK(ssf_fresnel_dielectric_dielectric_setup(fresnel, 0.7, 1), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &ssf_specular_reflection, &brdf) == RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy) == RES_OK);
+ CHK(ssf_fresnel_create
+ (&allocator, &ssf_fresnel_dielectric_dielectric, &fresnel) == RES_OK);
+ CHK(ssf_fresnel_dielectric_dielectric_setup(fresnel, 0.7, 1) == RES_OK);
- CHECK(ssf_specular_reflection_setup(NULL, NULL), RES_BAD_ARG);
- CHECK(ssf_specular_reflection_setup(brdf, NULL), RES_BAD_ARG);
- CHECK(ssf_specular_reflection_setup(NULL, fresnel), RES_BAD_ARG);
- CHECK(ssf_specular_reflection_setup(brdf, fresnel), RES_OK);
- CHECK(ssf_specular_reflection_setup(dummy, fresnel), RES_BAD_ARG);
+ CHK(ssf_specular_reflection_setup(NULL, NULL) == RES_BAD_ARG);
+ CHK(ssf_specular_reflection_setup(brdf, NULL) == RES_BAD_ARG);
+ CHK(ssf_specular_reflection_setup(NULL, fresnel) == RES_BAD_ARG);
+ CHK(ssf_specular_reflection_setup(brdf, fresnel) == RES_OK);
+ CHK(ssf_specular_reflection_setup(dummy, fresnel) == RES_BAD_ARG);
d3(N, 0.0, 1.0, 0.0);
d3_normalize(wo, d3(wo, 1.0, 1.0, 0.0));
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6), 1);
- CHECK(IS_INF(pdf), 1);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6) == 1);
+ CHK(IS_INF(pdf) == 1);
+ CHK(type == (SSF_SPECULAR|SSF_REFLECTION));
d3_normalize(wo, d3(wo, 1.0, 1.0, 0.0));
- CHECK(ssf_specular_reflection_setup(brdf, fresnel), RES_OK);
+ CHK(ssf_specular_reflection_setup(brdf, fresnel) == RES_OK);
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6), 1);
- CHECK(IS_INF(pdf), 1);
- CHECK(d3_eq_eps(d3(wo, -wo[0], wo[1], 0.0), wi, 1.e-6), 1);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6) == 1);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(d3(wo, -wo[0], wo[1], 0.0), wi, 1.e-6) == 1);
+ CHK(type == (SSF_SPECULAR|SSF_REFLECTION));
- CHECK(ssf_bsdf_eval(brdf, wo, N, wi), 0.0);
- CHECK(ssf_bsdf_pdf(brdf, wo, N, wi), 0.0);
+ CHK(ssf_bsdf_eval(brdf, wo, N, wi) == 0.0);
+ CHK(ssf_bsdf_pdf(brdf, wo, N, wi) == 0.0);
d3(wo, 0.0, 1.0, 0.0);
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6), 1);
- CHECK(IS_INF(pdf), 1);
- CHECK(d3_eq_eps(d3(wo, 0.0, 1.0, 0.0), wi, 1.e-6), 1);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6) == 1);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(d3(wo, 0.0, 1.0, 0.0), wi, 1.e-6) == 1);
+ CHK(type == (SSF_SPECULAR|SSF_REFLECTION));
d3_normalize(wo, d3(wo, -1.0, 1.0, 0.0));
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6), 1);
- CHECK(IS_INF(pdf), 1);
- CHECK(d3_eq_eps(d3(wo, -wo[0], wo[1], 0.0), wi, 1.e-6), 1);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(eq_eps(R, ssf_fresnel_eval(fresnel, d3_dot(N, wi)), 1.e-6) == 1);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(d3(wo, -wo[0], wo[1], 0.0), wi, 1.e-6) == 1);
+ CHK(type == (SSF_SPECULAR|SSF_REFLECTION));
wo[0] = ssp_rng_uniform_double(rng, -1, 1);
wo[1] = ssp_rng_uniform_double(rng, 0, 1);
wo[2] = ssp_rng_uniform_double(rng, -1, 1);
d3_normalize(wo, wo);
R = ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(type == (SSF_SPECULAR|SSF_REFLECTION));
FOR_EACH(i, 0, NSTEPS) {
- CHECK(eq_eps(ssf_bsdf_sample
- (brdf, rng, wo, N, wi, &type, &pdf), R, 1.e-6), 1);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(eq_eps(ssf_bsdf_sample(brdf, rng, wo, N, wi, &type, &pdf), R, 1.e-6));
+ CHK(type == (SSF_SPECULAR|SSF_REFLECTION));
}
- CHECK(ssf_bsdf_ref_put(brdf), RES_OK);
- CHECK(ssf_bsdf_ref_put(dummy), RES_OK);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssf_bsdf_ref_put(brdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(dummy) == RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_specular_transmission.c b/src/test_ssf_specular_transmission.c
@@ -35,69 +35,69 @@ main(int argc, char** argv)
(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_specular_transmission, &btdf), RES_OK);
- CHECK(ssf_bxdf_create(&allocator, &bxdf_dummy, &dummy), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
+ CHK(ssf_bxdf_create(&allocator, &ssf_specular_transmission, &btdf) == RES_OK);
+ CHK(ssf_bxdf_create(&allocator, &bxdf_dummy, &dummy) == RES_OK);
CHECK(ssf_fresnel_create
(&allocator, &ssf_fresnel_dielectric_dielectric, &fresnel), RES_OK);
- CHECK(ssf_fresnel_dielectric_dielectric_setup(fresnel, 1.00027, 1.5), RES_OK);
+ CHK(ssf_fresnel_dielectric_dielectric_setup(fresnel, 1.00027, 1.5) == RES_OK);
- CHECK(ssf_specular_transmission_setup(NULL, -1, -1), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(btdf, -1, -1), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(NULL, 1.00027, -1), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(btdf, 1.00027, -1), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(NULL, -1, 1.5), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(btdf, -1, 1.5), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(NULL, 1.00027, 1.5), RES_BAD_ARG);
- CHECK(ssf_specular_transmission_setup(btdf, 1.00027, 1.5), RES_OK);
- CHECK(ssf_specular_transmission_setup(dummy, 1.00027, 1.5), RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(NULL, -1, -1) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(btdf, -1, -1) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(NULL, 1.00027, -1) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(btdf, 1.00027, -1) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(NULL, -1, 1.5) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(btdf, -1, 1.5) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(NULL, 1.00027, 1.5) == RES_BAD_ARG);
+ CHK(ssf_specular_transmission_setup(btdf, 1.00027, 1.5) == RES_OK);
+ CHK(ssf_specular_transmission_setup(dummy, 1.00027, 1.5) == RES_BAD_ARG);
d3(N, 0.0, 1.0, 0.0);
d3_normalize(wo, d3(wo, 1.0, 1.0, 0.0));
R = ssf_bxdf_sample(btdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, ssf_fresnel_eval(fresnel, fabs(d3_dot(N, wi))), 1.e-6), RES_OK);
- CHECK(d3_eq_eps(wi, d3_minus(tmp, wo), 1.e-6), 0);
- CHECK(wi[1] < 0, 1);
- CHECK(IS_INF(pdf), 1);
- CHECK(type, SSF_SPECULAR|SSF_TRANSMISSION);
+ CHK(eq_eps(R, ssf_fresnel_eval(fresnel, fabs(d3_dot(N, wi))), 1.e-6) == RES_OK);
+ CHK(d3_eq_eps(wi, d3_minus(tmp, wo), 1.e-6) == 0);
+ CHK(wi[1] < 0 == 1);
+ CHK(IS_INF(pdf) == 1);
+ CHK(type == SSF_SPECULAR|SSF_TRANSMISSION);
- CHECK(ssf_bxdf_eval(btdf, wo, N, wi), 0.0);
- CHECK(ssf_bxdf_pdf(btdf, wo, N, wi), 0.0);
+ CHK(ssf_bxdf_eval(btdf, wo, N, wi) == 0.0);
+ CHK(ssf_bxdf_pdf(btdf, wo, N, wi) == 0.0);
d3(wo, 0.0, 1.0, 0.0);
R = ssf_bxdf_sample(btdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, ssf_fresnel_eval(fresnel, fabs(d3_dot(N, wi))), 1.e-6), RES_OK);
- CHECK(IS_INF(pdf), 1);
- CHECK(d3_eq_eps(wi, d3_minus(tmp, wo), 1.e-6), 1);
- CHECK(type, SSF_SPECULAR|SSF_TRANSMISSION);
+ CHK(eq_eps(R, ssf_fresnel_eval(fresnel, fabs(d3_dot(N, wi))), 1.e-6) == RES_OK);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(wi, d3_minus(tmp, wo), 1.e-6) == 1);
+ CHK(type == SSF_SPECULAR|SSF_TRANSMISSION);
d3_normalize(wo, d3(wo, -1.0, 1.0, 0.0));
R = ssf_bxdf_sample(btdf, rng, wo, N, wi, &type, &pdf);
reflect(tmp, wi, N);
- CHECK(type, SSF_SPECULAR|SSF_TRANSMISSION);
+ CHK(type == SSF_SPECULAR|SSF_TRANSMISSION);
d3_normalize(wo, d3(wo, 1.0, 1.0, 0.0));
R = ssf_bxdf_sample(btdf, rng, wo, N, wi, &type, &pdf);
- CHECK(d3_eq_eps(wi, tmp, 1.e-6), 1);
- CHECK(type, SSF_SPECULAR|SSF_TRANSMISSION);
+ CHK(d3_eq_eps(wi, tmp, 1.e-6) == 1);
+ CHK(type == SSF_SPECULAR|SSF_TRANSMISSION);
d3_normalize(wo, d3(wo, -1, 1.e-6, 0));
R = ssf_bxdf_sample(btdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, 0, 1.e-3), 1);
- CHECK(type, SSF_SPECULAR|SSF_TRANSMISSION);
+ CHK(eq_eps(R, 0, 1.e-3) == 1);
+ CHK(type == SSF_SPECULAR|SSF_TRANSMISSION);
/* Check total internal reflection */
- CHECK(ssf_specular_transmission_setup(btdf, 1.5, 1.00027), RES_OK);
+ CHK(ssf_specular_transmission_setup(btdf, 1.5, 1.00027) == RES_OK);
R = ssf_bxdf_sample(btdf, rng, wo, N, wi, &type, &pdf);
- CHECK(eq_eps(R, 0, 1.e-3), 1);
- CHECK(type, SSF_SPECULAR|SSF_REFLECTION);
+ CHK(eq_eps(R, 0, 1.e-3) == 1);
+ CHK(type == SSF_SPECULAR|SSF_REFLECTION);
- CHECK(ssf_fresnel_ref_put(fresnel), RES_OK);
- CHECK(ssf_bxdf_ref_put(btdf), RES_OK);
- CHECK(ssf_bxdf_ref_put(dummy), RES_OK);
- CHECK(ssp_rng_ref_put(rng), RES_OK);
+ CHK(ssf_fresnel_ref_put(fresnel) == RES_OK);
+ CHK(ssf_bxdf_ref_put(btdf) == RES_OK);
+ CHK(ssf_bxdf_ref_put(dummy) == RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
check_memory_allocator(&allocator);
mem_shutdown_proxy_allocator(&allocator);
- CHECK(mem_allocated_size(), 0);
+ CHK(mem_allocated_size() == 0);
return 0;
}
diff --git a/src/test_ssf_thin_specular_dielectric.c b/src/test_ssf_thin_specular_dielectric.c
@@ -40,85 +40,85 @@ main(int argc, char** argv)
(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_bsdf_create
- (&allocator, &ssf_thin_specular_dielectric, &bsdf), RES_OK);
- CHECK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy), RES_OK);
+ CHK(ssp_rng_create(&allocator, &ssp_rng_threefry, &rng) == RES_OK);
+ CHK(ssf_bsdf_create
+ (&allocator, &ssf_thin_specular_dielectric, &bsdf) == RES_OK);
+ CHK(ssf_bsdf_create(&allocator, &bsdf_dummy, &dummy) == RES_OK);
#define SETUP ssf_thin_specular_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);
+ CHK(SETUP(NULL, -1, 0, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 0, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 0, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 0, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 1.00027, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 1.00027, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 1.00027, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 1.00027, 0, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 0, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 0, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 0, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 0, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 1.00027, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 1.00027, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 1.00027, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 1.00027, 1.5, -1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 0, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 0, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 0, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 0, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 1.00027, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 1.00027, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 1.00027, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 1.00027, 0, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 0, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 0, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 0, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 0, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, -1, 1.00027, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, -1, 1.00027, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(NULL, 1, 1.00027, 1.5, 0.1) == RES_BAD_ARG);
+ CHK(SETUP(bsdf, 1, 1.00027, 1.5, 0.1) == RES_OK);
+ CHK(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_bsdf_sample(bsdf, rng, wo, N, wi, &type, &pdf);
- NCHECK(R, 0);
- NCHECK(type & SSF_SPECULAR, 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);
+ CHK(R != 0);
+ CHK(type & SSF_SPECULAR);
+ CHK(IS_INF(pdf) == 1);
+ CHK(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));
- CHECK(ssf_bsdf_eval(bsdf, wo, N, wi), 0.0);
- CHECK(ssf_bsdf_pdf(bsdf, wo, N, wi), 0.0);
+ CHK(ssf_bsdf_eval(bsdf, wo, N, wi) == 0.0);
+ CHK(ssf_bsdf_pdf(bsdf, wo, N, wi) == 0.0);
d3(wo, 0.0, 1.0, 0.0);
R = ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &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);
- CHECK(type, SSF_SPECULAR | SSF_TRANSMISSION);
+ CHK(R != 0);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(wi, d3(tmp, -wo[0], -wo[1], 0), 1.e-6) == 1);
+ CHK(type == (SSF_SPECULAR | SSF_TRANSMISSION));
d3(wo, 1.0, 0.0, 0.0);
R = ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &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);
- CHECK(type, SSF_SPECULAR | SSF_REFLECTION);
+ CHK(R != 0);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(wi, d3(tmp, -wo[0], wo[1], 0), 1.e-6) == 1);
+ CHK(type == (SSF_SPECULAR | SSF_REFLECTION));
/* Check total internal reflection, i.e. no transmission */
d3_normalize(wo, d3(wo, 1, 0.0000001, 0));
- CHECK(ssf_thin_specular_dielectric_setup(bsdf, 0, 1.4, 1.0, 1), RES_OK);
+ CHK(ssf_thin_specular_dielectric_setup(bsdf, 0, 1.4, 1.0, 1) == RES_OK);
R = ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &pdf);
- CHECK(R, 1);
- CHECK(IS_INF(pdf), 1);
- CHECK(d3_eq_eps(wi, d3(tmp, -wo[0], wo[1], 0), 1.e-6), 1);
- CHECK(type, SSF_SPECULAR | SSF_REFLECTION);
+ CHK(R == 1);
+ CHK(IS_INF(pdf) == 1);
+ CHK(d3_eq_eps(wi, d3(tmp, -wo[0], wo[1], 0), 1.e-6) == 1);
+ CHK(type == (SSF_SPECULAR | SSF_REFLECTION));
FOR_EACH(i, 0, NSTEPS) {
R = ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &pdf);
- CHECK(type & SSF_REFLECTION, 1);
- CHECK(R, 1);
+ CHK(type & SSF_REFLECTION);
+ CHK(R == 1);
}
/* Check T VS R proportion and E conservation */
@@ -139,9 +139,9 @@ main(int argc, char** argv)
#define STD(x, x2, n) \
(VAR((x), (x2), (n)) > 0 ? sqrt(VAR((x), (x2), (n)) / (double)(n)) : 0)
/* Check conservation of energy */
- CHECK(MEAN(SR+ST, NSTEPS), 1);
+ CHK(MEAN(SR+ST, NSTEPS) == 1);
/* Check T VS R proportion */
- CHECK(eq_eps(MEAN(SR, NSTEPS), 0.0540540540, 3 * STD(SR,SR2,NSTEPS)), 1);
+ CHK(eq_eps(MEAN(SR, NSTEPS), 0.0540540540, 3 * STD(SR,SR2,NSTEPS)) == 1);
#undef MEAN
#undef VAR
#undef STD
@@ -156,20 +156,20 @@ main(int argc, char** argv)
FOR_EACH(i, 0, NSTEPS) {
R = ssf_bsdf_sample(bsdf, rng, wo, N, wi, &type, &pdf);
- NCHECK(R, 0);
- CHECK(IS_INF(pdf), 1);
+ CHK(R != 0);
+ CHK(IS_INF(pdf) == 1);
if(d3_eq_eps(wi, reflect, 1.e-6)) {
- CHECK(type, SSF_SPECULAR | SSF_REFLECTION);
+ CHK(type == (SSF_SPECULAR | SSF_REFLECTION));
} else if(d3_eq_eps(wi, refract, 1e-6), 1) {
- CHECK(type, SSF_SPECULAR | SSF_TRANSMISSION);
+ CHK(type == (SSF_SPECULAR | SSF_TRANSMISSION));
} else {
FATAL("Unexpected value.\n");
}
}
- CHECK(ssp_rng_ref_put(rng), RES_OK);
- CHECK(ssf_bsdf_ref_put(bsdf), RES_OK);
- CHECK(ssf_bsdf_ref_put(dummy), RES_OK);
+ CHK(ssp_rng_ref_put(rng) == RES_OK);
+ CHK(ssf_bsdf_ref_put(bsdf) == RES_OK);
+ CHK(ssf_bsdf_ref_put(dummy) == RES_OK);
return 0;
}
diff --git a/src/test_ssf_utils.h b/src/test_ssf_utils.h
@@ -216,7 +216,7 @@ check_microfacet_distribution
V = MMAX(sum2 / (double)n - E*E, 0);
SE = sqrt(V/(double)n);
} while(SE > E * 0.05);
- CHECK(eq_eps(E, 1.0, 3*SE), 1);
+ CHK(eq_eps(E, 1.0, 3*SE) == 1);
/* Check the sampling of a direction wh and the returned pdf */
FOR_EACH(i, 0, NSTEPS) {
@@ -225,7 +225,7 @@ check_microfacet_distribution
ssf_microfacet_distribution_sample(distrib, rng, N, wh, &pdf);
D = ssf_microfacet_distribution_eval(distrib, N, wh);
weight = D * d3_dot(wh, N) / pdf;
- CHECK(eq_eps(weight, 1.0, 1.e-6), 1);
+ CHK(eq_eps(weight, 1.0, 1.e-6) == 1);
}
}