1 #include "rs_core.rsh" 2 #include "rs_structs.h" 3 4 /* Function declarations from libRS */ 5 extern float4 __attribute__((overloadable)) convert_float4(uchar4 c); 6 7 /* Implementation of Core Runtime */ 8 9 10 ///////////////////////////////////////////////////// 11 // Matrix ops 12 ///////////////////////////////////////////////////// 13 14 15 extern void __attribute__((overloadable)) 16 rsMatrixLoadIdentity(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 35 extern void __attribute__((overloadable)) 36 rsMatrixLoadIdentity(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 } 47 extern void __attribute__((overloadable)) 48 rsMatrixLoadIdentity(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 55 extern void __attribute__((overloadable)) 56 rsMatrixLoad(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 } 74 extern void __attribute__((overloadable)) 75 rsMatrixLoad(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 } 86 extern void __attribute__((overloadable)) 87 rsMatrixLoad(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 94 extern void __attribute__((overloadable)) 95 rsMatrixLoad(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 } 113 extern void __attribute__((overloadable)) 114 rsMatrixLoad(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 } 132 extern void __attribute__((overloadable)) 133 rsMatrixLoad(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 } 151 extern void __attribute__((overloadable)) 152 rsMatrixLoad(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 } 163 extern void __attribute__((overloadable)) 164 rsMatrixLoad(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 172 extern void __attribute__((overloadable)) 173 rsMatrixSet(rs_matrix4x4 *m, uint32_t col, uint32_t row, float v) { 174 m->m[col * 4 + row] = v; 175 } 176 177 extern float __attribute__((overloadable)) 178 rsMatrixGet(const rs_matrix4x4 *m, uint32_t col, uint32_t row) { 179 return m->m[col * 4 + row]; 180 } 181 182 extern void __attribute__((overloadable)) 183 rsMatrixSet(rs_matrix3x3 *m, uint32_t col, uint32_t row, float v) { 184 m->m[col * 3 + row] = v; 185 } 186 187 extern float __attribute__((overloadable)) 188 rsMatrixGet(const rs_matrix3x3 *m, uint32_t col, uint32_t row) { 189 return m->m[col * 3 + row]; 190 } 191 192 extern void __attribute__((overloadable)) 193 rsMatrixSet(rs_matrix2x2 *m, uint32_t col, uint32_t row, float v) { 194 m->m[col * 2 + row] = v; 195 } 196 197 extern float __attribute__((overloadable)) 198 rsMatrixGet(const rs_matrix2x2 *m, uint32_t col, uint32_t row) { 199 return m->m[col * 2 + row]; 200 } 201 202 extern float2 __attribute__((overloadable)) 203 rsMatrixMultiply(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 } 209 extern float2 __attribute__((overloadable)) 210 rsMatrixMultiply(rs_matrix2x2 *m, float2 in) { 211 return rsMatrixMultiply((const rs_matrix2x2 *)m, in); 212 } 213 214 extern float4 __attribute__((overloadable)) 215 rsMatrixMultiply(rs_matrix4x4 *m, float4 in) { 216 return rsMatrixMultiply((const rs_matrix4x4 *)m, in); 217 } 218 219 extern float4 __attribute__((overloadable)) 220 rsMatrixMultiply(rs_matrix4x4 *m, float3 in) { 221 return rsMatrixMultiply((const rs_matrix4x4 *)m, in); 222 } 223 224 extern float4 __attribute__((overloadable)) 225 rsMatrixMultiply(rs_matrix4x4 *m, float2 in) { 226 return rsMatrixMultiply((const rs_matrix4x4 *)m, in); 227 } 228 229 extern float3 __attribute__((overloadable)) 230 rsMatrixMultiply(rs_matrix3x3 *m, float3 in) { 231 return rsMatrixMultiply((const rs_matrix3x3 *)m, in); 232 } 233 234 extern float3 __attribute__((overloadable)) 235 rsMatrixMultiply(rs_matrix3x3 *m, float2 in) { 236 return rsMatrixMultiply((const rs_matrix3x3 *)m, in); 237 } 238 239 extern void __attribute__((overloadable)) 240 rsMatrixLoadMultiply(rs_matrix4x4 *ret, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) { 241 // Use a temporary variable to support the case where one of the inputs 242 // is also the destination, e.g. rsMatrixLoadMultiply(&left, &left, &right); 243 rs_matrix4x4 result; 244 for (int i=0 ; i<4 ; i++) { 245 float ri0 = 0; 246 float ri1 = 0; 247 float ri2 = 0; 248 float ri3 = 0; 249 for (int j=0 ; j<4 ; j++) { 250 const float rhs_ij = rsMatrixGet(rhs, i, j); 251 ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; 252 ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; 253 ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij; 254 ri3 += rsMatrixGet(lhs, j, 3) * rhs_ij; 255 } 256 rsMatrixSet(&result, i, 0, ri0); 257 rsMatrixSet(&result, i, 1, ri1); 258 rsMatrixSet(&result, i, 2, ri2); 259 rsMatrixSet(&result, i, 3, ri3); 260 } 261 rsMatrixLoad(ret, &result); 262 } 263 264 extern void __attribute__((overloadable)) 265 rsMatrixMultiply(rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) { 266 rsMatrixLoadMultiply(lhs, lhs, rhs); 267 } 268 269 extern void __attribute__((overloadable)) 270 rsMatrixLoadMultiply(rs_matrix3x3 *ret, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) { 271 // Use a temporary variable to support the case where one of the inputs 272 // is also the destination, e.g. rsMatrixLoadMultiply(&left, &left, &right); 273 rs_matrix3x3 result; 274 for (int i=0 ; i<3 ; i++) { 275 float ri0 = 0; 276 float ri1 = 0; 277 float ri2 = 0; 278 for (int j=0 ; j<3 ; j++) { 279 const float rhs_ij = rsMatrixGet(rhs, i, j); 280 ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; 281 ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; 282 ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij; 283 } 284 rsMatrixSet(&result, i, 0, ri0); 285 rsMatrixSet(&result, i, 1, ri1); 286 rsMatrixSet(&result, i, 2, ri2); 287 } 288 rsMatrixLoad(ret, &result); 289 } 290 291 extern void __attribute__((overloadable)) 292 rsMatrixMultiply(rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) { 293 rsMatrixLoadMultiply(lhs, lhs, rhs); 294 } 295 296 extern void __attribute__((overloadable)) 297 rsMatrixLoadMultiply(rs_matrix2x2 *ret, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) { 298 // Use a temporary variable to support the case where one of the inputs 299 // is also the destination, e.g. rsMatrixLoadMultiply(&left, &left, &right); 300 rs_matrix2x2 result; 301 for (int i=0 ; i<2 ; i++) { 302 float ri0 = 0; 303 float ri1 = 0; 304 for (int j=0 ; j<2 ; j++) { 305 const float rhs_ij = rsMatrixGet(rhs, i, j); 306 ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij; 307 ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij; 308 } 309 rsMatrixSet(&result, i, 0, ri0); 310 rsMatrixSet(&result, i, 1, ri1); 311 } 312 rsMatrixLoad(ret, &result); 313 } 314 315 extern void __attribute__((overloadable)) 316 rsMatrixMultiply(rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) { 317 rsMatrixLoadMultiply(lhs, lhs, rhs); 318 } 319 320