#include #include #include #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; }