mrumtl

Describe materials that vary spectrally
git clone git://git.meso-star.fr/mrumtl.git
Log | Files | Refs | README | LICENSE

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:
Mcmake/CMakeLists.txt | 5+++++
Asrc/test_mrumtl_wlen.c | 219+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
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; +}