commit 341777e3f2309ac592115ac5aac2e76bd09d1394
parent 65324e2f8a5da6fba9c3ea84fcf400e15e43d91f
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Wed, 1 Mar 2017 16:20:31 +0100
Parse and load the new thin_dielectric material descriptor
Diffstat:
5 files changed, 147 insertions(+), 7 deletions(-)
diff --git a/doc/input b/doc/input
@@ -195,7 +195,7 @@
# back: <material-descriptor>
#
# <material-descriptor> ::=
-# <mirror> | <matte> | <virtual>
+# <mirror> | <matte> | <thin-dielectric> | <virtual>
#
# <mirror> ::=
# mirror:
@@ -208,6 +208,11 @@
#
# <virtual> ::=
# virtual: EMPTY-STRING
+#
+# <thin-dielectric> ::=
+# thin_dielectric:
+# thickness: REAL
+# refractive_index: REAL
#
# ----------------------------------------
# <entity> ::=
@@ -296,4 +301,4 @@
# <spectrum-data> ::=
# wavelength: REAL # in [0, INF)
# data: REAL # in [0, INF)
-#
-\ No newline at end of file
+#
diff --git a/src/parser/solparser.c b/src/parser/solparser.c
@@ -54,6 +54,11 @@ struct target_alias {
#define DARRAY_DATA struct solparser_material_mirror
#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
+#include <rsys/dynamic_array.h>
+
/* Declare the array of materials */
#define DARRAY_NAME material
#define DARRAY_DATA struct solparser_material
@@ -175,6 +180,7 @@ struct solparser {
struct darray_material2 mtls2; /* Double sided materials */
struct darray_matte mattes;
struct darray_mirror mirrors;
+ struct darray_thin_dielectric thin_dielectrics;
/* Use to deferred the setup of the anchor targeted by a pivot */
struct darray_tgtalias tgtaliases;
@@ -372,6 +378,7 @@ parser_clear(struct solparser* parser)
darray_material2_clear(&parser->mtls2);
darray_matte_clear(&parser->mattes);
darray_mirror_clear(&parser->mirrors);
+ darray_thin_dielectric_clear(&parser->thin_dielectrics);
/* Deferred targeted anchors */
darray_tgtalias_clear(&parser->tgtaliases);
@@ -423,6 +430,7 @@ parser_release(ref_T* ref)
darray_material2_release(&parser->mtls2);
darray_matte_release(&parser->mattes);
darray_mirror_release(&parser->mirrors);
+ darray_thin_dielectric_release(&parser->thin_dielectrics);
/* Deferred targeted anchors */
darray_tgtalias_release(&parser->tgtaliases);
@@ -1014,6 +1022,102 @@ error:
}
static res_T
+parse_material_thin_dielectric
+ (struct solparser* parser,
+ yaml_document_t* doc,
+ yaml_node_t* thin,
+ struct solparser_material_thin_dielectric_id* out_imtl)
+{
+ enum { REFRACTIVE_INDEX, THICKNESS };
+ struct solparser_material_thin_dielectric* mtl = NULL;
+ size_t imtl = SIZE_MAX;
+ int mask = 0; /* Register the parsed attributes */
+ intptr_t i, n;
+ res_T res = RES_OK;
+ ASSERT(doc && thin && out_imtl);
+
+ if(thin->type != YAML_MAPPING_NODE) {
+ log_err(parser, thin,
+ "expect a mapping of thin material attributes.\n");
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ /* Allocate the thin dielectric material */
+ imtl = darray_thin_dielectric_size_get(&parser->thin_dielectrics);
+ res = darray_thin_dielectric_resize(&parser->thin_dielectrics, imtl + 1);
+ if(res != RES_OK) {
+ log_err(parser, thin,
+ "could not allocate the thin dielectric material.\n");
+ goto error;
+ }
+ mtl = darray_thin_dielectric_data_get(&parser->thin_dielectrics) + imtl;
+
+ n = thin->data.mapping.pairs.top - thin->data.mapping.pairs.start;
+ FOR_EACH(i, 0, n) {
+ yaml_node_t* key;
+ yaml_node_t* val;
+
+ key = yaml_document_get_node(doc, thin->data.mapping.pairs.start[i].key);
+ val = yaml_document_get_node(doc, thin->data.mapping.pairs.start[i].value);
+ if(key->type != YAML_SCALAR_NODE) {
+ log_err(parser, key, "expect a thin dielectric material parameter.\n");
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+ #define SETUP_MASK(Flag, Name) { \
+ if(mask & BIT(Flag)) { \
+ log_err(parser, key, \
+ "the "Name" of the thin dielectric material is already defined.\n"); \
+ res = RES_BAD_ARG; \
+ goto error; \
+ } \
+ mask |= BIT(Flag); \
+ } (void)0
+ if(!strcmp((char*)key->data.scalar.value, "refractive_index")) {
+ SETUP_MASK(REFRACTIVE_INDEX, "refractive_index");
+ res = parse_real
+ (parser, val, nextafter(0, 1), DBL_MAX, &mtl->refractive_index);
+ } else if(!strcmp((char*)key->data.scalar.value, "thickness")) {
+ SETUP_MASK(THICKNESS, "thickness");
+ res = parse_real(parser, val, 0, DBL_MAX, &mtl->thickness);
+ } else {
+ log_err(parser, key, "unknown thin dielectric parameter `%s'.\n",
+ key->data.scalar.value);
+ res = RES_BAD_ARG;
+ goto error;
+ }
+ if(res != RES_OK) {
+ log_node(parser, key);
+ goto error;
+ }
+ #undef SETUP_MASK
+ }
+
+ #define CHECK_PARAM(Flag, Name) \
+ if(!(mask & BIT(Flag))) { \
+ log_err(parser, thin, \
+ "the "Name" of the thin dielectric material is missing.\n"); \
+ res = RES_BAD_ARG; \
+ goto error; \
+ } (void)0
+ CHECK_PARAM(REFRACTIVE_INDEX, "refractive_index");
+ CHECK_PARAM(THICKNESS, "thickness");
+ #undef CHECK_PARAM
+
+exit:
+ out_imtl->i = imtl;
+ return res;
+error:
+ if(mtl) {
+ darray_thin_dielectric_pop_back(&parser->thin_dielectrics);
+ imtl = SIZE_MAX;
+ }
+ goto exit;
+}
+
+static res_T
parse_material_virtual(struct solparser* parser, yaml_node_t* virtual)
{
res_T res = RES_OK;
@@ -1101,8 +1205,13 @@ parse_material_descriptor
SETUP_MASK(DESCRIPTOR, "descriptor");
mtl->type = SOLPARSER_MATERIAL_MIRROR;
res = parse_material_mirror(parser, doc, val, &mtl->data.mirror);
+ } else if(!strcmp((char*)key->data.scalar.value, "thin_dielectric")) {
+ SETUP_MASK(DESCRIPTOR, "descriptor");
+ mtl->type = SOLPARSER_MATERIAL_THIN_DIELECTRIC;
+ res = parse_material_thin_dielectric
+ (parser, doc, val, &mtl->data.thin_dielectric);
} else if(!strcmp((char*)key->data.scalar.value, "virtual")) {
- SETUP_MASK(DESCRIPTOR, "virtual");
+ SETUP_MASK(DESCRIPTOR, "descriptor");
mtl->type = SOLPARSER_MATERIAL_VIRTUAL;
res = parse_material_virtual(parser, val);
} else {
@@ -1607,7 +1716,7 @@ parse_cylinder
*(Ptr) = Value; \
} (void)0
DEFAULT_PARAM(SLICES, &shape->nslices, 16);
- #undef DEFAULT_PARAM
+ #undef DEFAULT_PARAM
exit:
out_ishape->i = ishape;
@@ -2948,7 +3057,7 @@ parse_zx_pivot
parser, doc, val, -DBL_MAX, DBL_MAX, solxzpivot->ref_point);
} else if(!strcmp((char*) key->data.scalar.value, "target")) {
struct solparser_pivot_id pivot_id;
- pivot_id.i =
+ pivot_id.i =
(size_t) (solxzpivot - darray_zx_pivot_cdata_get(&parser->zx_pivots));
SETUP_MASK(TARGET, "target");
res = parse_target(parser, doc, val, &solxzpivot->target, pivot_id);
@@ -3335,6 +3444,7 @@ solparser_create
darray_material2_init(mem_allocator, &parser->mtls2);
darray_matte_init(mem_allocator, &parser->mattes);
darray_mirror_init(mem_allocator, &parser->mirrors);
+ darray_thin_dielectric_init(mem_allocator, &parser->thin_dielectrics);
/* Deferred targeted anchors */
darray_tgtalias_init(mem_allocator, &parser->tgtaliases);
@@ -3687,6 +3797,16 @@ solparser_get_material_mirror
return darray_mirror_cdata_get(&parser->mirrors) + mirror.i;
}
+const struct solparser_material_thin_dielectric*
+solparser_get_material_thin_dielectric
+ (const struct solparser* parser,
+ const struct solparser_material_thin_dielectric_id thin)
+{
+ ASSERT(parser);
+ ASSERT(thin.i < darray_thin_dielectric_size_get(&parser->thin_dielectrics));
+ return darray_thin_dielectric_cdata_get(&parser->thin_dielectrics) + thin.i;
+}
+
const struct solparser_object*
solparser_get_object
(const struct solparser* parser,
diff --git a/src/parser/solparser.h b/src/parser/solparser.h
@@ -112,6 +112,11 @@ solparser_get_material_mirror
(const struct solparser* parser,
const struct solparser_material_mirror_id mirror);
+extern LOCAL_SYM const struct solparser_material_thin_dielectric*
+solparser_get_material_thin_dielectric
+ (const struct solparser* parser,
+ const struct solparser_material_thin_dielectric_id thin_dielectric);
+
extern LOCAL_SYM const struct solparser_object*
solparser_get_object
(const struct solparser* parser,
diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h
@@ -21,6 +21,7 @@
enum solparser_material_type {
SOLPARSER_MATERIAL_MATTE,
SOLPARSER_MATERIAL_MIRROR,
+ SOLPARSER_MATERIAL_THIN_DIELECTRIC,
SOLPARSER_MATERIAL_VIRTUAL
};
@@ -37,11 +38,19 @@ struct solparser_material_mirror {
struct solparser_material_mirror_id { size_t i; };
+struct solparser_material_thin_dielectric {
+ double refractive_index;
+ double thickness;
+};
+
+struct solparser_material_thin_dielectric_id { size_t i; };
+
struct solparser_material {
enum solparser_material_type type;
union {
struct solparser_material_matte_id matte;
struct solparser_material_mirror_id mirror;
+ struct solparser_material_thin_dielectric_id thin_dielectric;
} data;
};
diff --git a/src/solstice_args.c b/src/solstice_args.c
@@ -254,7 +254,9 @@ parse_rendering_option(const char* str, struct solstice_args* args)
}
} else {
fprintf(stderr, "Invalid rendering option `%s'.\n", val);
- fprintf(stderr, "Valid options are: fov=FOV:img=WIDTHxHEIGHT:pos=X,Y,Z:tgt=X,Y,Z:up=X,Y,Z\n");
+ /* TODO remove this. The man page will be sufficient */
+ fprintf(stderr,
+"Valid options are: fov=FOV:img=WIDTHxHEIGHT:pos=X,Y,Z:tgt=X,Y,Z:up=X,Y,Z\n");
res = RES_BAD_ARG;
goto error;
}