commit 9f0380b99c4c0b3e58c369b89ff1dd5444d17648
parent 01556a67343cb7658a5ca5a0093ce4493de5f253
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Mon, 24 Apr 2017 14:27:42 +0200
Parse and handle the mirror mtl_data
The mirror roughness and reflectivy can be reals or spectra.
Diffstat:
6 files changed, 27 insertions(+), 16 deletions(-)
diff --git a/src/parser/solparser_material.c b/src/parser/solparser_material.c
@@ -264,10 +264,10 @@ parse_material_mirror
res = parse_image(parser, doc, val, &mtl->normal_map);
} else if(!strcmp((char*)key->data.scalar.value, "reflectivity")) {
SETUP_MASK(REFLECTIVITY, "reflectivity");
- res = parse_real(parser, val, 0, 1, &mtl->reflectivity);
+ res = parse_mtl_data(parser, doc, val, 0, 1, &mtl->reflectivity);
} else if(!strcmp((char*)key->data.scalar.value, "roughness")) {
SETUP_MASK(ROUGHNESS, "roughness");
- res = parse_real(parser, val, 0, 1, &mtl->roughness);
+ res = parse_mtl_data(parser, doc, val, 0, 1, &mtl->roughness);
} else {
log_err(parser, key, "unknown mirror attribute `%s'.\n",
key->data.scalar.value);
diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h
@@ -64,8 +64,8 @@ solparser_material_matte_init
}
struct solparser_material_mirror {
- double roughness; /* In [0, 1] */
- double reflectivity; /* In [0, 1] */
+ struct solparser_mtl_data roughness; /* In [0, 1] */
+ struct solparser_mtl_data reflectivity; /* In [0, 1] */
struct solparser_image_id normal_map;
};
diff --git a/src/parser/test_solparser2.c b/src/parser/test_solparser2.c
@@ -166,8 +166,10 @@ main(int argc, char** argv)
CHECK(mtl == mtls[0] || mtl == mtls[1], 1);
CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
- CHECK(mirror->reflectivity, 0.9);
- CHECK(mirror->roughness, 0.1);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->reflectivity.value.real, 0.9);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->roughness.value.real, 0.1);
entity_id = solparser_entity_get_child(entity, 1);
entity1b = solparser_get_entity(parser, entity_id);
diff --git a/src/parser/test_solparser4.c b/src/parser/test_solparser4.c
@@ -159,8 +159,10 @@ main(int argc, char** argv)
mtl = solparser_get_material(parser, mtl2->front);
CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
- CHECK(mirror->reflectivity, 0.2);
- CHECK(mirror->roughness, 0.1);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->reflectivity.value.real, 0.2);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->roughness.value.real, 0.1);
shape = solparser_get_shape(parser, obj->shape);
CHECK(shape->type, SOLPARSER_SHAPE_CUBOID);
diff --git a/src/parser/test_solparser_normal_map.c b/src/parser/test_solparser_normal_map.c
@@ -223,8 +223,10 @@ test_mirror(struct solparser* parser)
mtl = solparser_get_material(parser, mtl2->front);
CHECK(mtl->type, SOLPARSER_MATERIAL_MIRROR);
mirror = solparser_get_material_mirror(parser, mtl->data.mirror);
- CHECK(mirror->reflectivity, 1);
- CHECK(mirror->roughness, 0.1);
+ CHECK(mirror->reflectivity.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->reflectivity.value.real, 1);
+ CHECK(mirror->roughness.type, SOLPARSER_MTL_DATA_REAL);
+ CHECK(mirror->roughness.value.real, 0.1);
CHECK(SOLPARSER_ID_IS_VALID(mirror->normal_map), 1);
img = solparser_get_image(parser, mirror->normal_map);
CHECK(strcmp(str_cget(&img->filename), "Normal map"), 0);
diff --git a/src/solstice_material.c b/src/solstice_material.c
@@ -30,8 +30,8 @@ struct matte_param {
};
struct mirror_param {
- double reflectivity;
- double roughness;
+ struct ssol_data reflectivity;
+ struct ssol_data roughness;
struct ssol_image* normal_map;
};
@@ -144,7 +144,7 @@ mirror_get_reflectivity
{
const struct mirror_param* param = ssol_param_buffer_get(buf);
(void)dev, (void)wavelength, (void)frag;
- *val = param->reflectivity;
+ *val = ssol_data_get_value(¶m->reflectivity, wavelength);
}
static void
@@ -157,7 +157,7 @@ mirror_get_roughness
{
const struct mirror_param* param = ssol_param_buffer_get(buf);
(void)dev, (void)wavelength, (void)frag;
- *val = param->roughness;
+ *val = ssol_data_get_value(¶m->roughness, wavelength);
}
static void
@@ -179,6 +179,8 @@ mirror_param_release(void* mem)
struct mirror_param* param = mem;
ASSERT(param);
if(param->normal_map) SSOL(image_ref_put(param->normal_map));
+ ssol_data_clear(¶m->reflectivity);
+ ssol_data_clear(¶m->roughness);
}
static void
@@ -481,8 +483,11 @@ create_material_mirror
goto error;
}
memset(param, 0, sizeof(struct mirror_param));
- param->reflectivity = mirror->reflectivity;
- param->roughness = mirror->roughness;
+
+ res = mtl_to_ssol_data(solstice, &mirror->reflectivity, ¶m->reflectivity);
+ if(res != RES_OK) goto error;
+ res = mtl_to_ssol_data(solstice, &mirror->roughness, ¶m->roughness);
+ if(res != RES_OK) goto error;
if(!SOLPARSER_ID_IS_VALID(mirror->normal_map)) {
shader.normal = mtl_get_normal;