solstice-solver

Solver library of the solstice app
git clone git://git.meso-star.com/solstice-solver.git
Log | Files | Refs | README | LICENSE

commit aba2a6238a4aa2f6ee9c4e036efed365d0d243ce
parent 47c67c32652aec9125b5f7895658fd7f24755cd4
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu, 23 Feb 2017 10:25:36 +0100

Add and test the ssol_material_get_type function

Diffstat:
Msrc/ssol.h | 12++++++++++++
Msrc/ssol_material.c | 37+++++++++++++++++++++++--------------
Msrc/ssol_material_c.h | 9+--------
Msrc/ssol_scene.c | 2+-
Msrc/ssol_solver.c | 4++--
Msrc/test_ssol_material.c | 14++++++++++++++
6 files changed, 53 insertions(+), 25 deletions(-)

diff --git a/src/ssol.h b/src/ssol.h @@ -66,6 +66,13 @@ enum ssol_side_flag { SSOL_INVALID_SIDE = BIT(2) }; +enum ssol_material_type { + SSOL_MATERIAL_MATTE, + SSOL_MATERIAL_MIRROR, + SSOL_MATERIAL_VIRTUAL, + SSOL_MATERIAL_TYPES_COUNT__ +}; + enum ssol_clipping_op { SSOL_AND, SSOL_SUB, @@ -567,6 +574,11 @@ ssol_material_create_virtual struct ssol_material** mtl); SSOL_API res_T +ssol_material_get_type + (const struct ssol_material* mtl, + enum ssol_material_type* type); + +SSOL_API res_T ssol_material_ref_get (struct ssol_material* mtl); diff --git a/src/ssol_material.c b/src/ssol_material.c @@ -45,7 +45,7 @@ matte_shade double normal[3]; double reflectivity; res_T res; - ASSERT(mtl && fragment && mtl->type == MATERIAL_MATTE); + ASSERT(mtl && fragment && mtl->type == SSOL_MATERIAL_MATTE); ASSERT(bsdf); shader = &mtl->data.matte; @@ -88,7 +88,7 @@ mirror_shade double roughness; double reflectivity; res_T res; - ASSERT(mtl && fragment && mtl->type == MATERIAL_MIRROR); + ASSERT(mtl && fragment && mtl->type == SSOL_MATERIAL_MIRROR); ASSERT(bsdf); shader = &mtl->data.mirror; @@ -177,13 +177,13 @@ static res_T ssol_material_create (struct ssol_device* dev, struct ssol_material** out_material, - enum material_type type) + enum ssol_material_type type) { struct ssol_material* material = NULL; res_T res = RES_OK; if(!dev || !out_material - || type >= MATERIAL_TYPES_COUNT__) { + || type >= SSOL_MATERIAL_TYPES_COUNT__) { return RES_BAD_ARG; } @@ -218,7 +218,7 @@ ssol_material_ref_get(struct ssol_material* material) { if (!material) return RES_BAD_ARG; - ASSERT(material->type < MATERIAL_TYPES_COUNT__); + ASSERT(material->type < SSOL_MATERIAL_TYPES_COUNT__); ref_get(&material->ref); return RES_OK; } @@ -228,12 +228,21 @@ ssol_material_ref_put(struct ssol_material* material) { if (!material) return RES_BAD_ARG; - ASSERT(material->type < MATERIAL_TYPES_COUNT__); + ASSERT(material->type < SSOL_MATERIAL_TYPES_COUNT__); ref_put(&material->ref, material_release); return RES_OK; } res_T +ssol_material_get_type + (const struct ssol_material* mtl, enum ssol_material_type* type) +{ + if(!mtl || !type) return RES_BAD_ARG; + *type = mtl->type; + return RES_OK; +} + +res_T ssol_material_set_param_buffer (struct ssol_material* mtl, struct ssol_param_buffer* buf) { @@ -247,14 +256,14 @@ res_T ssol_material_create_mirror (struct ssol_device* dev, struct ssol_material** out_material) { - return ssol_material_create(dev, out_material, MATERIAL_MIRROR); + return ssol_material_create(dev, out_material, SSOL_MATERIAL_MIRROR); } res_T ssol_material_create_matte (struct ssol_device* dev, struct ssol_material** out_material) { - return ssol_material_create(dev, out_material, MATERIAL_MATTE); + return ssol_material_create(dev, out_material, SSOL_MATERIAL_MATTE); } res_T @@ -262,7 +271,7 @@ ssol_mirror_set_shader (struct ssol_material* material, const struct ssol_mirror_shader* shader) { if(!material - || material->type != MATERIAL_MIRROR + || material->type != SSOL_MATERIAL_MIRROR || !check_shader_mirror(shader)) return RES_BAD_ARG; material->data.mirror = *shader; @@ -274,7 +283,7 @@ ssol_matte_set_shader (struct ssol_material* material, const struct ssol_matte_shader* shader) { if(!material - || material->type != MATERIAL_MATTE + || material->type != SSOL_MATERIAL_MATTE || !check_shader_matte(shader)) return RES_BAD_ARG; material->data.matte = *shader; @@ -285,7 +294,7 @@ res_T ssol_material_create_virtual (struct ssol_device* dev, struct ssol_material** out_material) { - return ssol_material_create(dev, out_material, MATERIAL_VIRTUAL); + return ssol_material_create(dev, out_material, SSOL_MATERIAL_VIRTUAL); } /******************************************************************************* @@ -372,13 +381,13 @@ material_shade /* Specific material shading */ switch(mtl->type) { - case MATERIAL_MATTE: + case SSOL_MATERIAL_MATTE: res = matte_shade(mtl, fragment, wavelength, bsdf); break; - case MATERIAL_MIRROR: + case SSOL_MATERIAL_MIRROR: res = mirror_shade(mtl, fragment, wavelength, bsdf); break; - case MATERIAL_VIRTUAL: /* Nothing to shade */ break; + case SSOL_MATERIAL_VIRTUAL: /* Nothing to shade */ break; default: FATAL("Unreachable code\n"); break; } return res; diff --git a/src/ssol_material_c.h b/src/ssol_material_c.h @@ -34,15 +34,8 @@ struct surface_fragment { static const struct surface_fragment SURFACE_FRAGMENT_NULL = SURFACE_FRAGMENT_NULL__; -enum material_type { - MATERIAL_MATTE, - MATERIAL_MIRROR, - MATERIAL_VIRTUAL, - MATERIAL_TYPES_COUNT__ -}; - struct ssol_material { - enum material_type type; + enum ssol_material_type type; union { struct ssol_matte_shader matte; diff --git a/src/ssol_scene.c b/src/ssol_scene.c @@ -480,7 +480,7 @@ hit_filter_function hit_side = (hit_side == SSOL_FRONT) ? SSOL_BACK : SSOL_FRONT; } mtl = hit_side == SSOL_FRONT ? sshape->mtl_front : sshape->mtl_back; - if(mtl->type == MATERIAL_VIRTUAL) { + if(mtl->type == SSOL_MATERIAL_VIRTUAL) { /* Discard all virtual materials */ if(rdata->discard_virtual_materials) return 1; /* Discard virtual material that are not receivers */ diff --git a/src/ssol_solver.c b/src/ssol_solver.c @@ -659,7 +659,7 @@ trace_radiative_path } mtl = point_get_material(&pt); - if(mtl->type == MATERIAL_VIRTUAL) { + if(mtl->type == SSOL_MATERIAL_VIRTUAL) { /* Note that for Virtual materials, the ray parameters 'org' & 'dir' * are not updated to ensure that it pursues its traversal without any * accuracy issue */ @@ -693,7 +693,7 @@ trace_radiative_path S3D(scene_view_trace_ray(view_rt, org, dir, range, &ray_data, &hit)); if(S3D_HIT_NONE(&hit)) break; - depth += mtl->type != MATERIAL_VIRTUAL; + depth += mtl->type != SSOL_MATERIAL_VIRTUAL; /* Take into account the atmosphere attenuation along the new ray */ if(scn->atmosphere) { diff --git a/src/test_ssol_material.c b/src/test_ssol_material.c @@ -26,6 +26,7 @@ main(int argc, char** argv) struct ssol_mirror_shader mirror = SSOL_MIRROR_SHADER_NULL; struct ssol_matte_shader matte = SSOL_MATTE_SHADER_NULL; struct ssol_param_buffer* pbuf = NULL; + enum ssol_material_type type; (void) argc, (void) argv; mem_init_proxy_allocator(&allocator, &mem_default_allocator); @@ -37,6 +38,12 @@ main(int argc, char** argv) CHECK(ssol_material_create_mirror(dev, NULL), RES_BAD_ARG); CHECK(ssol_material_create_mirror(dev, &material), RES_OK); + CHECK(ssol_material_get_type(NULL, NULL), RES_BAD_ARG); + CHECK(ssol_material_get_type(material, NULL), RES_BAD_ARG); + CHECK(ssol_material_get_type(NULL, &type), RES_BAD_ARG); + CHECK(ssol_material_get_type(material, &type), RES_OK); + CHECK(type, SSOL_MATERIAL_MIRROR); + CHECK(ssol_material_ref_get(NULL), RES_BAD_ARG); CHECK(ssol_material_ref_get(material), RES_OK); @@ -77,6 +84,9 @@ main(int argc, char** argv) CHECK(ssol_material_create_virtual(dev, NULL), RES_BAD_ARG); CHECK(ssol_material_create_virtual(dev, &material), RES_OK); + CHECK(ssol_material_get_type(material, &type), RES_OK); + CHECK(type, SSOL_MATERIAL_VIRTUAL); + CHECK(ssol_material_ref_put(material), RES_OK); CHECK(ssol_param_buffer_ref_put(pbuf), RES_OK); @@ -85,6 +95,9 @@ main(int argc, char** argv) CHECK(ssol_material_create_matte(NULL, &material), RES_BAD_ARG); CHECK(ssol_material_create_matte(dev, &material), RES_OK); + CHECK(ssol_material_get_type(material, &type), RES_OK); + CHECK(type, SSOL_MATERIAL_MATTE); + matte.normal = get_shader_normal; matte.reflectivity = get_shader_reflectivity; CHECK(ssol_matte_set_shader(NULL, NULL), RES_BAD_ARG); @@ -107,3 +120,4 @@ main(int argc, char** argv) return 0; } +