summaryrefslogtreecommitdiff
path: root/src/transform.c
blob: 6e4db56474f92f8f692f422b881725c33058a504 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#include <stdlib.h>
#include <string.h>
#include <math.h>

#include <kalmia.h>
#include <ezxml.h>
#include "transform.h"


#define TWO_PI 6.2831853071796f


int kai_parse_matrix(ka_matrix_t *m, ezxml_t tag)
{
	if (strcmp("matrix", ezxml_name(tag)) != 0)
		return -1;
	
	char *str = ezxml_txt(tag);
	char *end;
	int i;
	for (i=0; i<16; i++) {
		(*m)[i] = strtod(str, &end);
		str = end;
	}
	
	return 0;
}


int kai_parse_rotate(ka_matrix_t *m, ezxml_t tag)
{
	if (strcmp("rotate", ezxml_name(tag)) != 0)
		return -1;
	
	char *str = ezxml_txt(tag);
	char *end;
	int i;
	double rot[4];
	for (i=0; i<4; i++) {
		rot[i] = strtod(str, &end);
		str = end;
	}

	double x, y, z, angle;
	x = rot[0];
	y = rot[1];
	z = rot[2];
	angle = rot[3];

	/* normalize length */
	double axis_len = (x*x) + (y*y) + (z*z);
	axis_len = sqrt(axis_len);
	x /= axis_len;
	y /= axis_len;
	z /= axis_len;

	/* convert angle to radians */
	angle *= TWO_PI / 360;

	/* compute rotation matrix entries */
	double co = cos(angle);
	double unco = 1 - co;
	double si = sin(angle);

	(*m)[0] = (x*x*unco) + co;
	(*m)[1] = (x*y*unco) - (z*si);
	(*m)[2] = (x*z*unco) + (y*si);
	(*m)[3] = 0.0f;
	(*m)[4] = (y*x*unco) + (z*si);
	(*m)[5] = (y*y*unco) + co;
	(*m)[6] = (y*z*unco) - (x*si);
	(*m)[7] = 0.0f;
	(*m)[8] = (z*x*unco) - (y*si);
	(*m)[9] = (z*y*unco) + (x*si);
	(*m)[10] = (z*z*unco) + co;
	(*m)[11] = 0.0f;
	(*m)[12] = 0.0f;
	(*m)[13] = 0.0f;
	(*m)[14] = 0.0f;
	(*m)[15] = 1.0f;

	return 0;
}


int kai_parse_translate(ka_matrix_t *m, ezxml_t tag)
{
	if (strcmp("translate", ezxml_name(tag)) != 0)
		return -1;

	char *str = ezxml_txt(tag);
	char *end;
	int i;
	double move[3];
	for (i=0; i<3; i++) {
		move[i] = strtod(str, &end);
		str = end;
	}

	memset(*m, 0, sizeof(ka_matrix_t));

	(*m)[0] = 1.0f;
	(*m)[3] = move[0];
	(*m)[5] = 1.0f;
	(*m)[7] = move[1];
	(*m)[10] = 1.0f;
	(*m)[11] = move[2];
	(*m)[15] = 1.0f;
	
	return 0;
}