loader_aw

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

commit 4041e5f38fcfe93c503a98e3f58d3cca8774ff84
parent 79d7856ba1e70a3ff506e5f4afbf248a5edbf77d
Author: vaplv <vaplv@free.fr>
Date:   Tue,  6 Jan 2015 21:50:11 +0100

Change the aw_map and aw_material API

Diffstat:
Mcmake/CMakeLists.txt | 2+-
Msrc/aw.h | 42+++++++++++++++++++++++++++++++++++-------
Msrc/aw_mtl.c | 383+++++++++++++++++++++++++++----------------------------------------------------
Msrc/test_aw_mtl.c | 48+++++++++++++++++++++++-------------------------
4 files changed, 191 insertions(+), 284 deletions(-)

diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt @@ -42,7 +42,7 @@ add_library(aw SHARED ${AW_FILES_SRC} ${AW_FILES_INC}) target_link_libraries(aw RSys) set(VERSION_MAJOR 0) -set(VERSION_MINOR 0) +set(VERSION_MINOR 1) set(VERSION_PATCH 0) set(VERSION ${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}) set_target_properties(aw PROPERTIES diff --git a/src/aw.h b/src/aw.h @@ -17,6 +17,7 @@ #define AW_H #include <rsys/rsys.h> +#include <rsys/str.h> #ifdef AW_SHARED_BUILD #define AW_API extern EXPORT_SYM @@ -101,7 +102,7 @@ struct aw_color { }; struct aw_map { - char* filename; /* NULL <=> Not defined */ + struct str filename; /* str_len == 0 <=> Not defined */ int options_mask; float image_bias; /* Scalar to add to the image pixels */ float image_scale; /* Scalar to multiply to the image pixels */ @@ -114,7 +115,7 @@ struct aw_map { }; struct aw_material { - char* name; + struct str name; struct aw_color ambient; struct aw_color diffuse; struct aw_color specular; @@ -127,9 +128,6 @@ 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; @@ -254,19 +252,49 @@ aw_mtl_material_get const size_t imaterial, struct aw_material* material); +/******************************************************************************* + * Map functions + ******************************************************************************/ +AW_API res_T +aw_map_init + (struct mem_allocator* allocator, + struct aw_map* map); + +AW_API res_T +aw_map_release + (struct aw_map* map); + +AW_API res_T +aw_map_copy + (struct aw_map* dst, + const struct aw_map* src); + +AW_API res_T +aw_map_copy_and_release + (struct aw_map* dst, + struct aw_map* src); + +/******************************************************************************* + * Material functions + ******************************************************************************/ AW_API res_T aw_material_init (struct mem_allocator* allocator, struct aw_material* material); AW_API res_T +aw_material_release + (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 - (struct aw_material* material); +aw_material_copy_and_release + (struct aw_material* dst, + struct aw_material* src); END_DECLS diff --git a/src/aw_mtl.c b/src/aw_mtl.c @@ -27,215 +27,26 @@ #include <float.h> -/******************************************************************************* - * Map helper data structure - ******************************************************************************/ -struct map { - struct str filename; - int options_mask; - float image_bias; /* Scalar to add to the image pixels */ - float image_scale; /* Scalar to multiply to the image pixels */ - float texcoord_bias[3]; - float texcoord_scale[3]; - float texcoord_turbulence[3]; - size_t resolution; /* image size = resolution x resolution */ - enum aw_map_channel scalar; /* Channel used to create a scalar texture */ - float bump_multiplier; /* Only available on bump maps */ -}; - enum map_type { MAP_COMMON = BIT(0), MAP_SCALAR = BIT(1), MAP_BUMP = MAP_SCALAR | BIT(2) }; -static FINLINE void -map_init(struct mem_allocator* allocator, struct map* map) -{ - (void)allocator; - ASSERT(map); - str_init(allocator, &map->filename); - map->options_mask = 0; - map->image_bias = 0.f; - map->image_scale = 1.f; - f3_splat(map->texcoord_bias, 0.f); - f3_splat(map->texcoord_scale, 1.f); - f3_splat(map->texcoord_turbulence, 0.f); - map->resolution = 0; - map->scalar = AW_MAP_CHANNEL_LUMINANCE; - map->bump_multiplier = 1.0f; -} - -static FINLINE void -map_release(struct map* map) -{ - ASSERT(map); - str_release(&map->filename); -} - -static FINLINE void -map_copy_pod__(struct map* dst, const struct map* src) -{ - ASSERT(dst && src); - dst->options_mask = src->options_mask; - dst->image_bias = src->image_bias; - dst->image_scale = src->image_scale; - f3_set(dst->texcoord_bias, src->texcoord_bias); - f3_set(dst->texcoord_scale, src->texcoord_scale); - f3_set(dst->texcoord_turbulence, src->texcoord_turbulence); - dst->resolution = src->resolution; - dst->scalar = src->scalar; - dst->bump_multiplier = src->bump_multiplier; -} - -static FINLINE res_T -map_copy(struct map* dst, const struct map* src) -{ - ASSERT(dst && src); - if(dst == src) return RES_OK; - map_copy_pod__(dst, src); - return str_copy(&dst->filename, &src->filename); -} - -static FINLINE res_T -map_copy_and_release(struct map* dst, struct map* src) -{ - ASSERT(dst && src); - if(dst == src) return RES_OK; - map_copy_pod__(dst, src); - return str_copy_and_release(&dst->filename, &src->filename); -} - -static FINLINE res_T -map_to_aw_map - (struct mem_allocator* allocator, struct aw_map* dst, const struct map* src) -{ - ASSERT(allocator && dst && src); - if(!str_len(&src->filename)) { - dst->filename = NULL; - } else { - dst->filename = MEM_ALLOC(allocator, str_len(&src->filename) + 1); - if(!dst->filename) return RES_MEM_ERR; - strcpy(dst->filename, str_cget(&src->filename)); - } - dst->options_mask = src->options_mask; - dst->image_bias = src->image_bias; - dst->image_scale = src->image_scale; - f3_set(dst->texcoord_bias, src->texcoord_bias); - f3_set(dst->texcoord_scale, src->texcoord_scale); - f3_set(dst->texcoord_turbulence, src->texcoord_turbulence); - dst->resolution = src->resolution; - dst->scalar = src->scalar; - dst->bump_multiplier = src->bump_multiplier; - return RES_OK; -} - -/******************************************************************************* - * Material helper functions - ******************************************************************************/ -struct material { - struct str name; - struct aw_color ambient; - struct aw_color diffuse; - struct aw_color specular; - struct aw_color transmission; - float specular_exponent; - float refraction_index; - size_t illumination_model; /* In [0, 10] */ - struct map ambient_map; - struct map diffuse_map; - struct map specular_map; - struct map specular_exponent_map; /* Scalar texture */ - struct map bump_map; /* Scalar texture with valid bump multiplier */ -}; - -static FINLINE void -material_init(struct mem_allocator* allocator, struct material* mtl) -{ - ASSERT(mtl); - memset(mtl, 0, sizeof(struct material)); - str_init(allocator, &mtl->name); - map_init(allocator, &mtl->ambient_map); - map_init(allocator, &mtl->diffuse_map); - map_init(allocator, &mtl->specular_map); - map_init(allocator, &mtl->specular_exponent_map); - map_init(allocator, &mtl->bump_map); -} - -static FINLINE void -material_release(struct material* mtl) -{ - ASSERT(mtl); - str_release(&mtl->name); - map_release(&mtl->ambient_map); - map_release(&mtl->diffuse_map); - map_release(&mtl->specular_map); - map_release(&mtl->specular_exponent_map); - map_release(&mtl->bump_map); -} - -static FINLINE void -material_copy_pod__(struct material* dst, const struct material* src) -{ - ASSERT(dst && src); - dst->ambient = src->ambient; - dst->diffuse = src->diffuse; - dst->specular = src->specular; - dst->transmission = src->transmission; - dst->specular_exponent = src->specular_exponent; - dst->refraction_index = src->refraction_index; - dst->illumination_model = src->illumination_model; -} - -static FINLINE res_T -material_copy(struct material* dst, const struct material* src) -{ - res_T res; - if(dst == src) return RES_OK; - material_copy_pod__(dst, src); - #define CALL(Func) if(RES_OK != (res = Func)) return res - CALL(str_copy(&dst->name, &src->name)); - CALL(map_copy(&dst->ambient_map, &src->ambient_map)); - CALL(map_copy(&dst->diffuse_map, &src->diffuse_map)); - CALL(map_copy(&dst->specular_map, &src->specular_map)); - CALL(map_copy(&dst->specular_exponent_map, &src->specular_exponent_map)); - CALL(map_copy(&dst->bump_map, &src->bump_map)); - #undef CALL - return RES_OK; -} - -static FINLINE res_T -material_copy_and_release(struct material* dst, struct material* src) -{ - res_T res; - if(dst == src) return RES_OK; - material_copy_pod__(dst, src); - #define CALL(Func) if(RES_OK != (res = Func)) return res - CALL(str_copy_and_release(&dst->name, &src->name)); - CALL(map_copy_and_release(&dst->ambient_map, &src->ambient_map)); - CALL(map_copy_and_release(&dst->diffuse_map, &src->diffuse_map)); - CALL(map_copy_and_release(&dst->specular_map, &src->specular_map)); - CALL(map_copy_and_release - (&dst->specular_exponent_map, &src->specular_exponent_map)); - CALL(map_copy_and_release(&dst->bump_map, &src->bump_map)); - #undef CALL - return RES_OK; -} - /******************************************************************************* * Definition of the aw_mtl opaque data structure ******************************************************************************/ /* Generate the darray_mtl data structure */ #define DARRAY_NAME material -#define DARRAY_DATA struct material -#define DARRAY_FUNCTOR_INIT material_init -#define DARRAY_FUNCTOR_RELEASE material_release -#define DARRAY_FUNCTOR_COPY material_copy +#define DARRAY_DATA struct aw_material +#define DARRAY_FUNCTOR_INIT aw_material_init +#define DARRAY_FUNCTOR_RELEASE aw_material_release +#define DARRAY_FUNCTOR_COPY aw_material_copy #include <rsys/dynamic_array.h> struct aw_mtl { struct darray_material materials; - struct material* newmtl; /* Pointer toward the current material */ + struct aw_material* newmtl; /* Pointer toward the current material */ const char* filename; /* Currently parsed file. Use in error messages */ size_t iline; /* Currently parsed line index. Use in error messages */ @@ -400,7 +211,7 @@ parse_imfchan_option(enum aw_map_channel* channel, char** tk_ctxt) static res_T parse_map - (struct map* map, + (struct aw_map* map, const enum map_type type, char** tk_ctxt) { @@ -527,6 +338,34 @@ mtl_clear(struct aw_mtl* mtl) mtl->newmtl = NULL; } +static FINLINE void +map_copy_pod__(struct aw_map* dst, const struct aw_map* src) +{ + ASSERT(dst && src); + dst->options_mask = src->options_mask; + dst->image_bias = src->image_bias; + dst->image_scale = src->image_scale; + f3_set(dst->texcoord_bias, src->texcoord_bias); + f3_set(dst->texcoord_scale, src->texcoord_scale); + f3_set(dst->texcoord_turbulence, src->texcoord_turbulence); + dst->resolution = src->resolution; + dst->scalar = src->scalar; + dst->bump_multiplier = src->bump_multiplier; +} + +static FINLINE void +material_copy_pod__(struct aw_material* dst, const struct aw_material* src) +{ + ASSERT(dst && src); + dst->ambient = src->ambient; + dst->diffuse = src->diffuse; + dst->specular = src->specular; + dst->transmission = src->transmission; + dst->specular_exponent = src->specular_exponent; + dst->refraction_index = src->refraction_index; + dst->illumination_model = src->illumination_model; +} + static void mtl_release(ref_T* ref) { @@ -692,75 +531,117 @@ aw_mtl_material_get const size_t imaterial, struct aw_material* material) { - const struct material* mtr; - res_T res = RES_OK; - + const struct aw_material* mtr; if(!mtl || !material || imaterial>=darray_material_size_get(&mtl->materials)) return RES_BAD_ARG; - mtr = darray_material_cdata_get(&mtl->materials) + imaterial; - material->name = MEM_ALLOC(material->allocator__, str_len(&mtr->name) + 1); - if(!material->name) { - res = RES_MEM_ERR; - goto error; - } - strcpy(material->name, str_cget(&mtr->name)); - material->ambient = mtr->ambient; - material->diffuse = mtr->diffuse; - material->specular = mtr->specular; - material->transmission = mtr->transmission; - material->specular_exponent = mtr->specular_exponent; - material->refraction_index = mtr->refraction_index; - material->illumination_model = mtr->illumination_model; - - #define CALL(Func) if(RES_OK != (res = Func)) goto error - CALL(map_to_aw_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 + return aw_material_copy(material, mtr); +} -exit: - return res; -error: - if(material) - AW(material_release(material)); - goto exit; +res_T +aw_map_init(struct mem_allocator* allocator, struct aw_map* map) +{ + if(!map) return RES_BAD_ARG; + str_init(allocator, &map->filename); + map->options_mask = 0; + map->image_bias = 0.f; + map->image_scale = 1.f; + f3_splat(map->texcoord_bias, 0.f); + f3_splat(map->texcoord_scale, 1.f); + f3_splat(map->texcoord_turbulence, 0.f); + map->resolution = 0; + map->scalar = AW_MAP_CHANNEL_LUMINANCE; + map->bump_multiplier = 1.0f; + return RES_OK; +} + +res_T +aw_map_release(struct aw_map* map) +{ + if(!map) return RES_BAD_ARG; + str_release(&map->filename); + return RES_OK; +} + +res_T +aw_map_copy(struct aw_map* dst, const struct aw_map* src) +{ + if(!dst || !src) return RES_BAD_ARG; + if(dst == src) return RES_OK; + map_copy_pod__(dst, src); + return str_copy(&dst->filename, &src->filename); +} + +res_T +aw_map_copy_and_release(struct aw_map* dst, struct aw_map* src) +{ + if(!dst || !src) return RES_BAD_ARG; + if(dst == src) return RES_OK; + map_copy_pod__(dst, src); + return str_copy_and_release(&dst->filename, &src->filename); } res_T -aw_material_init(struct mem_allocator* allocator, struct aw_material* m) +aw_material_init(struct mem_allocator* allocator, struct aw_material* mtl) { - if(!m) return RES_BAD_ARG; - memset(m, 0, sizeof(struct aw_material)); - m->allocator__ = allocator ? allocator : &mem_default_allocator; + if(!mtl) return RES_BAD_ARG; + memset(mtl, 0, sizeof(struct aw_material)); + str_init(allocator, &mtl->name); + AW(map_init(allocator, &mtl->ambient_map)); + AW(map_init(allocator, &mtl->diffuse_map)); + AW(map_init(allocator, &mtl->specular_map)); + AW(map_init(allocator, &mtl->specular_exponent_map)); + AW(map_init(allocator, &mtl->bump_map)); + return RES_OK; +} + +res_T +aw_material_release(struct aw_material* mtl) +{ + if(!mtl) return RES_BAD_ARG; + str_release(&mtl->name); + AW(map_release(&mtl->ambient_map)); + AW(map_release(&mtl->diffuse_map)); + AW(map_release(&mtl->specular_map)); + AW(map_release(&mtl->specular_exponent_map)); + AW(map_release(&mtl->bump_map)); return RES_OK; } res_T -aw_material_release(struct aw_material* m) +aw_material_copy(struct aw_material* dst, const struct aw_material* src) { - if(!m) return RES_BAD_ARG; - 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->allocator__, m->specular_exponent_map.filename); - if(m->bump_map.filename) - MEM_FREE(m->allocator__, m->bump_map.filename); + res_T res; + if(!dst || !src) return RES_BAD_ARG; + if(dst == src) return RES_OK; + material_copy_pod__(dst, src); + #define CALL(Func) if(RES_OK != (res = Func)) return res + CALL(str_copy(&dst->name, &src->name)); + CALL(aw_map_copy(&dst->ambient_map, &src->ambient_map)); + CALL(aw_map_copy(&dst->diffuse_map, &src->diffuse_map)); + CALL(aw_map_copy(&dst->specular_map, &src->specular_map)); + CALL(aw_map_copy(&dst->specular_exponent_map, &src->specular_exponent_map)); + CALL(aw_map_copy(&dst->bump_map, &src->bump_map)); + #undef CALL + return RES_OK; +} + +res_T +aw_material_copy_and_release(struct aw_material* dst, struct aw_material* src) +{ + res_T res; + if(!dst || !src) return RES_BAD_ARG; + if(dst == src) return RES_OK; + material_copy_pod__(dst, src); + #define CALL(Func) if(RES_OK != (res = Func)) return res + CALL(str_copy_and_release(&dst->name, &src->name)); + CALL(aw_map_copy_and_release(&dst->ambient_map, &src->ambient_map)); + CALL(aw_map_copy_and_release(&dst->diffuse_map, &src->diffuse_map)); + CALL(aw_map_copy_and_release(&dst->specular_map, &src->specular_map)); + CALL(aw_map_copy_and_release + (&dst->specular_exponent_map, &src->specular_exponent_map)); + CALL(aw_map_copy_and_release(&dst->bump_map, &src->bump_map)); + #undef CALL return RES_OK; } diff --git a/src/test_aw_mtl.c b/src/test_aw_mtl.c @@ -91,7 +91,7 @@ test_common(struct aw_mtl* mtl) CHECK(aw_mtl_material_get(NULL, 0, &mtr), RES_BAD_ARG); CHECK(aw_mtl_material_get(mtl, 0, &mtr), RES_OK); - CHECK(strcmp(mtr.name, "my_mtl"), 0); + CHECK(strcmp(str_cget(&mtr.name), "my_mtl"), 0); CHECK(mtr.ambient.color_space, AW_COLOR_RGB); f3(tmp, 0.0435f, 0.0436f, 0.0437f); CHECK(f3_eq(mtr.ambient.value, tmp), 1); @@ -112,7 +112,7 @@ test_common(struct aw_mtl* mtl) CHECK(mtr.refraction_index, (float)1.19713f); CHECK(mtr.illumination_model, 6); - CHECK(strcmp(mtr.ambient_map.filename, "chrome.mpc"), 0); + CHECK(strcmp(str_cget(&mtr.ambient_map.filename), "chrome.mpc"), 0); CHECK(mtr.ambient_map.options_mask, 0); CHECK(mtr.ambient_map.image_bias, 0.f); CHECK(mtr.ambient_map.image_scale, 1.f); @@ -120,7 +120,7 @@ test_common(struct aw_mtl* mtl) CHECK(f3_eq(mtr.ambient_map.texcoord_scale, f3_splat(tmp, 1.f)), 1); CHECK(f3_eq(mtr.ambient_map.texcoord_turbulence, f3_splat(tmp, 0.f)), 1); - CHECK(strcmp(mtr.diffuse_map.filename, "chrome.mpc"), 0); + CHECK(strcmp(str_cget(&mtr.diffuse_map.filename), "chrome.mpc"), 0); CHECK(mtr.diffuse_map.options_mask, 0); CHECK(mtr.diffuse_map.image_bias, 0.f); CHECK(mtr.diffuse_map.image_scale, 1.f); @@ -128,7 +128,7 @@ test_common(struct aw_mtl* mtl) CHECK(f3_eq(mtr.diffuse_map.texcoord_scale, f3_splat(tmp, 1.f)), 1); CHECK(f3_eq(mtr.diffuse_map.texcoord_turbulence, f3_splat(tmp, 0.f)), 1); - CHECK(strcmp(mtr.specular_map.filename, "chrome.mpc"), 0); + CHECK(strcmp(str_cget(&mtr.specular_map.filename), "chrome.mpc"), 0); CHECK(mtr.specular_map.options_mask, 0); CHECK(mtr.specular_map.image_bias, 0.f); CHECK(mtr.specular_map.image_scale, 1.f); @@ -136,7 +136,7 @@ test_common(struct aw_mtl* mtl) CHECK(f3_eq(mtr.specular_map.texcoord_scale, f3_splat(tmp, 1.f)), 1); CHECK(f3_eq(mtr.specular_map.texcoord_turbulence, f3_splat(tmp, 0.f)), 1); - CHECK(strcmp(mtr.specular_exponent_map.filename, "wisp.mps"), 0); + CHECK(strcmp(str_cget(&mtr.specular_exponent_map.filename), "wisp.mps"), 0); CHECK(mtr.specular_exponent_map.options_mask, 0); CHECK(mtr.specular_exponent_map.image_bias, 0.f); CHECK(mtr.specular_exponent_map.image_scale, 1.f); @@ -145,7 +145,7 @@ test_common(struct aw_mtl* mtl) CHECK(f3_eq(mtr.specular_exponent_map.texcoord_turbulence, tmp), 1); CHECK(mtr.specular_exponent_map.scalar, AW_MAP_CHANNEL_LUMINANCE); - CHECK(strcmp(mtr.bump_map.filename, "sand.mpb"), 0); + CHECK(strcmp(str_cget(&mtr.bump_map.filename), "sand.mpb"), 0); CHECK(mtr.bump_map.options_mask, 0); CHECK(mtr.bump_map.image_bias, 0.f); CHECK(mtr.bump_map.image_scale, 1.f); @@ -219,7 +219,7 @@ test_multiple_materials(struct aw_mtl* mtl) 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(strcmp(str_cget(&mtr.name), "material_0"), 0); CHECK(mtr.specular_exponent, 8.f); CHECK(mtr.refraction_index, 1.5f); CHECK(mtr.transmission.color_space, AW_COLOR_RGB); @@ -232,7 +232,7 @@ test_multiple_materials(struct aw_mtl* mtl) CHECK(mtr.specular.color_space, AW_COLOR_RGB); CHECK(f3_eq(mtr.specular.value, f3_splat(tmp, 0.f)), 1); CHECK(strcmp - (mtr.ambient_map.filename, + (str_cget(&mtr.ambient_map.filename), "my_long_and_verbose_filename_of_a_RED_GREEN_BLUE_1024x64_image.png"), 0); CHECK(mtr.ambient_map.options_mask, 0); CHECK(mtr.ambient_map.image_bias, 0.f); @@ -241,14 +241,13 @@ test_multiple_materials(struct aw_mtl* mtl) CHECK(f3_eq(mtr.ambient_map.texcoord_scale, f3_splat(tmp, 1.f)), 1); CHECK(f3_eq(mtr.ambient_map.texcoord_turbulence, f3_splat(tmp, 0.f)), 1); CHECK(mtr.ambient_map.resolution, 0); - CHECK(strcmp(mtr.diffuse_map.filename, "tp.png"), 0); - CHECK(mtr.specular_map.filename, NULL); - CHECK(mtr.specular_exponent_map.filename, NULL); - CHECK(mtr.bump_map.filename, NULL); - CHECK(aw_material_release(&mtr), RES_OK); + CHECK(strcmp(str_cget(&mtr.diffuse_map.filename), "tp.png"), 0); + CHECK(str_len(&mtr.specular_map.filename), 0); + CHECK(str_len(&mtr.specular_exponent_map.filename), 0); + CHECK(str_len(&mtr.bump_map.filename), 0); CHECK(aw_mtl_material_get(mtl, 1, &mtr), RES_OK); - CHECK(strcmp(mtr.name, "textured_material"), 0); + CHECK(strcmp(str_cget(&mtr.name), "textured_material"), 0); CHECK(mtr.specular_exponent, 6.f); CHECK(mtr.refraction_index, (float)1.7f); CHECK(mtr.transmission.color_space, AW_COLOR_RGB); @@ -260,16 +259,15 @@ test_multiple_materials(struct aw_mtl* mtl) CHECK(f3_eq(mtr.diffuse.value, f3(tmp, 0.734118f, 0.709412f, 0.674118f)), 1); CHECK(mtr.specular.color_space, AW_COLOR_RGB); CHECK(f3_eq(mtr.specular.value, f3_splat(tmp, 0.f)), 1); - CHECK(strcmp(mtr.ambient_map.filename, "tex6x6.png"), 0); - CHECK(strcmp(mtr.diffuse_map.filename, "tex6x6.png"), 0); - CHECK(strcmp(mtr.bump_map.filename, "tex6x6-bump.png"), 0); + CHECK(strcmp(str_cget(&mtr.ambient_map.filename), "tex6x6.png"), 0); + CHECK(strcmp(str_cget(&mtr.diffuse_map.filename), "tex6x6.png"), 0); + CHECK(strcmp(str_cget(&mtr.bump_map.filename), "tex6x6-bump.png"), 0); CHECK(mtr.bump_map.scalar, AW_MAP_CHANNEL_RED); CHECK(mtr.bump_map.bump_multiplier, (float)0.2f); - CHECK(mtr.specular_exponent_map.filename, NULL); - CHECK(aw_material_release(&mtr), RES_OK); + CHECK(str_len(&mtr.specular_exponent_map.filename), 0); CHECK(aw_mtl_material_get(mtl, 2, &mtr), RES_OK); - CHECK(strcmp(mtr.name, "hello_world"), 0); + CHECK(strcmp(str_cget(&mtr.name), "hello_world"), 0); CHECK(mtr.specular_exponent, 8.f); CHECK(mtr.refraction_index, 1.5f); CHECK(mtr.transmission.color_space, AW_COLOR_RGB); @@ -281,12 +279,12 @@ test_multiple_materials(struct aw_mtl* mtl) CHECK(f3_eq(mtr.diffuse.value, f3(tmp, 0.546274f, 0.219608f, 0.183922f)), 1); CHECK(mtr.specular.color_space, AW_COLOR_RGB); CHECK(f3_eq(mtr.specular.value, f3_splat(tmp, 2.f)), 1); - CHECK(mtr.ambient_map.filename, NULL); - CHECK(mtr.diffuse_map.filename, NULL); - CHECK(mtr.bump_map.filename, NULL); - CHECK(mtr.specular_exponent_map.filename, NULL); - CHECK(aw_material_release(&mtr), RES_OK); + CHECK(str_len(&mtr.ambient_map.filename), 0); + CHECK(str_len(&mtr.diffuse_map.filename), 0); + CHECK(str_len(&mtr.bump_map.filename), 0); + CHECK(str_len(&mtr.specular_exponent_map.filename), 0); + CHECK(aw_material_release(&mtr), RES_OK); fclose(file); }