commit ab92ef6795915fde9aa882d116078642922b7425
parent c2a24f515e1b0a3b6e068927956f28d72fc141c2
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 26 Jan 2017 14:31:33 +0100
Add the virtual material descriptor to the input fileformat
Add the virtual specification and parse it.
Diffstat:
5 files changed, 66 insertions(+), 5 deletions(-)
diff --git a/cmake/parser/CMakeLists.txt b/cmake/parser/CMakeLists.txt
@@ -74,8 +74,10 @@ if(NOT NO_TEST)
${SOLPARSER_SOURCE_DIR}/yaml/test_ok_1.yaml)
add_test(test_solparser_ok_2 test_solparser
${SOLPARSER_SOURCE_DIR}/yaml/test_ok_2.yaml)
- add_test(test_solparser_ok_2 test_solparser
+ add_test(test_solparser_ok_3 test_solparser
${SOLPARSER_SOURCE_DIR}/yaml/test_ok_3.yaml)
+ add_test(test_solparser_ok_4 test_solparser
+ ${SOLPARSER_SOURCE_DIR}/yaml/test_ok_4.yaml)
add_test(test_solparser_ko test_solparser -e
${SOLPARSER_SOURCE_DIR}/yaml/test_ko_0.yaml)
diff --git a/doc/input b/doc/input
@@ -187,7 +187,7 @@
back: <material-descriptor>
<material-descriptor> ::=
- <mirror> | <matte>
+ <mirror> | <matte> | <virtual>
<mirror> ::=
mirror:
@@ -198,6 +198,9 @@
matte:
reflectivity: REAL # in [0, 1]
+<virtual> ::=
+ virtual: EMPTY-STRING
+
----------------------------------------
<entity> ::=
entity:
@@ -282,4 +285,3 @@
wavelength: REAL # in [0, INF)
data: REAL # in [0, INF)
-
diff --git a/src/parser/solparser.c b/src/parser/solparser.c
@@ -921,7 +921,7 @@ parse_material_mirror
if(mirror->type != YAML_MAPPING_NODE) {
log_err(parser, mirror,
- "expect a mapping of mirror material attributes .\n");
+ "expect a mapping of mirror material attributes.\n");
res = RES_BAD_ARG;
goto error;
}
@@ -998,6 +998,26 @@ error:
}
static res_T
+parse_material_virtual(struct solparser* parser, yaml_node_t* virtual)
+{
+ res_T res = RES_OK;
+ ASSERT(virtual);
+
+ if(virtual->type != YAML_SCALAR_NODE
+ || ((char*)virtual->data.scalar.value)[0] != '\0') {
+ log_err(parser, virtual,
+ "virtual materials can have a null scalar value only.\n");
+ res = RES_BAD_ARG;
+ goto error;
+ }
+
+exit:
+ return res;
+error:
+ goto exit;
+}
+
+static res_T
parse_material_descriptor
(struct solparser* parser,
yaml_document_t* doc,
@@ -1065,6 +1085,10 @@ 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, "virtual")) {
+ SETUP_MASK(DESCRIPTOR, "virtual");
+ mtl->type = SOLPARSER_MATERIAL_VIRTUAL;
+ res = parse_material_virtual(parser, val);
} else {
log_err(parser, key, "unknown material descriptor `%s'.\n",
key->data.scalar.value);
diff --git a/src/parser/solparser_material.h b/src/parser/solparser_material.h
@@ -20,7 +20,8 @@
enum solparser_material_type {
SOLPARSER_MATERIAL_MATTE,
- SOLPARSER_MATERIAL_MIRROR
+ SOLPARSER_MATERIAL_MIRROR,
+ SOLPARSER_MATERIAL_VIRTUAL
};
struct solparser_material_matte {
diff --git a/src/parser/yaml/test_ok_4.yaml b/src/parser/yaml/test_ok_4.yaml
@@ -0,0 +1,32 @@
+- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
+
+- material: &virtual
+ ? virtual
+
+- entity:
+ name: "entity"
+ geometry:
+ - material: *virtual
+ sphere: { radius: 1 }
+---
+- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
+- entity:
+ name: "entity"
+ geometry:
+ - material: { virtual: "" }
+ sphere: { radius: 1 }
+---
+- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
+- entity:
+ name: "entity"
+ geometry:
+ - material: { virtual: }
+ sphere: { radius: 1 }
+---
+- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
+- entity:
+ name: "entity"
+ geometry:
+ - material: { ?virtual }
+ sphere: { radius: 1 }
+