commit 491e8ffbfec89d039acaaf8a38fdee407b246cfc
parent 5adce6172f84fad272b8d70252af2857862d03cd
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 26 Jan 2017 16:02:17 +0100
Merge remote-tracking branch 'origin/master'
Diffstat:
15 files changed, 161 insertions(+), 8 deletions(-)
diff --git a/doc/input b/doc/input
@@ -27,6 +27,7 @@
# Create the solar factory
- entity:
name: "entity0"
+ primary: 0
transform: { rotation: [0, 90, 0] }
anchors:
- name: "anchor0"
@@ -42,6 +43,7 @@
- template: &composition
name: "composition"
+ primary: 1
transform: { translation: [1, 2, 3 ] }
geometry:
- cylinder: { height: 5, radius: 0.5 }
@@ -60,16 +62,19 @@
- entity:
name: "entity2"
+ primary: 0
transform: { translation: [4, 5, 6] }
children: [ *composition ]
- entity:
name: "entity3"
+ primary: 0
transform: { translation: [7, 8, 9] }
children: [ *composition ]
- entity:
name: "entity4"
+ primary: 1
transform: { translation: [10, 11, 12] }
children: [ *composition ]
@@ -114,7 +119,6 @@
| position: <real3>
| <sun>
-
----------------------------------------
<shape> ::=
<cuboid>
@@ -212,11 +216,15 @@
<entity-data> ::=
name: STRING
-[ <geometry> | <pivot> ]
+[ <geometry-data> | <pivot> ]
[ <anchors> ]
[ <transform> ]
[ <children> ]
+<geometry-data> ::=
+ primary: INTEGER # in [0, 1]
+ <geometry>
+
<children> ::=
children:
- <entity-data>
diff --git a/src/parser/solparser.c b/src/parser/solparser.c
@@ -2450,7 +2450,7 @@ parse_entity
struct htable_str2sols* htable,
struct solparser_entity_id* out_isolent)
{
- enum { ANCHORS, CHILDREN, DATA, NAME, TRANSFORM };
+ enum { ANCHORS, CHILDREN, DATA, NAME, TRANSFORM, PRIMARY };
struct solparser_entity solent;
struct solparser_entity* psolent;
const size_t *pisolent;
@@ -2531,7 +2531,13 @@ parse_entity
SETUP_MASK(TRANSFORM, "transform");
res = parse_transform
(parser, doc, val, solent.translation, solent.rotation);
- } else {
+ } else if (!strcmp((char*) key->data.scalar.value, "primary")) {
+ long tmp;
+ SETUP_MASK(PRIMARY, "primary");
+ res = parse_integer(parser, val, 0, 1, &tmp);
+ solent.primary = (int)tmp;
+ }
+ else {
log_err(parser, key, "unknown entity parameter `%s'.\n",
key->data.scalar.value);
res = RES_BAD_ARG;
@@ -2554,8 +2560,22 @@ parse_entity
res = RES_BAD_ARG; \
goto error; \
} (void)0
+ #define CHECK_NOPARAM(Flag, Name) \
+ if(mask & BIT(Flag)) { \
+ log_err(parser, entity, \
+ "the entity "Name" is invalid in this context.\n"); \
+ res = RES_BAD_ARG; \
+ goto error; \
+ } (void) 0
CHECK_PARAM(NAME, "name");
+ if (solent.type == SOLPARSER_ENTITY_GEOMETRY) {
+ CHECK_PARAM(PRIMARY, "primary");
+ }
+ else {
+ CHECK_NOPARAM(PRIMARY, "primary");
+ }
#undef CHECK_PARAM
+ #undef CHECK_NOPARAM
psolent = darray_entity_data_get(&parser->entities) + isolent;
res = solparser_entity_copy_and_clear(psolent, &solent);
diff --git a/src/parser/solparser_entity.h b/src/parser/solparser_entity.h
@@ -61,6 +61,8 @@ struct solparser_entity {
struct str name;
+ int primary;
+
enum solparser_entity_type type;
union {
struct solparser_geometry_id geometry;
@@ -84,6 +86,7 @@ solparser_entity_init
entity->type = SOLPARSER_ENTITY_GEOMETRY;
entity->data.geometry.i = SIZE_MAX;
str_init(allocator, &entity->name);
+ entity->primary = 2;
htable_str2sols_init(allocator, &entity->str2anchors);
htable_str2sols_init(allocator, &entity->str2children);
darray_anchor_id_init(allocator, &entity->anchors);
@@ -112,6 +115,7 @@ solparser_entity_copy
dst->type = src->type;
dst->data = src->data;
res = str_copy(&dst->name, &src->name);
+ dst->primary = src->primary;
if(res != RES_OK) return res;
res = htable_str2sols_copy(&dst->str2anchors, &src->str2anchors);
if(res != RES_OK) return res;
@@ -135,6 +139,7 @@ solparser_entity_copy_and_release
dst->type = src->type;
dst->data = src->data;
res = str_copy_and_release(&dst->name, &src->name);
+ dst->primary = src->primary;
if(res != RES_OK) return res;
res = htable_str2sols_copy_and_release(&dst->str2anchors, &src->str2anchors);
if(res != RES_OK) return res;
@@ -158,6 +163,7 @@ solparser_entity_copy_and_clear
dst->type = src->type;
dst->data = src->data;
res = str_copy_and_clear(&dst->name, &src->name);
+ dst->primary = src->primary;
if(res != RES_OK) return res;
res = htable_str2sols_copy_and_clear(&dst->str2anchors, &src->str2anchors);
if(res != RES_OK) return res;
diff --git a/src/parser/test_solparser2.c b/src/parser/test_solparser2.c
@@ -57,19 +57,23 @@ main(int argc, char** argv)
fprintf(stream, " material: { matte: { reflectivity: 1 } }\n");
fprintf(stream, "- entity:\n");
fprintf(stream, " name: lvl 0\n");
+ fprintf(stream, " primary: 0\n");
fprintf(stream, " geometry: *sphere\n");
fprintf(stream, " transform: { translation: [1,2,3], rotation: [4,5,6]}\n");
fprintf(stream, " children:\n");
fprintf(stream, " - name: lvl1a\n");
+ fprintf(stream, " primary: 1\n");
fprintf(stream, " geometry: \n");
fprintf(stream, " - sphere: {radius: 2}\n");
fprintf(stream, " material:\n");
fprintf(stream, " mirror: { reflectivity: 0.9, roughness: 0.1 }\n");
fprintf(stream, " - name: lvl1b\n");
+ fprintf(stream, " primary: 0\n");
fprintf(stream, " geometry: *sphere\n");
fprintf(stream, " transform: { rotation: [3.14, 0, -1] }\n");
fprintf(stream, " children:\n");
fprintf(stream, " - name: lvl2\n");
+ fprintf(stream, " primary: 0\n");
fprintf(stream, " geometry: *sphere\n");
fprintf(stream, "- sun:\n");
fprintf(stream, " dni: 1\n");
@@ -142,6 +146,7 @@ main(int argc, char** argv)
CHECK(strcmp("lvl1a", str_cget(&entity1a->name)), 0);
CHECK(solparser_entity_get_children_count(entity1a), 0);
CHECK(entity1a->type, SOLPARSER_ENTITY_GEOMETRY);
+ CHECK(entity1a->primary, 1);
NCHECK(entity1a->data.geometry.i, geom_id.i);
geom = solparser_get_geometry(parser, entity1a->data.geometry);
CHECK(geom == geoms[0] || geom == geoms[1], 1);
@@ -170,6 +175,7 @@ main(int argc, char** argv)
CHECK(strcmp("lvl1b", str_cget(&entity1b->name)), 0);
CHECK(solparser_entity_get_children_count(entity1b), 1);
CHECK(entity1b->type, SOLPARSER_ENTITY_GEOMETRY);
+ CHECK(entity1b->primary, 0);
CHECK(entity1b->data.geometry.i, geom_id.i);
entity_id = solparser_entity_get_child(entity1b, 0);
diff --git a/src/parser/test_solparser3.c b/src/parser/test_solparser3.c
@@ -27,6 +27,7 @@ static const char* input[] = {
" spectrum: [{wavelength: 1, data: 1}]\n",
"- entity:\n",
" name: entity0\n",
+ " primary: 0\n",
" geometry: *cylinder\n",
" anchors:\n",
" - name: anchor0\n",
@@ -35,8 +36,10 @@ static const char* input[] = {
" position: [4, 5, 6]\n",
" children:\n",
" - name: entity0a\n",
+ " primary: 1\n",
" geometry: *cylinder\n",
" - name: entity0b\n",
+ " primary: 1\n",
" geometry: *cylinder\n",
" anchors:\n\n",
" - name: anchor0\n",
diff --git a/src/parser/test_solparser4.c b/src/parser/test_solparser4.c
@@ -29,6 +29,7 @@ static const char* input[] = {
" material: *lambertian\n",
"- template: &template\n",
" name: template0\n",
+ " primary: 1\n",
" geometry: *cuboid\n",
"- entity:\n",
" name: entity0\n",
diff --git a/src/parser/test_solparser5.c b/src/parser/test_solparser5.c
@@ -26,6 +26,7 @@ static const char* input[] = {
" material: { matte: { reflectivity: 1 } }\n",
"- template: &template\n",
" name: lvl1\n",
+ " primary: 1\n",
" geometry: *cuboid\n",
" anchors:\n",
" - name: anchor0\n",
diff --git a/src/parser/yaml/test_ko_0.yaml b/src/parser/yaml/test_ko_0.yaml
@@ -898,13 +898,18 @@
# <entity> ::=
# entity:
# <entity-data>
-##
+#
# <entity-data> ::=
# name: STRING
-# [ <geometry> | <pivot> ]
+# [ <geometry-data> | <pivot> ]
# [ <anchors> ]
# [ <transform> ]
# [ <children> ]
+#
+# <geometry-data> ::=
+# primary: INTEGER # in [0, 1]
+# <geometry>
+#
# missing entity definition
- entity:
@@ -915,6 +920,9 @@
# missing name value
- entity: { name: }
---
+# missing primary value
+- entity: { primary: }
+---
# missing geometry value
- entity: { geometry: }
---
@@ -930,15 +938,40 @@
# missing children value
- entity: { children: }
---
+# primary should be a number
+- entity: { primary: "dummy" }
+---
+# -1 invalid
+- entity: { primary: -1 }
+---
+# 2 invalid
+- entity: { primary: 2 }
+---
# missing entity name
- entity:
+ primary: 1
geometry:
- stl: { path: "file" }
material: { matte: { reflectivity: 1 } }
---
+# missing entity primary
+- entity:
+ name: "entity"
+ geometry:
+ - stl: { path: "file" }
+ material: { matte: { reflectivity: 1 } }
+---
+# primary invalid in this context
+- entity:
+ name: "entity"
+ primary: 1
+---
# 2x name
- entity: { name: "ent", name: "ent" }
---
+# 2x primary
+- entity: { primary: 1, primary: 1 }
+---
# cannot define both geometry and pivot
- sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
@@ -972,11 +1005,13 @@
# 2 entities with the same name
- entity:
name: "foo"
+ primary: 1
geometry:
- stl: { path: "file" }
material: { matte: { reflectivity: 1 } }
- entity:
name: "foo"
+ primary: 1
geometry:
- stl: { path: "file" }
material: { matte: { reflectivity: 1 } }
@@ -988,10 +1023,15 @@
#
# <entity-data> ::=
# name: STRING
-# [ <geometry> | <pivot> ]
+# [ <geometry-data> | <pivot> ]
# [ <anchors> ]
# [ <transform> ]
# [ <children> ]
+#
+# <geometry-data> ::=
+# primary: INTEGER # in [0, 1]
+# <geometry>
+#
# missing template definition
- template: &temp
@@ -1005,6 +1045,10 @@
- template: &temp { name: }
- entity: *temp
---
+# missing primary value
+- template: &temp { primary: }
+- entity: *temp
+---
# missing geometry value
- template: &temp { geometry: }
- entity: *temp
@@ -1025,6 +1069,17 @@
- template: &temp { children: }
- entity: *temp
---
+# primary should be a number
+- template: &temp { primary: "dummy" }
+---
+# -1 invalid
+- template: &temp { primary: -1 }
+- entity: *temp
+---
+# 2 invalid
+- template: &temp { primary: 2 }
+- entity: *temp
+---
# missing template name
- template: &temp
geometry:
@@ -1032,10 +1087,28 @@
material: { matte: { reflectivity: 1 } }
- entity: *temp
---
+# missing template primary
+- template: &temp
+ name: "entity"
+ geometry:
+ - stl: { path: "file" }
+ material: { matte: { reflectivity: 1 } }
+- entity: *temp
+---
+# primary invalid in this context
+- template: &temp
+ name: "entity"
+ primary: 1
+- entity: *temp
+---
# 2x name
- template: &temp { name: "ent", name: "ent" }
- entity: *temp
---
+# 2x primary
+- template: &temp { primary: 1, primary: 1 }
+- entity: *temp
+---
# cannot define both geometry and pivot
- sun: &sun { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- template: &temp
@@ -1073,11 +1146,13 @@
# 2 templates with the same name
- template: &temp1
name: "foo"
+ primary: 1
geometry:
- stl: { path: "file" }
material: { matte: { reflectivity: 1 } }
- template: &temp2
name: "foo"
+ primary: 1
geometry:
- stl: { path: "file" }
material: { matte: { reflectivity: 1 } }
@@ -1188,6 +1263,7 @@
# missing sun in document
- entity:
name: foo
+ primary: 1
geometry:
- cuboid: { size: [1, 2, 3] }
material: { matte: { reflectivity: 1 } }
diff --git a/src/parser/yaml/test_ok_0.yaml b/src/parser/yaml/test_ok_0.yaml
@@ -1,6 +1,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: "entity"
+ primary: 0
transform:
rotation: [ 0, 1, 2 ]
translation: [ -4, 5.2, -6.5 ]
@@ -12,6 +13,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: "entity"
+ primary: 0
transform: { translation: [ 1, 2, 0 ] }
geometry:
- transform:
@@ -23,6 +25,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: "entity"
+ primary: 0
geometry:
- material: { matte: { reflectivity: 1 } }
cuboid: { size: [1, 2, 3] }
@@ -33,6 +36,7 @@
- entity:
name: "entity"
+ primary: 0
geometry:
- material: *lambertian
cuboid: { size: [1, 2, 3] }
@@ -43,13 +47,14 @@
- geometry: &cuboid
- cuboid: { size: [1, 2, 3] }
material: { front: *front, back: *back }
-- entity: { name: "hop", geometry: *cuboid }
+- entity: { name: "hop", primary: 1, geometry: *cuboid }
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
---
- material: &lambertian { matte: { reflectivity: 1 } }
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: hop
+ primary: 0
geometry: &cuboid
- cuboid: { size: [1, 2, 3] }
material:
diff --git a/src/parser/yaml/test_ok_1.yaml b/src/parser/yaml/test_ok_1.yaml
@@ -14,6 +14,7 @@
- entity:
name: "hop"
+ primary: 0
geometry: *cylinder
transform:
translation: [0, 1, 2]
@@ -34,11 +35,13 @@
- entity:
name: "entity"
+ primary: 0
geometry: *cylinder
---
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: entity
+ primary: 1
geometry:
- material: { mirror: { reflectivity: 0.314, roughness: 0.5 } }
cylinder: { height: 10.12, radius: 0.32 }
@@ -46,6 +49,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: entity
+ primary: 1
geometry:
- material: { mirror: { reflectivity: 0, roughness: 0.5 } }
cylinder: { height: 1, radius: 1 }
diff --git a/src/parser/yaml/test_ok_2.yaml b/src/parser/yaml/test_ok_2.yaml
@@ -1,6 +1,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: 1
+ primary: 0
geometry:
- material: { matte: { reflectivity: 1 } }
stl: { path: path toward }
@@ -8,6 +9,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: 1a
+ primary: 1
geometry:
- material: { matte: { reflectivity: 1 } }
obj: { path: "my_path" }
@@ -15,6 +17,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: test
+ primary: 0
geometry:
- material: { matte: { reflectivity: 1 } }
obj: { path: "path/path/path" }
@@ -23,6 +26,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: test
+ primary: 0
geometry:
- material: { matte: { reflectivity: 1 } }
obj: { path: "path/path/path" }
@@ -31,6 +35,7 @@
- sun: { dni: 1, spectrum: [{wavelength: 1, data: 1}] }
- entity:
name: hop
+ primary: 1
geometry:
- material: { matte: { reflectivity: 1 } }
stl: { path: "path/path/path" }
diff --git a/src/parser/yaml/test_ok_3.yaml b/src/parser/yaml/test_ok_3.yaml
@@ -13,9 +13,11 @@
- template: &template
name: "template"
+ primary: 0
geometry: *geom
children:
- name: "child0"
+ primary: 0
geometry: *geom
transform: { rotation: [1, 2, 3] }
diff --git a/src/solstice_c.h b/src/solstice_c.h
@@ -106,6 +106,11 @@ solstice_node_ref_put
(struct solstice_node* node);
extern LOCAL_SYM res_T
+solstice_node_geometry_set_primary
+ (struct solstice_node* node,
+ const int is_primary);
+
+extern LOCAL_SYM res_T
solstice_node_geometry_set_receiver
(struct solstice_node* node,
const int mask); /* Combination of ssol_side_flag */
diff --git a/src/solstice_entity.c b/src/solstice_entity.c
@@ -176,6 +176,8 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity)
break;
case SOLPARSER_ENTITY_GEOMETRY:
node = create_geometry_node(solstice, entity);
+ res = solstice_node_geometry_set_primary(node, entity->primary);
+ if (res != RES_OK) goto error;
break;
case SOLPARSER_ENTITY_PIVOT:
node = create_pivot_node(solstice, entity);
diff --git a/src/solstice_node.c b/src/solstice_node.c
@@ -222,6 +222,15 @@ solstice_node_ref_put(struct solstice_node* node)
}
res_T
+solstice_node_geometry_set_primary
+ (struct solstice_node* node,
+ const int is_primary)
+{
+ ASSERT(node && (!is_primary || node->type == SOLSTICE_NODE_GEOMETRY));
+ return ssol_instance_sample(node->instance, is_primary);
+}
+
+res_T
solstice_node_geometry_set_receiver(struct solstice_node* node, const int mask)
{
ASSERT(node && node->type == SOLSTICE_NODE_GEOMETRY);