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