commit 469a81abaef549b7fd3dee09478a9f3954f9f905
parent 6a2029b2107860c5e056809aefbce01e214d8f15
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 2 Mar 2020 12:16:40 +0100
Test the fileformat where BRDFs are defined per wavelength
Diffstat:
2 files changed, 224 insertions(+), 0 deletions(-)
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
@@ -81,6 +81,11 @@ if(NOT NO_TEST)
endfunction()
new_test(test_mrumtl)
+ new_test(test_mrumtl_wlen)
+
+ if(CMAKE_COMPILER_IS_GNUCC)
+ target_link_libraries(test_mrumtl_wlen m)
+ endif()
endif()
diff --git a/src/test_mrumtl_wlen.c b/src/test_mrumtl_wlen.c
@@ -0,0 +1,219 @@
+/* Copyright (C) 2020 |Meso|Star> (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 */
+
+#include "mrumtl.h"
+#include <rsys/mem_allocator.h>
+
+#include <math.h>
+#include <stdio.h>
+
+static void
+check_load(struct mrumtl* mrumtl)
+{
+ const char* filename = "my_mat.mrumtl";
+ FILE* fp = NULL;
+
+ CHK(mrumtl);
+
+ CHK(fp = fopen(filename, "w+"));
+ fprintf(fp, "wavelengths\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "290\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "290 bad_type\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "290 lambertian\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "290 lambertian -0.00001");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "290 lambertian 1.00001");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "290 lambertian 1 invalid_word\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ fprintf(fp, "280 specular 0\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ fprintf(fp, "290 specular 0\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ fprintf(fp, "290.1 specular -0.0001\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ fprintf(fp, "290.1 specular 1.0001\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ fprintf(fp, "290.1 specular 0.5\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 2\n");
+ fprintf(fp, "290 lambertian 1\n");
+ fprintf(fp, "290.1 specular 0.5\n");
+ fprintf(fp, "dummy line that is not parsed.\n");
+ rewind(fp);
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK);
+
+ fclose(fp);
+}
+
+static void
+check_fetch(struct mrumtl* mrumtl)
+{
+ const struct mrumtl_brdf* brdf = NULL;
+ const char* filename = "my_mat.mrumtl";
+ FILE* fp = NULL;
+
+ CHK(mrumtl);
+
+ CHK(fp = fopen(filename, "w+"));
+ fprintf(fp, "wavelengths 1\n");
+ fprintf(fp, "280 lambertian 0.3");
+ rewind(fp);
+
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK);
+
+ CHK(mrumtl_fetch_brdf(NULL, 0, &brdf) == RES_BAD_ARG);
+ CHK(mrumtl_fetch_brdf(mrumtl, 0, NULL) == RES_BAD_ARG);
+ CHK(mrumtl_fetch_brdf(mrumtl, 0, &brdf) == RES_OK);
+ CHK(brdf != NULL);
+
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.3);
+
+ CHK(fp = freopen(filename, "w+", fp));
+ fprintf(fp, "wavelengths 10\n");
+ fprintf(fp, "0.1 lambertian 0.1\n");
+ fprintf(fp, "0.2 specular 0.2\n");
+ fprintf(fp, "3.0 lambertian 0.3\n");
+ fprintf(fp, "4.1 lambertian 0.4\n");
+ fprintf(fp, "4.5 specular 0.5\n");
+ fprintf(fp, "4.6 lambertian 0.21\n");
+ fprintf(fp, "7.0 lambertian 0.11\n");
+ fprintf(fp, "7.08 specular 0.61\n");
+ fprintf(fp, "8.9 specular 0.123\n");
+ fprintf(fp, "9.31 lambertian 0.23");
+ rewind(fp);
+
+ CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK);
+ CHK(mrumtl_fetch_brdf(mrumtl, 0.11, &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.1);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, nextafter(0.15, 0), &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.1);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, nextafter(0.15, 1), &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR);
+ CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0.2);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, 4.1, &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.4);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, 0, &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.1);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, 200, &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.23);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, 8.91, &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR);
+ CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0.123);
+
+ CHK(mrumtl_fetch_brdf(mrumtl, 2.9, &brdf) == RES_OK);
+ CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN);
+ CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.3);
+
+ fclose(fp);
+}
+
+int
+main(int argc, char** argv)
+{
+ struct mrumtl* mrumtl = NULL;
+ (void)argc, (void)argv;
+
+ CHK(mrumtl_create(NULL, NULL, 1, &mrumtl) == RES_OK);
+
+ check_load(mrumtl);
+ check_fetch(mrumtl);
+
+ CHK(mrumtl_ref_put(mrumtl) == RES_OK);
+
+ CHK(mem_allocated_size() == 0);
+ return 0;
+}