loader_aw

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

commit 79d7856ba1e70a3ff506e5f4afbf248a5edbf77d
parent 6de6e201f5b182780b4fa4807ebf7cbae6e26b94
Author: vaplv <vaplv@free.fr>
Date:   Tue,  6 Jan 2015 15:46:23 +0100

Change the aw_material_init function profile

Diffstat:
Msrc/aw.h | 11++++++++++-
Msrc/aw_mtl.c | 45+++++++++++++++++++++++++++++----------------
Msrc/test_aw_mtl.c | 6+++---
3 files changed, 42 insertions(+), 20 deletions(-)

diff --git a/src/aw.h b/src/aw.h @@ -127,6 +127,9 @@ struct aw_material { struct aw_map specular_map; struct aw_map specular_exponent_map; /* Scalar texture */ struct aw_map bump_map; /* Scalar texture with valid bump multiplier */ + + /* Internal data */ + struct mem_allocator* allocator__; }; struct aw_obj; @@ -253,7 +256,13 @@ aw_mtl_material_get AW_API res_T aw_material_init - (struct aw_material* material); + (struct mem_allocator* allocator, + struct aw_material* material); + +AW_API res_T +aw_material_copy + (struct aw_material* dst, + const struct aw_material* src); AW_API res_T aw_material_release diff --git a/src/aw_mtl.c b/src/aw_mtl.c @@ -107,13 +107,14 @@ map_copy_and_release(struct map* dst, struct map* src) } static FINLINE res_T -map_to_aw_map(struct aw_map* dst, const struct map* src) +map_to_aw_map + (struct mem_allocator* allocator, struct aw_map* dst, const struct map* src) { - ASSERT(dst && src); + ASSERT(allocator && dst && src); if(!str_len(&src->filename)) { dst->filename = NULL; } else { - dst->filename = mem_alloc(str_len(&src->filename) + 1); + dst->filename = MEM_ALLOC(allocator, str_len(&src->filename) + 1); if(!dst->filename) return RES_MEM_ERR; strcpy(dst->filename, str_cget(&src->filename)); } @@ -698,7 +699,7 @@ aw_mtl_material_get return RES_BAD_ARG; mtr = darray_material_cdata_get(&mtl->materials) + imaterial; - material->name = mem_alloc(str_len(&mtr->name) + 1); + material->name = MEM_ALLOC(material->allocator__, str_len(&mtr->name) + 1); if(!material->name) { res = RES_MEM_ERR; goto error; @@ -713,12 +714,18 @@ aw_mtl_material_get material->illumination_model = mtr->illumination_model; #define CALL(Func) if(RES_OK != (res = Func)) goto error - CALL(map_to_aw_map(&material->ambient_map, &mtr->ambient_map)); - CALL(map_to_aw_map(&material->diffuse_map, &mtr->diffuse_map)); - CALL(map_to_aw_map(&material->specular_map, &mtr->specular_map)); CALL(map_to_aw_map - (&material->specular_exponent_map, &mtr->specular_exponent_map)); - CALL(map_to_aw_map(&material->bump_map, &mtr->bump_map)); + (material->allocator__, &material->ambient_map, &mtr->ambient_map)); + CALL(map_to_aw_map + (material->allocator__, &material->diffuse_map, &mtr->diffuse_map)); + CALL(map_to_aw_map + (material->allocator__, &material->specular_map, &mtr->specular_map)); + CALL(map_to_aw_map + (material->allocator__, + &material->specular_exponent_map, + &mtr->specular_exponent_map)); + CALL(map_to_aw_map + (material->allocator__, &material->bump_map, &mtr->bump_map)); #undef CALL exit: @@ -730,10 +737,11 @@ error: } res_T -aw_material_init(struct aw_material* m) +aw_material_init(struct mem_allocator* allocator, struct aw_material* m) { if(!m) return RES_BAD_ARG; memset(m, 0, sizeof(struct aw_material)); + m->allocator__ = allocator ? allocator : &mem_default_allocator; return RES_OK; } @@ -741,13 +749,18 @@ res_T aw_material_release(struct aw_material* m) { if(!m) return RES_BAD_ARG; - if(m->name) mem_free(m->name); - if(m->ambient_map.filename) mem_free(m->ambient_map.filename); - if(m->diffuse_map.filename) mem_free(m->diffuse_map.filename); - if(m->specular_map.filename) mem_free(m->specular_map.filename); + if(m->name) + MEM_FREE(m->allocator__, m->name); + if(m->ambient_map.filename) + MEM_FREE(m->allocator__, m->ambient_map.filename); + if(m->diffuse_map.filename) + MEM_FREE(m->allocator__, m->diffuse_map.filename); + if(m->specular_map.filename) + MEM_FREE(m->allocator__, m->specular_map.filename); if(m->specular_exponent_map.filename) - mem_free(m->specular_exponent_map.filename); - if(m->bump_map.filename) mem_free(m->bump_map.filename); + MEM_FREE(m->allocator__, m->specular_exponent_map.filename); + if(m->bump_map.filename) + MEM_FREE(m->allocator__, m->bump_map.filename); return RES_OK; } diff --git a/src/test_aw_mtl.c b/src/test_aw_mtl.c @@ -80,8 +80,8 @@ test_common(struct aw_mtl* mtl) CHECK(aw_mtl_load(mtl, "test_mtl_common.mtl"), RES_OK); - CHECK(aw_material_init(NULL), RES_BAD_ARG); - CHECK(aw_material_init(&mtr), RES_OK); + CHECK(aw_material_init(NULL, NULL), RES_BAD_ARG); + CHECK(aw_material_init(NULL, &mtr), RES_OK); CHECK(aw_mtl_material_get(NULL, SIZE_MAX, NULL), RES_BAD_ARG); CHECK(aw_mtl_material_get(mtl, SIZE_MAX, NULL), RES_BAD_ARG); CHECK(aw_mtl_material_get(NULL, 0, NULL), RES_BAD_ARG); @@ -217,7 +217,7 @@ test_multiple_materials(struct aw_mtl* mtl) CHECK(aw_mtl_materials_count_get(mtl, &nmtls), RES_OK); CHECK(nmtls, 3); - CHECK(aw_material_init(&mtr), RES_OK); + CHECK(aw_material_init(NULL, &mtr), RES_OK); CHECK(aw_mtl_material_get(mtl, 0, &mtr), RES_OK); CHECK(strcmp(mtr.name, "material_0"), 0); CHECK(mtr.specular_exponent, 8.f);