diff options
Diffstat (limited to 'src/node.c')
-rw-r--r-- | src/node.c | 49 |
1 files changed, 49 insertions, 0 deletions
@@ -1,5 +1,54 @@ +#include <string.h> + #include <kalmia.h> #include <ezxml.h> + +#include "util.h" +#include "transform.h" #include "node.h" +ka_node_t * kai_parse_node(kalmia_t *k, ezxml_t tag) +{ + /* check for incorrect tag name */ + if (strcmp("node", ezxml_name(tag)) != 0) + return NULL; + + /* initialize node */ + ka_node_t *node = kai_next_node(k); + kai_identity(&(node->transform)); + + /* get first child */ + ezxml_t t = tag->child; + + /* iterate over sub-tags */ + while (t != NULL) { + const char *t_name = ezxml_name(t); + ka_matrix_t m; + if (strcmp(t_name, "matrix") == 0) { + /* process matrix */ + kai_parse_matrix(&m, t); + kai_multiply(&(node->transform), node->transform, m); + } + else if (strcmp(t_name, "rotate") == 0) { + /* process rotation */ + kai_parse_rotate(&m, t); + kai_multiply(&(node->transform), node->transform, m); + } + else if (strcmp(t_name, "scale") == 0) { + /* process scale */ + kai_parse_scale(&m, t); + kai_multiply(&(node->transform), node->transform, m); + } + else if (strcmp(t_name, "translate") == 0) { + /* process translation */ + kai_parse_translate(&m, t); + kai_multiply(&(node->transform), node->transform, m); + } + + /* advance to next child node */ + t = t->ordered; + } + + return node; +} |