rs_matrix.c revision 3ff0fe77fdba8ad4a920dc27157d8c1786bb3661
1#include "rs_core.rsh"
2#include "rs_structs.h"
3
4/* Function declarations from libRS */
5extern float4 __attribute__((overloadable)) convert_float4(uchar4 c);
6
7/* Implementation of Core Runtime */
8
9
10/////////////////////////////////////////////////////
11// Matrix ops
12/////////////////////////////////////////////////////
13
14
15extern void __attribute__((overloadable))
16rsMatrixLoadIdentity(rs_matrix4x4 *m) {
17    m->m[0] = 1.f;
18    m->m[1] = 0.f;
19    m->m[2] = 0.f;
20    m->m[3] = 0.f;
21    m->m[4] = 0.f;
22    m->m[5] = 1.f;
23    m->m[6] = 0.f;
24    m->m[7] = 0.f;
25    m->m[8] = 0.f;
26    m->m[9] = 0.f;
27    m->m[10] = 1.f;
28    m->m[11] = 0.f;
29    m->m[12] = 0.f;
30    m->m[13] = 0.f;
31    m->m[14] = 0.f;
32    m->m[15] = 1.f;
33}
34
35extern void __attribute__((overloadable))
36rsMatrixLoadIdentity(rs_matrix3x3 *m) {
37    m->m[0] = 1.f;
38    m->m[1] = 0.f;
39    m->m[2] = 0.f;
40    m->m[3] = 0.f;
41    m->m[4] = 1.f;
42    m->m[5] = 0.f;
43    m->m[6] = 0.f;
44    m->m[7] = 0.f;
45    m->m[8] = 1.f;
46}
47extern void __attribute__((overloadable))
48rsMatrixLoadIdentity(rs_matrix2x2 *m) {
49    m->m[0] = 1.f;
50    m->m[1] = 0.f;
51    m->m[2] = 0.f;
52    m->m[3] = 1.f;
53}
54
55extern void __attribute__((overloadable))
56rsMatrixLoad(rs_matrix4x4 *m, const float *f) {
57    m->m[0] = f[0];
58    m->m[1] = f[1];
59    m->m[2] = f[2];
60    m->m[3] = f[3];
61    m->m[4] = f[4];
62    m->m[5] = f[5];
63    m->m[6] = f[6];
64    m->m[7] = f[7];
65    m->m[8] = f[8];
66    m->m[9] = f[9];
67    m->m[10] = f[10];
68    m->m[11] = f[11];
69    m->m[12] = f[12];
70    m->m[13] = f[13];
71    m->m[14] = f[14];
72    m->m[15] = f[15];
73}
74extern void __attribute__((overloadable))
75rsMatrixLoad(rs_matrix3x3 *m, const float *f) {
76    m->m[0] = f[0];
77    m->m[1] = f[1];
78    m->m[2] = f[2];
79    m->m[3] = f[3];
80    m->m[4] = f[4];
81    m->m[5] = f[5];
82    m->m[6] = f[6];
83    m->m[7] = f[7];
84    m->m[8] = f[8];
85}
86extern void __attribute__((overloadable))
87rsMatrixLoad(rs_matrix2x2 *m, const float *f) {
88    m->m[0] = f[0];
89    m->m[1] = f[1];
90    m->m[2] = f[2];
91    m->m[3] = f[3];
92}
93
94extern void __attribute__((overloadable))
95rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *s) {
96    m->m[0] = s->m[0];
97    m->m[1] = s->m[1];
98    m->m[2] = s->m[2];
99    m->m[3] = s->m[3];
100    m->m[4] = s->m[4];
101    m->m[5] = s->m[5];
102    m->m[6] = s->m[6];
103    m->m[7] = s->m[7];
104    m->m[8] = s->m[8];
105    m->m[9] = s->m[9];
106    m->m[10] = s->m[10];
107    m->m[11] = s->m[11];
108    m->m[12] = s->m[12];
109    m->m[13] = s->m[13];
110    m->m[14] = s->m[14];
111    m->m[15] = s->m[15];
112}
113extern void __attribute__((overloadable))
114rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v) {
115    m->m[0] = v->m[0];
116    m->m[1] = v->m[1];
117    m->m[2] = v->m[2];
118    m->m[3] = 0.f;
119    m->m[4] = v->m[3];
120    m->m[5] = v->m[4];
121    m->m[6] = v->m[5];
122    m->m[7] = 0.f;
123    m->m[8] = v->m[6];
124    m->m[9] = v->m[7];
125    m->m[10] = v->m[8];
126    m->m[11] = 0.f;
127    m->m[12] = 0.f;
128    m->m[13] = 0.f;
129    m->m[14] = 0.f;
130    m->m[15] = 1.f;
131}
132extern void __attribute__((overloadable))
133rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v) {
134    m->m[0] = v->m[0];
135    m->m[1] = v->m[1];
136    m->m[2] = 0.f;
137    m->m[3] = 0.f;
138    m->m[4] = v->m[2];
139    m->m[5] = v->m[3];
140    m->m[6] = 0.f;
141    m->m[7] = 0.f;
142    m->m[8] = 0.f;
143    m->m[9] = 0.f;
144    m->m[10] = 1.f;
145    m->m[11] = 0.f;
146    m->m[12] = 0.f;
147    m->m[13] = 0.f;
148    m->m[14] = 0.f;
149    m->m[15] = 1.f;
150}
151extern void __attribute__((overloadable))
152rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *s) {
153    m->m[0] = s->m[0];
154    m->m[1] = s->m[1];
155    m->m[2] = s->m[2];
156    m->m[3] = s->m[3];
157    m->m[4] = s->m[4];
158    m->m[5] = s->m[5];
159    m->m[6] = s->m[6];
160    m->m[7] = s->m[7];
161    m->m[8] = s->m[8];
162}
163extern void __attribute__((overloadable))
164rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *s) {
165    m->m[0] = s->m[0];
166    m->m[1] = s->m[1];
167    m->m[2] = s->m[2];
168    m->m[3] = s->m[3];
169}
170
171
172extern void __attribute__((overloadable))
173rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v) {
174    m->m[row * 4 + col] = v;
175}
176
177extern float __attribute__((overloadable))
178rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col) {
179    return m->m[row * 4 + col];
180}
181
182extern void __attribute__((overloadable))
183rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v) {
184    m->m[row * 3 + col] = v;
185}
186
187extern float __attribute__((overloadable))
188rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col) {
189    return m->m[row * 3 + col];
190}
191
192extern void __attribute__((overloadable))
193rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v) {
194    m->m[row * 2 + col] = v;
195}
196
197extern float __attribute__((overloadable))
198rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col) {
199    return m->m[row * 2 + col];
200}
201
202extern float2 __attribute__((overloadable))
203rsMatrixMultiply(const rs_matrix2x2 *m, float2 in) {
204    float2 ret;
205    ret.x = (m->m[0] * in.x) + (m->m[2] * in.y);
206    ret.y = (m->m[1] * in.x) + (m->m[3] * in.y);
207    return ret;
208}
209extern float2 __attribute__((overloadable))
210rsMatrixMultiply(rs_matrix2x2 *m, float2 in) {
211    return rsMatrixMultiply((const rs_matrix2x2 *)m, in);
212}
213
214extern float4 __attribute__((overloadable))
215rsMatrixMultiply(rs_matrix4x4 *m, float4 in) {
216    return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
217}
218
219extern float4 __attribute__((overloadable))
220rsMatrixMultiply(rs_matrix4x4 *m, float3 in) {
221    return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
222}
223
224extern float4 __attribute__((overloadable))
225rsMatrixMultiply(rs_matrix4x4 *m, float2 in) {
226    return rsMatrixMultiply((const rs_matrix4x4 *)m, in);
227}
228
229extern float3 __attribute__((overloadable))
230rsMatrixMultiply(rs_matrix3x3 *m, float3 in) {
231    return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
232}
233
234extern float3 __attribute__((overloadable))
235rsMatrixMultiply(rs_matrix3x3 *m, float2 in) {
236    return rsMatrixMultiply((const rs_matrix3x3 *)m, in);
237}
238
239extern void __attribute__((overloadable))
240rsMatrixLoadMultiply(rs_matrix4x4 *ret, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) {
241    for (int i=0 ; i<4 ; i++) {
242        float ri0 = 0;
243        float ri1 = 0;
244        float ri2 = 0;
245        float ri3 = 0;
246        for (int j=0 ; j<4 ; j++) {
247            const float rhs_ij = rsMatrixGet(rhs, i, j);
248            ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
249            ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
250            ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij;
251            ri3 += rsMatrixGet(lhs, j, 3) * rhs_ij;
252        }
253        rsMatrixSet(ret, i, 0, ri0);
254        rsMatrixSet(ret, i, 1, ri1);
255        rsMatrixSet(ret, i, 2, ri2);
256        rsMatrixSet(ret, i, 3, ri3);
257    }
258}
259
260extern void __attribute__((overloadable))
261rsMatrixMultiply(rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) {
262    rs_matrix4x4 r;
263    rsMatrixLoadMultiply(&r, lhs, rhs);
264    rsMatrixLoad(lhs, &r);
265}
266
267extern void __attribute__((overloadable))
268rsMatrixLoadMultiply(rs_matrix3x3 *ret, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
269    for (int i=0 ; i<3 ; i++) {
270        float ri0 = 0;
271        float ri1 = 0;
272        float ri2 = 0;
273        for (int j=0 ; j<3 ; j++) {
274            const float rhs_ij = rsMatrixGet(rhs, i, j);
275            ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
276            ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
277            ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij;
278        }
279        rsMatrixSet(ret, i, 0, ri0);
280        rsMatrixSet(ret, i, 1, ri1);
281        rsMatrixSet(ret, i, 2, ri2);
282    }
283}
284
285extern void __attribute__((overloadable))
286rsMatrixMultiply(rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
287    rs_matrix3x3 r;
288    rsMatrixLoadMultiply(&r, lhs, rhs);
289    rsMatrixLoad(lhs, &r);
290}
291
292extern void __attribute__((overloadable))
293rsMatrixLoadMultiply(rs_matrix2x2 *ret, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) {
294    for (int i=0 ; i<2 ; i++) {
295        float ri0 = 0;
296        float ri1 = 0;
297        for (int j=0 ; j<2 ; j++) {
298            const float rhs_ij = rsMatrixGet(rhs, i, j);
299            ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
300            ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
301        }
302        rsMatrixSet(ret, i, 0, ri0);
303        rsMatrixSet(ret, i, 1, ri1);
304    }
305}
306
307extern void __attribute__((overloadable))
308rsMatrixMultiply(rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) {
309    rs_matrix2x2 r;
310    rsMatrixLoadMultiply(&r, lhs, rhs);
311    rsMatrixLoad(lhs, &r);
312}
313
314