summaryrefslogtreecommitdiff
path: root/src/node.c
diff options
context:
space:
mode:
authorsanine <sanine.not@pm.me>2022-12-10 17:14:50 -0600
committersanine <sanine.not@pm.me>2022-12-10 17:14:50 -0600
commit8bc49efb970ac44f17f6076bb16f1d0e712bd750 (patch)
treeee427b3881ddf46e351a61ddb29536baf6e7b214 /src/node.c
parent6ca18697f9eb332c38f0b46b823089ce80347580 (diff)
implement node transform processing
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;
+}