summaryrefslogtreecommitdiff
path: root/src/node.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/node.c')
-rw-r--r--src/node.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/node.c b/src/node.c
index 1ba862d..abf0034 100644
--- a/src/node.c
+++ b/src/node.c
@@ -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;
+}