solstice

Compute collected power and efficiencies of a solar plant
git clone git://git.meso-star.com/solstice.git
Log | Files | Refs | README | LICENSE

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:
Msrc/parser/solparser_material.c | 4++--
Msrc/parser/solparser_material.h | 4++--
Msrc/parser/test_solparser2.c | 6++++--
Msrc/parser/test_solparser4.c | 6++++--
Msrc/parser/test_solparser_normal_map.c | 6++++--
Msrc/solstice_material.c | 17+++++++++++------
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(&param->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(&param->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(&param->reflectivity); + ssol_data_clear(&param->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, &param->reflectivity); + if(res != RES_OK) goto error; + res = mtl_to_ssol_data(solstice, &mirror->roughness, &param->roughness); + if(res != RES_OK) goto error; if(!SOLPARSER_ID_IS_VALID(mirror->normal_map)) { shader.normal = mtl_get_normal;