rs_core.rsh revision 1d526a448325cd9678b12b7de9263a254ec8fdc8
11d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** @file rs_core.rsh 21d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \brief todo-jsams 31d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 41d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * todo-jsams 51d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 61d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 7275b1e98bb949643d35546f10f8b1af009349526Jason Sams#ifndef __RS_CORE_RSH__ 8275b1e98bb949643d35546f10f8b1af009349526Jason Sams#define __RS_CORE_RSH__ 9275b1e98bb949643d35546f10f8b1af009349526Jason Sams 107a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao#define _RS_RUNTIME extern 11f6a28c6a71d8929fb90ca83634a617d69531d87dStephen Hines 1209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 1309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 1409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 159bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 169bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, float); 1709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 1809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 1909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 209bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 219bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, float, float); 2209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 2309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 2409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 259bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 269bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, float, float, float); 2709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 2809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 2909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 309bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 319bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, float, float, float, float); 3209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 3309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 3409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 359bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 36df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines rsDebug(const char *, double); 3709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 3809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 3909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 40df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable)) 419bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, const rs_matrix4x4 *); 4209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 4309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 4409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 459bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 469bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, const rs_matrix3x3 *); 4709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 4809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 4909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 509bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 519bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, const rs_matrix2x2 *); 5209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 5309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 5409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 559bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 569bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, int); 5709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 5809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 5909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 609bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 619bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, uint); 6209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 6309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 6409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 659bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable)) 66df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines rsDebug(const char *, long); 6709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 6809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 6909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 70df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable)) 71df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines rsDebug(const char *, unsigned long); 7209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 7309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 7409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 75df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable)) 76df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines rsDebug(const char *, long long); 7709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 7809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 7909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 80df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable)) 81df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines rsDebug(const char *, unsigned long long); 8209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 8309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 8409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 85df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable)) 869bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao rsDebug(const char *, const void *); 879bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao#define RS_DEBUG(a) rsDebug(#a, a) 889bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao#define RS_DEBUG_MARKER rsDebug(__FILE__, __LINE__) 899bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao 9009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams 9109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 9209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 9309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 947a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float2 v); 9509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 9609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 9709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 987a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float3 v); 9909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 10009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function. Prints a string and value to the log. 10109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1027a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float4 v); 103275b1e98bb949643d35546f10f8b1af009349526Jason Sams 10409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams 10509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 10609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGB values into a uchar4. The alpha component is 10709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * set to 255 (1.0). 10809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 10909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param r 11009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param g 11109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param b 11209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 11309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4 11409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1157a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b); 116275b1e98bb949643d35546f10f8b1af009349526Jason Sams 11709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 11809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGBA values into a uchar4. 11909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 12009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param r 12109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param g 12209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param b 12309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param a 12409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 12509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4 12609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1277a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a); 128275b1e98bb949643d35546f10f8b1af009349526Jason Sams 12909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 13009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGB values into a uchar4. The alpha component is 13109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * set to 255 (1.0). 13209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 13309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param color 13409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 13509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4 13609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1377a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color); 138275b1e98bb949643d35546f10f8b1af009349526Jason Sams 13909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 14009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGBA values into a uchar4. 14109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 14209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param color 14309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 14409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4 14509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1467a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color); 147275b1e98bb949643d35546f10f8b1af009349526Jason Sams 14809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 14909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Unpack a uchar4 color to float4. The resulting float range will be (0-1). 15009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 15109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param c 15209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 15309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return float4 15409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1557a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 rsUnpackColor8888(uchar4 c); 156275b1e98bb949643d35546f10f8b1af009349526Jason Sams 1572a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams 1587fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams///////////////////////////////////////////////////// 1597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams// Matrix ops 1607fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams///////////////////////////////////////////////////// 1617fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 16209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 16309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set one element of a matrix. 16409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 16509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m The matrix to be set 16609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param row 16709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param col 16809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param v 16909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 17009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return void 17109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 1727a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) 1737a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v); 1741d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 1751d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 1761d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 1777a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) 1787a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v); 1791d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 1801d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 1811d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 1827a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) 1837a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v); 1847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 18509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 18609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Get one element of a matrix. 18709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 18809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m The matrix to read from 18909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param row 19009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param col 19109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 19209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return float 19309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 19409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams_RS_RUNTIME float __attribute__((overloadable)) 19509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason SamsrsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col); 1961d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 1971d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 1981d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 19909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams_RS_RUNTIME float __attribute__((overloadable)) 20009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason SamsrsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col); 2011d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2021d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2031d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 2047a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float __attribute__((overloadable)) 2057a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col); 2067fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 20709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 20809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set the elements of a matrix to the identity matrix. 20909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 21009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m 21109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 212693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m); 2131d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2141d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2151d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 216693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m); 2171d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2181d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2191d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 220693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m); 22109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams 22209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 22309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set the elements of a matrix from an array of floats. 22409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 22509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m 22609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 227693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v); 2281d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2291d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2301d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 231693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v); 2321d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2331d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2341d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 235693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v); 2361d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2371d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2381d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 2391d526a448325cd9678b12b7de9263a254ec8fdc8Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v); 2401d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2411d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2421d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 2431d526a448325cd9678b12b7de9263a254ec8fdc8Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v); 24409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams 24509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 24609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set the elements of a matrix from another matrix. 24709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 24809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m 24909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 250693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v); 2511d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2521d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2531d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 254693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v); 2551d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2561d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 2571d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 258693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v); 2597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 26009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/** 26109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Load a rotation matrix. 26209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * 26309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m 26409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param rot 26509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param x 26609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param y 26709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param z 26809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */ 269693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 270693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); 2717fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 2721d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2731d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Load a scale matrix. 2741d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 2751d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 2761d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x 2771d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y 2781d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param z 2791d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 280693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 281693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z); 2827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 2831d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2841d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Load a translation matrix. 2851d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 2861d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 2871d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x 2881d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y 2891d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param z 2901d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 291693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 292693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z); 2937fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 2941d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 2951d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiply two matrix (lhs, rhs) and place the result in m. 2961d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 2971d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 2981d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param lhs 2991d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rhs 3001d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 301693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 302693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs); 3031d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3041d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 3051d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 306693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 307693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs); 3081d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3091d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 3101d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 311693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 312693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs); 3137fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3141d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3151d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiply the matrix m by rhs and place the result back into m. 3161d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3171d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m (lhs) 3181d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rhs 3191d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 3201d526a448325cd9678b12b7de9263a254ec8fdc8Jason Samsextern void __attribute__((overloadable)) 3211d526a448325cd9678b12b7de9263a254ec8fdc8Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs); 3221d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3231d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 3241d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 3251d526a448325cd9678b12b7de9263a254ec8fdc8Jason Samsextern void __attribute__((overloadable)) 3261d526a448325cd9678b12b7de9263a254ec8fdc8Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs); 3271d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3281d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 3291d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 330693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 331693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs); 3327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3331d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3341d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiple matrix m with a rotation matrix 3351d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3361d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 3371d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rot 3381d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x 3391d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y 3401d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param z 3411d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 342693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 343693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); 3447fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3451d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3461d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiple matrix m with a scale matrix 3471d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3481d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 3491d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x 3501d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y 3511d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param z 3521d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 353693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 354693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixScale(rs_matrix4x4 *m, float x, float y, float z); 3557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3561d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3571d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiple matrix m with a translation matrix 3581d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3591d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 3601d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x 3611d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y 3621d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param z 3631d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 364693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 365693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z); 3667fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3671d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3681d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Load an Ortho projection matrix constructed from the 6 planes 3691d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3701d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 3711d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param left 3721d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param right 3731d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param bottom 3741d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param top 3751d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param near 3761d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param far 3771d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 378693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 379693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); 3807fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3811d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3821d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Load an Frustum projection matrix constructed from the 6 planes 3831d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3841d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 3851d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param left 3861d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param right 3871d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param bottom 3881d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param top 3891d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param near 3901d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param far 3911d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 392693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 393693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); 3947fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 3951d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 3961d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Load an perspective projection matrix constructed from the 6 planes 3971d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 3981d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 3991d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param fovy Field of view, in degrees along the Y axis. 4001d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param aspect Ratio of x / y. 4011d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param near 4021d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param far 4031d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 404693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) 405693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); 406c8dc45cc95cd144038c153f3a4657527d5a7c0b6Alex Sakhartchouk 407eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#if !defined(RS_VERSION) || (RS_VERSION < 14) 4081d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4091d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiply a vector by a matrix and return the result vector. 4101d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * API version 10-13 4111d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 4127a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 __attribute__((overloadable)) 4137a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix4x4 *m, float4 in); 4147fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 4151d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4161d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4171d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 4187a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 __attribute__((overloadable)) 4197a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix4x4 *m, float3 in); 4207fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 4211d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4221d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4231d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 4247a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 __attribute__((overloadable)) 4257a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix4x4 *m, float2 in); 4267fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 4271d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4281d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4291d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 4307a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float3 __attribute__((overloadable)) 4317a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix3x3 *m, float3 in); 4327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 4331d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4341d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4351d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 4367a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float3 __attribute__((overloadable)) 4377a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix3x3 *m, float2 in); 4387fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 4391d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4401d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4411d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 4427a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float2 __attribute__((overloadable)) 4437a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix2x2 *m, float2 in); 444eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#else 4451d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4461d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiply a vector by a matrix and return the result vector. 4471d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * API version 10-13 4481d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 449eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 450eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float4 in); 451eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams 4521d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4531d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4541d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 455eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 456eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float3 in); 457eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams 4581d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4591d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4601d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 461eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 462eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float2 in); 463eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams 4641d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4651d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4661d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 467eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float3 __attribute__((overloadable)) 468eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float3 in); 469eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams 4701d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4711d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4721d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 473eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float3 __attribute__((overloadable)) 474eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float2 in); 475eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams 4761d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4771d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 4781d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 479eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float2 __attribute__((overloadable)) 480eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix2x2 *m, float2 in); 481eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#endif 4827fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 4831d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 4841d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4851d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Returns true if the matrix was successfully inversed 4861d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 4871d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 4881d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 489693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m); 4901d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 4911d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4921d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Returns true if the matrix was successfully inversed and transposed. 4931d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 4941d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 4951d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 496693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m); 4971d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 4981d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 4991d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Transpose the matrix m. 5001d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 5011d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m 5021d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 503693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m); 5041d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5051d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 5061d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 507693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m); 5081d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5091d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 5101d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 511693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m); 51220c6c1febce7cdf398c58287bf506b3a4a210285Alex Sakhartchouk 51329858059ffff967607f7583ae9146dc4c720f92eAlex Sakhartchouk///////////////////////////////////////////////////// 5147e90cb90349e7e5b0cef362781830d519c20200aJason Sams// quaternion ops 5157e90cb90349e7e5b0cef362781830d519c20200aJason Sams///////////////////////////////////////////////////// 5167e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5171d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5181d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Set the quaternion components 5191d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param w component 5201d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x component 5211d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y component 5221d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param z component 5231d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 5241cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable)) 5257e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionSet(rs_quaternion *q, float w, float x, float y, float z) { 5267e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->w = w; 5277e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x = x; 5287e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y = y; 5297e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z = z; 5307e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 5317e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5321d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5331d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Set the quaternion from another quaternion 5341d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q destination quaternion 5351d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rhs source quaternion 5361d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 5371cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable)) 5387e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionSet(rs_quaternion *q, const rs_quaternion *rhs) { 5397e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->w = rhs->w; 5407e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x = rhs->x; 5417e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y = rhs->y; 5427e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z = rhs->z; 5437e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 5447e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5451d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5461d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiply quaternion by a scalar 5471d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q quaternion to multiply 5481d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param s scalar 5491d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 5501cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable)) 5517e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionMultiply(rs_quaternion *q, float s) { 5527e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->w *= s; 5537e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x *= s; 5547e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y *= s; 5557e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z *= s; 5567e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 5577e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5581d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5591d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Multiply quaternion by another quaternion 5601d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q destination quaternion 5611d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rhs right hand side quaternion to multiply by 5621d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 5631cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable)) 5647e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) { 5657e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->w = -q->x*rhs->x - q->y*rhs->y - q->z*rhs->z + q->w*rhs->w; 5667e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x = q->x*rhs->w + q->y*rhs->z - q->z*rhs->y + q->w*rhs->x; 5677e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y = -q->x*rhs->z + q->y*rhs->w + q->z*rhs->x + q->w*rhs->y; 5687e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z = q->x*rhs->y - q->y*rhs->x + q->z*rhs->w + q->w*rhs->z; 5697e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 5707e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5711d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5721d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Add two quaternions 5731d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q destination quaternion to add to 5741d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rsh right hand side quaternion to add 5751d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 5761cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void 5777e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionAdd(rs_quaternion *q, const rs_quaternion *rhs) { 5787e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->w *= rhs->w; 5797e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x *= rhs->x; 5807e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y *= rhs->y; 5817e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z *= rhs->z; 5827e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 5837e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5841d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 5851d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Loads a quaternion that represents a rotation about an arbitrary unit vector 5861d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q quaternion to set 5871d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rot angle to rotate by 5881d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x component of a vector 5891d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y component of a vector 5901d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x component of a vector 5911d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 5921cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void 5937e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionLoadRotateUnit(rs_quaternion *q, float rot, float x, float y, float z) { 5947e90cb90349e7e5b0cef362781830d519c20200aJason Sams rot *= (float)(M_PI / 180.0f) * 0.5f; 5957e90cb90349e7e5b0cef362781830d519c20200aJason Sams float c = cos(rot); 5967e90cb90349e7e5b0cef362781830d519c20200aJason Sams float s = sin(rot); 5977e90cb90349e7e5b0cef362781830d519c20200aJason Sams 5987e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->w = c; 5997e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x = x * s; 6007e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y = y * s; 6017e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z = z * s; 6027e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 6037e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6041d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 6051d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Loads a quaternion that represents a rotation about an arbitrary vector 6061d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * (doesn't have to be unit) 6071d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q quaternion to set 6081d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param rot angle to rotate by 6091d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x component of a vector 6101d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param y component of a vector 6111d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param x component of a vector 6121d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 6131cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void 6147e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionLoadRotate(rs_quaternion *q, float rot, float x, float y, float z) { 6157e90cb90349e7e5b0cef362781830d519c20200aJason Sams const float len = x*x + y*y + z*z; 6167e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (len != 1) { 6177e90cb90349e7e5b0cef362781830d519c20200aJason Sams const float recipLen = 1.f / sqrt(len); 6187e90cb90349e7e5b0cef362781830d519c20200aJason Sams x *= recipLen; 6197e90cb90349e7e5b0cef362781830d519c20200aJason Sams y *= recipLen; 6207e90cb90349e7e5b0cef362781830d519c20200aJason Sams z *= recipLen; 6217e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 6227e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionLoadRotateUnit(q, rot, x, y, z); 6237e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 6247e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6251d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 6261d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Conjugates the quaternion 6271d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q quaternion to conjugate 6281d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 6291cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void 6307e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionConjugate(rs_quaternion *q) { 6317e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->x = -q->x; 6327e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->y = -q->y; 6337e90cb90349e7e5b0cef362781830d519c20200aJason Sams q->z = -q->z; 6347e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 6357e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6361d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 6371d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Dot product of two quaternions 6381d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q0 first quaternion 6391d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q1 second quaternion 6401d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @return dot product between q0 and q1 6411d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 6421cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic float 6437e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionDot(const rs_quaternion *q0, const rs_quaternion *q1) { 6447e90cb90349e7e5b0cef362781830d519c20200aJason Sams return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z; 6457e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 6467e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6471d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 6481d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Normalizes the quaternion 6491d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q quaternion to normalize 6501d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 6511cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void 6527e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionNormalize(rs_quaternion *q) { 6537e90cb90349e7e5b0cef362781830d519c20200aJason Sams const float len = rsQuaternionDot(q, q); 6547e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (len != 1) { 6557e90cb90349e7e5b0cef362781830d519c20200aJason Sams const float recipLen = 1.f / sqrt(len); 6567e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionMultiply(q, recipLen); 6577e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 6587e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 6597e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6601d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 6611d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Performs spherical linear interpolation between two quaternions 6621d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q result quaternion from interpolation 6631d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q0 first param 6641d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param q1 second param 6651d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param t how much to interpolate by 6661d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 6671cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void 6687e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionSlerp(rs_quaternion *q, const rs_quaternion *q0, const rs_quaternion *q1, float t) { 6697e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (t <= 0.0f) { 6707e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionSet(q, q0); 6717e90cb90349e7e5b0cef362781830d519c20200aJason Sams return; 6727e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 6737e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (t >= 1.0f) { 6747e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionSet(q, q1); 6757e90cb90349e7e5b0cef362781830d519c20200aJason Sams return; 6767e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 6777e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6787e90cb90349e7e5b0cef362781830d519c20200aJason Sams rs_quaternion tempq0, tempq1; 6797e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionSet(&tempq0, q0); 6807e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionSet(&tempq1, q1); 6817e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6827e90cb90349e7e5b0cef362781830d519c20200aJason Sams float angle = rsQuaternionDot(q0, q1); 6837e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (angle < 0) { 6847e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionMultiply(&tempq0, -1.0f); 6857e90cb90349e7e5b0cef362781830d519c20200aJason Sams angle *= -1.0f; 6867e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 6877e90cb90349e7e5b0cef362781830d519c20200aJason Sams 6887e90cb90349e7e5b0cef362781830d519c20200aJason Sams float scale, invScale; 6897e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (angle + 1.0f > 0.05f) { 6907e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (1.0f - angle >= 0.05f) { 6917e90cb90349e7e5b0cef362781830d519c20200aJason Sams float theta = acos(angle); 6927e90cb90349e7e5b0cef362781830d519c20200aJason Sams float invSinTheta = 1.0f / sin(theta); 6937e90cb90349e7e5b0cef362781830d519c20200aJason Sams scale = sin(theta * (1.0f - t)) * invSinTheta; 6947e90cb90349e7e5b0cef362781830d519c20200aJason Sams invScale = sin(theta * t) * invSinTheta; 6957e90cb90349e7e5b0cef362781830d519c20200aJason Sams } else { 6967e90cb90349e7e5b0cef362781830d519c20200aJason Sams scale = 1.0f - t; 6977e90cb90349e7e5b0cef362781830d519c20200aJason Sams invScale = t; 6987e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 6997e90cb90349e7e5b0cef362781830d519c20200aJason Sams } else { 7007e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w); 7017e90cb90349e7e5b0cef362781830d519c20200aJason Sams scale = sin(M_PI * (0.5f - t)); 7027e90cb90349e7e5b0cef362781830d519c20200aJason Sams invScale = sin(M_PI * t); 7037e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 7047e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7057e90cb90349e7e5b0cef362781830d519c20200aJason Sams rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale, 7067e90cb90349e7e5b0cef362781830d519c20200aJason Sams tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale); 7077e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 7087e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7091d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 7101d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Computes rotation matrix from the normalized quaternion 7111d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param m resulting matrix 7121d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param p normalized quaternion 7131d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 7141cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) { 7157e90cb90349e7e5b0cef362781830d519c20200aJason Sams float x2 = 2.0f * q->x * q->x; 7167e90cb90349e7e5b0cef362781830d519c20200aJason Sams float y2 = 2.0f * q->y * q->y; 7177e90cb90349e7e5b0cef362781830d519c20200aJason Sams float z2 = 2.0f * q->z * q->z; 7187e90cb90349e7e5b0cef362781830d519c20200aJason Sams float xy = 2.0f * q->x * q->y; 7197e90cb90349e7e5b0cef362781830d519c20200aJason Sams float wz = 2.0f * q->w * q->z; 7207e90cb90349e7e5b0cef362781830d519c20200aJason Sams float xz = 2.0f * q->x * q->z; 7217e90cb90349e7e5b0cef362781830d519c20200aJason Sams float wy = 2.0f * q->w * q->y; 7227e90cb90349e7e5b0cef362781830d519c20200aJason Sams float wx = 2.0f * q->w * q->x; 7237e90cb90349e7e5b0cef362781830d519c20200aJason Sams float yz = 2.0f * q->y * q->z; 7247e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7257e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[0] = 1.0f - y2 - z2; 7267e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[1] = xy - wz; 7277e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[2] = xz + wy; 7287e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[3] = 0.0f; 7297e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7307e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[4] = xy + wz; 7317e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[5] = 1.0f - x2 - z2; 7327e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[6] = yz - wx; 7337e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[7] = 0.0f; 7347e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7357e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[8] = xz - wy; 7367e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[9] = yz - wx; 7377e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[10] = 1.0f - x2 - y2; 7387e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[11] = 0.0f; 7397e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7407e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[12] = 0.0f; 7417e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[13] = 0.0f; 7427e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[14] = 0.0f; 7437e90cb90349e7e5b0cef362781830d519c20200aJason Sams m->m[15] = 1.0f; 7447e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 7457e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7467e90cb90349e7e5b0cef362781830d519c20200aJason Sams///////////////////////////////////////////////////// 7477e90cb90349e7e5b0cef362781830d519c20200aJason Sams// utility funcs 7487e90cb90349e7e5b0cef362781830d519c20200aJason Sams///////////////////////////////////////////////////// 7491d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 7501d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 7511d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Computes 6 frustum planes from the view projection matrix 7521d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param viewProj matrix to extract planes from 7531d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param left plane 7541d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param right plane 7551d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param top plane 7561d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param bottom plane 7571d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param near plane 7581d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param far plane 7591d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 7601cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hines__inline__ static void __attribute__((overloadable, always_inline)) 7611d526a448325cd9678b12b7de9263a254ec8fdc8Jason SamsrsExtractFrustumPlanes(const rs_matrix4x4 *viewProj, 7627e90cb90349e7e5b0cef362781830d519c20200aJason Sams float4 *left, float4 *right, 7637e90cb90349e7e5b0cef362781830d519c20200aJason Sams float4 *top, float4 *bottom, 7647e90cb90349e7e5b0cef362781830d519c20200aJason Sams float4 *near, float4 *far) { 7657e90cb90349e7e5b0cef362781830d519c20200aJason Sams // x y z w = a b c d in the plane equation 7661d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams left->x = viewProj->m[3] + viewProj->m[0]; 7671d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams left->y = viewProj->m[7] + viewProj->m[4]; 7681d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams left->z = viewProj->m[11] + viewProj->m[8]; 7691d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams left->w = viewProj->m[15] + viewProj->m[12]; 7701d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 7711d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams right->x = viewProj->m[3] - viewProj->m[0]; 7721d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams right->y = viewProj->m[7] - viewProj->m[4]; 7731d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams right->z = viewProj->m[11] - viewProj->m[8]; 7741d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams right->w = viewProj->m[15] - viewProj->m[12]; 7751d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 7761d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams top->x = viewProj->m[3] - viewProj->m[1]; 7771d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams top->y = viewProj->m[7] - viewProj->m[5]; 7781d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams top->z = viewProj->m[11] - viewProj->m[9]; 7791d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams top->w = viewProj->m[15] - viewProj->m[13]; 7801d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 7811d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams bottom->x = viewProj->m[3] + viewProj->m[1]; 7821d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams bottom->y = viewProj->m[7] + viewProj->m[5]; 7831d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams bottom->z = viewProj->m[11] + viewProj->m[9]; 7841d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams bottom->w = viewProj->m[15] + viewProj->m[13]; 7851d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 7861d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams near->x = viewProj->m[3] + viewProj->m[2]; 7871d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams near->y = viewProj->m[7] + viewProj->m[6]; 7881d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams near->z = viewProj->m[11] + viewProj->m[10]; 7891d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams near->w = viewProj->m[15] + viewProj->m[14]; 7901d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 7911d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams far->x = viewProj->m[3] - viewProj->m[2]; 7921d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams far->y = viewProj->m[7] - viewProj->m[6]; 7931d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams far->z = viewProj->m[11] - viewProj->m[10]; 7941d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams far->w = viewProj->m[15] - viewProj->m[14]; 7957e90cb90349e7e5b0cef362781830d519c20200aJason Sams 7967e90cb90349e7e5b0cef362781830d519c20200aJason Sams float len = length(left->xyz); 7977e90cb90349e7e5b0cef362781830d519c20200aJason Sams *left /= len; 7987e90cb90349e7e5b0cef362781830d519c20200aJason Sams len = length(right->xyz); 7997e90cb90349e7e5b0cef362781830d519c20200aJason Sams *right /= len; 8007e90cb90349e7e5b0cef362781830d519c20200aJason Sams len = length(top->xyz); 8017e90cb90349e7e5b0cef362781830d519c20200aJason Sams *top /= len; 8027e90cb90349e7e5b0cef362781830d519c20200aJason Sams len = length(bottom->xyz); 8037e90cb90349e7e5b0cef362781830d519c20200aJason Sams *bottom /= len; 8047e90cb90349e7e5b0cef362781830d519c20200aJason Sams len = length(near->xyz); 8057e90cb90349e7e5b0cef362781830d519c20200aJason Sams *near /= len; 8067e90cb90349e7e5b0cef362781830d519c20200aJason Sams len = length(far->xyz); 8077e90cb90349e7e5b0cef362781830d519c20200aJason Sams *far /= len; 8087e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 8097e90cb90349e7e5b0cef362781830d519c20200aJason Sams 8101d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8111d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Checks if a sphere is withing the 6 frustum planes 8121d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param sphere float4 representing the sphere 8131d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param left plane 8141d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param right plane 8151d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param top plane 8161d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param bottom plane 8171d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param near plane 8181d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param far plane 8191d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8201cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hines__inline__ static bool __attribute__((overloadable, always_inline)) 8217e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsIsSphereInFrustum(float4 *sphere, 8227e90cb90349e7e5b0cef362781830d519c20200aJason Sams float4 *left, float4 *right, 8237e90cb90349e7e5b0cef362781830d519c20200aJason Sams float4 *top, float4 *bottom, 8247e90cb90349e7e5b0cef362781830d519c20200aJason Sams float4 *near, float4 *far) { 8257e90cb90349e7e5b0cef362781830d519c20200aJason Sams 8267e90cb90349e7e5b0cef362781830d519c20200aJason Sams float distToCenter = dot(left->xyz, sphere->xyz) + left->w; 8277e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (distToCenter < -sphere->w) { 8287e90cb90349e7e5b0cef362781830d519c20200aJason Sams return false; 8297e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 8307e90cb90349e7e5b0cef362781830d519c20200aJason Sams distToCenter = dot(right->xyz, sphere->xyz) + right->w; 8317e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (distToCenter < -sphere->w) { 8327e90cb90349e7e5b0cef362781830d519c20200aJason Sams return false; 8337e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 8347e90cb90349e7e5b0cef362781830d519c20200aJason Sams distToCenter = dot(top->xyz, sphere->xyz) + top->w; 8357e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (distToCenter < -sphere->w) { 8367e90cb90349e7e5b0cef362781830d519c20200aJason Sams return false; 8377e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 8387e90cb90349e7e5b0cef362781830d519c20200aJason Sams distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w; 8397e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (distToCenter < -sphere->w) { 8407e90cb90349e7e5b0cef362781830d519c20200aJason Sams return false; 8417e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 8427e90cb90349e7e5b0cef362781830d519c20200aJason Sams distToCenter = dot(near->xyz, sphere->xyz) + near->w; 8437e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (distToCenter < -sphere->w) { 8447e90cb90349e7e5b0cef362781830d519c20200aJason Sams return false; 8457e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 8467e90cb90349e7e5b0cef362781830d519c20200aJason Sams distToCenter = dot(far->xyz, sphere->xyz) + far->w; 8477e90cb90349e7e5b0cef362781830d519c20200aJason Sams if (distToCenter < -sphere->w) { 8487e90cb90349e7e5b0cef362781830d519c20200aJason Sams return false; 8497e90cb90349e7e5b0cef362781830d519c20200aJason Sams } 8507e90cb90349e7e5b0cef362781830d519c20200aJason Sams return true; 8517e90cb90349e7e5b0cef362781830d519c20200aJason Sams} 8527e90cb90349e7e5b0cef362781830d519c20200aJason Sams 8537e90cb90349e7e5b0cef362781830d519c20200aJason Sams 8547e90cb90349e7e5b0cef362781830d519c20200aJason Sams///////////////////////////////////////////////////// 8557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams// int ops 8567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams///////////////////////////////////////////////////// 8577fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 8581d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8591d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * Clamp the value amount between low and high. 8601d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * 8611d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param amount The value to clamp 8621d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param low 8631d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * @param high 8641d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8657a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high); 8661d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams 8671d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8681d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 8691d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8707a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high); 8711d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8721d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 8731d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8747a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high); 8751d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8761d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 8771d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8787a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high); 8791d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8801d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 8811d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8827a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high); 8831d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams/** 8841d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams * \overload 8851d526a448325cd9678b12b7de9263a254ec8fdc8Jason Sams */ 8867a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high); 8877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams 8887a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao#undef _RS_RUNTIME 889275b1e98bb949643d35546f10f8b1af009349526Jason Sams 890275b1e98bb949643d35546f10f8b1af009349526Jason Sams#endif 891