rs_matrix.c revision 5a47020542c52af3e879c1cd67674ca979ff0a18
1#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 315