1044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/*
2291330fbaf7486a1cea33de7dd26c18e57c71391Stephen Hines * Copyright (C) 2016 The Android Open Source Project
3044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
4044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * you may not use this file except in compliance with the License.
6044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * You may obtain a copy of the License at
7044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
8044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
10044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Unless required by applicable law or agreed to in writing, software
11044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * See the License for the specific language governing permissions and
14044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * limitations under the License.
15044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
16044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
174a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet// Don't edit this file!  It is auto-generated by frameworks/rs/api/generate.sh.
18c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
2020b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet * rs_matrix.rsh: Matrix Functions
21044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
221bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * These functions let you manipulate square matrices of rank 2x2, 3x3, and 4x4.
236386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * They are particularly useful for graphical transformations and are compatible
246386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * with OpenGL.
251bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
266386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * We use a zero-based index for rows and columns.  E.g. the last element of a
276386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * rs_matrix4x4 is found at (3, 3).
281bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
296386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * RenderScript uses column-major matrices and column-based vectors.  Transforming
306386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * a vector is done by postmultiplying the vector, e.g. (matrix * vector),
316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * as provided by rsMatrixMultiply().
321bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
336386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To create a transformation matrix that performs two transformations at once,
346386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * multiply the two source matrices, with the first transformation as the right
356386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * argument.  E.g. to create a transformation matrix that applies the
36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * transformation s1 followed by s2, call rsMatrixLoadMultiply(&combined, &s2, &s1).
37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * This derives from s2 * (s1 * v), which is (s2 * s1) * v.
381bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
39c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * We have two style of functions to create transformation matrices:
406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * rsMatrixLoadTransformation and rsMatrixTransformation.  The former
416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * style simply stores the transformation matrix in the first argument.  The latter
426386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * modifies a pre-existing transformation matrix so that the new transformation
436386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * happens first.  E.g. if you call rsMatrixTranslate() on a matrix that already
446386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * does a scaling, the resulting matrix when applied to a vector will first do the
456386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * translation then the scaling.
46044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
474a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet
48c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#ifndef RENDERSCRIPT_RS_MATRIX_RSH
49c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#define RENDERSCRIPT_RS_MATRIX_RSH
50044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
51be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet#include "rs_vector_math.rsh"
52be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
53be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet/*
5420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet * rsExtractFrustumPlanes: Compute frustum planes
5520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet *
56be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet * Computes 6 frustum planes from the view projection matrix
57be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *
58be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet * Parameters:
596386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   viewProj: Matrix to extract planes from.
606386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   left: Left plane.
616386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   right: Right plane.
626386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   top: Top plane.
636386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   bottom: Bottom plane.
646386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   near: Near plane.
656386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   far: Far plane.
66be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet */
676e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#if !defined(RS_VERSION) || (RS_VERSION <= 23)
68a4d25bc511c86bb402890ce480ef581654319d75Verena Beckhamstatic inline void __attribute__((overloadable))
69be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* right, float4* top,
70be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet                           float4* bottom, float4* near, float4* far) {
71be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    // x y z w = a b c d in the plane equation
72be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    left->x = viewProj->m[3] + viewProj->m[0];
73be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    left->y = viewProj->m[7] + viewProj->m[4];
74be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    left->z = viewProj->m[11] + viewProj->m[8];
75be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    left->w = viewProj->m[15] + viewProj->m[12];
76be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
77be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    right->x = viewProj->m[3] - viewProj->m[0];
78be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    right->y = viewProj->m[7] - viewProj->m[4];
79be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    right->z = viewProj->m[11] - viewProj->m[8];
80be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    right->w = viewProj->m[15] - viewProj->m[12];
81be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
82be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    top->x = viewProj->m[3] - viewProj->m[1];
83be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    top->y = viewProj->m[7] - viewProj->m[5];
84be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    top->z = viewProj->m[11] - viewProj->m[9];
85be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    top->w = viewProj->m[15] - viewProj->m[13];
86be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
87be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    bottom->x = viewProj->m[3] + viewProj->m[1];
88be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    bottom->y = viewProj->m[7] + viewProj->m[5];
89be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    bottom->z = viewProj->m[11] + viewProj->m[9];
90be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    bottom->w = viewProj->m[15] + viewProj->m[13];
91be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
92be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    near->x = viewProj->m[3] + viewProj->m[2];
93be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    near->y = viewProj->m[7] + viewProj->m[6];
94be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    near->z = viewProj->m[11] + viewProj->m[10];
95be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    near->w = viewProj->m[15] + viewProj->m[14];
96be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
97be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    far->x = viewProj->m[3] - viewProj->m[2];
98be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    far->y = viewProj->m[7] - viewProj->m[6];
99be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    far->z = viewProj->m[11] - viewProj->m[10];
100be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    far->w = viewProj->m[15] - viewProj->m[14];
101be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
102be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    float len = length(left->xyz);
103be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    *left /= len;
104be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    len = length(right->xyz);
105be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    *right /= len;
106be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    len = length(top->xyz);
107be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    *top /= len;
108be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    len = length(bottom->xyz);
109be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    *bottom /= len;
110be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    len = length(near->xyz);
111be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    *near /= len;
112be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    len = length(far->xyz);
113be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    *far /= len;
114be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet}
1156e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#endif
1166e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham
1176e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#if (defined(RS_VERSION) && (RS_VERSION >= 24))
1186e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamextern void __attribute__((overloadable))
1196e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham    rsExtractFrustumPlanes(const rs_matrix4x4* viewProj, float4* left, float4* righ, float4* top,
1206e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham                           float4* bottom, float4* near, float4* far);
1216e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#endif
122be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
123be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet/*
12420b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet * rsIsSphereInFrustum: Checks if a sphere is within the frustum planes
12520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet *
12620b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet * Returns true if the sphere is within the 6 frustum planes.
127be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *
128be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet * Parameters:
1296386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   sphere: float4 representing the sphere.
1306386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   left: Left plane.
1316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   right: Right plane.
1326386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   top: Top plane.
1336386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   bottom: Bottom plane.
1346386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   near: Near plane.
1356386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   far: Far plane.
136be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet */
1376e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#if !defined(RS_VERSION) || (RS_VERSION <= 23)
1386e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamstatic inline bool __attribute__((always_inline, overloadable))
139be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    rsIsSphereInFrustum(float4* sphere, float4* left, float4* right, float4* top, float4* bottom,
140be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet                        float4* near, float4* far) {
141be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    float distToCenter = dot(left->xyz, sphere->xyz) + left->w;
142be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    if (distToCenter < -sphere->w) {
143be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet        return false;
144be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    }
145be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    distToCenter = dot(right->xyz, sphere->xyz) + right->w;
146be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    if (distToCenter < -sphere->w) {
147be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet        return false;
148be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    }
149be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    distToCenter = dot(top->xyz, sphere->xyz) + top->w;
150be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    if (distToCenter < -sphere->w) {
151be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet        return false;
152be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    }
153be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w;
154be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    if (distToCenter < -sphere->w) {
155be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet        return false;
156be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    }
157be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    distToCenter = dot(near->xyz, sphere->xyz) + near->w;
158be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    if (distToCenter < -sphere->w) {
159be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet        return false;
160be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    }
161be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    distToCenter = dot(far->xyz, sphere->xyz) + far->w;
162be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    if (distToCenter < -sphere->w) {
163be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet        return false;
164be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    }
165be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet    return true;
166be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet}
1676e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#endif
1686e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham
1696e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#if (defined(RS_VERSION) && (RS_VERSION >= 24))
1706e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamextern bool __attribute__((overloadable))
1716e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham    rsIsSphereInFrustum(float4* sphere, float4* left, float4* right, float4* top, float4* bottom,
1726e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham                        float4* near, float4* far);
1736e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham#endif
174be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet
175c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
176c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixGet: Get one element
177044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
1781bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * Returns one element of a matrix.
1791bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Warning: The order of the column and row parameters may be unexpected.
181044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
182c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
1836386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to extract the element from.
1846386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   col: Zero-based column of the element to be extracted.
1856386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   row: Zero-based row of the element to extracted.
186044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
187129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float __attribute__((overloadable))
188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixGet(const rs_matrix4x4* m, uint32_t col, uint32_t row);
189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
190129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float __attribute__((overloadable))
191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixGet(const rs_matrix3x3* m, uint32_t col, uint32_t row);
192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
193129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float __attribute__((overloadable))
194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixGet(const rs_matrix2x2* m, uint32_t col, uint32_t row);
195044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixInverse: Inverts a matrix in place
198044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Returns true if the matrix was successfully inverted.
200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
2026386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to invert.
203044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
204c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern bool __attribute__((overloadable))
205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixInverse(rs_matrix4x4* m);
206044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
207c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
208c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixInverseTranspose: Inverts and transpose a matrix in place
209044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
2106386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * The matrix is first inverted then transposed. Returns true if the matrix was
2116386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * successfully inverted.
2121bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
2146386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to modify.
215044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
216c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern bool __attribute__((overloadable))
217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixInverseTranspose(rs_matrix4x4* m);
218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoad: Load or copy a matrix
2211bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Set the elements of a matrix from an array of floats or from another matrix.
2231bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * If loading from an array, the floats should be in row-major order, i.e. the element a
225c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * row 0, column 0 should be first, followed by the element at
226c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * row 0, column 1, etc.
227044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
2286386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * If loading from a matrix and the source is smaller than the destination, the rest
2296386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * of the destination is filled with elements of the identity matrix.  E.g.
230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * loading a rs_matrix2x2 into a rs_matrix4x4 will give:
2311bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * m00 m01 0.0 0.0
233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * m10 m11 0.0 0.0
234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 0.0 0.0 1.0 0.0
235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * 0.0 0.0 0.0 1.0
2361bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
2371bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
2396386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   destination: Matrix to set.
2406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   array: Array of values to set the matrix to. These arrays should be 4, 9, or 16 floats long, depending on the matrix size.
2416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   source: Source matrix.
242044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
243044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
244c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix4x4* destination, const float* array);
245c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
246c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
247c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix3x3* destination, const float* array);
248c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix2x2* destination, const float* array);
251c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix4x4* source);
254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
255c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
256c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix3x3* destination, const rs_matrix3x3* source);
257044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
259c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix2x2* destination, const rs_matrix2x2* source);
260c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
261c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
262c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix3x3* source);
263c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
264c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
265c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoad(rs_matrix4x4* destination, const rs_matrix2x2* source);
266c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
267c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
268c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadFrustum: Load a frustum projection matrix
269044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
2706386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * Constructs a frustum projection matrix, transforming the box identified by
2716386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * the six clipping planes left, right, bottom, top, near, far.
2721bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
2736386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To apply this projection to a vector, multiply the vector by the created
2746386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * matrix using rsMatrixMultiply().
2751bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
276c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
2776386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
278044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
279044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
280c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadFrustum(rs_matrix4x4* m, float left, float right, float bottom, float top,
281c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                        float near, float far);
282044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
283c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
284c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadIdentity: Load identity matrix
2851bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
286c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Set the elements of a matrix to the identity matrix.
2871bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
288c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
2896386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
290044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
291044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
292c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadIdentity(rs_matrix4x4* m);
293c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
294c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
295c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadIdentity(rs_matrix3x3* m);
296c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
297c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
298c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadIdentity(rs_matrix2x2* m);
299044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
300c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
301c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadMultiply: Multiply two matrices
3021bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
303c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Sets m to the matrix product of lhs * rhs.
304044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
3051bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * To combine two 4x4 transformaton matrices, multiply the second transformation matrix
3061bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * by the first transformation matrix.  E.g. to create a transformation matrix that applies
3076386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * the transformation s1 followed by s2, call rsMatrixLoadMultiply(&combined, &s2, &s1).
3081bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
309c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Warning: Prior to version 21, storing the result back into right matrix is not supported and
3101bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * will result in undefined behavior.  Use rsMatrixMulitply instead.   E.g. instead of doing
3111bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * rsMatrixLoadMultiply (&m2r, &m2r, &m2l), use rsMatrixMultiply (&m2r, &m2l).
3121bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet * rsMatrixLoadMultiply (&m2l, &m2r, &m2l) works as expected.
3131bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
314c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
3156386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
3166386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   lhs: Left matrix of the product.
3176386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   rhs: Right matrix of the product.
318044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
319044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadMultiply(rs_matrix4x4* m, const rs_matrix4x4* lhs, const rs_matrix4x4* rhs);
321044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
322044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadMultiply(rs_matrix3x3* m, const rs_matrix3x3* lhs, const rs_matrix3x3* rhs);
324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
325044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
326c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadMultiply(rs_matrix2x2* m, const rs_matrix2x2* lhs, const rs_matrix2x2* rhs);
327044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
329c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadOrtho: Load an orthographic projection matrix
3301bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
3316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * Constructs an orthographic projection matrix, transforming the box identified by the
3326386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * six clipping planes left, right, bottom, top, near, far into a unit cube
3336386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * with a corner at (-1, -1, -1) and the opposite at (1, 1, 1).
334044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
3356386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To apply this projection to a vector, multiply the vector by the created matrix
3366386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * using rsMatrixMultiply().
3371bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
338c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See https://en.wikipedia.org/wiki/Orthographic_projection .
339c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
340c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
3416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
342044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
343044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
344c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadOrtho(rs_matrix4x4* m, float left, float right, float bottom, float top, float near,
345c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet                      float far);
346044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
347c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
348c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadPerspective: Load a perspective projection matrix
3491bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
350c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Constructs a perspective projection matrix, assuming a symmetrical field of view.
351044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
3526386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To apply this projection to a vector, multiply the vector by the created matrix
3536386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * using rsMatrixMultiply().
3541bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
355c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
3566386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
3574a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *   fovy: Field of view, in degrees along the Y axis.
3584a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *   aspect: Ratio of x / y.
3596386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   near: Near clipping plane.
3606386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   far: Far clipping plane.
361044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
362044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
363c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
364044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
365c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
366c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadRotate: Load a rotation matrix
3671bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
3686386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * This function creates a rotation matrix.  The axis of rotation is the (x, y, z) vector.
3691bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
3706386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To rotate a vector, multiply the vector by the created matrix using rsMatrixMultiply().
371c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
372c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * See http://en.wikipedia.org/wiki/Rotation_matrix .
373044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
374c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
3756386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
3764a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *   rot: How much rotation to do, in degrees.
3776386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   x: X component of the vector that is the axis of rotation.
3786386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   y: Y component of the vector that is the axis of rotation.
3796386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   z: Z component of the vector that is the axis of rotation.
380044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
381044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
382c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadRotate(rs_matrix4x4* m, float rot, float x, float y, float z);
383044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
384c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
385c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadScale: Load a scaling matrix
3861bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
3876386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * This function creates a scaling matrix, where each component of a vector is multiplied
3886386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * by a number.  This number can be negative.
3891bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
3906386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To scale a vector, multiply the vector by the created matrix using rsMatrixMultiply().
3911bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
392c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
3936386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
3946386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   x: Multiple to scale the x components by.
3956386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   y: Multiple to scale the y components by.
3966386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   z: Multiple to scale the z components by.
397044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
398044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
399c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadScale(rs_matrix4x4* m, float x, float y, float z);
400044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
402c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixLoadTranslate: Load a translation matrix
4031bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
4046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * This function creates a translation matrix, where a number is added to each element of
4056386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * a vector.
406044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
4076386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To translate a vector, multiply the vector by the created matrix using
4086386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * rsMatrixMultiply().
409c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
410c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
4116386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to set.
4126386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   x: Number to add to each x component.
4136386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   y: Number to add to each y component.
4146386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   z: Number to add to each z component.
415044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
416044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable))
417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixLoadTranslate(rs_matrix4x4* m, float x, float y, float z);
418044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixMultiply: Multiply a matrix by a vector or another matrix
4211bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
422c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * For the matrix by matrix variant, sets m to the matrix product m * rhs.
4231bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
424c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * When combining two 4x4 transformation matrices using this function, the resulting
425c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * matrix will correspond to performing the rhs transformation first followed by
426c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * the original m transformation.
427044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
428c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * For the matrix by vector variant, returns the post-multiplication of the vector
429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * by the matrix, ie. m * in.
4301bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
431c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * When multiplying a float3 to a rs_matrix4x4, the vector is expanded with (1).
4321bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
433c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * When multiplying a float2 to a rs_matrix4x4, the vector is expanded with (0, 1).
4341bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
435c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * When multiplying a float2 to a rs_matrix3x3, the vector is expanded with (0).
4361bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Starting with API 14, this function takes a const matrix as the first argument.
4381bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
439c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
4406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Left matrix of the product and the matrix to be set.
4416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   rhs: Right matrix of the product.
442044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
443c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix4x4* m, const rs_matrix4x4* rhs);
445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix3x3* m, const rs_matrix3x3* rhs);
448c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
449c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
450c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix2x2* m, const rs_matrix2x2* rhs);
451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if !defined(RS_VERSION) || (RS_VERSION <= 13)
453129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float4 __attribute__((overloadable))
454c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix4x4* m, float4 in);
455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
456044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
457c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if !defined(RS_VERSION) || (RS_VERSION <= 13)
458129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float4 __attribute__((overloadable))
459c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix4x4* m, float3 in);
460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
461044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
462c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if !defined(RS_VERSION) || (RS_VERSION <= 13)
463129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float4 __attribute__((overloadable))
464c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix4x4* m, float2 in);
465c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
466044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
467c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if !defined(RS_VERSION) || (RS_VERSION <= 13)
468129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float3 __attribute__((overloadable))
469c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix3x3* m, float3 in);
470c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
471044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
472c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if !defined(RS_VERSION) || (RS_VERSION <= 13)
473129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float3 __attribute__((overloadable))
474c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix3x3* m, float2 in);
475c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
476044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
477c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if !defined(RS_VERSION) || (RS_VERSION <= 13)
478129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float2 __attribute__((overloadable))
479c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(rs_matrix2x2* m, float2 in);
480c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
481c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
482c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if (defined(RS_VERSION) && (RS_VERSION >= 14))
483129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float4 __attribute__((overloadable))
484c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(const rs_matrix4x4* m, float4 in);
485c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
486044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if (defined(RS_VERSION) && (RS_VERSION >= 14))
488129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float4 __attribute__((overloadable))
489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(const rs_matrix4x4* m, float3 in);
490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
491044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
492c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if (defined(RS_VERSION) && (RS_VERSION >= 14))
493129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float4 __attribute__((overloadable))
494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(const rs_matrix4x4* m, float2 in);
495c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
496044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
497c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if (defined(RS_VERSION) && (RS_VERSION >= 14))
498129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float3 __attribute__((overloadable))
499c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(const rs_matrix3x3* m, float3 in);
500c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
501044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
502c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if (defined(RS_VERSION) && (RS_VERSION >= 14))
503129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float3 __attribute__((overloadable))
504c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(const rs_matrix3x3* m, float2 in);
505c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif
506044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
507c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#if (defined(RS_VERSION) && (RS_VERSION >= 14))
508129c14734e6f9fc1f4937026182cd35ee4dbe911Jean-Luc Brouilletextern float2 __attribute__((overloadable))
509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixMultiply(const rs_matrix2x2* m, float2 in);
510044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#endif
511044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
512c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
513c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixRotate: Apply a rotation to a transformation matrix
5141bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
515c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Multiply the matrix m with a rotation matrix.
516c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
5176386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * This function modifies a transformation matrix to first do a rotation.  The axis of
5186386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * rotation is the (x, y, z) vector.
519044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
5206386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To apply this combined transformation to a vector, multiply the vector by the created
5216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * matrix using rsMatrixMultiply().
522c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
523c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
5246386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to modify.
5254a73004df5231d188c41267fee17c566ae7c3631Jean-Luc Brouillet *   rot: How much rotation to do, in degrees.
5266386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   x: X component of the vector that is the axis of rotation.
5276386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   y: Y component of the vector that is the axis of rotation.
5286386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   z: Z component of the vector that is the axis of rotation.
529044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
531c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixRotate(rs_matrix4x4* m, float rot, float x, float y, float z);
532044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
533c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
534c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixScale: Apply a scaling to a transformation matrix
5351bb2eed69caa28cf8198d58db7d9134cc2f563f5Jean-Luc Brouillet *
536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Multiply the matrix m with a scaling matrix.
537044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
5386386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * This function modifies a transformation matrix to first do a scaling.   When scaling,
5396386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * each component of a vector is multiplied by a number.  This number can be negative.
540c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
5416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To apply this combined transformation to a vector, multiply the vector by the created
5426386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * matrix using rsMatrixMultiply().
543c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
544c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
5456386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to modify.
5466386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   x: Multiple to scale the x components by.
5476386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   y: Multiple to scale the y components by.
5486386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   z: Multiple to scale the z components by.
549044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
550c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
551c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixScale(rs_matrix4x4* m, float x, float y, float z);
552044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
553c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
554c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixSet: Set one element
555c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
556c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Set an element of a matrix.
557044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams *
558c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Warning: The order of the column and row parameters may be unexpected.
559c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
560c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
5616386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix that will be modified.
5626386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   col: Zero-based column of the element to be set.
5636386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   row: Zero-based row of the element to be set.
5646386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   v: Value to set.
565044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
566c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
567c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixSet(rs_matrix4x4* m, uint32_t col, uint32_t row, float v);
568c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
569c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixSet(rs_matrix3x3* m, uint32_t col, uint32_t row, float v);
571c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
572c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
573c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixSet(rs_matrix2x2* m, uint32_t col, uint32_t row, float v);
574c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
575c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
576c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixTranslate: Apply a translation to a transformation matrix
577c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
578c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Multiply the matrix m with a translation matrix.
579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
5806386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * This function modifies a transformation matrix to first do a translation.  When
5816386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * translating, a number is added to each component of a vector.
582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
5836386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * To apply this combined transformation to a vector, multiply the vector by the
5846386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet * created matrix using rsMatrixMultiply().
585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
5876386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to modify.
5886386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   x: Number to add to each x component.
5896386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   y: Number to add to each y component.
5906386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   z: Number to add to each z component.
591044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
592c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
593c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixTranslate(rs_matrix4x4* m, float x, float y, float z);
594c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
595c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet/*
596c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * rsMatrixTranspose: Transpose a matrix place
597c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
598c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Transpose the matrix m in place.
599c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet *
600c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet * Parameters:
6016386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet *   m: Matrix to transpose.
602044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */
603c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
604c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixTranspose(rs_matrix4x4* m);
605c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet
606c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
607c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixTranspose(rs_matrix3x3* m);
608044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
609c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletextern void __attribute__((overloadable))
610c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet    rsMatrixTranspose(rs_matrix2x2* m);
611044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams
612c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet#endif // RENDERSCRIPT_RS_MATRIX_RSH
613