commit 12b8c7329e89f5d0d0c61780f7298d5edc4894e3
parent 4a4f136c620e500add4de047afc2c9d1233ceecb
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Thu, 2 Feb 2017 09:42:43 +0100
Merge remote-tracking branch 'origin/master'
Diffstat:
9 files changed, 234 insertions(+), 193 deletions(-)
diff --git a/doc/input b/doc/input
@@ -60,9 +60,7 @@
children:
- name: "child 1"
transform: { rotation: [0, 0, 0] }
- pivot:
- point: [0, 0, 0]
- normal: [0, 1, 0]
+ x_pivot:
target: { position: [0, 0, 0] }
- entity:
name: "entity2"
@@ -107,16 +105,15 @@
# <material>
# [ <transform> ]
#
-# <pivot> ::=
-# pivot:
-# point: <real3>
-# normal: <real3>
+# <x_pivot> ::=
+# x_pivot:
+# [ ref_point: <real3>. Default 0,0,0 ]
# <target>
#
-# <pivot2> ::=
-# pivot2:
-# spacing: REAL # in [0, INF)
-# ref_point: <real3>
+# <zx_pivot> ::=
+# zx_pivot:
+# [ spacing: REAL # in [0, INF). Default 0 ]
+# [ ref_point: <real3>. Default 0,0,0 ]
# <target>
#
# <target> ::=
@@ -223,7 +220,7 @@
#
# <entity-data> ::=
# name: STRING
-# [ <geometry-data> | <pivot> | <pivot2> ]
+# [ <geometry-data> | <x_pivot> | <zx_pivot> ]
# [ <anchors> ]
# [ <transform> ]
# [ <children> ]
diff --git a/src/parser/solparser.c b/src/parser/solparser.c
@@ -145,16 +145,16 @@ struct target_alias {
#define DARRAY_FUNCTOR_COPY_AND_RELEASE solparser_anchor_copy_and_release
#include <rsys/dynamic_array.h>
-/* Declare the array of pivots */
-#define DARRAY_NAME pivot
-#define DARRAY_DATA struct solparser_pivot
-#define DARRAY_FUNCTOR_INIT solparser_pivot_init
+/* Declare the array of x_pivots */
+#define DARRAY_NAME x_pivot
+#define DARRAY_DATA struct solparser_x_pivot
+#define DARRAY_FUNCTOR_INIT solparser_x_pivot_init
#include <rsys/dynamic_array.h>
-/* Declare the array of pivot2s */
-#define DARRAY_NAME pivot2
-#define DARRAY_DATA struct solparser_pivot2
-#define DARRAY_FUNCTOR_INIT solparser_pivot2_init
+/* Declare the array of xz_pivots */
+#define DARRAY_NAME xz_pivot
+#define DARRAY_DATA struct solparser_xz_pivot
+#define DARRAY_FUNCTOR_INIT solparser_xz_pivot_init
#include <rsys/dynamic_array.h>
/* Declare the hash table that maps the address of a YAML node to the id of its
@@ -206,8 +206,8 @@ struct solparser {
/* Miscellaneous */
struct darray_anchor anchors;
- struct darray_pivot pivots;
- struct darray_pivot2 pivot2s;
+ struct darray_x_pivot x_pivots;
+ struct darray_xz_pivot xz_pivots;
ref_T ref;
struct mem_allocator* allocator;
@@ -229,17 +229,17 @@ parse_geometry
struct solparser_geometry_id* solgeom);
static res_T
-parse_pivot
+parse_x_pivot
(struct solparser* parser,
yaml_document_t* doc,
- const yaml_node_t* pivot,
+ const yaml_node_t* x_pivot,
struct solparser_pivot_id* out_isolpivot);
static res_T
-parse_pivot2
+parse_xz_pivot
(struct solparser* parser,
yaml_document_t* doc,
- const yaml_node_t* pivot2,
+ const yaml_node_t* xz_pivot,
struct solparser_pivot_id* out_isolpivot);
static res_T
@@ -314,7 +314,7 @@ flush_deferred_target_aliases
n = darray_tgtalias_size_get(&parser->tgtaliases);
FOR_EACH(i, 0, n) {
const struct solparser_anchor* anchor;
- struct solparser_pivot* pivot;
+ struct solparser_x_pivot* x_pivot;
const struct target_alias* tgt;
size_t ianchor;
size_t len;
@@ -344,11 +344,11 @@ flush_deferred_target_aliases
}
/* Define the targeted anchor of the pivot */
- pivot = darray_pivot_data_get(&parser->pivots) + tgt->pivot.i;
- ASSERT(pivot->target.type == SOLPARSER_TARGET_ANCHOR);
+ x_pivot = darray_x_pivot_data_get(&parser->x_pivots) + tgt->pivot.i;
+ ASSERT(x_pivot->target.type == SOLPARSER_TARGET_ANCHOR);
ianchor = (size_t)(anchor - darray_anchor_cdata_get(&parser->anchors));
ASSERT(ianchor < darray_anchor_size_get(&parser->anchors));
- pivot->target.data.anchor.i = ianchor;
+ x_pivot->target.data.anchor.i = ianchor;
}
darray_tgtalias_clear(&parser->tgtaliases);
@@ -403,8 +403,8 @@ parser_clear(struct solparser* parser)
/* Miscellaneous */
darray_anchor_clear(&parser->anchors);
- darray_pivot_clear(&parser->pivots);
- darray_pivot2_clear(&parser->pivot2s);
+ darray_x_pivot_clear(&parser->x_pivots);
+ darray_xz_pivot_clear(&parser->xz_pivots);
}
static void
@@ -453,8 +453,8 @@ parser_release(ref_T* ref)
/* Miscellaneous */
darray_anchor_release(&parser->anchors);
- darray_pivot_release(&parser->pivots);
- darray_pivot2_release(&parser->pivot2s);
+ darray_x_pivot_release(&parser->x_pivots);
+ darray_xz_pivot_release(&parser->xz_pivots);
MEM_RM(parser->allocator, parser);
}
@@ -1602,6 +1602,13 @@ parse_cylinder
CHECK_PARAM(RADIUS, "radius");
#undef CHECK_PARAM
+ #define DEFAULT_PARAM(Flag, Ptr, Value) \
+ if(!(mask & BIT(Flag))) { \
+ *(Ptr) = Value; \
+ } (void)0
+ DEFAULT_PARAM(SLICES, &shape->nslices, 16);
+ #undef DEFAULT_PARAM
+
exit:
out_ishape->i = ishape;
return res;
@@ -1955,11 +1962,22 @@ parse_sphere
#undef SETUP_MASK
}
- if(!(mask & BIT(RADIUS))) {
- log_err(parser, sphere, "the sphere radius is missing.\n");
- res = RES_BAD_ARG;
- goto error;
- }
+ #define CHECK_PARAM(Flag, Name) \
+ if(!(mask & BIT(Flag))) { \
+ log_err(parser, sphere, \
+ "the sphere parameter `"Name"' is missing.\n"); \
+ res = RES_BAD_ARG; \
+ goto error; \
+ } (void)0
+ CHECK_PARAM(RADIUS, "radius");
+ #undef CHECK_PARAM
+
+ #define DEFAULT_PARAM(Flag, Ptr, Value) \
+ if(!(mask & BIT(Flag))) { \
+ *(Ptr) = Value; \
+ } (void)0
+ DEFAULT_PARAM(SLICES, &shape->nslices, 16);
+ #undef DEFAULT_PARAM
exit:
out_ishape->i = ishape;
@@ -2539,14 +2557,14 @@ parse_entity
} else if(!strcmp((char*)key->data.scalar.value, "name")) {
SETUP_MASK(NAME, "name");
res = parse_identifier_string(parser, val, &solent.name);
- } else if(!strcmp((char*)key->data.scalar.value, "pivot")) {
+ } else if(!strcmp((char*)key->data.scalar.value, "x_pivot")) {
SETUP_MASK(DATA, "data");
- solent.type = SOLPARSER_ENTITY_PIVOT;
- res = parse_pivot(parser, doc, val, &solent.data.pivot);
- } else if(!strcmp((char*) key->data.scalar.value, "pivot2")) {
+ solent.type = SOLPARSER_ENTITY_X_PIVOT;
+ res = parse_x_pivot(parser, doc, val, &solent.data.x_pivot);
+ } else if(!strcmp((char*) key->data.scalar.value, "xz_pivot")) {
SETUP_MASK(DATA, "data");
- solent.type = SOLPARSER_ENTITY_PIVOT2;
- res = parse_pivot2(parser, doc, val, &solent.data.pivot2);
+ solent.type = SOLPARSER_ENTITY_XZ_PIVOT;
+ res = parse_xz_pivot(parser, doc, val, &solent.data.xz_pivot);
} else if(!strcmp((char*)key->data.scalar.value, "transform")) {
SETUP_MASK(TRANSFORM, "transform");
res = parse_transform
@@ -2761,70 +2779,67 @@ error:
}
static res_T
-parse_pivot
+parse_x_pivot
(struct solparser* parser,
yaml_document_t* doc,
- const yaml_node_t* pivot,
+ const yaml_node_t* x_pivot,
struct solparser_pivot_id* out_isolpivot)
{
- enum { NORMAL, POINT, TARGET };
- struct solparser_pivot* solpivot = NULL;
+ enum { REF_POINT, TARGET };
+ struct solparser_x_pivot* solxpivot = NULL;
size_t isolpivot = SIZE_MAX;
int mask = 0; /* Register the parsed attributes */
intptr_t i, n;
res_T res = RES_OK;
- ASSERT(doc && pivot && out_isolpivot);
+ ASSERT(doc && x_pivot && out_isolpivot);
- if(pivot->type != YAML_MAPPING_NODE) {
- log_err(parser, pivot, "expect a pivot definition.\n");
+ if(x_pivot->type != YAML_MAPPING_NODE) {
+ log_err(parser, x_pivot, "expect a x_pivot definition.\n");
res = RES_BAD_ARG;
goto error;
}
/* Allocate the solstice pivot */
- isolpivot = darray_pivot_size_get(&parser->pivots);
- res = darray_pivot_resize(&parser->pivots, isolpivot + 1);
+ isolpivot = darray_x_pivot_size_get(&parser->x_pivots);
+ res = darray_x_pivot_resize(&parser->x_pivots, isolpivot + 1);
if(res != RES_OK) {
- log_err(parser, pivot, "could not allocate the pivot.\n");
+ log_err(parser, x_pivot, "could not allocate the x_pivot.\n");
res = RES_BAD_ARG;
goto error;
}
- solpivot = darray_pivot_data_get(&parser->pivots) + isolpivot;
+ solxpivot = darray_x_pivot_data_get(&parser->x_pivots) + isolpivot;
- n = pivot->data.mapping.pairs.top - pivot->data.mapping.pairs.start;
+ n = x_pivot->data.mapping.pairs.top - x_pivot->data.mapping.pairs.start;
FOR_EACH(i, 0, n) {
yaml_node_t* key;
yaml_node_t* val;
- key = yaml_document_get_node(doc, pivot->data.mapping.pairs.start[i].key);
- val = yaml_document_get_node(doc, pivot->data.mapping.pairs.start[i].value);
+ key = yaml_document_get_node(doc, x_pivot->data.mapping.pairs.start[i].key);
+ val = yaml_document_get_node(doc, x_pivot->data.mapping.pairs.start[i].value);
if(key->type != YAML_SCALAR_NODE) {
- log_err(parser, key, "expect pivot parameters.\n");
+ log_err(parser, key, "expect x_pivot parameters.\n");
res = RES_BAD_ARG;
goto error;
}
#define SETUP_MASK(Flag, Name) { \
if(mask & BIT(Flag)) { \
log_err(parser, key, \
- "the pivot parameter `"Name"' is already defined.\n"); \
+ "the x_pivot parameter `"Name"' is already defined.\n"); \
res = RES_BAD_ARG; \
goto error; \
} \
mask |= BIT(Flag); \
} (void)0
- if(!strcmp((char*)key->data.scalar.value, "point")) {
- SETUP_MASK(POINT, "point");
- res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solpivot->point);
- } else if(!strcmp((char*)key->data.scalar.value, "normal")) {
- SETUP_MASK(NORMAL, "normal");
- res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solpivot->normal);
+ if(!strcmp((char*)key->data.scalar.value, "ref_point")) {
+ SETUP_MASK(REF_POINT, "point");
+ res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solxpivot->ref_point);
} else if(!strcmp((char*)key->data.scalar.value, "target")) {
struct solparser_pivot_id pivot_id;
- pivot_id.i = (size_t) (solpivot - darray_pivot_cdata_get(&parser->pivots));
+ pivot_id.i = (size_t) (solxpivot - darray_x_pivot_cdata_get(&parser->x_pivots));
SETUP_MASK(TARGET, "target");
- res = parse_target(parser, doc, val, &solpivot->target, pivot_id);
+ res = parse_target(parser, doc, val, &solxpivot->target, pivot_id);
} else {
- log_err(parser, key, "unknown pivot parameter `%s'.\n",
+ log_err(parser, key, "unknown x_pivot parameter `%s'.\n",
key->data.scalar.value);
res = RES_BAD_ARG;
goto error;
@@ -2837,73 +2852,81 @@ parse_pivot
}
#define CHECK_PARAM(Flag, Name) \
if(!(mask & BIT(Flag))) { \
- log_err(parser, pivot, "the pivot parameter `"Name"' is missing.\n"); \
+ log_err(parser, x_pivot, "the x_pivot parameter `"Name"' is missing.\n");\
res = RES_BAD_ARG; \
goto error; \
} (void)0
- CHECK_PARAM(POINT, "point");
- CHECK_PARAM(NORMAL, "normal");
CHECK_PARAM(TARGET, "target");
#undef CHECK_PARAM
+ #define DEFAULT_PARAM(Flag, Ptr, Value) \
+ if(!(mask & BIT(Flag))) { \
+ *(Ptr) = Value; \
+ } (void)0
+ DEFAULT_PARAM(REF_POINT, solxpivot->ref_point, 0);
+ DEFAULT_PARAM(REF_POINT, solxpivot->ref_point+1, 0);
+ DEFAULT_PARAM(REF_POINT, solxpivot->ref_point+2, 0);
+ #undef DEFAULT_PARAM
+
exit:
out_isolpivot->i = isolpivot;
return res;
error:
- if(solpivot) {
- darray_pivot_pop_back(&parser->pivots);
+ if(solxpivot) {
+ darray_x_pivot_pop_back(&parser->x_pivots);
isolpivot = SIZE_MAX;
}
goto exit;
}
static res_T
-parse_pivot2
+parse_xz_pivot
(struct solparser* parser,
yaml_document_t* doc,
- const yaml_node_t* pivot2,
+ const yaml_node_t* xz_pivot,
struct solparser_pivot_id* out_isolpivot)
{
enum { SPACING, REF_POINT, TARGET };
- struct solparser_pivot2* solpivot2 = NULL;
+ struct solparser_xz_pivot* solxzpivot = NULL;
size_t isolpivot = SIZE_MAX;
int mask = 0; /* Register the parsed attributes */
intptr_t i, n;
res_T res = RES_OK;
- ASSERT(doc && pivot2 && out_isolpivot);
+ ASSERT(doc && xz_pivot && out_isolpivot);
- if(pivot2->type != YAML_MAPPING_NODE) {
- log_err(parser, pivot2, "expect a pivot2 definition.\n");
+ if(xz_pivot->type != YAML_MAPPING_NODE) {
+ log_err(parser, xz_pivot, "expect a xz_pivot definition.\n");
res = RES_BAD_ARG;
goto error;
}
/* Allocate the solstice pivot */
- isolpivot = darray_pivot2_size_get(&parser->pivot2s);
- res = darray_pivot2_resize(&parser->pivot2s, isolpivot + 1);
+ isolpivot = darray_xz_pivot_size_get(&parser->xz_pivots);
+ res = darray_xz_pivot_resize(&parser->xz_pivots, isolpivot + 1);
if(res != RES_OK) {
- log_err(parser, pivot2, "could not allocate the pivot2.\n");
+ log_err(parser, xz_pivot, "could not allocate the xz_pivot.\n");
res = RES_BAD_ARG;
goto error;
}
- solpivot2 = darray_pivot2_data_get(&parser->pivot2s) + isolpivot;
+ solxzpivot = darray_xz_pivot_data_get(&parser->xz_pivots) + isolpivot;
- n = pivot2->data.mapping.pairs.top - pivot2->data.mapping.pairs.start;
+ n = xz_pivot->data.mapping.pairs.top - xz_pivot->data.mapping.pairs.start;
FOR_EACH(i, 0, n) {
yaml_node_t* key;
yaml_node_t* val;
- key = yaml_document_get_node(doc, pivot2->data.mapping.pairs.start[i].key);
- val = yaml_document_get_node(doc, pivot2->data.mapping.pairs.start[i].value);
+ key = yaml_document_get_node(doc, xz_pivot->data.mapping.pairs.start[i].key);
+ val = yaml_document_get_node(
+ doc, xz_pivot->data.mapping.pairs.start[i].value);
if(key->type != YAML_SCALAR_NODE) {
- log_err(parser, key, "expect pivot2 parameters.\n");
+ log_err(parser, key, "expect xz_pivot parameters.\n");
res = RES_BAD_ARG;
goto error;
}
#define SETUP_MASK(Flag, Name) { \
if(mask & BIT(Flag)) { \
log_err(parser, key, \
- "the pivot2 parameter `"Name"' is already defined.\n"); \
+ "the xz_pivot parameter `"Name"' is already defined.\n"); \
res = RES_BAD_ARG; \
goto error; \
} \
@@ -2911,17 +2934,19 @@ parse_pivot2
} (void)0
if(!strcmp((char*) key->data.scalar.value, "spacing")) {
SETUP_MASK(SPACING, "spacing");
- res = parse_real(parser, val, 0, DBL_MAX, &solpivot2->spacing);
+ res = parse_real(parser, val, 0, DBL_MAX, &solxzpivot->spacing);
} else if(!strcmp((char*) key->data.scalar.value, "ref_point")) {
SETUP_MASK(REF_POINT, "ref_point");
- res = parse_real3(parser, doc, val, -DBL_MAX, DBL_MAX, solpivot2->ref_point);
+ res = parse_real3(
+ 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 = (size_t) (solpivot2 - darray_pivot2_cdata_get(&parser->pivot2s));
+ pivot_id.i =
+ (size_t) (solxzpivot - darray_xz_pivot_cdata_get(&parser->xz_pivots));
SETUP_MASK(TARGET, "target");
- res = parse_target(parser, doc, val, &solpivot2->target, pivot_id);
+ res = parse_target(parser, doc, val, &solxzpivot->target, pivot_id);
} else {
- log_err(parser, key, "unknown pivot2 parameter `%s'.\n",
+ log_err(parser, key, "unknown xz_pivot parameter `%s'.\n",
key->data.scalar.value);
res = RES_BAD_ARG;
goto error;
@@ -2934,21 +2959,30 @@ parse_pivot2
}
#define CHECK_PARAM(Flag, Name) \
if(!(mask & BIT(Flag))) { \
- log_err(parser, pivot2, "the pivot2 parameter `"Name"' is missing.\n"); \
+ log_err(parser, xz_pivot, \
+ "the xz_pivot parameter `"Name"' is missing.\n"); \
res = RES_BAD_ARG; \
goto error; \
} (void)0
- CHECK_PARAM(SPACING, "spacing");
- CHECK_PARAM(REF_POINT, "ref_point");
CHECK_PARAM(TARGET, "target");
#undef CHECK_PARAM
+ #define DEFAULT_PARAM(Flag, Ptr, Value) \
+ if(!(mask & BIT(Flag))) { \
+ *(Ptr) = Value; \
+ } (void)0
+ DEFAULT_PARAM(SPACING, &solxzpivot->spacing, 0);
+ DEFAULT_PARAM(REF_POINT, solxzpivot->ref_point, 0);
+ DEFAULT_PARAM(REF_POINT, solxzpivot->ref_point+1, 0);
+ DEFAULT_PARAM(REF_POINT, solxzpivot->ref_point+2, 0);
+ #undef DEFAULT_PARAM
+
exit:
out_isolpivot->i = isolpivot;
return res;
error:
- if(solpivot2) {
- darray_pivot2_pop_back(&parser->pivot2s);
+ if(solxzpivot) {
+ darray_xz_pivot_pop_back(&parser->xz_pivots);
isolpivot = SIZE_MAX;
}
goto exit;
@@ -3324,8 +3358,8 @@ solparser_create
/* Anchors and pivot(2)s */
darray_anchor_init(mem_allocator, &parser->anchors);
- darray_pivot_init(mem_allocator, &parser->pivots);
- darray_pivot2_init(mem_allocator, &parser->pivot2s);
+ darray_x_pivot_init(mem_allocator, &parser->x_pivots);
+ darray_xz_pivot_init(mem_allocator, &parser->xz_pivots);
exit:
*out_parser = parser;
@@ -3655,22 +3689,22 @@ solparser_get_object
return darray_object_cdata_get(&parser->objects) + obj.i;
}
-const struct solparser_pivot*
-solparser_get_pivot
+const struct solparser_x_pivot*
+solparser_get_x_pivot
(const struct solparser* parser,
- const struct solparser_pivot_id pivot)
+ const struct solparser_pivot_id x_pivot)
{
- ASSERT(parser && pivot.i < darray_pivot_size_get(&parser->pivots));
- return darray_pivot_cdata_get(&parser->pivots) + pivot.i;
+ ASSERT(parser && x_pivot.i < darray_x_pivot_size_get(&parser->x_pivots));
+ return darray_x_pivot_cdata_get(&parser->x_pivots) + x_pivot.i;
}
-const struct solparser_pivot2*
-solparser_get_pivot2
+const struct solparser_xz_pivot*
+solparser_get_xz_pivot
(const struct solparser* parser,
- const struct solparser_pivot_id pivot2)
+ const struct solparser_pivot_id xz_pivot)
{
- ASSERT(parser && pivot2.i < darray_pivot2_size_get(&parser->pivot2s));
- return darray_pivot2_cdata_get(&parser->pivot2s) + pivot2.i;
+ ASSERT(parser && xz_pivot.i < darray_xz_pivot_size_get(&parser->xz_pivots));
+ return darray_xz_pivot_cdata_get(&parser->xz_pivots) + xz_pivot.i;
}
const struct solparser_shape*
diff --git a/src/parser/solparser.h b/src/parser/solparser.h
@@ -117,15 +117,15 @@ solparser_get_object
(const struct solparser* parser,
const struct solparser_object_id obj);
-extern LOCAL_SYM const struct solparser_pivot*
-solparser_get_pivot
+extern LOCAL_SYM const struct solparser_x_pivot*
+solparser_get_x_pivot
(const struct solparser* parser,
- const struct solparser_pivot_id pivot);
+ const struct solparser_pivot_id x_pivot);
-extern LOCAL_SYM const struct solparser_pivot2*
-solparser_get_pivot2
+extern LOCAL_SYM const struct solparser_xz_pivot*
+solparser_get_xz_pivot
(const struct solparser* parser,
- const struct solparser_pivot_id pivot2);
+ const struct solparser_pivot_id xz_pivot);
extern LOCAL_SYM const struct solparser_shape*
solparser_get_shape
diff --git a/src/parser/solparser_entity.h b/src/parser/solparser_entity.h
@@ -29,8 +29,8 @@
enum solparser_entity_type {
SOLPARSER_ENTITY_EMPTY,
SOLPARSER_ENTITY_GEOMETRY,
- SOLPARSER_ENTITY_PIVOT,
- SOLPARSER_ENTITY_PIVOT2
+ SOLPARSER_ENTITY_X_PIVOT,
+ SOLPARSER_ENTITY_XZ_PIVOT
};
struct solparser_entity_id { size_t i; };
@@ -67,8 +67,8 @@ struct solparser_entity {
enum solparser_entity_type type;
union {
struct solparser_geometry_id geometry;
- struct solparser_pivot_id pivot;
- struct solparser_pivot_id pivot2;
+ struct solparser_pivot_id x_pivot;
+ struct solparser_pivot_id xz_pivot;
} data;
/* Internal data. Should not be acceded directly. */
diff --git a/src/parser/solparser_pivot.h b/src/parser/solparser_pivot.h
@@ -81,41 +81,40 @@ static const struct solparser_target SOLPARSER_TARGET_NULL =
struct solparser_pivot_id { size_t i; };
-struct solparser_pivot {
- double point[3];
- double normal[3];
+struct solparser_x_pivot {
+ double ref_point[3];
struct solparser_target target;
};
-#define SOLPARSER_PIVOT_NULL__ { {0,0,0}, {0,0,0}, SOLPARSER_TARGET_NULL__ }
-static const struct solparser_pivot SOLPARSER_PIVOT_NULL =
- SOLPARSER_PIVOT_NULL__;
+#define SOLPARSER_X_PIVOT_NULL__ { {0,0,0}, SOLPARSER_TARGET_NULL__ }
+static const struct solparser_x_pivot SOLPARSER_X_PIVOT_NULL =
+ SOLPARSER_X_PIVOT_NULL__;
static INLINE void
-solparser_pivot_init
-(struct mem_allocator* allocator, struct solparser_pivot* pivot)
+solparser_x_pivot_init
+(struct mem_allocator* allocator, struct solparser_x_pivot* x_pivot)
{
(void) allocator;
- ASSERT(pivot);
- *pivot = SOLPARSER_PIVOT_NULL;
+ ASSERT(x_pivot);
+ *x_pivot = SOLPARSER_X_PIVOT_NULL;
}
-struct solparser_pivot2 {
+struct solparser_xz_pivot {
double spacing;
double ref_point[3];
struct solparser_target target;
};
-#define SOLPARSER_PIVOT2_NULL__ { 0, {0,0,0}, SOLPARSER_TARGET_NULL__ }
-static const struct solparser_pivot2 SOLPARSER_PIVOT2_NULL =
- SOLPARSER_PIVOT2_NULL__;
+#define SOLPARSER_XZ_PIVOT_NULL__ { 0, {0,0,0}, SOLPARSER_TARGET_NULL__ }
+static const struct solparser_xz_pivot SOLPARSER_XZ_PIVOT_NULL =
+ SOLPARSER_XZ_PIVOT_NULL__;
static INLINE void
-solparser_pivot2_init
- (struct mem_allocator* allocator, struct solparser_pivot2* pivot2)
+solparser_xz_pivot_init
+ (struct mem_allocator* allocator, struct solparser_xz_pivot* xz_pivot)
{
(void) allocator;
- ASSERT(pivot2);
- *pivot2 = SOLPARSER_PIVOT2_NULL;
+ ASSERT(xz_pivot);
+ *xz_pivot = SOLPARSER_XZ_PIVOT_NULL;
}
#endif /* SOLPARSER_PIVOT_H */
diff --git a/src/parser/test_solparser3.c b/src/parser/test_solparser3.c
@@ -22,6 +22,9 @@ static const char* input[] = {
"- geometry: &cylinder\n",
" - cylinder: { radius: 1, height: 10, slices: 128 }\n",
" material: *lambertian\n",
+ "- geometry: &cylinder2\n",
+ " - cylinder: { radius: 1, height: 10 }\n",
+ " material: *lambertian\n",
"- sun: \n",
" dni: 1\n",
" spectrum: [{wavelength: 1, data: 1}]\n",
@@ -37,7 +40,7 @@ static const char* input[] = {
" children:\n",
" - name: entity0a\n",
" primary: 1\n",
- " geometry: *cylinder\n",
+ " geometry: *cylinder2\n",
" - name: entity0b\n",
" primary: 1\n",
" geometry: *cylinder\n",
@@ -48,13 +51,12 @@ static const char* input[] = {
" position: [7, 8, 9]\n",
"- entity:\n",
" name: entity1\n",
- " pivot:\n",
- " point: [1, 2, 3]\n",
- " normal: [4, 5, 6]\n",
+ " x_pivot:\n",
+ " ref_point: [1, 2, 3]\n",
" target: { anchor: \"entity0.entity0b.anchor0\" }\n",
"- entity:\n",
" name: entity2\n",
- " pivot2:\n",
+ " xz_pivot:\n",
" spacing: 1\n",
" ref_point: [1, 2, 3]\n",
" target: { anchor: \"entity0.entity0b.anchor0\" }\n",
@@ -66,8 +68,8 @@ const struct solparser_anchor* entity0_anchor1;
const struct solparser_anchor* entity0_entity0b_anchor0;
const struct solparser_anchor* entity0_entity0b_entity0b;
const struct solparser_geometry* geom;
-const struct solparser_pivot* pivot;
-const struct solparser_pivot2* pivot2;
+const struct solparser_x_pivot* x_pivot;
+const struct solparser_xz_pivot* xz_pivot;
static void
check_entity0
@@ -135,10 +137,21 @@ check_entity0
entity0a = solparser_get_entity(parser, entity_id);
CHECK(strcmp(str_cget(&entity0a->name), "entity0a"), 0);
CHECK(entity0a->type, SOLPARSER_ENTITY_GEOMETRY);
- CHECK(entity0->data.geometry.i, entity0a->data.geometry.i);
+ NCHECK(entity0->data.geometry.i, entity0a->data.geometry.i);
CHECK(solparser_entity_get_anchors_count(entity0a), 0);
CHECK(solparser_entity_get_children_count(entity0a), 0);
+ geom = solparser_get_geometry(parser, entity0a->data.geometry);
+ CHECK(solparser_geometry_get_objects_count(geom), 1);
+ obj_id = solparser_geometry_get_object(geom, 0);
+ obj = solparser_get_object(parser, obj_id);
+ shape = solparser_get_shape(parser, obj->shape);
+ CHECK(shape->type, SOLPARSER_SHAPE_CYLINDER);
+ cylinder = solparser_get_shape_cylinder(parser, shape->data.cylinder);
+ CHECK(cylinder->height, 10);
+ CHECK(cylinder->radius, 1);
+ CHECK(cylinder->nslices, 16);
+
entity_id = solparser_entity_get_child(entity0, 1);
entity0b = solparser_get_entity(parser, entity_id);
CHECK(strcmp(str_cget(&entity0b->name), "entity0b"), 0);
@@ -168,14 +181,13 @@ check_entity1
NCHECK(entity1, NULL);
CHECK(strcmp(str_cget(&entity1->name), "entity1"), 0);
- CHECK(entity1->type, SOLPARSER_ENTITY_PIVOT);
+ CHECK(entity1->type, SOLPARSER_ENTITY_X_PIVOT);
CHECK(solparser_entity_get_anchors_count(entity1), 0);
CHECK(solparser_entity_get_children_count(entity1), 0);
- pivot = solparser_get_pivot(parser, entity1->data.pivot);
- CHECK(d3_eq(pivot->point, d3(tmp, 1, 2, 3)), 1);
- CHECK(d3_eq(pivot->normal, d3(tmp, 4, 5, 6)), 1);
- CHECK(pivot->target.type, SOLPARSER_TARGET_ANCHOR);
+ x_pivot = solparser_get_x_pivot(parser, entity1->data.x_pivot);
+ CHECK(d3_eq(x_pivot->ref_point, d3(tmp, 1, 2, 3)), 1);
+ CHECK(x_pivot->target.type, SOLPARSER_TARGET_ANCHOR);
}
static void
@@ -188,14 +200,14 @@ check_entity2
NCHECK(entity2, NULL);
CHECK(strcmp(str_cget(&entity2->name), "entity2"), 0);
- CHECK(entity2->type, SOLPARSER_ENTITY_PIVOT2);
+ CHECK(entity2->type, SOLPARSER_ENTITY_XZ_PIVOT);
CHECK(solparser_entity_get_anchors_count(entity2), 0);
CHECK(solparser_entity_get_children_count(entity2), 0);
- pivot2 = solparser_get_pivot2(parser, entity2->data.pivot2);
- CHECK(pivot2->spacing, 1);
- CHECK(d3_eq(pivot2->ref_point, d3(tmp, 1, 2, 3)), 1);
- CHECK(pivot2->target.type, SOLPARSER_TARGET_ANCHOR);
+ xz_pivot = solparser_get_xz_pivot(parser, entity2->data.xz_pivot);
+ CHECK(xz_pivot->spacing, 1);
+ CHECK(d3_eq(xz_pivot->ref_point, d3(tmp, 1, 2, 3)), 1);
+ CHECK(xz_pivot->target.type, SOLPARSER_TARGET_ANCHOR);
}
int
@@ -251,7 +263,7 @@ main(int argc, char** argv)
solparser_entity_iterator_next(&it);
}
- anchor = solparser_get_anchor(parser, pivot->target.data.anchor);
+ anchor = solparser_get_anchor(parser, x_pivot->target.data.anchor);
CHECK(anchor, entity0_entity0b_anchor0);
anchor = solparser_find_anchor(parser, "entity0");
diff --git a/src/parser/test_solparser5.c b/src/parser/test_solparser5.c
@@ -33,9 +33,8 @@ static const char* input[] = {
" position: [1, 2, 3]\n",
" children:\n",
" - name: lvl2\n",
- " pivot:\n",
- " point: [1, 2, 3]\n",
- " normal: [4, 5, 6]\n",
+ " x_pivot:\n",
+ " ref_point: [1, 2, 3]\n",
" target: { anchor: self.lvl1.anchor0 }\n",
"- entity:\n",
" name: entity0\n",
@@ -50,7 +49,7 @@ static void
check_entity(struct solparser* parser, const struct solparser_entity* entity)
{
const struct solparser_anchor* anchor;
- const struct solparser_pivot* pivot;
+ const struct solparser_x_pivot* x_pivot;
struct solparser_entity_id entity_id;
double tmp[3];
@@ -66,14 +65,13 @@ check_entity(struct solparser* parser, const struct solparser_entity* entity)
entity_id = solparser_entity_get_child(entity, 0);
entity = solparser_get_entity(parser, entity_id);
CHECK(strcmp(str_cget(&entity->name), "lvl2"), 0);
- CHECK(entity->type, SOLPARSER_ENTITY_PIVOT);
+ CHECK(entity->type, SOLPARSER_ENTITY_X_PIVOT);
- pivot = solparser_get_pivot(parser, entity->data.pivot);
- CHECK(d3_eq(pivot->point, d3(tmp, 1, 2, 3)), 1);
- CHECK(d3_eq(pivot->normal, d3(tmp, 4, 5, 6)), 1);
- CHECK(pivot->target.type, SOLPARSER_TARGET_ANCHOR);
+ x_pivot = solparser_get_x_pivot(parser, entity->data.x_pivot);
+ CHECK(d3_eq(x_pivot->ref_point, d3(tmp, 1, 2, 3)), 1);
+ CHECK(x_pivot->target.type, SOLPARSER_TARGET_ANCHOR);
- anchor = solparser_get_anchor(parser, pivot->target.data.anchor);
+ anchor = solparser_get_anchor(parser, x_pivot->target.data.anchor);
CHECK(strcmp(str_cget(&anchor->name), "anchor0"), 0);
CHECK(d3_eq(anchor->position, d3(tmp, 1, 2, 3)), 1);
}
diff --git a/src/solstice_args.c b/src/solstice_args.c
@@ -44,14 +44,14 @@ print_help(const char* program)
printf(
" -D <dirs> list of sun directions.\n");
printf(
-" -H output the per receiver hit data.\n");
+" -H output hit-on-receiver data (binary format).\n");
printf(
" -h display this help and exit.\n");
printf(
" -n REALISATIONS number of realisations. Default is %lu.\n",
SOLSTICE_ARGS_DEFAULT.nrealisations);
printf(
-" -o write results to OUTPUT. If not define, write results to\n"
+" -o OUTPUT write results to OUTPUT. If not defined, write results to\n"
" standard output.\n");
printf(
" -q do not print the helper message when no FILE is submitted.\n");
diff --git a/src/solstice_entity.c b/src/solstice_entity.c
@@ -98,39 +98,40 @@ error:
}
static struct solstice_node*
-create_pivot_node
+create_x_pivot_node
(struct solstice* solstice,
const struct solparser_entity* entity)
{
+ double n[3];
struct solstice_node* node = NULL;
struct solstice_node* target = NULL;
- const struct solparser_pivot* parser_pivot = NULL;
+ const struct solparser_x_pivot* parser_x_pivot = NULL;
struct sanim_pivot anim_pivot = SANIM_PIVOT_NULL;
struct sanim_tracking anim_tracking = SANIM_TRACKING_NULL;
res_T res = RES_OK;
ASSERT(solstice && entity);
- parser_pivot = solparser_get_pivot(solstice->parser, entity->data.pivot);
+ parser_x_pivot = solparser_get_x_pivot(solstice->parser, entity->data.x_pivot);
anim_pivot.type = PIVOT_SINGLE_AXIS;
- d3_set(anim_pivot.data.pivot1.ref_normal, parser_pivot->normal);
- d3_set(anim_pivot.data.pivot1.ref_point, parser_pivot->point);
+ d3_set(anim_pivot.data.pivot1.ref_normal, d3(n, 0, 0, 1));
+ d3_set(anim_pivot.data.pivot1.ref_point, parser_x_pivot->ref_point);
/* Setup the tracking descriptor */
- switch (parser_pivot->target.type) {
+ switch (parser_x_pivot->target.type) {
case SOLPARSER_TARGET_ANCHOR:
anim_tracking.policy = TRACKING_NODE_TARGET;
target = *htable_anchor_find
- (&solstice->anchors, &parser_pivot->target.data.anchor.i);
+ (&solstice->anchors, &parser_x_pivot->target.data.anchor.i);
solstice_node_target_get_tracking(target, &anim_tracking);
break;
case SOLPARSER_TARGET_DIRECTION:
anim_tracking.policy = TRACKING_OUT_DIR;
- d3_set(anim_tracking.data.out_dir.u, parser_pivot->target.data.direction);
+ d3_set(anim_tracking.data.out_dir.u, parser_x_pivot->target.data.direction);
break;
case SOLPARSER_TARGET_POSITION:
anim_tracking.policy = TRACKING_POINT;
- d3_set(anim_tracking.data.point.target, parser_pivot->target.data.position);
+ d3_set(anim_tracking.data.point.target, parser_x_pivot->target.data.position);
anim_tracking.data.point.target_is_local = 0; /* TODO */
break;
case SOLPARSER_TARGET_SUN:
@@ -157,39 +158,39 @@ error:
}
static struct solstice_node*
-create_pivot2_node
+create_xz_pivot_node
(struct solstice* solstice,
const struct solparser_entity* entity)
{
struct solstice_node* node = NULL;
struct solstice_node* target = NULL;
- const struct solparser_pivot2* parser_pivot2 = NULL;
+ const struct solparser_xz_pivot* parser_xz_pivot = NULL;
struct sanim_pivot anim_pivot = SANIM_PIVOT_NULL;
struct sanim_tracking anim_tracking = SANIM_TRACKING_NULL;
res_T res = RES_OK;
ASSERT(solstice && entity);
- parser_pivot2 = solparser_get_pivot2(solstice->parser, entity->data.pivot2);
+ parser_xz_pivot = solparser_get_xz_pivot(solstice->parser, entity->data.xz_pivot);
anim_pivot.type = PIVOT_TWO_AXIS;
- anim_pivot.data.pivot2.spacing = parser_pivot2->spacing;
- d3_set(anim_pivot.data.pivot2.ref_point, parser_pivot2->ref_point);
+ anim_pivot.data.pivot2.spacing = parser_xz_pivot->spacing;
+ d3_set(anim_pivot.data.pivot2.ref_point, parser_xz_pivot->ref_point);
/* Setup the tracking descriptor */
- switch (parser_pivot2->target.type) {
+ switch (parser_xz_pivot->target.type) {
case SOLPARSER_TARGET_ANCHOR:
anim_tracking.policy = TRACKING_NODE_TARGET;
target = *htable_anchor_find
- (&solstice->anchors, &parser_pivot2->target.data.anchor.i);
+ (&solstice->anchors, &parser_xz_pivot->target.data.anchor.i);
solstice_node_target_get_tracking(target, &anim_tracking);
break;
case SOLPARSER_TARGET_DIRECTION:
anim_tracking.policy = TRACKING_OUT_DIR;
- d3_set(anim_tracking.data.out_dir.u, parser_pivot2->target.data.direction);
+ d3_set(anim_tracking.data.out_dir.u, parser_xz_pivot->target.data.direction);
break;
case SOLPARSER_TARGET_POSITION:
anim_tracking.policy = TRACKING_POINT;
- d3_set(anim_tracking.data.point.target, parser_pivot2->target.data.position);
+ d3_set(anim_tracking.data.point.target, parser_xz_pivot->target.data.position);
anim_tracking.data.point.target_is_local = 0; /* TODO */
break;
case SOLPARSER_TARGET_SUN:
@@ -235,11 +236,11 @@ create_node(struct solstice* solstice, const struct solparser_entity* entity)
case SOLPARSER_ENTITY_GEOMETRY:
node = create_geometry_node(solstice, entity);
break;
- case SOLPARSER_ENTITY_PIVOT:
- node = create_pivot_node(solstice, entity);
+ case SOLPARSER_ENTITY_X_PIVOT:
+ node = create_x_pivot_node(solstice, entity);
break;
- case SOLPARSER_ENTITY_PIVOT2:
- node = create_pivot2_node(solstice, entity);
+ case SOLPARSER_ENTITY_XZ_PIVOT:
+ node = create_xz_pivot_node(solstice, entity);
break;
default: FATAL("Unreachable code.\n"); break;
}