rs_core.rsh revision 7fe6bce13c30b8d14dc833e06468666d28e56ee1
1275b1e98bb949643d35546f10f8b1af009349526Jason Sams#ifndef __RS_CORE_RSH__
2275b1e98bb949643d35546f10f8b1af009349526Jason Sams#define __RS_CORE_RSH__
3275b1e98bb949643d35546f10f8b1af009349526Jason Sams
4275b1e98bb949643d35546f10f8b1af009349526Jason Sams
579f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsstatic uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b)
6275b1e98bb949643d35546f10f8b1af009349526Jason Sams{
7275b1e98bb949643d35546f10f8b1af009349526Jason Sams    uchar4 c;
8275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.x = (uchar)(r * 255.f);
9275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.y = (uchar)(g * 255.f);
10275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.z = (uchar)(b * 255.f);
11275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.w = 255;
12275b1e98bb949643d35546f10f8b1af009349526Jason Sams    return c;
13275b1e98bb949643d35546f10f8b1af009349526Jason Sams}
14275b1e98bb949643d35546f10f8b1af009349526Jason Sams
1579f52df541f87ac07709e770cd79f14dd1a05e93Jason Samsstatic uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a)
16275b1e98bb949643d35546f10f8b1af009349526Jason Sams{
17275b1e98bb949643d35546f10f8b1af009349526Jason Sams    uchar4 c;
18275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.x = (uchar)(r * 255.f);
19275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.y = (uchar)(g * 255.f);
20275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.z = (uchar)(b * 255.f);
21275b1e98bb949643d35546f10f8b1af009349526Jason Sams    c.w = (uchar)(a * 255.f);
22275b1e98bb949643d35546f10f8b1af009349526Jason Sams    return c;
23275b1e98bb949643d35546f10f8b1af009349526Jason Sams}
24275b1e98bb949643d35546f10f8b1af009349526Jason Sams
25275b1e98bb949643d35546f10f8b1af009349526Jason Samsstatic uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color)
26275b1e98bb949643d35546f10f8b1af009349526Jason Sams{
27275b1e98bb949643d35546f10f8b1af009349526Jason Sams    color *= 255.f;
28275b1e98bb949643d35546f10f8b1af009349526Jason Sams    uchar4 c = {color.x, color.y, color.z, 255};
29275b1e98bb949643d35546f10f8b1af009349526Jason Sams    return c;
30275b1e98bb949643d35546f10f8b1af009349526Jason Sams}
31275b1e98bb949643d35546f10f8b1af009349526Jason Sams
32275b1e98bb949643d35546f10f8b1af009349526Jason Samsstatic uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color)
33275b1e98bb949643d35546f10f8b1af009349526Jason Sams{
34275b1e98bb949643d35546f10f8b1af009349526Jason Sams    color *= 255.f;
35275b1e98bb949643d35546f10f8b1af009349526Jason Sams    uchar4 c = {color.x, color.y, color.z, color.w};
36275b1e98bb949643d35546f10f8b1af009349526Jason Sams    return c;
37275b1e98bb949643d35546f10f8b1af009349526Jason Sams}
38275b1e98bb949643d35546f10f8b1af009349526Jason Sams
39275b1e98bb949643d35546f10f8b1af009349526Jason Samsstatic float4 rsUnpackColor8888(uchar4 c)
40275b1e98bb949643d35546f10f8b1af009349526Jason Sams{
411b937f5c0d66a65daf07a45554c98a9f2481b9baJason Sams    float4 ret = (float4)0.0039156862745f;
421b937f5c0d66a65daf07a45554c98a9f2481b9baJason Sams    ret *= convert_float4(c);
43275b1e98bb949643d35546f10f8b1af009349526Jason Sams    return ret;
44275b1e98bb949643d35546f10f8b1af009349526Jason Sams}
45275b1e98bb949643d35546f10f8b1af009349526Jason Sams
462a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams//extern uchar4 __attribute__((overloadable)) rsPackColorTo565(float r, float g, float b);
472a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams//extern uchar4 __attribute__((overloadable)) rsPackColorTo565(float3);
482a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams//extern float4 rsUnpackColor565(uchar4);
492a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams
502a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams
517fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
527fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams// Matrix ops
537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
547fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v) {
577fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[row * 4 + col] = v;
587fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
607fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float __attribute__((overloadable))
617fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col) {
627fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return m->m[row * 4 + col];
637fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
647fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
657fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
667fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v) {
677fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[row * 3 + col] = v;
687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
697fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
707fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float __attribute__((overloadable))
717fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col) {
727fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return m->m[row * 3 + col];
737fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
747fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
757fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
767fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v) {
777fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[row * 2 + col] = v;
787fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
797fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
807fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float __attribute__((overloadable))
817fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col) {
827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return m->m[row * 2 + col];
837fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
857fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
867fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadIdentity(rs_matrix4x4 *m) {
877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = 1.f;
887fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = 0.f;
897fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = 0.f;
907fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = 0.f;
917fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = 0.f;
927fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = 1.f;
937fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = 0.f;
947fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = 0.f;
957fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = 0.f;
967fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[9] = 0.f;
977fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = 1.f;
987fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11] = 0.f;
997fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12] = 0.f;
1007fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13] = 0.f;
1017fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14] = 0.f;
1027fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15] = 1.f;
1037fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1047fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1057fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1067fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadIdentity(rs_matrix3x3 *m) {
1077fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = 1.f;
1087fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = 0.f;
1097fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = 0.f;
1107fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = 0.f;
1117fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = 1.f;
1127fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = 0.f;
1137fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = 0.f;
1147fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = 0.f;
1157fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = 1.f;
1167fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1177fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1187fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1197fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadIdentity(rs_matrix2x2 *m) {
1207fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = 1.f;
1217fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = 0.f;
1227fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = 0.f;
1237fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = 1.f;
1247fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1257fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1267fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1277fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix4x4 *m, const float *v) {
1287fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v[0];
1297fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v[1];
1307fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v[2];
1317fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = v[3];
1327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = v[4];
1337fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = v[5];
1347fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = v[6];
1357fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = v[7];
1367fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = v[8];
1377fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[9] = v[9];
1387fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = v[10];
1397fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11] = v[11];
1407fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12] = v[12];
1417fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13] = v[13];
1427fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14] = v[14];
1437fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15] = v[15];
1447fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1457fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1467fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1477fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix3x3 *m, const float *v) {
1487fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v[0];
1497fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v[1];
1507fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v[2];
1517fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = v[3];
1527fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = v[4];
1537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = v[5];
1547fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = v[6];
1557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = v[7];
1567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = v[8];
1577fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1587fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1607fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix2x2 *m, const float *v) {
1617fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v[0];
1627fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v[1];
1637fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v[2];
1647fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = v[3];
1657fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1667fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1677fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v) {
1697fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v->m[0];
1707fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v->m[1];
1717fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v->m[2];
1727fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = v->m[3];
1737fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = v->m[4];
1747fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = v->m[5];
1757fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = v->m[6];
1767fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = v->m[7];
1777fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = v->m[8];
1787fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[9] = v->m[9];
1797fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = v->m[10];
1807fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11] = v->m[11];
1817fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12] = v->m[12];
1827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13] = v->m[13];
1837fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14] = v->m[14];
1847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15] = v->m[15];
1857fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
1867fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
1877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
1887fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v) {
1897fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v->m[0];
1907fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v->m[1];
1917fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v->m[2];
1927fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = 0.f;
1937fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = v->m[3];
1947fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = v->m[4];
1957fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = v->m[5];
1967fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = 0.f;
1977fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = v->m[6];
1987fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[9] = v->m[7];
1997fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = v->m[8];
2007fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11] = 0.f;
2017fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12] = 0.f;
2027fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13] = 0.f;
2037fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14] = 0.f;
2047fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15] = 1.f;
2057fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
2067fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2077fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
2087fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v) {
2097fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v->m[0];
2107fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v->m[1];
2117fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = 0.f;
2127fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = 0.f;
2137fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = v->m[3];
2147fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = v->m[4];
2157fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = 0.f;
2167fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = 0.f;
2177fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = v->m[6];
2187fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[9] = v->m[7];
2197fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = 1.f;
2207fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11] = 0.f;
2217fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12] = 0.f;
2227fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13] = 0.f;
2237fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14] = 0.f;
2247fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15] = 1.f;
2257fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
2267fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2277fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
2287fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v) {
2297fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v->m[0];
2307fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v->m[1];
2317fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v->m[2];
2327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = v->m[3];
2337fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[4] = v->m[4];
2347fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = v->m[5];
2357fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[6] = v->m[6];
2367fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = v->m[7];
2377fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = v->m[8];
2387fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
2397fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2407fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
2417fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v) {
2427fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = v->m[0];
2437fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[1] = v->m[1];
2447fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[2] = v->m[2];
2457fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = v->m[3];
2467fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
2477fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2487fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
2497fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z) {
2507fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float c, s;
2517fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[3] = 0;
2527fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[7] = 0;
2537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11]= 0;
2547fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12]= 0;
2557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13]= 0;
2567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14]= 0;
2577fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15]= 1;
2587fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rot *= (float)(M_PI / 180.0f);
2597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    c = cos(rot);
2607fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    s = sin(rot);
2617fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2627fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float len = x*x + y*y + z*z;
2637fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    if (!(len != 1)) {
2647fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        const float recipLen = 1.f / sqrt(len);
2657fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        x *= recipLen;
2667fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        y *= recipLen;
2677fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        z *= recipLen;
2687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    }
2697fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float nc = 1.0f - c;
2707fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float xy = x * y;
2717fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float yz = y * z;
2727fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float zx = z * x;
2737fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float xs = x * s;
2747fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float ys = y * s;
2757fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    const float zs = z * s;
2767fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 0] = x*x*nc +  c;
2777fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 4] =  xy*nc - zs;
2787fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 8] =  zx*nc + ys;
2797fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 1] =  xy*nc + zs;
2807fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 5] = y*y*nc +  c;
2817fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 9] =  yz*nc - xs;
2827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 2] =  zx*nc - ys;
2837fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[ 6] =  yz*nc + xs;
2847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = z*z*nc +  c;
2857fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
2867fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
2887fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z) {
2897fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadIdentity(m);
2907fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = x;
2917fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = y;
2927fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10] = z;
2937fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
2947fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2957fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
2967fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z) {
2977fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadIdentity(m);
2987fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12] = x;
2997fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13] = y;
3007fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14] = z;
3017fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3027fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3037fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3047fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs) {
3057fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    for (int i=0 ; i<4 ; i++) {
3067fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri0 = 0;
3077fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri1 = 0;
3087fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri2 = 0;
3097fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri3 = 0;
3107fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        for (int j=0 ; j<4 ; j++) {
3117fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            const float rhs_ij = rsMatrixGet(rhs, i,j);
3127fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
3137fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
3147fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij;
3157fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri3 += rsMatrixGet(lhs, j, 3) * rhs_ij;
3167fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        }
3177fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 0, ri0);
3187fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 1, ri1);
3197fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 2, ri2);
3207fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 3, ri3);
3217fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    }
3227fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3237fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3247fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3257fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs) {
3267fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rs_matrix4x4 mt;
3277fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadMultiply(&mt, m, rhs);
3287fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoad(m, &mt);
3297fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3307fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3317fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs) {
3337fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    for (int i=0 ; i<3 ; i++) {
3347fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri0 = 0;
3357fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri1 = 0;
3367fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri2 = 0;
3377fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        for (int j=0 ; j<3 ; j++) {
3387fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            const float rhs_ij = rsMatrixGet(rhs, i,j);
3397fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
3407fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
3417fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri2 += rsMatrixGet(lhs, j, 2) * rhs_ij;
3427fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        }
3437fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 0, ri0);
3447fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 1, ri1);
3457fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 2, ri2);
3467fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    }
3477fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3487fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3497fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3507fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs) {
3517fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rs_matrix3x3 mt;
3527fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadMultiply(&mt, m, rhs);
3537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoad(m, &mt);
3547fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3577fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs) {
3587fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    for (int i=0 ; i<2 ; i++) {
3597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri0 = 0;
3607fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        float ri1 = 0;
3617fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        for (int j=0 ; j<2 ; j++) {
3627fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            const float rhs_ij = rsMatrixGet(rhs, i,j);
3637fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri0 += rsMatrixGet(lhs, j, 0) * rhs_ij;
3647fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams            ri1 += rsMatrixGet(lhs, j, 1) * rhs_ij;
3657fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        }
3667fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 0, ri0);
3677fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams        rsMatrixSet(m, i, 1, ri1);
3687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    }
3697fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3707fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3717fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3727fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs) {
3737fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rs_matrix2x2 mt;
3747fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadMultiply(&mt, m, rhs);
3757fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoad(m, &mt);
3767fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3777fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3787fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3797fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z) {
3807fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rs_matrix4x4 m1;
3817fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadRotate(&m1, rot, x, y, z);
3827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixMultiply(m, &m1);
3837fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3857fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3867fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixScale(rs_matrix4x4 *m, float x, float y, float z) {
3877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rs_matrix4x4 m1;
3887fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadScale(&m1, x, y, z);
3897fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixMultiply(m, &m1);
3907fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3917fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3927fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
3937fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z) {
3947fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rs_matrix4x4 m1;
3957fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadTranslate(&m1, x, y, z);
3967fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixMultiply(m, &m1);
3977fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
3987fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
3997fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
4007fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far) {
4017fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadIdentity(m);
4027fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = 2.f / (right - left);
4037fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = 2.f / (top - bottom);
4047fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10]= -2.f / (far - near);
4057fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[12]= -(right + left) / (right - left);
4067fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[13]= -(top + bottom) / (top - bottom);
4077fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14]= -(far + near) / (far - near);
4087fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4097fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4107fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic void __attribute__((overloadable))
4117fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far) {
4127fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    rsMatrixLoadIdentity(m);
4137fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[0] = 2.f * near / (right - left);
4147fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[5] = 2.f * near / (top - bottom);
4157fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[8] = (right + left) / (right - left);
4167fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[9] = (top + bottom) / (top - bottom);
4177fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[10]= -(far + near) / (far - near);
4187fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[11]= -1.f;
4197fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[14]= -2.f * far * near / (far - near);
4207fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    m->m[15]= 0.f;
4217fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4227fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4237fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float4 __attribute__((overloadable))
4247fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, float4 in) {
4257fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float4 ret;
4267fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + (m->m[12] * in.w);
4277fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + (m->m[13] * in.w);
4287fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + (m->m[14] * in.w);
4297fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + (m->m[15] * in.w);
4307fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return ret;
4317fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4337fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float4 __attribute__((overloadable))
4347fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, float3 in) {
4357fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float4 ret;
4367fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + (m->m[8] * in.z) + m->m[12];
4377fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + (m->m[9] * in.z) + m->m[13];
4387fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + (m->m[10] * in.z) + m->m[14];
4397fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + (m->m[11] * in.z) + m->m[15];
4407fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return ret;
4417fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4427fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4437fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float4 __attribute__((overloadable))
4447fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, float2 in) {
4457fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float4 ret;
4467fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.x = (m->m[0] * in.x) + (m->m[4] * in.y) + m->m[12];
4477fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.y = (m->m[1] * in.x) + (m->m[5] * in.y) + m->m[13];
4487fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.z = (m->m[2] * in.x) + (m->m[6] * in.y) + m->m[14];
4497fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.w = (m->m[3] * in.x) + (m->m[7] * in.y) + m->m[15];
4507fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return ret;
4517fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4527fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float3 __attribute__((overloadable))
4547fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, float3 in) {
4557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float3 ret;
4567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.x = (m->m[0] * in.x) + (m->m[3] * in.y) + (m->m[6] * in.z);
4577fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.y = (m->m[1] * in.x) + (m->m[4] * in.y) + (m->m[7] * in.z);
4587fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.z = (m->m[2] * in.x) + (m->m[5] * in.y) + (m->m[8] * in.z);
4597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return ret;
4607fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4617fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4627fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float3 __attribute__((overloadable))
4637fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, float2 in) {
4647fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float3 ret;
4657fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.x = (m->m[0] * in.x) + (m->m[3] * in.y);
4667fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.y = (m->m[1] * in.x) + (m->m[4] * in.y);
4677fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.z = (m->m[2] * in.x) + (m->m[5] * in.y);
4687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return ret;
4697fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4707fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4717fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Samsstatic float2 __attribute__((overloadable))
4727fe6bce13c30b8d14dc833e06468666d28e56ee1Jason SamsrsMatrixMultiply(rs_matrix2x2 *m, float2 in) {
4737fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    float2 ret;
4747fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.x = (m->m[0] * in.x) + (m->m[2] * in.y);
4757fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    ret.y = (m->m[1] * in.x) + (m->m[3] * in.y);
4767fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return ret;
4777fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4787fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4797fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
4807fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams// int ops
4817fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
4827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
4837fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams__inline__ static float __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high) {
4847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return amount < low ? low : (amount > high ? high : amount);
4857fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4867fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams__inline__ static float __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high) {
4877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return amount < low ? low : (amount > high ? high : amount);
4887fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4897fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams__inline__ static float __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high) {
4907fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return amount < low ? low : (amount > high ? high : amount);
4917fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4927fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams__inline__ static float __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high) {
4937fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return amount < low ? low : (amount > high ? high : amount);
4947fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4957fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams__inline__ static float __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high) {
4967fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return amount < low ? low : (amount > high ? high : amount);
4977fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
4987fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams__inline__ static float __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high) {
4997fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams    return amount < low ? low : (amount > high ? high : amount);
5007fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams}
5017fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
502275b1e98bb949643d35546f10f8b1af009349526Jason Sams
503275b1e98bb949643d35546f10f8b1af009349526Jason Sams
504275b1e98bb949643d35546f10f8b1af009349526Jason Sams#endif
505275b1e98bb949643d35546f10f8b1af009349526Jason Sams
506