vec4, quat, and half-done matrices
[gph-cmath] / src / cgmvec4.inl
1 static inline void cgm_wcons(cgm_vec4 *v, float x, float y, float z, float w)
2 {
3         v->x = x;
4         v->y = y;
5         v->z = z;
6         v->w = w;
7 }
8
9 static inline void cgm_wadd(cgm_vec4 *a, const cgm_vec4 *b)
10 {
11         a->x += b->x;
12         a->y += b->y;
13         a->z += b->z;
14         a->w += b->w;
15 }
16
17 static inline void cgm_wsub(cgm_vec4 *a, const cgm_vec4 *b)
18 {
19         a->x -= b->x;
20         a->y -= b->y;
21         a->z -= b->z;
22         a->w -= b->w;
23 }
24
25 static inline void cgm_wmul(cgm_vec4 *a, const cgm_vec4 *b)
26 {
27         a->x *= b->x;
28         a->y *= b->y;
29         a->z *= b->z;
30         a->w *= b->w;
31 }
32
33 static inline void cgm_wscale(cgm_vec4 *v, float s)
34 {
35         v->x *= s;
36         v->y *= s;
37         v->z *= s;
38         v->w *= s;
39 }
40
41 static inline void cgm_wmul_m4v4(cgm_vec4 *v, const float *m)
42 {
43         float x = v->x * m[0] + v->y * m[4] + v->z * m[8] + v->w * m[12];
44         float y = v->x * m[1] + v->y * m[5] + v->z * m[9] + v->w * m[13];
45         float z = v->x * m[2] + v->y * m[6] + v->z * m[10] + v->w * m[14];
46         v->w = v->x * m[3] + v->y * m[7] + v->z * m[11] + v->w * m[15];
47         v->x = x;
48         v->y = y;
49         v->z = z;
50 }
51
52 static inline void cgm_wmul_v4m4(cgm_vec4 *v, const float *m)
53 {
54         float x = v->x * m[0] + v->y * m[1] + v->z * m[2] + v->w * m[3];
55         float y = v->x * m[4] + v->y * m[5] + v->z * m[6] + v->w * m[7];
56         float z = v->x * m[8] + v->y * m[9] + v->z * m[10] + v->w * m[11];
57         v->w = v->x * m[12] + v->y * m[13] + v->z * m[14] + v->w * m[15];
58         v->x = x;
59         v->y = y;
60         v->z = z;
61 }
62
63 static inline void cgm_wmul_m34v4(cgm_vec4 *v, const float *m)
64 {
65         float x = v->x * m[0] + v->y * m[4] + v->z * m[8] + v->w * m[12];
66         float y = v->x * m[1] + v->y * m[5] + v->z * m[9] + v->w * m[13];
67         v->z = v->x * m[2] + v->y * m[6] + v->z * m[10] + v->w * m[14];
68         v->x = x;
69         v->y = y;
70 }
71
72 static inline void cgm_wmul_v4m43(cgm_vec4 *v, const float *m)
73 {
74         float x = v->x * m[0] + v->y * m[1] + v->z * m[2] + v->w * m[3];
75         float y = v->x * m[4] + v->y * m[5] + v->z * m[6] + v->w * m[7];
76         v->z = v->x * m[8] + v->y * m[9] + v->z * m[10] + v->w * m[11];
77         v->x = x;
78         v->y = y;
79 }
80
81 static inline void cgm_wmul_m3v4(cgm_vec4 *v, const float *m)
82 {
83         float x = v->x * m[0] + v->y * m[4] + v->z * m[8];
84         float y = v->x * m[1] + v->y * m[5] + v->z * m[9];
85         v->z = v->x * m[2] + v->y * m[6] + v->z * m[10];
86         v->x = x;
87         v->y = y;
88 }
89
90 static inline void cgm_wmul_v4m3(cgm_vec4 *v, const float *m)
91 {
92         float x = v->x * m[0] + v->y * m[1] + v->z * m[2];
93         float y = v->x * m[4] + v->y * m[5] + v->z * m[6];
94         v->z = v->x * m[8] + v->y * m[9] + v->z * m[10];
95         v->x = x;
96         v->y = y;
97 }
98
99 static inline float cgm_wlength(const cgm_vec4 *v)
100 {
101         return sqrt(v->x * v->x + v->y * v->y + v->z * v->z + v->w * v->w);
102 }
103
104 static inline float cgm_wlength_sq(const cgm_vec4 *v)
105 {
106         return v->x * v->x + v->y * v->y + v->z * v->z + v->w * v->w;
107 }
108
109 static inline float cgm_wdist(const cgm_vec4 *a, const cgm_vec4 *b)
110 {
111         float dx = a->x - b->x;
112         float dy = a->y - b->y;
113         float dz = a->z - b->z;
114         float dw = a->w - b->w;
115         return sqrt(dx * dx + dy * dy + dz * dz + dw * dw);
116 }
117
118 static inline float cgm_wdist_sq(const cgm_vec4 *a, const cgm_vec4 *b)
119 {
120         float dx = a->x - b->x;
121         float dy = a->y - b->y;
122         float dz = a->z - b->z;
123         float dw = a->w - b->w;
124         return dx * dx + dy * dy + dz * dz + dw * dw;
125 }
126
127 static inline void cgm_wnormalize(cgm_vec4 *v)
128 {
129         float len = cgm_wlength(v);
130         if(len != 0.0f) {
131                 float s = 1.0f / len;
132                 v->x *= s;
133                 v->y *= s;
134                 v->z *= s;
135                 v->w *= s;
136         }
137 }
138
139 static inline void cgm_wlerp(cgm_vec4 *res, const cgm_vec4 *a, const cgm_vec4 *b, float t)
140 {
141         res->x = a->x + (b->x - a->x) * t;
142         res->y = a->y + (b->y - a->y) * t;
143         res->z = a->z + (b->z - a->z) * t;
144         res->w = a->w + (b->w - a->w) * t;
145 }