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:
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);