commit 29b0e0121566096f3a220422f584abd31fd4feb8
parent 693d9c633d293a63756924b03f4fade44de94925
Author: Vincent Forest <vincent.forest@meso-star.com>
Date: Fri, 3 Mar 2017 11:03:31 +0100
Refactor the setup of the pivot entity
Factorise the setup of the Solstice Anim tracking node
Diffstat:
| M | src/solstice_entity.c | | | 143 | ++++++++++++++++++++++++++++++++++++++++++++++--------------------------------- |
1 file changed, 84 insertions(+), 59 deletions(-)
diff --git a/src/solstice_entity.c b/src/solstice_entity.c
@@ -35,6 +35,33 @@ update_instance_transform
return ssol_instance_set_transform(node->instance, transform);
}
+static res_T
+merge_name
+ (struct str* RESTRICT output,
+ const struct str* name0,
+ const struct str* name1)
+{
+ res_T res = RES_OK;
+ ASSERT(output && name0 && name1);
+ ASSERT(output != name0 && output != name1);
+
+ res = str_copy(output, name0);
+ if(res != RES_OK) goto error;
+
+ res = str_append_char(output, '.');
+ if(res != RES_OK) goto error;
+
+ res = str_append(output, str_cget(name1));
+ if(res != RES_OK) goto error;
+
+exit:
+ return res;
+error:
+ fprintf(stderr, "Could not build the name from `%s' and `%s'.\n",
+ str_cget(name0), str_cget(name1));
+ goto exit;
+}
+
static INLINE int
srcvl_side_to_ssol_mask(const enum srcvl_side side)
{
@@ -100,7 +127,7 @@ error:
static res_T
get_anchor_node
(struct solstice* solstice,
- struct solparser_anchor_id anchor_id,
+ const struct solparser_anchor_id anchor_id,
struct solstice_node** out_node)
{
struct solstice_node* node = NULL;
@@ -114,7 +141,6 @@ get_anchor_node
} else {
res = solstice_node_target_create(solstice->allocator, &node);
if(res != RES_OK) goto error;
-
res = htable_anchor_set(&solstice->anchors, &anchor_id.i, &node);
if(res != RES_OK) goto error;
}
@@ -127,6 +153,48 @@ error:
goto exit;
}
+static res_T
+setup_tracking
+ (struct solstice* solstice,
+ struct sanim_tracking* tracking,
+ const struct solparser_target* target)
+{
+ struct solstice_node* anchor_node = NULL;
+ struct str anchor_name;
+ res_T res = RES_OK;
+ ASSERT(solstice && tracking && target);
+
+ str_init(solstice->allocator, &anchor_name);
+
+ switch(target->type) {
+ case SOLPARSER_TARGET_ANCHOR:
+ tracking->policy = TRACKING_NODE_TARGET;
+ res = get_anchor_node(solstice, target->data.anchor, &anchor_node);
+ if(res != RES_OK) goto error;
+ solstice_node_target_get_tracking(anchor_node, tracking);
+ break;
+ case SOLPARSER_TARGET_DIRECTION:
+ tracking->policy = TRACKING_OUT_DIR;
+ d3_set(tracking->data.out_dir.u, target->data.direction);
+ break;
+ case SOLPARSER_TARGET_POSITION:
+ tracking->policy = TRACKING_POINT;
+ d3_set(tracking->data.point.target, target->data.position);
+ tracking->data.point.target_is_local = 0; /* TODO */
+ break;
+ case SOLPARSER_TARGET_SUN:
+ tracking->policy = TRACKING_SUN;
+ break;
+ default: FATAL("Unreachable code.\n"); break;
+ }
+
+exit:
+ str_release(&anchor_name);
+ return res;
+error:
+ goto exit;
+}
+
static struct solstice_node*
create_x_pivot_node
@@ -135,7 +203,6 @@ create_x_pivot_node
{
double n[3];
struct solstice_node* node = NULL;
- struct solstice_node* target = 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;
@@ -148,28 +215,8 @@ create_x_pivot_node
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_x_pivot->target.type) {
- case SOLPARSER_TARGET_ANCHOR:
- anim_tracking.policy = TRACKING_NODE_TARGET;
- target = *htable_anchor_find
- (&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_x_pivot->target.data.direction);
- break;
- case SOLPARSER_TARGET_POSITION:
- anim_tracking.policy = TRACKING_POINT;
- 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:
- anim_tracking.policy = TRACKING_SUN;
- break;
- default: FATAL("Unreachable code.\n"); break;
- }
+ res = setup_tracking(solstice, &anim_tracking, &parser_x_pivot->target);
+ if(res != RES_OK) goto error;
res = solstice_node_pivot_create
(solstice->allocator, &anim_pivot, &anim_tracking, &node);
@@ -194,7 +241,6 @@ create_zx_pivot_node
const struct solparser_entity* entity)
{
struct solstice_node* node = NULL;
- struct solstice_node* target = NULL;
const struct solparser_zx_pivot* parser_zx_pivot = NULL;
struct sanim_pivot anim_pivot = SANIM_PIVOT_NULL;
struct sanim_tracking anim_tracking = SANIM_TRACKING_NULL;
@@ -207,35 +253,15 @@ create_zx_pivot_node
anim_pivot.data.pivot2.spacing = parser_zx_pivot->spacing;
d3_set(anim_pivot.data.pivot2.ref_point, parser_zx_pivot->ref_point);
- /* Setup the tracking descriptor */
- switch (parser_zx_pivot->target.type) {
- case SOLPARSER_TARGET_ANCHOR:
- anim_tracking.policy = TRACKING_NODE_TARGET;
- CHECK(RES_OK,
- get_anchor_node(solstice, parser_zx_pivot->target.data.anchor, &target));
- 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_zx_pivot->target.data.direction);
- break;
- case SOLPARSER_TARGET_POSITION:
- anim_tracking.policy = TRACKING_POINT;
- d3_set(anim_tracking.data.point.target, parser_zx_pivot->target.data.position);
- anim_tracking.data.point.target_is_local = 0; /* TODO */
- break;
- case SOLPARSER_TARGET_SUN:
- anim_tracking.policy = TRACKING_SUN;
- break;
- default: FATAL("Unreachable code.\n"); break;
- }
+ res = setup_tracking(solstice, &anim_tracking, &parser_zx_pivot->target);
+ if(res != RES_OK) goto error;
res = solstice_node_pivot_create
(solstice->allocator, &anim_pivot, &anim_tracking, &node);
- if (res != RES_OK) goto error;
+ if(res != RES_OK) goto error;
res = darray_nodes_push_back(&solstice->pivots, &node);
- if (res != RES_OK) goto error;
+ if(res != RES_OK) goto error;
exit:
return node;
@@ -257,12 +283,14 @@ create_node
struct solstice_node* child = NULL;
struct solstice_receiver* rcv = NULL;
struct str child_name;
+ struct str anchor_name;
double rotation[3];
size_t i;
res_T res = RES_OK;
ASSERT(solstice && entity && name);
str_init(solstice->allocator, &child_name);
+ str_init(solstice->allocator, &anchor_name);
/* Create the entity node */
switch(entity->type) {
@@ -333,6 +361,9 @@ create_node
id = solparser_entity_get_anchor(entity, i);
anchor = solparser_get_anchor(solstice->parser, id);
+ res = merge_name(&anchor_name, name, &anchor->name);
+ if(res != RES_OK) goto error;
+
res = get_anchor_node(solstice, id, &tgt);
if(res != RES_OK) goto error;
@@ -353,15 +384,8 @@ create_node
id = solparser_entity_get_child(entity, i);
child_entity = solparser_get_entity(solstice->parser, id);
- #define CALL(Func) \
- if(RES_OK != (res = Func)) { \
- fprintf(stderr, "Could not build the absolute entity name.\n"); \
- goto error; \
- } (void)0
- CALL(str_copy(&child_name, name));
- CALL(str_append_char(&child_name, '.'));
- CALL(str_append(&child_name, str_cget(&child_entity->name)));
- #undef CALL
+ res = merge_name(&child_name, name, &child_entity->name);
+ if(res != RES_OK) goto error;
child = create_node(solstice, child_entity, &child_name);
if(!child) goto error;
@@ -375,6 +399,7 @@ create_node
exit:
str_release(&child_name);
+ str_release(&anchor_name);
return node;
error:
if(child) solstice_node_ref_put(child);