loader_aw

Load OBJ/MTL file formats
git clone git://git.meso-star.fr/loader_aw.git
Log | Files | Refs | README | LICENSE

commit 816caf720136e541f658300dbccc83cd340bff13
parent 9cf08f5ec213edb726be29946ab4464ebcafae38
Author: vaplv <vaplv@free.fr>
Date:   Wed, 17 Jun 2015 16:18:27 +0200

Update the aw_<obj|mtl>_create API

Add a verbose parameter

Diffstat:
Mcmake/CMakeLists.txt | 4++--
Msrc/aw.h | 2++
Msrc/aw_mtl.c | 43++++++++++++++++++++++++++++---------------
Msrc/aw_obj.c | 26++++++++++++++++++--------
Msrc/test_aw_mtl.c | 8++++----
Msrc/test_aw_obj.c | 8++++----
6 files changed, 58 insertions(+), 33 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -46,8 +46,8 @@ add_library(aw SHARED ${AW_FILES_SRC} ${AW_FILES_INC}) target_link_libraries(aw RSys) set(VERSION_MAJOR 1) -set(VERSION_MINOR 0) -set(VERSION_PATCH 2) +set(VERSION_MINOR 1) +set(VERSION_PATCH 0) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set_target_properties(aw PROPERTIES DEFINE_SYMBOL AW_SHARED_BUILD diff --git a/src/aw.h b/src/aw.h @@ -138,6 +138,7 @@ AW_API res_T aw_obj_create (struct logger* logger, /* NULL <=> use default logger*/ struct mem_allocator* allocator, /* NULL <=> use default allocator */ + const int verbose, /* Verbosity level */ struct aw_obj** obj); AW_API res_T @@ -210,6 +211,7 @@ AW_API res_T aw_mtl_create (struct logger* logger, /* NULL <=> use default logger */ struct mem_allocator* allocator, /* NULL <=> use default allocator */ + const int verbose, /* Verbosity level */ struct aw_mtl** mtl); AW_API res_T diff --git a/src/aw_mtl.c b/src/aw_mtl.c @@ -59,6 +59,7 @@ struct aw_mtl { ref_T ref; struct mem_allocator* allocator; struct logger* logger; + int verbose; }; /******************************************************************************* @@ -115,18 +116,21 @@ parse_newmtl(struct aw_mtl* mtl, char** word_tk) } static res_T -parse_color(struct logger* logger, struct aw_color* col, char** word_tk) +parse_color(struct aw_mtl* mtl, struct aw_color* col, char** word_tk) { char* word; res_T res = RES_OK; - ASSERT(logger && col && word_tk); + ASSERT(mtl && col && word_tk); word = strtok_r(NULL, " \t", word_tk); if(!word) return RES_BAD_ARG; if(!strcmp(word, "spectral")) { - logger_print(logger, LOG_ERROR, "spectral colors are not supported\n"); + if(mtl->verbose) { + logger_print + (mtl->logger, LOG_ERROR, "spectral colors are not supported\n"); + } return RES_BAD_ARG; } @@ -285,13 +289,13 @@ parse_mtl_line(struct aw_mtl* mtl, char* line) } else if(mtl->newmtl == NULL) { res = RES_BAD_ARG; } else if(!strcmp(word, "Ka")) { /* Ambient reflectivity */ - res = parse_color(mtl->logger, &mtl->newmtl->ambient, &word_tk); + res = parse_color(mtl, &mtl->newmtl->ambient, &word_tk); } else if(!strcmp(word, "Kd")) { /* Diffuse reflectivity */ - res = parse_color(mtl->logger, &mtl->newmtl->diffuse, &word_tk); + res = parse_color(mtl, &mtl->newmtl->diffuse, &word_tk); } else if(!strcmp(word, "Ks")) { /* Specular reflectivity */ - res = parse_color(mtl->logger, &mtl->newmtl->specular, &word_tk); + res = parse_color(mtl, &mtl->newmtl->specular, &word_tk); } else if(!strcmp(word, "Tf")) { /* Transimission filter */ - res = parse_color(mtl->logger, &mtl->newmtl->transmission, &word_tk); + res = parse_color(mtl, &mtl->newmtl->transmission, &word_tk); } else if(!strcmp(word, "Ns")) { /* Specular exponent */ res = parse_floatX (&mtl->newmtl->specular_exponent, 1, 1, 0.f, FLT_MAX, 0.f, &word_tk); @@ -313,16 +317,20 @@ parse_mtl_line(struct aw_mtl* mtl, char* line) res = parse_map(&mtl->newmtl->bump_map, MAP_BUMP, &word_tk); } else { res = RES_OK; - logger_print(mtl->logger, LOG_WARNING, - "%s:%lu: warning: ignored or malformed directive %s\n", - mtl->filename, (unsigned long)mtl->iline, word); + if(mtl->verbose) { + logger_print(mtl->logger, LOG_WARNING, + "%s:%lu: warning: ignored or malformed directive %s\n", + mtl->filename, (unsigned long)mtl->iline, word); + } while((word = strtok_r(NULL, " \t", &word_tk))); /* Skip spaces */ } if(res != RES_OK) goto error; if((word = strtok_r(NULL, " ", &word_tk))) { - logger_print(mtl->logger, LOG_ERROR, "%s:%lu: unexpected directive %s\n", - mtl->filename, (unsigned long)mtl->iline, word); + if(mtl->verbose) { + logger_print(mtl->logger, LOG_ERROR, "%s:%lu: unexpected directive %s\n", + mtl->filename, (unsigned long)mtl->iline, word); + } res = RES_BAD_ARG; goto error; } @@ -330,8 +338,10 @@ parse_mtl_line(struct aw_mtl* mtl, char* line) exit: return res; error: - logger_print(mtl->logger, LOG_ERROR, "%s:%lu: error: parsing failed\n", - mtl->filename, (unsigned long)mtl->iline); + if(mtl->verbose) { + logger_print(mtl->logger, LOG_ERROR, "%s:%lu: error: parsing failed\n", + mtl->filename, (unsigned long)mtl->iline); + } goto exit; } @@ -387,6 +397,7 @@ res_T aw_mtl_create (struct logger* logger, struct mem_allocator* mem_allocator, + const int verbose, struct aw_mtl** mtl_out) { struct mem_allocator* allocator; @@ -406,6 +417,7 @@ aw_mtl_create ref_init(&mtl->ref); mtl->allocator = allocator; mtl->logger = logger ? logger : LOGGER_DEFAULT; + mtl->verbose = verbose; darray_material_init(allocator, &mtl->materials); exit: @@ -448,7 +460,8 @@ aw_mtl_load(struct aw_mtl* mtl, const char* filename) mtl->filename = filename; file = fopen(filename, "r"); if(!file) { - logger_print(mtl->logger, LOG_ERROR, "Error opening `%s'\n", filename); + if(mtl->verbose) + logger_print(mtl->logger, LOG_ERROR, "Error opening `%s'\n", filename); return RES_IO_ERR; } diff --git a/src/aw_obj.c b/src/aw_obj.c @@ -93,6 +93,7 @@ struct aw_obj { ref_T ref; struct mem_allocator* allocator; struct logger* logger; + int verbose; }; /******************************************************************************* @@ -421,16 +422,20 @@ parse_obj_line(struct aw_obj* obj, char* line) res = parse_usemtl(obj, &word_tk); } else { res = RES_OK; - logger_print(obj->logger, LOG_WARNING, - "%s:%lu: warning: ignored or malformed directive %s\n", - obj->filename, (unsigned long)obj->iline, word); + if(obj->verbose) { + logger_print(obj->logger, LOG_WARNING, + "%s:%lu: warning: ignored or malformed directive %s\n", + obj->filename, (unsigned long)obj->iline, word); + } while((word = strtok_r(NULL, " \t", &word_tk))); /* Skip the line */ } if(res != RES_OK) goto error; if((word = strtok_r(NULL, " ", &word_tk))) { - logger_print(obj->logger, LOG_ERROR, "%s:%lu: unexpected directive %s\n", - obj->filename, (unsigned long)obj->iline, word); + if(obj->verbose) { + logger_print(obj->logger, LOG_ERROR, "%s:%lu: unexpected directive %s\n", + obj->filename, (unsigned long)obj->iline, word); + } res = RES_BAD_ARG; goto error; } @@ -438,8 +443,10 @@ parse_obj_line(struct aw_obj* obj, char* line) exit: return res; error: - logger_print(obj->logger, LOG_ERROR, "%s:%lu: error: parsing failed\n", - obj->filename, (unsigned long)obj->iline); + if(obj->verbose) { + logger_print(obj->logger, LOG_ERROR, "%s:%lu: error: parsing failed\n", + obj->filename, (unsigned long)obj->iline); + } goto exit; } @@ -467,6 +474,7 @@ res_T aw_obj_create (struct logger* logger, struct mem_allocator* mem_allocator, + const int verbose, struct aw_obj** obj_out) { struct mem_allocator* allocator; @@ -486,6 +494,7 @@ aw_obj_create ref_init(&obj->ref); obj->allocator = allocator; obj->logger = logger ? logger : LOGGER_DEFAULT; + obj->verbose = verbose; darray_float_init(mem_allocator, &obj->positions); darray_float_init(mem_allocator, &obj->normals); darray_float_init(mem_allocator, &obj->texcoords); @@ -536,7 +545,8 @@ aw_obj_load(struct aw_obj* obj, const char* filename) obj->filename = filename; file = fopen(filename, "r"); if(!file) { - logger_print(obj->logger, LOG_ERROR, "Error opening `%s'\n", filename); + if(obj->verbose) + logger_print(obj->logger, LOG_ERROR, "Error opening `%s'\n", filename); return RES_IO_ERR; } res = aw_obj_load_stream(obj, file); diff --git a/src/test_aw_mtl.c b/src/test_aw_mtl.c @@ -325,9 +325,9 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(aw_mtl_create(NULL, NULL, NULL), RES_BAD_ARG); - CHECK(aw_mtl_create(NULL, &allocator, NULL), RES_BAD_ARG); - CHECK(aw_mtl_create(NULL, NULL, &mtl), RES_OK); + CHECK(aw_mtl_create(NULL, NULL, 1, NULL), RES_BAD_ARG); + CHECK(aw_mtl_create(NULL, &allocator, 1, NULL), RES_BAD_ARG); + CHECK(aw_mtl_create(NULL, NULL, 1, &mtl), RES_OK); CHECK(aw_mtl_ref_get(NULL), RES_BAD_ARG); CHECK(aw_mtl_ref_get(mtl), RES_OK); @@ -335,7 +335,7 @@ main(int argc, char** argv) CHECK(aw_mtl_ref_put(mtl), RES_OK); CHECK(aw_mtl_ref_put(mtl), RES_OK); - CHECK(aw_mtl_create(LOGGER_DEFAULT, &allocator, &mtl), RES_OK); + CHECK(aw_mtl_create(LOGGER_DEFAULT, &allocator, 1, &mtl), RES_OK); test_common(mtl); test_multiple_materials(mtl); diff --git a/src/test_aw_obj.c b/src/test_aw_obj.c @@ -548,9 +548,9 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(aw_obj_create(NULL, NULL, NULL), RES_BAD_ARG); - CHECK(aw_obj_create(NULL, &allocator, NULL), RES_BAD_ARG); - CHECK(aw_obj_create(NULL, NULL, &obj), RES_OK); + CHECK(aw_obj_create(NULL, NULL, 1, NULL), RES_BAD_ARG); + CHECK(aw_obj_create(NULL, &allocator, 1, NULL), RES_BAD_ARG); + CHECK(aw_obj_create(NULL, NULL, 1, &obj), RES_OK); CHECK(aw_obj_ref_get(NULL), RES_BAD_ARG); CHECK(aw_obj_ref_get(obj), RES_OK); @@ -558,7 +558,7 @@ main(int argc, char** argv) CHECK(aw_obj_ref_put(obj), RES_OK); CHECK(aw_obj_ref_put(obj), RES_OK); - CHECK(aw_obj_create(LOGGER_DEFAULT, &allocator, &obj), RES_OK); + CHECK(aw_obj_create(LOGGER_DEFAULT, &allocator, 1, &obj), RES_OK); test_plane(obj); test_squares(obj);