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 e03b22958c4fe37189044f59f4098d493187600e
parent ba45aa5f7dd5aa1ec93e091f7f983df1821c5494
Author: Vincent Forest <vincent.forest@meso-star.com>
Date:   Thu,  6 Apr 2017 17:56:27 +0200

Parse an optional normal_map for all materials

Diffstat:
Mdoc/input | 3+++
Msrc/parser/solparser_c.h | 3+++
Msrc/parser/solparser_material.c | 21+++++++++++++++------
Msrc/parser/solparser_material.h | 33+++++++++++++++++++++++++++++++++
Msrc/solstice_material.c | 4+---
5 files changed, 55 insertions(+), 9 deletions(-)

diff --git a/doc/input b/doc/input @@ -225,6 +225,7 @@ dielectric: medium_i: <dielectric-medium> medium_t: <dielectric-medium> +[ <normal-map> ] <matte> ::= matte: @@ -235,6 +236,7 @@ mirror: reflectivity: REAL # in [0, 1] roughness: REAL # in [0, 1] +[ <normal-map> ] <virtual> ::= virtual: EMPTY-STRING @@ -244,6 +246,7 @@ thickness: REAL # in [0, INF) medium_i: <dielectric-medium> medium_t: <dielectric-medium> +[ <normal-map> ] <dielectric-medium> ::= refractive_index: REAL # in ]0, INF) diff --git a/src/parser/solparser_c.h b/src/parser/solparser_c.h @@ -49,6 +49,7 @@ struct target_alias { /* Declare the array of dielectric materials */ #define DARRAY_NAME dielectric #define DARRAY_DATA struct solparser_material_dielectric +#define DARRAY_FUNCTOR_INIT solparser_material_dielectric_init #include <rsys/dynamic_array.h> /* Declare the array of matte materials */ @@ -60,11 +61,13 @@ struct target_alias { /* Declare the array of mirror materials */ #define DARRAY_NAME mirror #define DARRAY_DATA struct solparser_material_mirror +#define DARRAY_FUNCTOR_INIT solparser_material_mirror_init #include <rsys/dynamic_array.h> /* Declare the array of thin_dielectric materials */ #define DARRAY_NAME thin_dielectric #define DARRAY_DATA struct solparser_material_thin_dielectric +#define DARRAY_FUNCTOR_INIT solparser_material_thin_dielectric_init #include <rsys/dynamic_array.h> /* Declare the array of materials */ diff --git a/src/parser/solparser_material.c b/src/parser/solparser_material.c @@ -120,7 +120,7 @@ parse_material_dielectric const yaml_node_t* dielec, struct solparser_material_dielectric_id* out_imtl) { - enum { MEDIUM_I, MEDIUM_T }; + enum { MEDIUM_I, MEDIUM_T, NORMAL_MAP }; struct solparser_material_dielectric* mtl = NULL; size_t imtl = SIZE_MAX; int mask = 0; /* Register the parsed attributes */ @@ -166,7 +166,10 @@ parse_material_dielectric } \ mask |= BIT(Flag); \ } (void)0 - if(!strcmp((char*)key->data.scalar.value, "medium_i")) { + if(!strcmp((char*)key->data.scalar.value, "normal_map")) { + SETUP_MASK(NORMAL_MAP, "normal_map"); + res = parse_image(parser, doc, val, &mtl->normal_map); + } else if(!strcmp((char*)key->data.scalar.value, "medium_i")) { SETUP_MASK(MEDIUM_I, "medium_i"); res = parse_medium(parser, doc, val, &mtl->medium_i); } else if(!strcmp((char*)key->data.scalar.value, "medium_t")) { @@ -302,7 +305,7 @@ parse_material_mirror const yaml_node_t* mirror, struct solparser_material_mirror_id* out_imtl) { - enum { REFLECTIVITY, ROUGHNESS }; + enum { NORMAL_MAP, REFLECTIVITY, ROUGHNESS }; struct solparser_material_mirror* mtl = NULL; size_t imtl = SIZE_MAX; int mask = 0; /* Register the parsed attributes */ @@ -348,7 +351,10 @@ parse_material_mirror } \ mask |= BIT(Flag); \ } (void)0 - if(!strcmp((char*)key->data.scalar.value, "reflectivity")) { + if(!strcmp((char*)key->data.scalar.value, "normal_map")) { + SETUP_MASK(NORMAL_MAP, "normal_map"); + 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); } else if(!strcmp((char*)key->data.scalar.value, "roughness")) { @@ -395,7 +401,7 @@ parse_material_thin_dielectric yaml_node_t* thin, struct solparser_material_thin_dielectric_id* out_imtl) { - enum { MEDIUM_I, MEDIUM_T, THICKNESS }; + enum { MEDIUM_I, MEDIUM_T, NORMAL_MAP, THICKNESS }; struct solparser_material_thin_dielectric* mtl = NULL; size_t imtl = SIZE_MAX; int mask = 0; /* Register the parsed attributes */ @@ -442,7 +448,10 @@ parse_material_thin_dielectric } \ mask |= BIT(Flag); \ } (void)0 - if(!strcmp((char*)key->data.scalar.value, "medium_i")) { + if(!strcmp((char*)key->data.scalar.value, "normal_map")) { + SETUP_MASK(NORMAL_MAP, "normal_map"); + res = parse_image(parser, doc, val, &mtl->normal_map); + } else if(!strcmp((char*)key->data.scalar.value, "medium_i")) { SETUP_MASK(MEDIUM_I, "medium_i"); res = parse_medium(parser, doc, val, &mtl->medium_i); } else if(!strcmp((char*)key->data.scalar.value, "medium_t")) { diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h @@ -37,10 +37,21 @@ struct solparser_medium_id { size_t i; }; struct solparser_material_dielectric { struct solparser_medium_id medium_i; /* Medium the material "looks at" */ struct solparser_medium_id medium_t; /* Opposite medium */ + struct solparser_image_id normal_map; }; struct solparser_material_dielectric_id { size_t i; }; +static INLINE void +solparser_material_dielectric_init + (struct mem_allocator* allocator, + struct solparser_material_dielectric* dielectric) +{ + ASSERT(dielectric); + (void)allocator; + dielectric->normal_map.i = SIZE_MAX; +} + struct solparser_material_matte { double reflectivity; /* In [0, 1] */ struct solparser_image_id normal_map; @@ -61,18 +72,40 @@ solparser_material_matte_init struct solparser_material_mirror { double roughness; /* In [0, 1] */ double reflectivity; /* In [0, 1] */ + struct solparser_image_id normal_map; }; struct solparser_material_mirror_id { size_t i; }; +static INLINE void +solparser_material_mirror_init + (struct mem_allocator* allocator, + struct solparser_material_mirror* mirror) +{ + ASSERT(mirror); + (void)allocator; + mirror->normal_map.i = SIZE_MAX; +} + struct solparser_material_thin_dielectric { struct solparser_medium_id medium_i; /* Outside medium */ struct solparser_medium_id medium_t; /* Medium of the slab */ + struct solparser_image_id normal_map; double thickness; }; struct solparser_material_thin_dielectric_id { size_t i; }; +static INLINE void +solparser_material_thin_dielectric_init + (struct mem_allocator* allocator, + struct solparser_material_thin_dielectric* thin) +{ + ASSERT(thin); + (void)allocator; + thin->normal_map.i = SIZE_MAX; +} + struct solparser_material { enum solparser_material_type type; union { diff --git a/src/solstice_material.c b/src/solstice_material.c @@ -42,9 +42,7 @@ mtl_get_normal double* val) { (void)dev, (void)buf, (void)wavelength; - val[0] = frag->Ns[0]; - val[1] = frag->Ns[1]; - val[2] = frag->Ns[2]; + d3_set(val, frag->Ns); } static void