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