loader_aw

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

commit 7fc020c01bd5aedbd6dc4498c37a1d8d4fec2054
parent 68ace9d987a2de9a06eece608652e4e001462d38
Author: vaplv <vaplv@free.fr>
Date:   Wed, 24 Sep 2014 09:55:19 +0200

Add a logger to the mtl/obj APIs

Diffstat:
Msrc/aw.h | 7+++++--
Msrc/aw_mtl.c | 33+++++++++++++++++++--------------
Msrc/aw_obj.c | 17+++++++++++------
Msrc/test_aw_mtl.c | 9+++++----
Msrc/test_aw_obj.c | 9+++++----
5 files changed, 45 insertions(+), 30 deletions(-)

diff --git a/src/aw.h b/src/aw.h @@ -131,6 +131,7 @@ struct aw_material { struct aw_obj; struct aw_mtl; +struct logger; struct mem_allocator; BEGIN_DECLS @@ -140,7 +141,8 @@ BEGIN_DECLS ******************************************************************************/ AW_API res_T aw_obj_create - (struct mem_allocator* allocator, /* NULL <=> use default allocator */ + (struct logger* logger, /* NULL <=> use default logger*/ + struct mem_allocator* allocator, /* NULL <=> use default allocator */ struct aw_obj** obj); AW_API res_T @@ -201,7 +203,8 @@ aw_obj_vertex_get ******************************************************************************/ AW_API res_T aw_mtl_create - (struct mem_allocator* allocator, /* NULL <=> use default allocator */ + (struct logger* logger, /* NULL <=> use default logger */ + struct mem_allocator* allocator, /* NULL <=> use default allocator */ struct aw_mtl** mtl); AW_API res_T diff --git a/src/aw_mtl.c b/src/aw_mtl.c @@ -19,6 +19,7 @@ #include <rsys/dynamic_array_char.h> #include <rsys/float3.h> +#include <rsys/logger.h> #include <rsys/mem_allocator.h> #include <rsys/ref_count.h> @@ -184,6 +185,7 @@ struct aw_mtl { ref_T ref; struct mem_allocator* allocator; + struct logger* logger; }; /******************************************************************************* @@ -260,18 +262,18 @@ parse_newmtl(struct aw_mtl* mtl, char** word_tk) } static res_T -parse_color(struct aw_color* col, char** word_tk) +parse_color(struct logger* logger, struct aw_color* col, char** word_tk) { char* word; res_T res = R_OK; - ASSERT(col && word_tk); + ASSERT(logger && col && word_tk); word = strtok_r(NULL, " \t", word_tk); if(!word) return R_BAD_ARG; if(!strcmp(word, "spectral")) { - fprintf(stderr, "spectral colors are not supported\n"); + logger_print(logger, LOG_ERROR, "spectral colors are not supported\n"); return R_BAD_ARG; } @@ -430,13 +432,13 @@ parse_mtl_line(struct aw_mtl* mtl, char* line) } else if(mtl->newmtl == NULL) { res = R_BAD_ARG; } else if(!strcmp(word, "Ka")) { /* Ambient reflectivity */ - res = parse_color(&mtl->newmtl->ambient, &word_tk); + res = parse_color(mtl->logger, &mtl->newmtl->ambient, &word_tk); } else if(!strcmp(word, "Kd")) { /* Diffuse reflectivity */ - res = parse_color(&mtl->newmtl->diffuse, &word_tk); + res = parse_color(mtl->logger, &mtl->newmtl->diffuse, &word_tk); } else if(!strcmp(word, "Ks")) { /* Specular reflectivity */ - res = parse_color(&mtl->newmtl->specular, &word_tk); + res = parse_color(mtl->logger, &mtl->newmtl->specular, &word_tk); } else if(!strcmp(word, "Tf")) { /* Transimission filter */ - res = parse_color(&mtl->newmtl->transmission, &word_tk); + res = parse_color(mtl->logger, &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); @@ -458,14 +460,15 @@ parse_mtl_line(struct aw_mtl* mtl, char* line) res = parse_map(&mtl->newmtl->bump_map, MAP_BUMP, &word_tk); } else { res = R_OK; - fprintf(stderr, "%s:%lu: warning: ignored or malformed directive %s\n", + logger_print(mtl->logger, LOG_ERROR, + "%s:%lu: warning: ignored or malformed directive %s\n", mtl->filename, (unsigned long)mtl->iline, word); - while((word = strtok_r(NULL, " \t", &word_tk))); + while((word = strtok_r(NULL, " \t", &word_tk))); /* Skip spaces */ } if(res != R_OK) goto error; if((word = strtok_r(NULL, " ", &word_tk))) { - fprintf(stderr, "%s:%lu: unexpected directive %s\n", + logger_print(mtl->logger, LOG_ERROR, "%s:%lu: unexpected directive %s\n", mtl->filename, (unsigned long)mtl->iline, word); res = R_BAD_ARG; goto error; @@ -474,7 +477,7 @@ parse_mtl_line(struct aw_mtl* mtl, char* line) exit: return res; error: - fprintf(stderr, "%s:%lu: error: parsing failed\n", + logger_print(mtl->logger, LOG_ERROR, "%s:%lu: error: parsing failed\n", mtl->filename, (unsigned long)mtl->iline); goto exit; } @@ -501,7 +504,8 @@ mtl_release(ref_T* ref) ******************************************************************************/ res_T aw_mtl_create - (struct mem_allocator* mem_allocator, + (struct logger* logger, + struct mem_allocator* mem_allocator, struct aw_mtl** mtl_out) { struct mem_allocator* allocator; @@ -518,8 +522,9 @@ aw_mtl_create res = R_MEM_ERR; goto error; } - mtl->allocator = allocator; ref_init(&mtl->ref); + mtl->allocator = allocator; + mtl->logger = logger ? logger : LOGGER_DEFAULT; darray_material_init(allocator, &mtl->materials); exit: @@ -564,7 +569,7 @@ aw_mtl_load(struct aw_mtl* mtl, const char* filename) mtl->filename = filename; file = fopen(filename, "r"); if(!file) { - fprintf(stderr, "Error opening `%s'\n", filename); + logger_print(mtl->logger, LOG_ERROR, "Error opening `%s'\n", filename); return R_BAD_ARG; } diff --git a/src/aw_obj.c b/src/aw_obj.c @@ -21,6 +21,7 @@ #include <rsys/dynamic_array_float.h> #include <rsys/float3.h> #include <rsys/float4.h> +#include <rsys/logger.h> #include <rsys/mem_allocator.h> #include <rsys/ref_count.h> #include <rsys/str.h> @@ -125,6 +126,7 @@ struct aw_obj { ref_T ref; struct mem_allocator* allocator; + struct logger* logger; }; /******************************************************************************* @@ -440,13 +442,14 @@ parse_obj_line(struct aw_obj* obj, char* line) res = parse_usemtl(obj, &word_tk); } else { res = R_OK; - fprintf(stderr, "%s:%lu: warning: ignored or malformed directive %s", + logger_print(obj->logger, LOG_ERROR, + "%s:%lu: warning: ignored or malformed directive %s", obj->filename, (unsigned long)obj->iline, word); } if(res != R_OK) goto error; if((word = strtok_r(NULL, " ", &word_tk))) { - fprintf(stderr, "%s:%lu: unexpected directive %s\n", + logger_print(obj->logger, LOG_ERROR, "%s:%lu: unexpected directive %s\n", obj->filename, (unsigned long)obj->iline, word); res = R_BAD_ARG; goto error; @@ -455,7 +458,7 @@ parse_obj_line(struct aw_obj* obj, char* line) exit: return res; error: - fprintf(stderr, "%s:%lu: error: parsing failed\n", + logger_print(obj->logger, LOG_ERROR, "%s:%lu: error: parsing failed\n", obj->filename, (unsigned long)obj->iline); goto exit; } @@ -498,7 +501,8 @@ obj_release(ref_T* ref) ******************************************************************************/ res_T aw_obj_create - (struct mem_allocator* mem_allocator, + (struct logger* logger, + struct mem_allocator* mem_allocator, struct aw_obj** obj_out) { struct mem_allocator* allocator; @@ -515,8 +519,9 @@ aw_obj_create res = R_MEM_ERR; goto error; } - obj->allocator = allocator; ref_init(&obj->ref); + obj->allocator = allocator; + obj->logger = logger ? logger : LOGGER_DEFAULT; darray_float_init(mem_allocator, &obj->positions); darray_float_init(mem_allocator, &obj->normals); darray_float_init(mem_allocator, &obj->texcoords); @@ -569,7 +574,7 @@ aw_obj_load(struct aw_obj* obj, const char* filename) obj->filename = filename; file = fopen(filename, "r"); if(!file) { - fprintf(stderr, "Error opening `%s'\n", filename); + logger_print(obj->logger, LOG_ERROR, "Error opening `%s'\n", filename); return R_BAD_ARG; } diff --git a/src/test_aw_mtl.c b/src/test_aw_mtl.c @@ -16,6 +16,7 @@ #include "aw.h" #include <rsys/float3.h> +#include <rsys/logger.h> #include <rsys/mem_allocator.h> #include <string.h> @@ -308,9 +309,9 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(aw_mtl_create(NULL, NULL), R_BAD_ARG); - CHECK(aw_mtl_create(&allocator, NULL), R_BAD_ARG); - CHECK(aw_mtl_create(NULL, &mtl), R_OK); + CHECK(aw_mtl_create(NULL, NULL, NULL), R_BAD_ARG); + CHECK(aw_mtl_create(NULL, &allocator, NULL), R_BAD_ARG); + CHECK(aw_mtl_create(NULL, NULL, &mtl), R_OK); CHECK(aw_mtl_ref_get(NULL), R_BAD_ARG); CHECK(aw_mtl_ref_get(mtl), R_OK); @@ -318,7 +319,7 @@ main(int argc, char** argv) CHECK(aw_mtl_ref_put(mtl), R_OK); CHECK(aw_mtl_ref_put(mtl), R_OK); - CHECK(aw_mtl_create(&allocator, &mtl), R_OK); + CHECK(aw_mtl_create(LOGGER_DEFAULT, &allocator, &mtl), R_OK); test_common(mtl); test_multiple_materials(mtl); diff --git a/src/test_aw_obj.c b/src/test_aw_obj.c @@ -17,6 +17,7 @@ #include <rsys/float3.h> #include <rsys/float4.h> +#include <rsys/logger.h> #include <rsys/mem_allocator.h> #include <string.h> @@ -332,9 +333,9 @@ main(int argc, char** argv) mem_init_proxy_allocator(&allocator, &mem_default_allocator); - CHECK(aw_obj_create(NULL, NULL), R_BAD_ARG); - CHECK(aw_obj_create(&allocator, NULL), R_BAD_ARG); - CHECK(aw_obj_create(NULL, &obj), R_OK); + CHECK(aw_obj_create(NULL, NULL, NULL), R_BAD_ARG); + CHECK(aw_obj_create(NULL, &allocator, NULL), R_BAD_ARG); + CHECK(aw_obj_create(NULL, NULL, &obj), R_OK); CHECK(aw_obj_ref_get(NULL), R_BAD_ARG); CHECK(aw_obj_ref_get(obj), R_OK); @@ -342,7 +343,7 @@ main(int argc, char** argv) CHECK(aw_obj_ref_put(obj), R_OK); CHECK(aw_obj_ref_put(obj), R_OK); - CHECK(aw_obj_create(&allocator, &obj), R_OK); + CHECK(aw_obj_create(LOGGER_DEFAULT, &allocator, &obj), R_OK); test_plane(obj); test_squares(obj);