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