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:
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;
}
+