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