rs_core.rsh revision eb0dfedaf861049858a365d56d67cc85bfcad3c3
1275b1e98bb949643d35546f10f8b1af009349526Jason Sams#ifndef __RS_CORE_RSH__
2275b1e98bb949643d35546f10f8b1af009349526Jason Sams#define __RS_CORE_RSH__
3275b1e98bb949643d35546f10f8b1af009349526Jason Sams
47a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao#define _RS_RUNTIME extern
5f6a28c6a71d8929fb90ca83634a617d69531d87dStephen Hines
609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
99bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
109bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, float);
1109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
1209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
1309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
149bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
159bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, float, float);
1609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
1709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
1809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
199bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
209bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, float, float, float);
2109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
2209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
2309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
249bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
259bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, float, float, float, float);
2609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
2709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
2809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
299bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
30df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    rsDebug(const char *, double);
3109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
3209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
3309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
34df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable))
359bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, const rs_matrix4x4 *);
3609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
3709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
3809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
399bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
409bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, const rs_matrix3x3 *);
4109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
4209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
4309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
449bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
459bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, const rs_matrix2x2 *);
4609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
4709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
4809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
499bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
509bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, int);
5109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
5209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
5309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
549bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
559bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, uint);
5609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
5709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
5809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
599bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liaoextern void __attribute__((overloadable))
60df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    rsDebug(const char *, long);
6109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
6209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
6309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
64df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable))
65df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    rsDebug(const char *, unsigned long);
6609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
6709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
6809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
69df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable))
70df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    rsDebug(const char *, long long);
7109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
7209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
7309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
74df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable))
75df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hines    rsDebug(const char *, unsigned long long);
7609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
7709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
7809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
79df09719cbeb426a4c8279f2ce226b5874ad7c2c9Stephen Hinesextern void __attribute__((overloadable))
809bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao    rsDebug(const char *, const void *);
819bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao#define RS_DEBUG(a) rsDebug(#a, a)
829bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao#define RS_DEBUG_MARKER rsDebug(__FILE__, __LINE__)
839bb32e1fd75e864071f18ef10976e8ba9fc0e252Shih-wei Liao
8409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
8509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
8609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
8709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
887a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float2 v);
8909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
9009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
9109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
927a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float3 v);
9309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
9409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Debug function.  Prints a string and value to the log.
9509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
967a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable)) rsDebug(const char *s, float4 v);
97275b1e98bb949643d35546f10f8b1af009349526Jason Sams
9809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
9909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
10009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGB values into a uchar4.  The alpha component is
10109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * set to 255 (1.0).
10209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
10309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param r
10409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param g
10509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param b
10609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
10709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4
10809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
1097a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b);
110275b1e98bb949643d35546f10f8b1af009349526Jason Sams
11109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
11209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGBA values into a uchar4.
11309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
11409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param r
11509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param g
11609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param b
11709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param a
11809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
11909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4
12009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
1217a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float r, float g, float b, float a);
122275b1e98bb949643d35546f10f8b1af009349526Jason Sams
12309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
12409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGB values into a uchar4.  The alpha component is
12509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * set to 255 (1.0).
12609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
12709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param color
12809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
12909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4
13009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
1317a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float3 color);
132275b1e98bb949643d35546f10f8b1af009349526Jason Sams
13309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
13409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Pack floating point (0-1) RGBA values into a uchar4.
13509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
13609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param color
13709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
13809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return uchar4
13909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
1407a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar4 __attribute__((overloadable)) rsPackColorTo8888(float4 color);
141275b1e98bb949643d35546f10f8b1af009349526Jason Sams
14209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
14309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Unpack a uchar4 color to float4.  The resulting float range will be (0-1).
14409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
14509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param c
14609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
14709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return float4
14809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
1497a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 rsUnpackColor8888(uchar4 c);
150275b1e98bb949643d35546f10f8b1af009349526Jason Sams
1512a63bf6c293d89c8e3725cfb7ee2add3dd3f0246Jason Sams
1527fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
1537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams// Matrix ops
1547fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
1557fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
15609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
15709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set one element of a matrix.
15809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
15909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m The matrix to be set
16009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param row
16109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param col
16209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param v
16309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
16409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return void
16509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
1667a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable))
1677a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
1687a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable))
1697a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
1707a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME void __attribute__((overloadable))
1717a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
1727fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
17309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
17409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Get one element of a matrix.
17509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
17609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m The matrix to read from
17709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param row
17809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param col
17909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
18009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @return float
18109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
18209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams_RS_RUNTIME float __attribute__((overloadable))
18309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason SamsrsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
18409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams_RS_RUNTIME float __attribute__((overloadable))
18509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason SamsrsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
1867a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float __attribute__((overloadable))
1877a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
1887fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
18909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
19009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set the elements of a matrix to the identity matrix.
19109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
19209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m
19309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
194693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m);
195693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m);
196693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m);
19709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
19809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
19909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set the elements of a matrix from an array of floats.
20009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
20109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m
20209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
203693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v);
204693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v);
205693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v);
20609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams
20709aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
20809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Set the elements of a matrix from another matrix.
20909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
21009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m
21109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
212693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v);
213693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v);
214693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v);
215693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v);
216693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v);
2177fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
21809aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams/**
21909aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * Load a rotation matrix.
22009aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams *
22109aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param m
22209aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param rot
22309aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param x
22409aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param y
22509aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams * @param z
22609aeb8ac1b0b976c2de40dd00da0c6841e4e882aJason Sams */
227693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
228693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
2297fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
230693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
231693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
2327fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
233693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
234693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
2357fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
236693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
237693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
2387fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
239693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
240693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
2417fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
242693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
243693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
2447fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
245693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
246693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
2477fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
248693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
249693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
2507fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
251693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
252693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
2537fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
254693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
255693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
2567fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
257693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
258693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
2597fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
260693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
261693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
2627fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
263693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
264693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
2657fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
266693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
267693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
2687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
269693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable))
270693080efdafbf49d675fe5f959f0286f83b30c81Jason SamsrsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
271c8dc45cc95cd144038c153f3a4657527d5a7c0b6Alex Sakhartchouk
272eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#if !defined(RS_VERSION) || (RS_VERSION < 14)
2737a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 __attribute__((overloadable))
2747a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix4x4 *m, float4 in);
2757fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2767a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 __attribute__((overloadable))
2777a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix4x4 *m, float3 in);
2787fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2797a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float4 __attribute__((overloadable))
2807a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix4x4 *m, float2 in);
2817fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2827a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float3 __attribute__((overloadable))
2837a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix3x3 *m, float3 in);
2847fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2857a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float3 __attribute__((overloadable))
2867a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix3x3 *m, float2 in);
2877fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
2887a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME float2 __attribute__((overloadable))
2897a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei LiaorsMatrixMultiply(rs_matrix2x2 *m, float2 in);
290eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#else
291eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float4 __attribute__((overloadable))
292eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float4 in);
293eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams
294eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float4 __attribute__((overloadable))
295eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float3 in);
296eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams
297eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float4 __attribute__((overloadable))
298eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float2 in);
299eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams
300eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float3 __attribute__((overloadable))
301eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float3 in);
302eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams
303eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float3 __attribute__((overloadable))
304eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float2 in);
305eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams
306eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams_RS_RUNTIME float2 __attribute__((overloadable))
307eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason SamsrsMatrixMultiply(const rs_matrix2x2 *m, float2 in);
308eb0dfedaf861049858a365d56d67cc85bfcad3c3Jason Sams#endif
3097fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
31020c6c1febce7cdf398c58287bf506b3a4a210285Alex Sakhartchouk// Returns true if the matrix was successfully inversed
311693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m);
312693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m);
313693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m);
314693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m);
315693080efdafbf49d675fe5f959f0286f83b30c81Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m);
31620c6c1febce7cdf398c58287bf506b3a4a210285Alex Sakhartchouk
31729858059ffff967607f7583ae9146dc4c720f92eAlex Sakhartchouk/////////////////////////////////////////////////////
3187e90cb90349e7e5b0cef362781830d519c20200aJason Sams// quaternion ops
3197e90cb90349e7e5b0cef362781830d519c20200aJason Sams/////////////////////////////////////////////////////
3207e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3211cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable))
3227e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionSet(rs_quaternion *q, float w, float x, float y, float z) {
3237e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->w = w;
3247e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x = x;
3257e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y = y;
3267e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z = z;
3277e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3287e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3291cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable))
3307e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionSet(rs_quaternion *q, const rs_quaternion *rhs) {
3317e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->w = rhs->w;
3327e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x = rhs->x;
3337e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y = rhs->y;
3347e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z = rhs->z;
3357e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3367e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3371cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable))
3387e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionMultiply(rs_quaternion *q, float s) {
3397e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->w *= s;
3407e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x *= s;
3417e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y *= s;
3427e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z *= s;
3437e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3447e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3451cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void __attribute__((overloadable))
3467e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionMultiply(rs_quaternion *q, const rs_quaternion *rhs) {
3477e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->w = -q->x*rhs->x - q->y*rhs->y - q->z*rhs->z + q->w*rhs->w;
3487e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x =  q->x*rhs->w + q->y*rhs->z - q->z*rhs->y + q->w*rhs->x;
3497e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y = -q->x*rhs->z + q->y*rhs->w + q->z*rhs->x + q->w*rhs->y;
3507e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z =  q->x*rhs->y - q->y*rhs->x + q->z*rhs->w + q->w*rhs->z;
3517e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3527e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3531cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void
3547e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionAdd(rs_quaternion *q, const rs_quaternion *rhs) {
3557e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->w *= rhs->w;
3567e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x *= rhs->x;
3577e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y *= rhs->y;
3587e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z *= rhs->z;
3597e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3607e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3611cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void
3627e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionLoadRotateUnit(rs_quaternion *q, float rot, float x, float y, float z) {
3637e90cb90349e7e5b0cef362781830d519c20200aJason Sams    rot *= (float)(M_PI / 180.0f) * 0.5f;
3647e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float c = cos(rot);
3657e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float s = sin(rot);
3667e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3677e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->w = c;
3687e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x = x * s;
3697e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y = y * s;
3707e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z = z * s;
3717e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3727e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3731cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void
3747e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionLoadRotate(rs_quaternion *q, float rot, float x, float y, float z) {
3757e90cb90349e7e5b0cef362781830d519c20200aJason Sams    const float len = x*x + y*y + z*z;
3767e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (len != 1) {
3777e90cb90349e7e5b0cef362781830d519c20200aJason Sams        const float recipLen = 1.f / sqrt(len);
3787e90cb90349e7e5b0cef362781830d519c20200aJason Sams        x *= recipLen;
3797e90cb90349e7e5b0cef362781830d519c20200aJason Sams        y *= recipLen;
3807e90cb90349e7e5b0cef362781830d519c20200aJason Sams        z *= recipLen;
3817e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
3827e90cb90349e7e5b0cef362781830d519c20200aJason Sams    rsQuaternionLoadRotateUnit(q, rot, x, y, z);
3837e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3847e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3851cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void
3867e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionConjugate(rs_quaternion *q) {
3877e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->x = -q->x;
3887e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->y = -q->y;
3897e90cb90349e7e5b0cef362781830d519c20200aJason Sams    q->z = -q->z;
3907e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3917e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3921cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic float
3937e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionDot(const rs_quaternion *q0, const rs_quaternion *q1) {
3947e90cb90349e7e5b0cef362781830d519c20200aJason Sams    return q0->w*q1->w + q0->x*q1->x + q0->y*q1->y + q0->z*q1->z;
3957e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
3967e90cb90349e7e5b0cef362781830d519c20200aJason Sams
3971cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void
3987e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionNormalize(rs_quaternion *q) {
3997e90cb90349e7e5b0cef362781830d519c20200aJason Sams    const float len = rsQuaternionDot(q, q);
4007e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (len != 1) {
4017e90cb90349e7e5b0cef362781830d519c20200aJason Sams        const float recipLen = 1.f / sqrt(len);
4027e90cb90349e7e5b0cef362781830d519c20200aJason Sams        rsQuaternionMultiply(q, recipLen);
4037e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
4047e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
4057e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4061cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void
4077e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsQuaternionSlerp(rs_quaternion *q, const rs_quaternion *q0, const rs_quaternion *q1, float t) {
4087e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (t <= 0.0f) {
4097e90cb90349e7e5b0cef362781830d519c20200aJason Sams        rsQuaternionSet(q, q0);
4107e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return;
4117e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
4127e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (t >= 1.0f) {
4137e90cb90349e7e5b0cef362781830d519c20200aJason Sams        rsQuaternionSet(q, q1);
4147e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return;
4157e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
4167e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4177e90cb90349e7e5b0cef362781830d519c20200aJason Sams    rs_quaternion tempq0, tempq1;
4187e90cb90349e7e5b0cef362781830d519c20200aJason Sams    rsQuaternionSet(&tempq0, q0);
4197e90cb90349e7e5b0cef362781830d519c20200aJason Sams    rsQuaternionSet(&tempq1, q1);
4207e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4217e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float angle = rsQuaternionDot(q0, q1);
4227e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (angle < 0) {
4237e90cb90349e7e5b0cef362781830d519c20200aJason Sams        rsQuaternionMultiply(&tempq0, -1.0f);
4247e90cb90349e7e5b0cef362781830d519c20200aJason Sams        angle *= -1.0f;
4257e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
4267e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4277e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float scale, invScale;
4287e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (angle + 1.0f > 0.05f) {
4297e90cb90349e7e5b0cef362781830d519c20200aJason Sams        if (1.0f - angle >= 0.05f) {
4307e90cb90349e7e5b0cef362781830d519c20200aJason Sams            float theta = acos(angle);
4317e90cb90349e7e5b0cef362781830d519c20200aJason Sams            float invSinTheta = 1.0f / sin(theta);
4327e90cb90349e7e5b0cef362781830d519c20200aJason Sams            scale = sin(theta * (1.0f - t)) * invSinTheta;
4337e90cb90349e7e5b0cef362781830d519c20200aJason Sams            invScale = sin(theta * t) * invSinTheta;
4347e90cb90349e7e5b0cef362781830d519c20200aJason Sams        } else {
4357e90cb90349e7e5b0cef362781830d519c20200aJason Sams            scale = 1.0f - t;
4367e90cb90349e7e5b0cef362781830d519c20200aJason Sams            invScale = t;
4377e90cb90349e7e5b0cef362781830d519c20200aJason Sams        }
4387e90cb90349e7e5b0cef362781830d519c20200aJason Sams    } else {
4397e90cb90349e7e5b0cef362781830d519c20200aJason Sams        rsQuaternionSet(&tempq1, tempq0.z, -tempq0.y, tempq0.x, -tempq0.w);
4407e90cb90349e7e5b0cef362781830d519c20200aJason Sams        scale = sin(M_PI * (0.5f - t));
4417e90cb90349e7e5b0cef362781830d519c20200aJason Sams        invScale = sin(M_PI * t);
4427e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
4437e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4447e90cb90349e7e5b0cef362781830d519c20200aJason Sams    rsQuaternionSet(q, tempq0.w*scale + tempq1.w*invScale, tempq0.x*scale + tempq1.x*invScale,
4457e90cb90349e7e5b0cef362781830d519c20200aJason Sams                        tempq0.y*scale + tempq1.y*invScale, tempq0.z*scale + tempq1.z*invScale);
4467e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
4477e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4481cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hinesstatic void rsQuaternionGetMatrixUnit(rs_matrix4x4 *m, const rs_quaternion *q) {
4497e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float x2 = 2.0f * q->x * q->x;
4507e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float y2 = 2.0f * q->y * q->y;
4517e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float z2 = 2.0f * q->z * q->z;
4527e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float xy = 2.0f * q->x * q->y;
4537e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float wz = 2.0f * q->w * q->z;
4547e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float xz = 2.0f * q->x * q->z;
4557e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float wy = 2.0f * q->w * q->y;
4567e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float wx = 2.0f * q->w * q->x;
4577e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float yz = 2.0f * q->y * q->z;
4587e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4597e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[0] = 1.0f - y2 - z2;
4607e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[1] = xy - wz;
4617e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[2] = xz + wy;
4627e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[3] = 0.0f;
4637e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4647e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[4] = xy + wz;
4657e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[5] = 1.0f - x2 - z2;
4667e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[6] = yz - wx;
4677e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[7] = 0.0f;
4687e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4697e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[8] = xz - wy;
4707e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[9] = yz - wx;
4717e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[10] = 1.0f - x2 - y2;
4727e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[11] = 0.0f;
4737e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4747e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[12] = 0.0f;
4757e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[13] = 0.0f;
4767e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[14] = 0.0f;
4777e90cb90349e7e5b0cef362781830d519c20200aJason Sams    m->m[15] = 1.0f;
4787e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
4797e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4807e90cb90349e7e5b0cef362781830d519c20200aJason Sams/////////////////////////////////////////////////////
4817e90cb90349e7e5b0cef362781830d519c20200aJason Sams// utility funcs
4827e90cb90349e7e5b0cef362781830d519c20200aJason Sams/////////////////////////////////////////////////////
4831cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hines__inline__ static void __attribute__((overloadable, always_inline))
4847e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsExtractFrustumPlanes(const rs_matrix4x4 *modelViewProj,
4857e90cb90349e7e5b0cef362781830d519c20200aJason Sams                         float4 *left, float4 *right,
4867e90cb90349e7e5b0cef362781830d519c20200aJason Sams                         float4 *top, float4 *bottom,
4877e90cb90349e7e5b0cef362781830d519c20200aJason Sams                         float4 *near, float4 *far) {
4887e90cb90349e7e5b0cef362781830d519c20200aJason Sams    // x y z w = a b c d in the plane equation
4897e90cb90349e7e5b0cef362781830d519c20200aJason Sams    left->x = modelViewProj->m[3] + modelViewProj->m[0];
4907e90cb90349e7e5b0cef362781830d519c20200aJason Sams    left->y = modelViewProj->m[7] + modelViewProj->m[4];
4917e90cb90349e7e5b0cef362781830d519c20200aJason Sams    left->z = modelViewProj->m[11] + modelViewProj->m[8];
4927e90cb90349e7e5b0cef362781830d519c20200aJason Sams    left->w = modelViewProj->m[15] + modelViewProj->m[12];
4937e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4947e90cb90349e7e5b0cef362781830d519c20200aJason Sams    right->x = modelViewProj->m[3] - modelViewProj->m[0];
4957e90cb90349e7e5b0cef362781830d519c20200aJason Sams    right->y = modelViewProj->m[7] - modelViewProj->m[4];
4967e90cb90349e7e5b0cef362781830d519c20200aJason Sams    right->z = modelViewProj->m[11] - modelViewProj->m[8];
4977e90cb90349e7e5b0cef362781830d519c20200aJason Sams    right->w = modelViewProj->m[15] - modelViewProj->m[12];
4987e90cb90349e7e5b0cef362781830d519c20200aJason Sams
4997e90cb90349e7e5b0cef362781830d519c20200aJason Sams    top->x = modelViewProj->m[3] - modelViewProj->m[1];
5007e90cb90349e7e5b0cef362781830d519c20200aJason Sams    top->y = modelViewProj->m[7] - modelViewProj->m[5];
5017e90cb90349e7e5b0cef362781830d519c20200aJason Sams    top->z = modelViewProj->m[11] - modelViewProj->m[9];
5027e90cb90349e7e5b0cef362781830d519c20200aJason Sams    top->w = modelViewProj->m[15] - modelViewProj->m[13];
5037e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5047e90cb90349e7e5b0cef362781830d519c20200aJason Sams    bottom->x = modelViewProj->m[3] + modelViewProj->m[1];
5057e90cb90349e7e5b0cef362781830d519c20200aJason Sams    bottom->y = modelViewProj->m[7] + modelViewProj->m[5];
5067e90cb90349e7e5b0cef362781830d519c20200aJason Sams    bottom->z = modelViewProj->m[11] + modelViewProj->m[9];
5077e90cb90349e7e5b0cef362781830d519c20200aJason Sams    bottom->w = modelViewProj->m[15] + modelViewProj->m[13];
5087e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5097e90cb90349e7e5b0cef362781830d519c20200aJason Sams    near->x = modelViewProj->m[3] + modelViewProj->m[2];
5107e90cb90349e7e5b0cef362781830d519c20200aJason Sams    near->y = modelViewProj->m[7] + modelViewProj->m[6];
5117e90cb90349e7e5b0cef362781830d519c20200aJason Sams    near->z = modelViewProj->m[11] + modelViewProj->m[10];
5127e90cb90349e7e5b0cef362781830d519c20200aJason Sams    near->w = modelViewProj->m[15] + modelViewProj->m[14];
5137e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5147e90cb90349e7e5b0cef362781830d519c20200aJason Sams    far->x = modelViewProj->m[3] - modelViewProj->m[2];
5157e90cb90349e7e5b0cef362781830d519c20200aJason Sams    far->y = modelViewProj->m[7] - modelViewProj->m[6];
5167e90cb90349e7e5b0cef362781830d519c20200aJason Sams    far->z = modelViewProj->m[11] - modelViewProj->m[10];
5177e90cb90349e7e5b0cef362781830d519c20200aJason Sams    far->w = modelViewProj->m[15] - modelViewProj->m[14];
5187e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5197e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float len = length(left->xyz);
5207e90cb90349e7e5b0cef362781830d519c20200aJason Sams    *left /= len;
5217e90cb90349e7e5b0cef362781830d519c20200aJason Sams    len = length(right->xyz);
5227e90cb90349e7e5b0cef362781830d519c20200aJason Sams    *right /= len;
5237e90cb90349e7e5b0cef362781830d519c20200aJason Sams    len = length(top->xyz);
5247e90cb90349e7e5b0cef362781830d519c20200aJason Sams    *top /= len;
5257e90cb90349e7e5b0cef362781830d519c20200aJason Sams    len = length(bottom->xyz);
5267e90cb90349e7e5b0cef362781830d519c20200aJason Sams    *bottom /= len;
5277e90cb90349e7e5b0cef362781830d519c20200aJason Sams    len = length(near->xyz);
5287e90cb90349e7e5b0cef362781830d519c20200aJason Sams    *near /= len;
5297e90cb90349e7e5b0cef362781830d519c20200aJason Sams    len = length(far->xyz);
5307e90cb90349e7e5b0cef362781830d519c20200aJason Sams    *far /= len;
5317e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
5327e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5331cd2f783e4ad6d962c81aca59960fd8f2e774ad1Stephen Hines__inline__ static bool __attribute__((overloadable, always_inline))
5347e90cb90349e7e5b0cef362781830d519c20200aJason SamsrsIsSphereInFrustum(float4 *sphere,
5357e90cb90349e7e5b0cef362781830d519c20200aJason Sams                      float4 *left, float4 *right,
5367e90cb90349e7e5b0cef362781830d519c20200aJason Sams                      float4 *top, float4 *bottom,
5377e90cb90349e7e5b0cef362781830d519c20200aJason Sams                      float4 *near, float4 *far) {
5387e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5397e90cb90349e7e5b0cef362781830d519c20200aJason Sams    float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
5407e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (distToCenter < -sphere->w) {
5417e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return false;
5427e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
5437e90cb90349e7e5b0cef362781830d519c20200aJason Sams    distToCenter = dot(right->xyz, sphere->xyz) + right->w;
5447e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (distToCenter < -sphere->w) {
5457e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return false;
5467e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
5477e90cb90349e7e5b0cef362781830d519c20200aJason Sams    distToCenter = dot(top->xyz, sphere->xyz) + top->w;
5487e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (distToCenter < -sphere->w) {
5497e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return false;
5507e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
5517e90cb90349e7e5b0cef362781830d519c20200aJason Sams    distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
5527e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (distToCenter < -sphere->w) {
5537e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return false;
5547e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
5557e90cb90349e7e5b0cef362781830d519c20200aJason Sams    distToCenter = dot(near->xyz, sphere->xyz) + near->w;
5567e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (distToCenter < -sphere->w) {
5577e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return false;
5587e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
5597e90cb90349e7e5b0cef362781830d519c20200aJason Sams    distToCenter = dot(far->xyz, sphere->xyz) + far->w;
5607e90cb90349e7e5b0cef362781830d519c20200aJason Sams    if (distToCenter < -sphere->w) {
5617e90cb90349e7e5b0cef362781830d519c20200aJason Sams        return false;
5627e90cb90349e7e5b0cef362781830d519c20200aJason Sams    }
5637e90cb90349e7e5b0cef362781830d519c20200aJason Sams    return true;
5647e90cb90349e7e5b0cef362781830d519c20200aJason Sams}
5657e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5667e90cb90349e7e5b0cef362781830d519c20200aJason Sams
5677e90cb90349e7e5b0cef362781830d519c20200aJason Sams/////////////////////////////////////////////////////
5687fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams// int ops
5697fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams/////////////////////////////////////////////////////
5707fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
5717a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uint __attribute__((overloadable, always_inline)) rsClamp(uint amount, uint low, uint high);
5727a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME int __attribute__((overloadable, always_inline)) rsClamp(int amount, int low, int high);
5737a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME ushort __attribute__((overloadable, always_inline)) rsClamp(ushort amount, ushort low, ushort high);
5747a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME short __attribute__((overloadable, always_inline)) rsClamp(short amount, short low, short high);
5757a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME uchar __attribute__((overloadable, always_inline)) rsClamp(uchar amount, uchar low, uchar high);
5767a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao_RS_RUNTIME char __attribute__((overloadable, always_inline)) rsClamp(char amount, char low, char high);
5777fe6bce13c30b8d14dc833e06468666d28e56ee1Jason Sams
5787a43031a3f3e06f0257b507d5f197afaa21e2a3aShih-wei Liao#undef _RS_RUNTIME
579275b1e98bb949643d35546f10f8b1af009349526Jason Sams
580275b1e98bb949643d35546f10f8b1af009349526Jason Sams#endif
581