mrumtl

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

commit 1cf0cc38686e9be2aef0b216a991d1239a4f57dd
parent 469a81abaef549b7fd3dee09478a9f3954f9f905
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Mon,  2 Mar 2020 14:41:55 +0100

Test the fileformat where BRDFs are defined per band

Diffstat:
Mcmake/CMakeLists.txt | 2++
Msrc/mrumtl.c | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Asrc/test_mrumtl_band.c | 290+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msrc/test_mrumtl_wlen.c | 19+++++++++++++++++++
4 files changed, 390 insertions(+), 26 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -82,9 +82,11 @@ if(NOT NO_TEST) new_test(test_mrumtl) new_test(test_mrumtl_wlen) + new_test(test_mrumtl_band) if(CMAKE_COMPILER_IS_GNUCC) target_link_libraries(test_mrumtl_wlen m) + target_link_libraries(test_mrumtl_band m) endif() endif() diff --git a/src/mrumtl.c b/src/mrumtl.c @@ -23,6 +23,7 @@ #include <rsys/logger.h> #include <rsys/mem_allocator.h> #include <rsys/ref_count.h> +#include <rsys/str.h> #include <rsys/text_reader.h> #include <string.h> @@ -74,6 +75,7 @@ struct mrumtl { enum brdf_list_type brdf_list_type; struct darray_brdf_wlen brdf_wlens; struct darray_brdf_band brdf_bands; + struct str name; int verbose; struct logger* logger; @@ -139,6 +141,24 @@ log_msg } static INLINE void +log_err + (const struct mrumtl* mrumtl, + const char* msg, ...) +#ifdef COMPILER_GCC + __attribute((format(printf, 2, 3))) +#endif +; + +static INLINE void +log_warn + (const struct mrumtl* mrumtl, + const char* msg, ...) +#ifdef COMPILER_GCC + __attribute((format(printf, 2, 3))) +#endif +; + +void log_err(const struct mrumtl* mrumtl, const char* msg, ...) { va_list vargs_list; @@ -149,7 +169,7 @@ log_err(const struct mrumtl* mrumtl, const char* msg, ...) va_end(vargs_list); } -static INLINE void +void log_warn(const struct mrumtl* mrumtl, const char* msg, ...) { va_list vargs_list; @@ -225,7 +245,7 @@ parse_brdf_specular res = cstr_to_double(tk, &brdf->reflectivity); if(res != RES_OK) { log_err(mrumtl, "%s:%lu: invalid specular reflectivity `%s'.\n", - txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), &tk); + txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), tk); res = RES_BAD_ARG; goto error; } @@ -305,12 +325,15 @@ parse_wlen_brdf } if(!txtrdr_get_cline(txtrdr)) { + const size_t nexpect = darray_brdf_wlen_size_get(&mrumtl->brdf_wlens); + const size_t nparsed = (size_t) + (brdf - darray_brdf_wlen_cdata_get(&mrumtl->brdf_wlens)); log_err(mrumtl, "%s:%lu: missing a wavelength BRDF. " - "Expecting %lu BRDFs while only %lu was parsed.\n", + "Expecting %lu BRDF%swhile %lu %s parsed.\n", txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), - (unsigned long)darray_brdf_wlen_size_get(&mrumtl->brdf_wlens), - (unsigned long)(brdf - darray_brdf_wlen_cdata_get(&mrumtl->brdf_wlens))); + (unsigned long)nexpect, nexpect == 1 ? " " : "s ", + (unsigned long)nparsed, nparsed > 1 ? "were" : "was"); res = RES_BAD_ARG; goto error; } @@ -362,12 +385,15 @@ parse_band_brdf } if(!txtrdr_get_cline(txtrdr)) { + const size_t nexpect = darray_brdf_band_size_get(&mrumtl->brdf_bands); + const size_t nparsed = (size_t) + (brdf - darray_brdf_band_cdata_get(&mrumtl->brdf_bands)); log_err(mrumtl, "%s:%lu: missing a band BRDF. " - "Expecting %lu BRDFs while only %lu was parsed.\n", + "Expecting %lu BRDF%swhile %lu %s parsed.\n", txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), - (unsigned long)darray_brdf_band_size_get(&mrumtl->brdf_bands), - (unsigned long)(brdf - darray_brdf_band_cdata_get(&mrumtl->brdf_bands))); + (unsigned long)nexpect, nexpect == 1 ? " " : "s ", + (unsigned long)nparsed, nparsed > 1 ? "were" : "was"); res = RES_BAD_ARG; goto error; } @@ -382,7 +408,7 @@ parse_band_brdf goto error; } - tk = strtok_r(txtrdr_get_line(txtrdr), " \t", &tk_ctx); + tk = strtok_r(NULL, " \t", &tk_ctx); if(!tk) { log_err(mrumtl, "%s:%lu: missing band max boundary.\n", txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr)); @@ -412,6 +438,7 @@ parse_band_brdf if(tk) { log_err(mrumtl, "%s:%lu: unexpected directive `%s'.\n", txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr), tk); + res = RES_BAD_ARG; goto error; } @@ -542,13 +569,16 @@ parse_bands_list(struct mrumtl* mrumtl, struct txtrdr* txtrdr, char** tk_ctx) res = parse_band_brdf(mrumtl, txtrdr, brdf); if(res != RES_OK) goto error; - if(i > 0 && brdf[0].wlen_min < brdf[-1].wlen_max) { - log_err(mrumtl, - "%s:%lu: the BRDF must be sorted un ascending order " - "wrt their band and the bands must not overlapped.\n", - txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr)); - res = RES_BAD_ARG; - goto error; + if(i > 0) { + if(brdf[0].wlen_min < brdf[-1].wlen_max + || brdf[0].wlen_min == brdf[-1].wlen_min) { + log_err(mrumtl, + "%s:%lu: the BRDF must be sorted un ascending order " + "wrt their band and the bands must not overlapped.\n", + txtrdr_get_name(txtrdr), (unsigned long)txtrdr_get_line_num(txtrdr)); + res = RES_BAD_ARG; + goto error; + } } } @@ -563,6 +593,7 @@ static INLINE void clear_mrumtl(struct mrumtl* mrumtl) { ASSERT(mrumtl); + str_clear(&mrumtl->name); darray_brdf_band_clear(&mrumtl->brdf_bands); darray_brdf_wlen_clear(&mrumtl->brdf_wlens); mrumtl->brdf_list_type = BRDF_LIST_NONE__; @@ -579,6 +610,13 @@ load_stream(struct mrumtl* mrumtl, FILE* stream, const char* stream_name) clear_mrumtl(mrumtl); + res = str_set(&mrumtl->name, stream_name); + if(res != RES_OK) { + log_err(mrumtl, "Could not copy the stream name `%s' -- %s.\n", + stream_name, res_to_cstr(res)); + goto error; + } + res = txtrdr_stream(mrumtl->allocator, stream, stream_name, '#', &txtrdr); if(res != RES_OK) { log_err(mrumtl, "Could not create the text reader to parse `%s' -- %s.\n", @@ -639,6 +677,7 @@ cmp_band(const void* key, const void* elmt) static INLINE res_T fetch_brdf_band (const struct mrumtl* mrumtl, + const char* func_name, const double wavelength, const struct mrumtl_brdf** out_brdf) { @@ -646,12 +685,14 @@ fetch_brdf_band const struct brdf_band* brdf_bands = NULL; size_t nbrdf_bands = 0; res_T res = RES_OK; - ASSERT(mrumtl && out_brdf); + ASSERT(mrumtl && func_name && out_brdf); brdf_bands = darray_brdf_band_cdata_get(&mrumtl->brdf_bands); nbrdf_bands = darray_brdf_band_size_get(&mrumtl->brdf_bands); if(!nbrdf_bands) { + log_err(mrumtl, "%s: no BRDF is defined in `%s'.\n", + func_name, str_cget(&mrumtl->name)); res = RES_BAD_ARG; goto error; } @@ -665,12 +706,19 @@ fetch_brdf_band brdf_band = &brdf_bands[nbrdf_bands-1]; ASSERT(brdf_band->wlen_max <= wavelength); } else { - if(brdf_band != brdf_bands) { - /* The found BRDF is not the first one so the submitted wavelength is - * forcely included in the band that it overlaps */ - ASSERT(brdf_band->wlen_min <= wavelength); - } ASSERT(wavelength < brdf_band->wlen_max); + if(brdf_band != brdf_bands && brdf_band->wlen_min > wavelength) { + /* The found BRDF is not the first and its associated band does not + * overlap the wavelength. The BRDF to use can be the found BRDF or the + * previous one, wrt the distance of the wavelength to the boundaries of + * the bands */ + const double dst0 = wavelength - brdf_band[-1].wlen_max; + const double dst1 = brdf_band[0].wlen_min - wavelength; + ASSERT(dst0 >= 0 && dst1 > 0); + if(dst0 < dst1) { + brdf_band = brdf_band - 1; + } + } } *out_brdf = &brdf_band->brdf; @@ -700,6 +748,7 @@ cmp_wlen(const void* key, const void* elmt) static INLINE res_T fetch_brdf_wlen (const struct mrumtl* mrumtl, + const char* func_name, const double wavelength, const struct mrumtl_brdf** out_brdf) { @@ -707,12 +756,14 @@ fetch_brdf_wlen const struct brdf_wlen* brdf_wlens = NULL; size_t nbrdf_wlens = 0; res_T res = RES_OK; - ASSERT(mrumtl && out_brdf); + ASSERT(mrumtl && func_name && out_brdf); brdf_wlens = darray_brdf_wlen_cdata_get(&mrumtl->brdf_wlens); nbrdf_wlens = darray_brdf_wlen_size_get(&mrumtl->brdf_wlens); if(!nbrdf_wlens) { + log_err(mrumtl, "%s: no BRDF is defined in `%s'.\n", + func_name, str_cget(&mrumtl->name)); res = RES_BAD_ARG; goto error; } @@ -755,6 +806,7 @@ release_mrumtl(ref_T* ref) darray_brdf_band_release(&mrumtl->brdf_bands); darray_brdf_wlen_release(&mrumtl->brdf_wlens); + str_release(&mrumtl->name); /* First release the programs that uses the libs array */ if(mrumtl->logger == &mrumtl->logger__) logger_release(&mrumtl->logger__); @@ -801,6 +853,7 @@ mrumtl_create darray_brdf_band_init(mrumtl->allocator, &mrumtl->brdf_bands); darray_brdf_wlen_init(mrumtl->allocator, &mrumtl->brdf_wlens); mrumtl->brdf_list_type = BRDF_LIST_NONE__; + str_init(mrumtl->allocator, &mrumtl->name); if(logger) { mrumtl->logger = logger; @@ -857,7 +910,7 @@ mrumtl_load(struct mrumtl* mrumtl, const char* filename) fp = fopen(filename, "r"); if(!fp) { log_err(mrumtl, "%s: error opening file `%s' -- %s.\n", - FUNC_NAME, strerror(errno)); + FUNC_NAME, filename, strerror(errno)); res = RES_IO_ERR; goto error; } @@ -906,10 +959,10 @@ mrumtl_fetch_brdf switch(mrumtl->brdf_list_type) { case BRDF_LIST_BAND: - res = fetch_brdf_band(mrumtl, wavelength, out_brdf); + res = fetch_brdf_band(mrumtl, FUNC_NAME, wavelength, out_brdf); break; case BRDF_LIST_WLEN: - res = fetch_brdf_wlen(mrumtl, wavelength, out_brdf); + res = fetch_brdf_wlen(mrumtl, FUNC_NAME, wavelength, out_brdf); break; default: FATAL("Unreachable code.\n"); break; } diff --git a/src/test_mrumtl_band.c b/src/test_mrumtl_band.c @@ -0,0 +1,290 @@ +/* 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, "bands\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 100"); /* Degenerated */ + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 200 bad_type"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 200 lambertian"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 200 lambertian -0.00001"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 200 lambertian 1.00001"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 200 lambertian 1 invalid_word"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 2\n"); + fprintf(fp, "200 200 lambertian 1"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 2\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "100 200 specular 0"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 2\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200 200 specular 0"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 2\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200 201 specular 0"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 2\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200.1 200.2 specular 0"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 2\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200.1 200.2 specular 0\n"); + fprintf(fp, "dummy line that is not parsed."); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 3\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200.1 200.2 specular 0\n"); + fprintf(fp, "200.2 200.2 lambertian 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 3\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200.1 200.2 specular -0.0001\n"); + fprintf(fp, "200.2 200.2 lambertian 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 3\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200.1 200.2 specular 1.0001\n"); + fprintf(fp, "200.2 200.2 lambertian 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 4\n"); + fprintf(fp, "200 200 lambertian 1\n"); + fprintf(fp, "200.1 200.2 specular 0.01\n"); + fprintf(fp, "200.2 200.2 lambertian 0\n"); + fprintf(fp, "250.3 2300 lambertian 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 0"); + 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, "bands 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + CHK(mrumtl_fetch_brdf(mrumtl, 1, &brdf) == RES_BAD_ARG); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 1\n"); + fprintf(fp, "200 280 lambertian 0.314\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + + CHK(mrumtl_fetch_brdf(NULL, 200, &brdf) == RES_BAD_ARG); + CHK(mrumtl_fetch_brdf(mrumtl, 200, NULL) == RES_BAD_ARG); + + 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.314); + + 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.314); + + CHK(mrumtl_fetch_brdf(mrumtl, 300, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.314); + + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "bands 7\n"); + fprintf(fp, "200 280 lambertian 0.314\n"); + fprintf(fp, "280 300 specular 0\n"); + fprintf(fp, "350 400.12 specular 0.123\n"); + fprintf(fp, "400.12 400.12 lambertian 0.9\n"); + fprintf(fp, "500.11 500.11 lambertian 0.4\n"); + fprintf(fp, "500.21 512.40 specular 0.4\n"); + fprintf(fp, "521.125 530.40 lambertian 0.7\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + + CHK(mrumtl_fetch_brdf(mrumtl, 200.1, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.314); + + CHK(mrumtl_fetch_brdf(mrumtl, nextafter(280, 0), &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.314); + + CHK(mrumtl_fetch_brdf(mrumtl, nextafter(280, 300), &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); + CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0); + + CHK(mrumtl_fetch_brdf(mrumtl, nextafter(280, 300), &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); + CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0); + + CHK(mrumtl_fetch_brdf(mrumtl, nextafter(325, 300), &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); + CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0); + + CHK(mrumtl_fetch_brdf(mrumtl, nextafter(325, 350), &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, 353, &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, 400.12, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.9); + + CHK(mrumtl_fetch_brdf(mrumtl, 500, &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, 501.123, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); + CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0.4); + + CHK(mrumtl_fetch_brdf(mrumtl, 517, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.7); + + CHK(mrumtl_fetch_brdf(mrumtl, 530.40, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.7); + + CHK(mrumtl_fetch_brdf(mrumtl, 20000, &brdf) == RES_OK); + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.7); + + 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.314); + + 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; + +} diff --git a/src/test_mrumtl_wlen.c b/src/test_mrumtl_wlen.c @@ -124,6 +124,11 @@ check_load(struct mrumtl* mrumtl) rewind(fp); CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + CHK(fp = freopen(filename, "w+", fp)); + fprintf(fp, "wavelengths 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + fclose(fp); } @@ -137,6 +142,12 @@ check_fetch(struct mrumtl* mrumtl) CHK(mrumtl); CHK(fp = fopen(filename, "w+")); + fprintf(fp, "wavelengths 0\n"); + rewind(fp); + CHK(mrumtl_load_stream(mrumtl, fp, filename) == RES_OK); + CHK(mrumtl_fetch_brdf(mrumtl, 2.9, &brdf) == RES_BAD_ARG); + + CHK(fp = fopen(filename, "w+")); fprintf(fp, "wavelengths 1\n"); fprintf(fp, "280 lambertian 0.3"); rewind(fp); @@ -170,6 +181,14 @@ check_fetch(struct mrumtl* mrumtl) CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN); CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.1); + CHK(mrumtl_fetch_brdf(mrumtl, 0.15, &brdf) == RES_OK); + if(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_LAMBERTIAN) { + CHK(mrumtl_brdf_lambertian_get_reflectivity(brdf) == 0.1); + } else { + CHK(mrumtl_brdf_get_type(brdf) == MRUMTL_BRDF_SPECULAR); + CHK(mrumtl_brdf_specular_get_reflectivity(brdf) == 0.2); + } + 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);