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